diff --git a/api_documentation/api_documentation.go b/api_documentation/api_documentation.go
index 2322c365ad86ebf31461b634923ca13b4bd8c5d9..d7c17eb555727efb08ed0b40e0a0d41de33c8afe 100644
--- a/api_documentation/api_documentation.go
+++ b/api_documentation/api_documentation.go
@@ -423,7 +423,7 @@ func GetStructDocs(corePath string) map[string]string {
 
 	err := filepath.Walk(corePath, walkFunction)
 	if err != nil {
-		logs.ErrorWithMsg("Failed to upload files to s3", err)
+		logs.ErrorWithMsg(err, "Failed to upload files to s3")
 	}
 
 	return docs
diff --git a/api_logs/api-logs.go b/api_logs/api-logs.go
index 3ea8a07f6b9fedfd45551bfacfde0e66a7da744b..d486db377e2d8b9ffa790f7311be64b6c77d6a47 100644
--- a/api_logs/api-logs.go
+++ b/api_logs/api-logs.go
@@ -189,6 +189,7 @@ type ApiLog struct {
 	Username            string         `json:"username,omitempty"`
 	SourceIP            string         `json:"source_ip,omitempty"`  // only logged for incoming API
 	UserAgent           string         `json:"user_agent,omitempty"` // only for incoming, indicate type of browser when UI
+	GraphQLQueryRoot    string         `json:"graphql_query_root,omitempty"`
 	Request             ApiLogRequest  `json:"request"`
 	Response            ApiLogResponse `json:"response"`
 }
diff --git a/api_responses/api_responses.go b/api_responses/api_responses.go
index 0f6325532844af3cc285853b644dfbbb07d85afd..71cee6f11d2913ffc91cece1b0e8d088be82ee4a 100644
--- a/api_responses/api_responses.go
+++ b/api_responses/api_responses.go
@@ -36,11 +36,11 @@ func ServerError(err error, msg string) (events.APIGatewayProxyResponse, error)
 }
 
 func Error(err error, msg string, statusCode int) (events.APIGatewayProxyResponse, error) {
-	logs.ErrorWithFields(map[string]interface{}{
+	logs.ErrorWithFields(err, map[string]interface{}{
 		"type":    "Server error",
 		"message": msg,
 		"code":    statusCode,
-	}, err)
+	})
 
 	serverError := errorMsg{
 		Message: msg,
@@ -81,11 +81,11 @@ func DatabaseServerErrorNew(err error, msg string) error {
 	} else if statusCode == http.StatusConflict {
 		logs.Info("Database conflict: " + msg + ". Code: " + strconv.Itoa(statusCode))
 	} else {
-		logs.ErrorWithFields(map[string]interface{}{
+		logs.ErrorWithFields(err, map[string]interface{}{
 			"type":    "Database error",
 			"message": msg,
 			"code":    statusCode,
-		}, err)
+		})
 	}
 
 	return ServerErrorStruct{
@@ -125,11 +125,11 @@ func DatabaseServerError(err error, msg string) (events.APIGatewayProxyResponse,
 	} else if statusCode == http.StatusConflict {
 		logs.Info("Database conflict: " + msg + ". Code: " + strconv.Itoa(statusCode))
 	} else {
-		logs.ErrorWithFields(map[string]interface{}{
+		logs.ErrorWithFields(err, map[string]interface{}{
 			"type":    "Database error",
 			"message": msg,
 			"code":    statusCode,
-		}, err)
+		})
 	}
 
 	serverError := errorMsg{
@@ -220,10 +220,10 @@ func trimBrackets(value string) string {
 
 // ClientError creates responses due to request client error
 func ClientError(status int, message string) (events.APIGatewayProxyResponse, error) {
-	logs.WarnWithFields(map[string]interface{}{
+	logs.WarnWithFields(errors.Error(message), map[string]interface{}{
 		"type": "Client error",
 		"code": status,
-	}, errors.Error(message))
+	})
 
 	e := errorMsg{
 		Message: message,
diff --git a/audit/audit.go b/audit/audit.go
index a766d4041b9ecebc4f370a556e162e3f98146572..06b4d2df4052880930f491082300e3e30f5df4f0 100644
--- a/audit/audit.go
+++ b/audit/audit.go
@@ -235,13 +235,13 @@ func CheckToFormatForAuditEvent(changes map[string]any, original any, new any, f
 
 	defer func() {
 		if err := recover(); err != nil {
-			logs.ErrorWithFields(map[string]any{
+			logs.ErrorWithFields(errors.Error("Failed to format for audit event"), map[string]any{
 				"error":    err,
 				"field":    field,
 				"index":    index,
 				"original": fmt.Sprintf("%#v", originalFieldValue),
 				"new":      fmt.Sprintf("%#v", newFieldValue),
-			}, errors.Error("Failed to format for audit event"))
+			})
 			didInsert = false
 		}
 	}()
diff --git a/batch/batch.go b/batch/batch.go
index 7bc147de7c24ceabc0771c04fbeb5c6f91581392..63f53d1c73cf527bdb0580e7f1b48d6c79743fe1 100644
--- a/batch/batch.go
+++ b/batch/batch.go
@@ -126,7 +126,7 @@ func RetrieveMessageFromS3(filename string, messagesBucketName string, isDebug b
 	var bodyBytes []byte
 	bodyBytes, err = io.ReadAll(rawObject.Body)
 	if err != nil {
-		logs.ErrorWithMsg("Could not read file", err)
+		logs.ErrorWithMsg(err, "Could not read file")
 		return bodyBytes, err
 	}
 	return bodyBytes, nil
diff --git a/date_utils/date_utils.go b/date_utils/date_utils.go
index 66cc9832e622c56a3f2921222e077d729ef57f0d..660d0e264b267a726b381ad1fab3d838e1fa34f5 100644
--- a/date_utils/date_utils.go
+++ b/date_utils/date_utils.go
@@ -8,12 +8,21 @@ import (
 	"time"
 
 	"github.com/jinzhu/now"
+	"github.com/rickar/cal/v2"
+	"github.com/rickar/cal/v2/za"
+	"google.golang.org/api/mybusinessbusinessinformation/v1"
 
 	"github.com/araddon/dateparse"
 	"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/errors"
+	"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/number_utils"
 )
 
-const TimeZoneString = "Africa/Johannesburg"
+const (
+	TimeZoneString         = "Africa/Johannesburg"
+	DurationFifteenMinutes = time.Minute * 15
+	DurationOneDay         = time.Hour * 24
+	DurationOneWeek        = DurationOneDay * 7
+)
 
 var currentLocation *time.Location
 
@@ -478,8 +487,86 @@ func (day TradingHoursDay) String() string {
 	return startTime.Format("3:04pm") + " – " + endTime.Format("3:04pm")
 }
 
-const DurationFifteenMinutes = time.Minute * 15
+func (th TradingHours) GoogleMyBusinessRegularHours() *mybusinessbusinessinformation.BusinessHours {
+	var timePeriods []*mybusinessbusinessinformation.TimePeriod
+
+	iteratableTradingHours := map[string]TradingHoursDay{
+		"MONDAY":    th.Monday,
+		"TUESDAY":   th.Tuesday,
+		"WEDNESDAY": th.Wednesday,
+		"THURSDAY":  th.Thursday,
+		"FRIDAY":    th.Friday,
+		"SATURDAY":  th.Saturday,
+		"SUNDAY":    th.Sunday,
+	}
+
+	for dayOfWeek, tradingHoursDay := range iteratableTradingHours {
+		if tradingHoursDay.StartTime == "" || tradingHoursDay.EndTime == "" {
+			continue
+		}
+
+		timePeriods = append(timePeriods, &mybusinessbusinessinformation.TimePeriod{
+			OpenDay:   dayOfWeek,
+			OpenTime:  googleMyBusinessTimeOfDayFromString(tradingHoursDay.StartTime),
+			CloseDay:  dayOfWeek,
+			CloseTime: googleMyBusinessTimeOfDayFromString(tradingHoursDay.EndTime),
+		})
+	}
+
+	return &mybusinessbusinessinformation.BusinessHours{
+		Periods: timePeriods,
+	}
+}
+
+func (th TradingHours) GoogleMyBusinessSpecialHoursForTheNextYear() *mybusinessbusinessinformation.SpecialHours {
+	var specialHourPeriods []*mybusinessbusinessinformation.SpecialHourPeriod
+	calendar := cal.NewBusinessCalendar()
+	calendar.AddHoliday(za.Holidays...)
+
+	for i := 0; i < 365; i++ {
+		day := CurrentDate().AddDate(0, 0, i)
+		if _, observed, _ := calendar.IsHoliday(day); observed {
+			var specialHourPeriod mybusinessbusinessinformation.SpecialHourPeriod
+			specialHourPeriodDay := &mybusinessbusinessinformation.Date{
+				Year:  int64(day.Year()),
+				Month: int64(day.Month()),
+				Day:   int64(day.Day()),
+			}
+			specialHourPeriod.StartDate = specialHourPeriodDay
+			specialHourPeriod.OpenTime = googleMyBusinessTimeOfDayFromString(th.Holidays.StartTime)
+			if th.Holidays.StartTime == "" || th.Holidays.EndTime == "" {
+				specialHourPeriod.Closed = true
+			}
+			specialHourPeriod.EndDate = specialHourPeriodDay
+			specialHourPeriod.CloseTime = googleMyBusinessTimeOfDayFromString(th.Holidays.EndTime)
+			specialHourPeriods = append(specialHourPeriods, &specialHourPeriod)
+		}
+	}
+
+	return &mybusinessbusinessinformation.SpecialHours{
+		SpecialHourPeriods: specialHourPeriods,
+	}
+}
+
+func googleMyBusinessTimeOfDayFromString(timeString string) *mybusinessbusinessinformation.TimeOfDay {
+	if timeString == "" {
+		return nil
+	}
+
+	hoursString := strings.Split(timeString, ":")[0]
+	hours, err := number_utils.StringToInt64(hoursString)
+	if err != nil {
+		return nil
+	}
 
-const DurationOneDay = time.Hour * 24
+	minutesString := strings.Split(timeString, ":")[1]
+	minutes, err := number_utils.StringToInt64(minutesString)
+	if err != nil {
+		return nil
+	}
 
-const DurationOneWeek = DurationOneDay * 7
+	return &mybusinessbusinessinformation.TimeOfDay{
+		Hours:   hours,
+		Minutes: minutes,
+	}
+}
diff --git a/encryption/encryption_keys.go b/encryption/encryption_keys.go
index 6b0f9ec59a62faceebde957f1fd7cbce43d0b840..d981588736f046ef3b1331e5ab9969e167b5cbfd 100644
--- a/encryption/encryption_keys.go
+++ b/encryption/encryption_keys.go
@@ -37,7 +37,7 @@ func GetEncryptionKeys(secretID string, isDebug bool) (EncryptionKeys, error) {
 func GetJWTEncryptionKey(secretID string, isDebug bool) (string, error) {
 	encryptionKeys, err := GetEncryptionKeys(secretID, isDebug)
 	if err != nil {
-		logs.ErrorWithMsg("Could not get encryption keys from secret manager", err)
+		logs.ErrorWithMsg(err, "Could not get encryption keys from secret manager")
 		return "", errors.Error("failed to get encryption keys for login")
 	}
 	return encryptionKeys.JWTEncryptionKey, nil
diff --git a/go.mod b/go.mod
index 0e047d9a2931c85b91db873f586575993213ad39..6d05d75a80f3a2efd3aadad838d5e5921af7d1ef 100644
--- a/go.mod
+++ b/go.mod
@@ -35,15 +35,16 @@ require (
 	github.com/pquerna/otp v1.4.0
 	github.com/prozz/aws-embedded-metrics-golang v1.2.0
 	github.com/r3labs/diff/v2 v2.14.2
+	github.com/rickar/cal/v2 v2.1.21
 	github.com/samber/lo v1.38.1
 	github.com/sirupsen/logrus v1.8.1
 	github.com/slack-go/slack v0.15.0
 	github.com/thoas/go-funk v0.9.1
 	github.com/uptrace/bun v1.1.17
 	golang.ngrok.com/ngrok v1.4.1
-	golang.org/x/crypto v0.31.0
+	golang.org/x/crypto v0.32.0
 	golang.org/x/text v0.21.0
-	google.golang.org/api v0.214.0
+	google.golang.org/api v0.216.0
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 )
 
@@ -78,7 +79,7 @@ require (
 	github.com/golang/protobuf v1.5.4 // indirect
 	github.com/google/s2a-go v0.1.8 // indirect
 	github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
-	github.com/googleapis/gax-go/v2 v2.14.0 // indirect
+	github.com/googleapis/gax-go/v2 v2.14.1 // indirect
 	github.com/gorilla/websocket v1.4.2 // indirect
 	github.com/hbollon/go-edlib v1.6.0 // indirect
 	github.com/inconshreveable/log15 v3.0.0-testing.3+incompatible // indirect
@@ -101,20 +102,21 @@ require (
 	github.com/vmihailenco/tagparser v0.1.2 // indirect
 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
 	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect
-	go.opentelemetry.io/otel v1.29.0 // indirect
-	go.opentelemetry.io/otel/metric v1.29.0 // indirect
-	go.opentelemetry.io/otel/trace v1.29.0 // indirect
+	go.opentelemetry.io/otel v1.31.0 // indirect
+	go.opentelemetry.io/otel/metric v1.31.0 // indirect
+	go.opentelemetry.io/otel/trace v1.31.0 // indirect
 	go.uber.org/multierr v1.10.0 // indirect
 	golang.ngrok.com/muxado/v2 v2.0.0 // indirect
-	golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
-	golang.org/x/net v0.33.0 // indirect
-	golang.org/x/oauth2 v0.24.0 // indirect
-	golang.org/x/sys v0.28.0 // indirect
-	golang.org/x/term v0.27.0 // indirect
+	golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
+	golang.org/x/net v0.34.0 // indirect
+	golang.org/x/oauth2 v0.25.0 // indirect
+	golang.org/x/sys v0.29.0 // indirect
+	golang.org/x/term v0.28.0 // indirect
 	google.golang.org/appengine v1.6.8 // indirect
-	google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 // indirect
-	google.golang.org/grpc v1.67.1 // indirect
-	google.golang.org/protobuf v1.36.0 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422 // indirect
+	google.golang.org/grpc v1.69.2 // indirect
+	google.golang.org/protobuf v1.36.2 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	mellium.im/sasl v0.2.1 // indirect
 )
diff --git a/go.sum b/go.sum
index c97ddc41107d5e495f8b794a1eadbc2fcc2e77ac..bd0354a882c929f30213fc0cfdbe1c18a464a611 100644
--- a/go.sum
+++ b/go.sum
@@ -165,8 +165,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw=
 github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
-github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o=
-github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk=
+github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q=
+github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
@@ -249,6 +249,8 @@ github.com/prozz/aws-embedded-metrics-golang v1.2.0 h1:b/LFb8J9LbgANow/9nYZE3M3b
 github.com/prozz/aws-embedded-metrics-golang v1.2.0/go.mod h1:MXOqF9cJCEHjj77LWq7NWK44/AOyaFzwmcAYqR3057M=
 github.com/r3labs/diff/v2 v2.14.2 h1:1HVhQKwg1YnoCWzCYlOWYLG4C3yfTudZo5AcrTSgCTc=
 github.com/r3labs/diff/v2 v2.14.2/go.mod h1:I8noH9Fc2fjSaMxqF3G2lhDdC0b+JXCfyx85tWFM9kc=
+github.com/rickar/cal/v2 v2.1.21 h1:ghZzbiF/T2xrqFjBZ/EypocIus9Law19TnLygGcmzhg=
+github.com/rickar/cal/v2 v2.1.21/go.mod h1:/fdlMcx7GjPlIBibMzOM9gMvDBsrK+mOtRXdTzUqV/A=
 github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
 github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -305,12 +307,16 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5
 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
-go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw=
-go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8=
-go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc=
-go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8=
-go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4=
-go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ=
+go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
+go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
+go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
+go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
+go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
+go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
+go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc=
+go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8=
+go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
+go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
 go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
 go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
 golang.ngrok.com/muxado/v2 v2.0.0 h1:bu9eIDhRdYNtIXNnqat/HyMeHYOAbUH55ebD7gTvW6c=
@@ -323,11 +329,11 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
-golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
-golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
+golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
+golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM=
-golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE=
+golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
+golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@@ -353,11 +359,11 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
 golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
-golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
-golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
+golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
-golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=
+golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -390,16 +396,16 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
-golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
+golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
 golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
-golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
-golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
+golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
+golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -412,8 +418,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
 golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
-golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
-golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
+golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -428,8 +434,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/api v0.214.0 h1:h2Gkq07OYi6kusGOaT/9rnNljuXmqPnaig7WGPmKbwA=
-google.golang.org/api v0.214.0/go.mod h1:bYPpLG8AyeMWwDU6NXoB00xC0DFkikVvd5MfwoxjLqE=
+google.golang.org/api v0.216.0 h1:xnEHy+xWFrtYInWPy8OdGFsyIfWJjtVnO39g7pz2BFY=
+google.golang.org/api v0.216.0/go.mod h1:K9wzQMvWi47Z9IU7OgdOofvZuw75Ge3PPITImZR/UyI=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
@@ -438,13 +444,15 @@ google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJ
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8 h1:TqExAhdPaB60Ux47Cn0oLV07rGnxZzIsaRhQaqS666A=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8/go.mod h1:lcTa1sDdWEIHMWlITnIczmw5w60CF9ffkb8Z+DVmmjA=
+google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 h1:GVIKPyP/kLIyVOgOnTwFOrvQaQUzOzGMCxgFUOEmm24=
+google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422/go.mod h1:b6h1vNKhxaSoEI+5jc3PJUCustfli/mRab7295pY7rw=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422 h1:3UsHvIr4Wc2aW4brOaSCmcxh9ksica6fHEr8P1XhkYw=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
-google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
+google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU=
+google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -456,8 +464,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ=
-google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU=
+google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/logs/logs.go b/logs/logs.go
index 804988b8faa96e53e609538042d0c2b5d14ce60a..d9aaf9fda10ad62329f0f71ea71bb4dbf6d1c0a4 100644
--- a/logs/logs.go
+++ b/logs/logs.go
@@ -226,7 +226,7 @@ func Info(format string, a ...interface{}) {
 	}
 }
 
-func ErrorWithFields(fields map[string]interface{}, err error) {
+func ErrorWithFields(err error, fields map[string]interface{}) {
 	if disableLogging {
 		return
 	}
@@ -242,17 +242,20 @@ func ErrorWithFields(fields map[string]interface{}, err error) {
 	}
 }
 
-func ErrorWithMsg(message string, err error) {
+func ErrorWithMsg(err error, format string, a ...interface{}) {
 	if disableLogging {
 		return
 	}
 
+	message := fmt.Sprintf(format, a...)
+
 	if err == nil {
 		err = errors.Error(message)
 	}
-	ErrorWithFields(map[string]interface{}{
+
+	ErrorWithFields(err, map[string]interface{}{
 		"message": message,
-	}, err)
+	})
 }
 
 func ErrorMsg(format string, a ...interface{}) {
@@ -262,7 +265,7 @@ func ErrorMsg(format string, a ...interface{}) {
 
 	message := SanitiseLogs(fmt.Sprintf(format, a...))
 
-	ErrorWithMsg(message, nil)
+	ErrorWithMsg(nil, message)
 }
 
 func Warn(format string, a ...interface{}) {
@@ -280,7 +283,7 @@ func Warn(format string, a ...interface{}) {
 	}
 }
 
-func WarnWithFields(fields map[string]interface{}, err error) {
+func WarnWithFields(err error, fields map[string]interface{}) {
 	if disableLogging {
 		return
 	}
diff --git a/logs/logs_test.go b/logs/logs_test.go
index 4abfb867f46b800a6d5d6105abfe1175addea5d3..1aaac22976781b10f8a9f4787aae8e3370c10657 100644
--- a/logs/logs_test.go
+++ b/logs/logs_test.go
@@ -19,10 +19,10 @@ func TestLogs(t *testing.T) {
 
 	logs.InfoWithFields(map[string]interface{}{"a": 1, "b": 2}, "MyLogMessage1")
 	logs.Info("MyLogMessage2=%d,%d,%d", 1, 2, 3)
-	logs.ErrorWithFields(map[string]interface{}{"a": 4, "b": 5}, errors.Errorf("simple mistake"))
-	logs.ErrorWithMsg("Error Message", errors.Errorf("another simple mistake"))
+	logs.ErrorWithFields(errors.Errorf("simple mistake"), map[string]interface{}{"a": 4, "b": 5})
+	logs.ErrorWithMsg(errors.Errorf("another simple mistake"), "Error Message")
 	logs.Warn("Warning about a=%s,%s,%s", "a", "b", "c")
-	logs.WarnWithFields(map[string]interface{}{"a": 4, "b": 5}, errors.Errorf("Cant believe it failed"))
+	logs.WarnWithFields(errors.Errorf("Cant believe it failed"), map[string]interface{}{"a": 4, "b": 5})
 	logs.SQLDebugInfo("SELECT * from user")
 	// logs.LogRequestInfo(event)
 	// api_logs.LogSQSEvent(sqsEvent)
diff --git a/redis/redis.go b/redis/redis.go
index 98972ed47dd4b2d58667a83ceff76db2f5d59f1f..8b6f3ee90e61adc85730839b897cbaa2a909809c 100644
--- a/redis/redis.go
+++ b/redis/redis.go
@@ -124,13 +124,13 @@ func (r ClientWithHelpers) SetObjectByKey(key string, object interface{}) {
 
 	jsonBytes, err := json.Marshal(object)
 	if err != nil {
-		logs.ErrorWithMsg("Error marshalling object to Redis: %s", err)
+		logs.ErrorWithMsg(err, "Error marshalling object to Redis: %s")
 		return
 	}
 
 	_, err = r.Client.Set(ctx, key, string(jsonBytes), 24*time.Hour).Result()
 	if err != nil {
-		logs.ErrorWithMsg(fmt.Sprintf("Error setting value to Redis for key: %s", key), err)
+		logs.ErrorWithMsg(err, "Error setting value to Redis for key: %s", key)
 
 		/* Prevent further calls in this execution from trying to connect and also timeout */
 		if strings.HasSuffix(err.Error(), "i/o timeout") {
@@ -146,13 +146,13 @@ func (r ClientWithHelpers) SetObjectByKeyWithExpiry(key string, object interface
 
 	jsonBytes, err := json.Marshal(object)
 	if err != nil {
-		logs.ErrorWithMsg("Error marshalling object to Redis: %s", err)
+		logs.ErrorWithMsg(err, "Error marshalling object to Redis: %s")
 		return
 	}
 
 	_, err = r.Client.Set(ctx, key, string(jsonBytes), expiration).Result()
 	if err != nil {
-		logs.ErrorWithMsg(fmt.Sprintf("Error setting value to Redis for key: %s", key), err)
+		logs.ErrorWithMsg(err, "Error setting value to Redis for key: %s", key)
 
 		/* Prevent further calls in this execution from trying to connect and also timeout */
 		if strings.HasSuffix(err.Error(), "i/o timeout") {
@@ -168,13 +168,13 @@ func (r ClientWithHelpers) SetObjectByKeyIndefinitely(key string, object interfa
 
 	jsonBytes, err := json.Marshal(object)
 	if err != nil {
-		logs.ErrorWithMsg("Error marshalling object to Redis", err)
+		logs.ErrorWithMsg(err, "Error marshalling object to Redis")
 		return
 	}
 
 	_, err = r.Client.Set(ctx, key, string(jsonBytes), 0).Result()
 	if err != nil {
-		logs.ErrorWithMsg(fmt.Sprintf("Error setting value to Redis for key: %s", key), err)
+		logs.ErrorWithMsg(err, "Error setting value to Redis for key: %s", key)
 
 		/* Prevent further calls in this execution from trying to connect and also timeout */
 		if strings.HasSuffix(err.Error(), "i/o timeout") {
@@ -237,7 +237,7 @@ func (r ClientWithHelpers) RateLimit(key string, limitFn func(int) redis_rate.Li
 	limiter := redis_rate.NewLimiter(r.Client)
 	res, err := limiter.Allow(ctx, key, limitFn(limit))
 	if err != nil {
-		logs.ErrorWithMsg(fmt.Sprintf("Redis Error rate limiting - %s", key), err)
+		logs.ErrorWithMsg(err, "Redis Error rate limiting - %s", key)
 
 		/* Prevent further calls in this execution from trying to connect and also timeout */
 		if strings.HasSuffix(err.Error(), "i/o timeout") {
@@ -280,7 +280,7 @@ func (r ClientWithHelpers) SetLockKey(key string, expiration time.Duration, lock
 	for retries >= 0 {
 		success, err = r.Client.SetNX(ctx, key, value, expiration).Result()
 		if err != nil {
-			logs.ErrorWithMsg(fmt.Sprintf("Error setting lock key %s", key), err)
+			logs.ErrorWithMsg(err, "Error setting lock key %s", key)
 
 			// Prevent further calls in this execution from trying to connect and also timeout
 			if strings.HasSuffix(err.Error(), "i/o timeout") {
diff --git a/ses/ses.go b/ses/ses.go
index 3b281ca83706f2669322cc33a4eb02f8ecc8e455..be6a991bdf2cc5d85752e7907d7cc363018e29b4 100644
--- a/ses/ses.go
+++ b/ses/ses.go
@@ -3,7 +3,6 @@ package ses
 import (
 	"bytes"
 	"context"
-	"fmt"
 	"github.com/aws/aws-sdk-go-v2/aws"
 	"github.com/aws/aws-sdk-go-v2/config"
 	"github.com/aws/aws-sdk-go-v2/service/ses"
@@ -151,13 +150,13 @@ func (c *ClientWithHelpers) SendEmail(email Email, emfNamespace string, isDebug
 
 		switch errors.AWSErrorExceptionCode(err) {
 		case messageRejectedErrorCode, mailFromDomainNotVerifiedErrorCode, configurationSetDoesNotExistErrorCode:
-			logs.ErrorWithMsg(errors.AWSErrorExceptionCode(err), err)
+			logs.ErrorWithMsg(err, errors.AWSErrorExceptionCode(err))
 		case InvalidParameterValueErrorString:
 			// Ignore errors due to invalid email addresses - we don't want to log it to raygun
 			logs.Warn(err.Error())
 			err = nil
 		default:
-			logs.ErrorWithMsg("Failed to send email", err)
+			logs.ErrorWithMsg(err, "Failed to send email")
 		}
 
 		if emfNamespace != "" {
@@ -187,14 +186,14 @@ func addAttachmentsToEmail(msg *gomail.Message, attachment s3.S3UploadResponse,
 	// Get object from S3
 	object, err := s3.GetClient(isDebug).GetObject(attachment.Bucket, attachment.Filename, isDebug)
 	if err != nil {
-		logs.ErrorWithMsg(fmt.Sprintf("Failed to get S3 object from bucket %s filename %s", attachment.Bucket, attachment.Filename), err)
+		logs.ErrorWithMsg(err, "Failed to get S3 object from bucket %s filename %s", attachment.Bucket, attachment.Filename)
 		return err
 	}
 	defer object.Body.Close()
 
 	attachmentBytes, err := io.ReadAll(object.Body)
 	if err != nil {
-		logs.ErrorWithMsg("Could not encode attachment for email", err)
+		logs.ErrorWithMsg(err, "Could not encode attachment for email")
 		return err
 	}
 
diff --git a/slack_utils/slack_utils.go b/slack_utils/slack_utils.go
index 1d35bc19786454f2fb49995eea71d867a62ecf9e..f3ca9eceb76ba64e06a9fc83e653785e152bd100 100644
--- a/slack_utils/slack_utils.go
+++ b/slack_utils/slack_utils.go
@@ -47,7 +47,7 @@ func (s *SlackClient) SendAlertWithFields(message string, channel string, slackF
 	if s == nil || s.Client == nil {
 		// If the slack client isn't set, log the message to Raygun instead
 		slackFieldMap := slackFieldsToMap(slackFields)
-		logs.ErrorWithFields(slackFieldMap, errors.Error(message))
+		logs.ErrorWithFields(errors.Error(message), slackFieldMap)
 		return ""
 	}
 
@@ -111,7 +111,7 @@ func (s *SlackClient) SendAlertWithFields(message string, channel string, slackF
 func (s *SlackClient) postMessage(channel string, messageOptions []slack.MsgOption) string {
 	_, messageTimestamp, err := s.Client.PostMessage(channel, messageOptions...)
 	if err != nil {
-		logs.ErrorWithMsg("Error sending slack: %v+\n", err)
+		logs.ErrorWithMsg(err, "Error sending slack:")
 	}
 	return messageTimestamp
 }
diff --git a/sqs/sqs.go b/sqs/sqs.go
index 0d0259ff033a771a50034fe9cca477a5cc87eb3d..a51408237869c6c3dec00ed819aab286cbf6b200 100644
--- a/sqs/sqs.go
+++ b/sqs/sqs.go
@@ -6,10 +6,12 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
-	"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/utils"
 	"io"
+	"sync"
 	"time"
 
+	"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/utils"
+
 	"github.com/google/uuid"
 	"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/s3"
 
@@ -108,7 +110,10 @@ func (m *Messenger) SendSQSMessage(headers map[string]string, body string, curre
 func SendSQSMessage(msgr Messenger, objectToSend interface{}, currentRequestID *string, sqsType string, isDebug bool) error {
 
 	if isDebug {
+		var wg sync.WaitGroup
+		wg.Add(1)
 		go func() {
+			defer wg.Done()
 			if msgr.DelaySeconds != nil {
 				delay := *msgr.DelaySeconds
 				time.Sleep(time.Second * time.Duration(delay))
@@ -118,6 +123,7 @@ func SendSQSMessage(msgr Messenger, objectToSend interface{}, currentRequestID *
 				Post("http://127.0.0.1:3000/sqs/" + sqsType)
 		}()
 		time.Sleep(time.Second * 1)
+		wg.Wait()
 		return nil
 	}
 
@@ -125,13 +131,13 @@ func SendSQSMessage(msgr Messenger, objectToSend interface{}, currentRequestID *
 		var err error
 		sqsClient, err = NewSQSClient(msgr.Region)
 		if err != nil {
-			logs.ErrorWithMsg("Failed to create sqs client", err)
+			logs.ErrorWithMsg(err, "Failed to create sqs client")
 		}
 	}
 
 	jsonBytes, err := json.Marshal(objectToSend)
 	if err != nil {
-		logs.ErrorWithMsg("Failed to encode sqs event data", err)
+		logs.ErrorWithMsg(err, "Failed to encode sqs event data")
 		return err
 	}
 
@@ -159,7 +165,7 @@ func SendSQSMessage(msgr Messenger, objectToSend interface{}, currentRequestID *
 
 	msgID, err := msgr.SendSQSMessage(headers, message, currentRequestID, sqsType)
 	if err != nil {
-		logs.ErrorWithMsg("Failed to send sqs event", err)
+		logs.ErrorWithMsg(err, "Failed to send sqs event")
 		return err
 	}
 
@@ -191,7 +197,7 @@ func RetrieveMessageFromS3(client *s3.ClientWithHelpers, bucket string, filename
 	var bodyBytes []byte
 	bodyBytes, err = io.ReadAll(rawObject.Body)
 	if err != nil {
-		logs.ErrorWithMsg("Could not read file", err)
+		logs.ErrorWithMsg(err, "Could not read file")
 		return []byte{}, err
 	}