Apples = apples. Always.
GA4 says "sessions". Meta says "reach". Google Ads says "impressions". Stripe says "successful_payments". A naive AI gets lost or compares apples to oranges. Our canonical layer normalizes everything into one shared metric vocabulary.
Same idea, four different words across four tools. Same word, different definitions across tools (a "session" in GA4 ≠ a "session" in Adobe). Without normalization, the AI either guesses wrong or refuses to compare. We don't guess.
Every metric in every connector has an explicit mapping to a canonical key (e.g. ga4.sessions → sessions_all, meta_ads.impressions → impressions_paid_social).
Currency conversions, timezone normalization (everything in your workspace timezone), and date alignment happen here. No timezone-shift surprises.
Each canonical metric carries a 0-100 confidence score. Bad data from a flaky API drops the score, and the AI flags it instead of pretending the number is solid.
Every canonical metric value links back to its source row(s). One click to see the GA4 / Meta / Stripe response that produced it.
LLMs are pattern matchers, feed them inconsistent naming and they will confidently confuse "reach" with "impressions". Feed them one canonical schema and they reason cleanly. This is the foundation that makes cross-source questions work: "What's my CAC blended across all paid channels?" only has an answer because the canonical layer knows how to combine spend + conversions across sources.
It’s published in our docs, full transparency on what we normalize and how.
Start the free trial