diff --git a/wasm/broadcast.go b/wasm/broadcast.go
index 456027b4c63828ac80578ebecc5eea62dea9b7cf..e3f05e416e38918e636100bf47b504200716b191 100644
--- a/wasm/broadcast.go
+++ b/wasm/broadcast.go
@@ -67,7 +67,7 @@ type broadcastListener struct {
 }
 
 func (bl *broadcastListener) Callback(payload []byte, err error) {
-	bl.callback(utils.CopyBytesToJS(payload), err.Error())
+	bl.callback(utils.CopyBytesToJS(payload), utils.JsTrace(err))
 }
 
 // Listen registers a BroadcastListener for a given method. This allows users to
diff --git a/wasm/e2eHandler.go b/wasm/e2eHandler.go
index 8d6efc63c5e015936230de093d71cf78c0b9b336..02f2a733fad36aaa393755d353a929a07f70ce67 100644
--- a/wasm/e2eHandler.go
+++ b/wasm/e2eHandler.go
@@ -181,8 +181,8 @@ type processor struct {
 
 func (p *processor) Process(
 	message, receptionId []byte, ephemeralId, roundId int64) {
-	p.process(utils.CopyBytesToJS(message), utils.CopyBytesToJS(receptionId), ephemeralId,
-		roundId)
+	p.process(utils.CopyBytesToJS(message), utils.CopyBytesToJS(receptionId),
+		ephemeralId, roundId)
 }
 
 func (p *processor) String() string {
diff --git a/wasm/fileTransfer.go b/wasm/fileTransfer.go
index 1a7d7953f29f42d54f569f75caf6547bce3f4a0c..1e2fa842359874994dd57723bfec0466d0efeb5b 100644
--- a/wasm/fileTransfer.go
+++ b/wasm/fileTransfer.go
@@ -56,7 +56,7 @@ type receiveFileCallback struct {
 }
 
 func (rfc *receiveFileCallback) Callback(payload []byte, err error) {
-	rfc.callback(utils.CopyBytesToJS(payload), err.Error())
+	rfc.callback(utils.CopyBytesToJS(payload), utils.JsTrace(err))
 }
 
 // fileTransferSentProgressCallback wraps Javascript callbacks to adhere to the
@@ -67,7 +67,8 @@ type fileTransferSentProgressCallback struct {
 
 func (spc *fileTransferSentProgressCallback) Callback(
 	payload []byte, t *bindings.FilePartTracker, err error) {
-	spc.callback(utils.CopyBytesToJS(payload), newFilePartTrackerJS(t), err.Error())
+	spc.callback(utils.CopyBytesToJS(payload), newFilePartTrackerJS(t),
+		utils.JsTrace(err))
 }
 
 // fileTransferReceiveProgressCallback wraps Javascript callbacks to adhere to
@@ -78,7 +79,8 @@ type fileTransferReceiveProgressCallback struct {
 
 func (rpc *fileTransferReceiveProgressCallback) Callback(
 	payload []byte, t *bindings.FilePartTracker, err error) {
-	rpc.callback(utils.CopyBytesToJS(payload), newFilePartTrackerJS(t), err.Error())
+	rpc.callback(utils.CopyBytesToJS(payload), newFilePartTrackerJS(t),
+		utils.JsTrace(err))
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/wasm/group.go b/wasm/group.go
index d19da538da36abca4fde43c428529976f6b97eba..b60dcb0b15c02502bec9c8c8e9d5049894b50258 100644
--- a/wasm/group.go
+++ b/wasm/group.go
@@ -357,8 +357,9 @@ type groupChatProcessor struct {
 
 func (gcp *groupChatProcessor) Process(decryptedMessage, msg,
 	receptionId []byte, ephemeralId, roundId int64, err error) {
-	gcp.callback(utils.CopyBytesToJS(decryptedMessage), utils.CopyBytesToJS(msg),
-		utils.CopyBytesToJS(receptionId), ephemeralId, roundId, err.Error())
+	gcp.callback(utils.CopyBytesToJS(decryptedMessage),
+		utils.CopyBytesToJS(msg), utils.CopyBytesToJS(receptionId), ephemeralId,
+		roundId, utils.JsTrace(err))
 }
 
 func (gcp *groupChatProcessor) String() string {
diff --git a/wasm/restlikeSingle.go b/wasm/restlikeSingle.go
index bcc5e93a74d67028b0489a2e5148d1c0323b307f..53f5070f25d86baa60f6d4172553ffcd603be1ea 100644
--- a/wasm/restlikeSingle.go
+++ b/wasm/restlikeSingle.go
@@ -22,7 +22,7 @@ type restlikeCallback struct {
 }
 
 func (rlc *restlikeCallback) Callback(payload []byte, err error) {
-	rlc.callback(utils.CopyBytesToJS(payload), err.Error())
+	rlc.callback(utils.CopyBytesToJS(payload), utils.JsTrace(err))
 }
 
 // RequestRestLike sends a restlike request to a given contact.
diff --git a/wasm/single.go b/wasm/single.go
index 7a55ffa7a876b5ab60b42d683ce7e852357f5cc3..a322d55d21209ce52e05209617429233b47e7516 100644
--- a/wasm/single.go
+++ b/wasm/single.go
@@ -115,7 +115,7 @@ type singleUseCallback struct {
 }
 
 func (suc *singleUseCallback) Callback(callbackReport []byte, err error) {
-	suc.callback(utils.CopyBytesToJS(callbackReport), err.Error())
+	suc.callback(utils.CopyBytesToJS(callbackReport), utils.JsTrace(err))
 }
 
 // singleUseResponse wraps Javascript callbacks to adhere to the
@@ -125,5 +125,5 @@ type singleUseResponse struct {
 }
 
 func (sur *singleUseResponse) Callback(responseReport []byte, err error) {
-	sur.callback(utils.CopyBytesToJS(responseReport), err.Error())
+	sur.callback(utils.CopyBytesToJS(responseReport), utils.JsTrace(err))
 }
diff --git a/wasm/ud.go b/wasm/ud.go
index 1c0198a753bfe5c0c2f11ccdd0ef3f06f6cd9618..f57b31ac6ef130a2c57ebe2c78b4da54ea87d6f2 100644
--- a/wasm/ud.go
+++ b/wasm/ud.go
@@ -286,7 +286,7 @@ type udLookupCallback struct {
 }
 
 func (ulc *udLookupCallback) Callback(contactBytes []byte, err error) {
-	ulc.callback(utils.CopyBytesToJS(contactBytes), err.Error())
+	ulc.callback(utils.CopyBytesToJS(contactBytes), utils.JsTrace(err))
 }
 
 // LookupUD returns the public key of the passed ID as known by the user
@@ -332,7 +332,7 @@ type udSearchCallback struct {
 }
 
 func (usc *udSearchCallback) Callback(contactListJSON []byte, err error) {
-	usc.callback(utils.CopyBytesToJS(contactListJSON), err.Error())
+	usc.callback(utils.CopyBytesToJS(contactListJSON), utils.JsTrace(err))
 }
 
 // SearchUD searches user discovery for the passed Facts. The searchCallback