# Your Ordinary revenue matches Shopify exactly

> Unlike attribution or pixel-tracked sessions, your revenue totals in Ordinary match Shopify's Sales report to the cent — and we check it every hour.

Source: https://help.tryordinary.com/features/reconciliation

---

Your total revenue in Ordinary equals what Shopify's Sales report shows.
Same number, same currency, same day boundary. If the two ever disagree
by more than a penny, our automated system catches it within an hour.

This is the foundation of every revenue-based report you'll see in
Ordinary — dashboard totals, LTV, net margin, cohort revenue. All of
them ultimately roll up to "what did this store make?" and we treat
that as a question with exactly one correct answer.

## Why this matters

Most analytics tools for Shopify are approximate. They sample, they
interpolate, they filter, and over weeks or months the numbers drift.
Merchants notice at quarter-close when the reported revenue doesn't
match their accountant's and lose trust in the whole tool.

Ordinary's design principle: if a number can be exact, it should be.
Revenue can be exact. So revenue IS exact.

## What we reconcile against

Shopify's built-in **Sales report** is the source of truth. Our totals
match that report for the same date range, in the shop's base currency,
with the same timezone bucketing.

Specifically, we match:

- **Gross revenue** per day
- **Refund totals** per day (items-only, matching Shopify's "Returns"
  column)
- **Net revenue** per day (gross minus all refund components including
  shipping and tax refunds)
- **Order counts** per day

## How we keep it matching

### On ingest

Every order and refund that flows into Ordinary — via Shopify webhook,
via our full-history sync on first install, or via manual re-sync — is
stored as its underlying components, not just a precomputed total. We
store every value Shopify's own accounting math uses rather than a
single "total" that we'd have to hope reconciles later.

That includes tips (excluded from Shopify's total sales formula),
discounts, processing timestamps, and the split between items and
shipping and tax inside every refund. When Shopify revises their
reporting formula in a future API version, we already have all the
inputs.

### Every hour

An automated reconciliation runs hourly. It compares our totals
against Shopify's Sales report for the last 3 closed days — a window
long enough for Shopify's own numbers to settle, short enough to catch
any drift the same day it happens.

### When drift happens

Ordinary's automated checks flag any discrepancy within the hour,
down to the exact day and component that differ. We don't silently
patch the number — we investigate and correct the ingest path so the
underlying cause is fixed. The policy: every drift class is a bug, not
a metric to manage.

## When does this kick in for a new merchant?

Immediately on first install. When you connect Shopify to Ordinary,
we automatically pull your full order history into Ordinary. Within
a few minutes to an hour (depending on your order volume), your
numbers are live. The hourly reconciliation then watches for any
divergence from that point forward.

## What if I find a mismatch?

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

- The specific date range you're comparing
- The number you see in Shopify's Sales report
- The number you see in Ordinary
- A screenshot of both, if possible

This is exactly the feedback loop we want — a merchant-reported
mismatch points our hourly checks at an edge case they haven't
exercised yet (usually a feature that merchant uses but none of our
reconciled merchants had touched), so we can tighten the ingest path
and keep your totals matched to the cent.

## Related articles

- [Attribution numbers don't match Shopify](https://help.tryordinary.com/troubleshooting/attribution-mismatch)
  — a DIFFERENT thing: attribution is approximate by nature (which
  channel drove this customer?), revenue is exact
- [Connecting Shopify](https://help.tryordinary.com/integrations/shopify)
- [Dashboard](https://help.tryordinary.com/features/dashboard)
