The Ecomm Analyst

Growing stores, one honest take at a time.

Building one revenue number you can actually run the business on

I have written before about why your Shopify revenue and your ad platform numbers never agree, and about why Meta says you made $50k and Shopify says $22k. Those posts explain the disagreement. This one is about what to do afterward, because diagnosis is not a reporting system.

At some point you have to walk into a meeting and say a number. Here is how I build one that survives being questioned.

Step one. Pick the ledger and never move it

Your cart is the ledger. Shopify, WooCommerce, whatever processes the money. Not GA4, not Meta, not your attribution platform, not Klaviyo.

This sounds obvious and it is violated constantly. The moment somebody in a meeting says “but Meta shows 340 purchases,” the ledger has moved, and the conversation is now about which vendor to believe rather than about the business. Meta is not counting your orders. It is counting conversions it believes it influenced, in a window it chose, deduplicated against nothing.

The ledger is the thing that reconciles to your bank account. Everything else is commentary on the ledger.

Step two. Define the number before you need it

Write down, in a document, what “revenue” means for you. Specifically.

  • Gross or net of discounts
  • Before or after refunds, and refunds attributed to the order date or the refund date
  • Shipping revenue in or out
  • Taxes in or out
  • Subscriptions counted at first order or at each renewal
  • Gift cards counted at purchase or at redemption

Every one of these has a defensible answer, and any one of them can create a five to fifteen percent gap between two people who both think they are reporting revenue. Most of the reconciliation arguments I get pulled into are not attribution problems at all. They are definitional problems that nobody wrote down.

My defaults are net of discounts and refunds, refunds applied to the original order date, shipping and taxes excluded. Yours can differ. What cannot differ is that everyone uses the same one.

Step three. Treat every channel number as an allocation, not a count

This is the conceptual move that makes the whole thing work.

Your ledger says you did $400,000 last month. That is the pie. Attribution’s job is to slice that pie, not to bake a second one. Meta gets a slice, Google gets a slice, email gets a slice, organic gets a slice, and the slices sum to $400,000. Always. By construction.

The reason platform-reported numbers never reconcile is that they are not slices. They are each platform’s independent claim on the whole pie, and those claims overlap heavily. When you add up Meta’s reported revenue plus Google’s plus Klaviyo’s, you routinely get 130 to 180 percent of your actual revenue. That is not a bug in any one platform. It is what happens when four vendors each answer the question “did I touch this order” and you treat the answers as if they were “did I cause this order.”

Once you insist that the slices must sum to the ledger, most of the noise disappears, because double counting becomes structurally impossible rather than something you have to argue about.

Step four. Pick one model and freeze it for a quarter

Choose your attribution model, choose your lookback window, and then do not touch either of them for three months.

Which model matters less than people think. Linear, position-based, or a data-driven multi-touch model will all give you directionally similar answers on a typical DTC mix, and all of them are better than last click. What destroys your ability to make decisions is changing the model mid-quarter and then trying to explain why Meta’s contribution moved eleven percent when the media plan did not change.

Freezing the model turns your reporting into something you can compare week over week. That comparability is worth more than any marginal accuracy gain from a better model.

Step five. Keep the unattributed bucket visible

Some revenue will not attribute cleanly. Direct traffic, dark social, word of mouth, people who saw a TikTok on a friend’s phone and typed your URL a week later.

Do not redistribute this proportionally across your paid channels, which is what several tools quietly do to make their dashboards look complete. Leave it in its own bucket and watch it as a percentage of total revenue. When it grows, that is information. It usually means either your tracking broke or your brand is working, and those are both things you want to know quickly.

A post-purchase survey is the cheapest way to put a floor under this bucket, because it catches the sources your pixels structurally cannot see.

Step six. Put MER on top as the smell test

Total ad spend divided into total ledger revenue. No attribution involved, no model, nothing to argue with.

MER will not tell you what to do. It will tell you when your attribution is lying. If your attributed ROAS improved and MER got worse, something in the allocation is wrong, and you should find it before you scale on the strength of a channel number. I go deeper on this in MER, blended ROAS, and platform ROAS.

What you end up with

One ledger number, defined in writing. A set of channel slices that sum to it. A visible unattributed bucket. A frozen model. MER as the check.

Any decent attribution platform will handle the mechanics of this. ThoughtMetric, which sponsors this site, does it, and so do most of its competitors. The tool is not the hard part. The hard part is getting your team to stop treating four vendors’ overlapping claims as four competing sources of truth, when only one of them is connected to your bank account.

Leave a comment

Navigation

About

Six years in e-commerce. Three Shopify stores across different niches, one scaled past seven figures. I’ve tested hundreds of ad creatives, obsessed over email flows, and learned more from my failures than my wins.

Now I focus on conversion optimization, retention marketing, and the analytics behind it all. This blog is where I share what actually works, backed by real numbers. No fluff, no guru energy.