Why Shopify and Admaxxer Revenue Numbers Disagree

TL;DR: Admaxxer reports net product revenue at the moment of purchase, in your reporting currency, deduplicated against your checkout. Shopify's dashboard reports gross sales (including tax and shipping), in the order's transaction currency, refund-adjusted at the order date. Both numbers are correct. They are not the same number. This guide walks through the seven canonical causes of disagreement and gives you a reconciliation checklist.

Why this happens — seven canonical causes

1. Refund timing

The single most common cause of mismatch.

Two reports, looked at in two different weeks, will show different revenue for the same window — even though both are "right" within their own definition. To compare: switch Shopify's "applied" date to "Refund date" or use the net_sales field, which never retroactively rewrites.

2. Currency conversion timing

If you sell in multiple currencies (USD + EUR + GBP), every report has to settle on one display currency. The question is: which exchange rate?

If your store sells in 3+ currencies, this is rarely a 1:1 cause but it is always a measurable contributor. See Multi-currency architecture for how Admaxxer normalizes.

3. Tax and shipping inclusion

Admaxxer's default revenue metric is net product revenue — the line items, before tax, before shipping, before tip. The Shopify dashboard headline number is gross sales, which often includes:

For a US store with 8% sales tax + $10 shipping per order, gross sales can run 15–25% above net product revenue. Neither number is wrong. They are different definitions. To match them: either configure Shopify to display net product revenue, or configure Admaxxer to report gross (Workspace settings › Revenue › "include shipping + tax").

4. Quarantined payment events (GL#357)

This one is real and worth surfacing: until 2026-05-05 a class of payment events were silently quarantined by our Tinybird ingestion layer because of how strict-mode columns interact with optional fields. The fix landed in production on the date above; rows ingested before then may be missing from visitor_payments. If you are reconciling a window before May 2026 and seeing material gaps that aren't explained by causes 1–3 above, this could be the cause. Contact support with your workspace ID and the date range and we'll re-ingest from the upstream source.

5. Discount handling

Discounts get reported in different places by different systems:

If your discount-active days don't match between systems, check which Shopify report you are reading. The Sales report's net_sales column is the closest equivalent to Admaxxer's revenue.

6. Subscription rebill vs new sale

If you sell subscriptions (Shopify subscriptions, Stripe billing, Recharge, etc.), there are two distinct revenue events: the initial purchase and each subsequent rebill. Admaxxer treats them as different events for cohort and LTV reporting:

Some Shopify reports double-count rebills as new sales (especially if the subscription provider creates fresh order records). If your headline revenue in Shopify is materially higher than Admaxxer's, check whether subscription rebills are being counted twice in Shopify. See Cohort LTV in the Metric Glossary for how Admaxxer separates the two.

7. Test orders and excluded modes

Both systems by default exclude test-mode orders, but the rules are not identical:

Reconciliation checklist

Run through this list in order. Most "mismatch" tickets resolve at step 3 or 4.

  1. Both reports cover the same window in the same timezone.
  2. Both reports use the same revenue definition (net product revenue, in reporting currency, post-discount, refund-at-event-date).
  3. Refund timing aligned. Compare Shopify "Net sales" not "Total sales".
  4. FX rates aligned (pick one source — usually Admaxxer's spot rate at purchase).
  5. Tax + shipping inclusion explicitly chosen on both sides.
  6. Subscription rebills counted exactly once.
  7. Test/draft orders excluded on both sides.
  8. If still >3% off after steps 1–7: check missing orders; the gap may be webhook-delivery, not revenue-definition.

Diagnostic queries

# Total Admaxxer revenue for a window, normalized
# Run this in your Admaxxer dashboard's chat or against the API:
SELECT
  toDate(payment_at) as day,
  SUM(amount_usd) as revenue_net_usd,
  SUM(amount_native) as revenue_native,
  COUNT(DISTINCT order_id) as orders
FROM visitor_payments
WHERE workspace_id = {YOUR_WORKSPACE_ID}
  AND payment_at >= toDate('2026-04-01')
  AND payment_at < toDate('2026-05-01')
  AND status = 'paid'
GROUP BY day
ORDER BY day;

Then in Shopify Admin › Analytics › Reports › Sales:

Day-by-day totals should now agree within ±1%. If a specific day is off by >5%, there's a real ingest issue on that day — see "When to escalate".

Worked example

For the same DTC supplement brand we used in the attribution-discrepancies guide, the week of 2026-04-21:

SourceRevenueDefinition
Shopify "Total sales" (default)$28,420Gross + tax + shipping, refund-rewritten
Shopify "Net sales"$24,890Post-discount, post-refund (event-date)
Admaxxer revenue (default)$24,710Net product revenue, post-discount, refund at event
Difference Admaxxer ↔ Shopify Net$180 (0.7%)Within FX-timing variance for a $25k week

The headline gap looked huge ($28,420 vs $24,710 = 13%). Once tax+shipping was excluded and refund-timing aligned, the residual gap was 0.7% — well within the FX timing variance for a multi-currency store.

When to escalate

Open a support ticket (/support) when:

Include the date range, the Shopify report you're comparing against, and a screenshot of both totals.

See also

Metric Glossary · Attribution discrepancies · Missing orders · Multi-currency architecture · Shopify revenue connector · Meta vs Shopify purchase mismatch