Private beta Join the waitlist →
Canonical Metrics Layer

One vocabulary for every source.

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.

schema · canonical_metrics
live
Raw sources
GA4sessions
Metareach
Google Adsimpressions
Canonical layer
sessions_all
confidence 96 · tz Europe/Paris

The naming chaos

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.

How the layer works

1. Source mapping

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).

2. Type-safe transforms

Currency conversions, timezone normalization (everything in your workspace timezone), and date alignment happen here. No timezone-shift surprises.

3. Confidence score

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.

4. Audit trail

Every canonical metric value links back to its source row(s). One click to see the GA4 / Meta / Stripe response that produced it.

Canonical keys (sample)

Why this matters for AI quality

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.

Want to see the canonical schema?

It’s published in our docs, full transparency on what we normalize and how.

Start the free trial