# Attribution numbers don't match Shopify

> Why Ordinary's attributed orders/revenue will always differ slightly from Shopify's built-in reports, and when the gap matters.

Source: https://help.tryordinary.com/troubleshooting/attribution-mismatch

---

You'll often notice Ordinary's **attribution report** shows slightly
different order counts or revenue from Shopify's built-in Sales
reports. This is normal and expected — here's why.

> **Important distinction**: this article is about ATTRIBUTION (which
> channel drove a sale — by nature approximate). Your **total revenue**
> in Ordinary DOES match Shopify's Sales report exactly, to the cent —
> see [Revenue matches Shopify exactly](https://help.tryordinary.com/features/reconciliation).
> If your total revenue numbers disagree with Shopify, that's a bug we
> want to hear about, not expected behavior.

## They're measuring different things

| What it counts | Shopify Sales | Ordinary Attribution |
|---|---|---|
| Includes orders with no visitor data | Yes | Only those we can attribute |
| Includes draft orders / manual orders | Yes | Usually no (no pixel data) |
| Uses which timestamp | Order creation | Session start of the attributed click |
| Currency handling | Shop currency | Your display currency, FX-converted |
| Tax / shipping in revenue | Configurable in Shopify | Configurable in Ordinary |

So even if everything's working perfectly, expect:

- **Ordinary shows fewer orders** than Shopify's total — we can only
  attribute orders where we saw pixel activity.
- **Revenue may differ by 1-3%** due to FX timing and tax/shipping
  config.

## How big a gap is normal?

- **Within 5%** on order count: typical for a well-instrumented store.
- **Within 2%** on revenue: typical if tax and FX are configured
  consistently.
- **More than 10%** missing: something's probably off. Investigate.

## Common causes of larger gaps

### Pixel not firing on all pageviews

If your pixel is Disconnected or firing inconsistently, sessions are
missing, and we can't attribute their orders. See
[Pixel says "Disconnected"](https://help.tryordinary.com/troubleshooting/pixel-disconnected).

Check the **Pixel events (last 5 min)** counter on Settings →
Integrations → Shopify.

### Orders from channels the pixel can't see

- **Amazon orders** — different storefront; can't be attributed.
  They show in Campaigns → Amazon as Amazon-attributed, not as
  Shopify orders.
- **Phone orders / draft orders** — no pixel data, no attribution
  possible.
- **Point of Sale (POS) orders** — in-person retail doesn't fire the
  web pixel. These show as "Direct" or "No attribution" depending on
  your model.

### Orders from before your pixel was installed

If you installed Ordinary recently, orders placed before install
have no attribution — we didn't see the sessions that led to them.
They show in revenue / order totals (those come from Shopify), but
they won't appear in session-based breakdowns like Traffic or the
attribution funnel. That's intentional: we don't backfill session
data from other analytics tools because the number has to come from
one source to be trustworthy.

### Customer-chose-Shop-Pay-long-ago

Shop Pay autofills cart and can sometimes skip the full checkout
funnel. We still attribute these, but some edge cases (Apple Pay,
Shop Pay express, guest checkouts with ad-blocker) slip through.

### Tax / shipping config mismatch

In Ordinary Settings → Reporting:

- "Include tax in revenue" — default **off**.
- "Include shipping in revenue" — default **off**.

If Shopify reports are configured to include these and yours doesn't,
revenue will be 10-20% lower than Shopify.

### Timezone

Shopify's Sales reports default to your shop timezone. Ordinary
defaults to UTC unless you've set a display timezone in Settings.
A single order can fall on different calendar days across the two
systems depending on the checkout time.

## When to be worried

Worry about the mismatch when:

- It's **suddenly larger** than it's been — something changed.
  Check pixel status first.
- Specific campaigns show **drastic under-attribution**. A campaign
  you know is driving revenue showing zero orders is a red flag for
  UTM-tagging issues.
- **Session counts** diverge dramatically from GA4 or PostHog on
  the same days. Some divergence is expected — GA4 / PostHog use
  different session definitions, bot filtering, and client-side
  sampling, so the numbers will never match exactly. But if Ordinary
  is showing materially fewer sessions than either tool on the same
  days, that's a pixel coverage issue worth investigating (ad
  blockers, consent gates, Shop Pay / direct checkout bypass).

## Still unsure?

Email [sales@tryordinary.com](mailto:sales@tryordinary.com) with:

- Specific order IDs you expect to see attributed but aren't.
- The date range you're comparing.
- Screenshots of both Shopify's and Ordinary's revenue for that range.

## Related articles

- [Attribution models explained](https://help.tryordinary.com/concepts/attribution-models)
- [What is a first-party pixel?](https://help.tryordinary.com/concepts/first-party-pixel)
- [Pixel says "Disconnected"](https://help.tryordinary.com/troubleshooting/pixel-disconnected)
