diff --git a/semantic_router/schema.py b/semantic_router/schema.py
index adb881fa1cedf56a2e103b7208e2b518e1bf0799..2a94b3559f572dd878355ad19b1ab3ffdbd25108 100644
--- a/semantic_router/schema.py
+++ b/semantic_router/schema.py
@@ -1,6 +1,7 @@
 from datetime import datetime
 from difflib import Differ
 from enum import Enum
+import json
 import numpy as np
 from typing import List, Optional, Union, Any, Dict, Tuple
 from pydantic import BaseModel, Field
@@ -126,7 +127,18 @@ class Utterance(BaseModel):
 
     def to_str(self, include_metadata: bool = False):
         if include_metadata:
-            return f"{self.route}: {self.utterance} | {self.function_schemas} | {self.metadata}"
+            # we sort the dicts to ensure consistent order as we need this to compare
+            # stringified function schemas accurately
+            if self.function_schemas is not None:
+                function_schemas_sorted: List[str] | None = [
+                    json.dumps(schema, sort_keys=True)
+                    for schema in self.function_schemas
+                ]
+            else:
+                function_schemas_sorted = None
+            # we must do the same for metadata
+            metadata_sorted = json.dumps(self.metadata, sort_keys=True)
+            return f"{self.route}: {self.utterance} | {function_schemas_sorted} | {metadata_sorted}"
         return f"{self.route}: {self.utterance}"
 
     def to_diff_str(self, include_metadata: bool = False):
diff --git a/tests/unit/test_sync.py b/tests/unit/test_sync.py
index 2f19236b5e8063f1768e4f26eb43cc9f480db377..8e73de34e740562981716e2aafb1a32f29e86620 100644
--- a/tests/unit/test_sync.py
+++ b/tests/unit/test_sync.py
@@ -283,8 +283,8 @@ class TestSemanticRouter:
         if index_cls is PineconeIndex:
             time.sleep(PINECONE_SLEEP)  # allow for index to be populated
         diff = route_layer_2.get_utterance_diff(include_metadata=True)
-        assert "+ Route 1: Hello | None | {'type': 'default'}" in diff
-        assert "+ Route 1: Hi | None | {'type': 'default'}" in diff
+        assert '+ Route 1: Hello | None | {"type": "default"}' in diff
+        assert '+ Route 1: Hi | None | {"type": "default"}' in diff
         assert "- Route 1: Hello | None | {}" in diff
         assert "+ Route 2: Au revoir | None | {}" in diff
         assert "- Route 2: Hi | None | {}" in diff