PostlytixGuidesWhy your e-commerce revenue numbers never match
Pillar guide

Why your revenue numbers
never match.

Four tools, four different totals for the same month. Here is what each one is actually measuring, why they can all be right at once, and which number belongs in your P&L.

You close the month and pull the number four times. Shopify says $1.85M. GA4 says $1.74M. Klaviyo says email alone drove $412,000. Meta says its campaigns drove $530,000. Add the channel numbers together and you get more revenue than you actually sold.

Nothing here is broken. Every one of those systems is reporting accurately against its own definition. The problem is that you are treating four different measurements as four attempts at the same measurement, and they were never that.

The three reasons the numbers separate

1. They are not counting the same object

Shopify counts orders. An order is a discrete thing with an ID, a timestamp and a dollar value, recorded server-side when payment authorizes. It cannot be missed.

GA4 counts sessions in which a purchase event fired in a browser. That is a fundamentally weaker claim. If the customer declined your consent banner, ran an ad blocker, closed the tab before the confirmation page rendered, or started on their phone and finished on a laptop, GA4 either misses the purchase or attributes it somewhere strange. Shopify has the order regardless.

Klaviyo counts profiles. Its revenue figure answers "how much did people who received our email spend," which is a question about correlation, not causation. Meta counts conversions it can tie back to an ad impression or click inside its own attribution window, measured on its own infrastructure, using data you cannot audit.

Four systems, four units: orders, sessions, profiles, ad interactions. They will never reconcile exactly because they are not measuring the same thing.

2. They cut the month at different moments

This one is boring and it moves real money. Your Shopify store has a timezone. Your GA4 property has a timezone, which defaults to whatever was selected at setup and is frequently wrong. Klaviyo has an account timezone. Meta reports in the ad account's timezone.

If any two of those disagree, they are drawing the month boundary at different hours, and every monthly comparison you make inherits the offset. On a brand doing $60,000 a day, a two-hour boundary difference reliably shifts a five-figure sum between months. It does not average out, because it lands in the same direction every single month.

3. Every platform claims the same order, and nothing deduplicates

A customer sees a Meta ad on Tuesday, opens your Klaviyo campaign on Thursday, gets an SMS on Friday, and buys on Saturday. Meta counts that order. Klaviyo counts that order. Postscript counts that order. All three are telling the truth about their own involvement.

There is no arbitration layer. No system is dividing one order into fractional credit across the channels that touched it, because no system can see the others. This is why summing your channel reports produces a number larger than your actual sales, and why "which channel drove growth" is a much harder question than any single dashboard makes it look.

What this looks like on a real month

Here is one month for Crestline Co., a simulated outdoor brand doing roughly $1.85M a month that we use to demonstrate how the arithmetic behaves.

What you look atReportsWhat it is actually counting
Shopify, gross sales$1,982,000Every order placed, before discounts and returns
Shopify, net sales$1,850,000After $84,000 discounts and $48,000 returns
GA4, purchase revenue$1,743,400Sessions where the purchase tag successfully fired
Klaviyo, attributed$412,000Orders within 5 days of an email open or click
Meta Ads, reported$530,000Orders inside a 7-day click, 1-day view window
Postscript, attributed$96,000Orders inside its own SMS window

Crestline Co. is a simulated DTC brand used for demonstration. These figures are illustrative and are not a client result.

Two things fall out of that table.

The GA4 gap is $106,600, or 5.8 percent. That is squarely in the normal range. Consent declines, ad blockers and cross-device purchases account for nearly all of it. If you went looking for a tracking bug here you would waste a week and find nothing, because there is nothing to find. A gap above roughly 10 percent, or a gap that appears suddenly between two months, is the one worth chasing.

The channel numbers claim $1,038,000 of $1,850,000. Email, paid social and SMS together assert they drove 56 percent of net sales. But GA4's last-click model, looking at the identical set of orders, assigns those same three channels only $761,000. That is a $277,000 disagreement about which orders belong to whom, and neither view is wrong. Klaviyo is asking "did an email touch this buyer recently," GA4 is asking "what was the last thing they clicked." Different questions, same orders.

Which number belongs in your P&L

Shopify net sales, reconciled against what actually settled in Stripe. That is the only pair in the list where one system records the obligation and another records the cash, which is what lets you catch a genuine error rather than a definitional difference.

GA4, Klaviyo and Meta are marketing measurement tools. They are useful for directional questions about channels and creative. None of them are accounting systems, none were built to be, and the moment one of their numbers reaches a board deck as revenue, you have a problem that compounds quietly.

A practical rule. Before anyone acts on a revenue figure, make them say which system it came from and what that system counts. Most bad budget decisions we see are not caused by bad data. They are caused by a correct number being asked a question it was never built to answer.

What to actually do about it

  1. Align every timezone to your commerce platform. An hour of settings work removes a recurring error from every monthly comparison you will make from now on. Do this one first because it is free.
  2. Write down which number answers which question, and put it somewhere the whole team sees. One sentence per system is enough.
  3. Stop summing channel-attributed revenue. The total is meaningless. Compare each channel against its own trend instead.
  4. Reconcile net sales to settled deposits monthly. This is the check that catches real problems: failed captures, chargebacks, refunds processed outside the platform.
  5. Tighten your attribution windows before you trust the reports, particularly Klaviyo's open-based attribution, which is the single most inflated number in the standard DTC stack.

Where this goes wrong in practice: the discrepancy is rarely the actual problem. The problem is the decision made on top of it, like a campaign scaled because its attributed ROAS looked strong while its contribution margin was negative. Postlytix reads across your commerce, support, ads, email and finance data at once and surfaces where those decisions are quietly costing you margin. That is the part no single dashboard can see, because the answer lives between them.

Common questions

Which revenue number should I actually use?
Your commerce platform's net sales, reconciled to your payment processor's settlements. Shopify records the order, Stripe records the money that cleared. Everything else, GA4, Klaviyo, Meta, is a marketing measurement tool, and none of them are accounting systems. Use those for directional decisions about channels, never for your P&L.
Why does the sum of my channel revenue exceed my total revenue?
Because every platform claims an order independently and nothing deduplicates between them. A customer who clicks a Meta ad, opens a Klaviyo email, then buys is counted once by Meta and once by Klaviyo. Each platform is measuring its own influence, not its share of a fixed total, so the parts routinely add up to more than the whole.
Is a gap between GA4 and Shopify a tracking bug?
Usually not. A 3 to 8 percent shortfall in GA4 against your commerce platform is normal and comes from consent banners, ad blockers, dropped sessions and timezone boundaries. Gaps above roughly 10 percent, or a gap that appears suddenly, are worth investigating as an actual tag problem.
Do I need to fix the discrepancies to run the business?
No, and trying to make four systems agree exactly is wasted effort. What matters is knowing which number answers which question, and making sure nobody is making budget decisions on a number that was never meant to carry them.