Open four tabs: Google Ads, Meta Ads Manager, GA4 and your bank account. Ask each one how last month went. You will get four different answers, and at least two of them will claim more revenue than you actually collected.
The usual response is to pick the number that feels right, or the one the agency put in the deck, and budget from there. That is how good campaigns get killed for looking unprofitable and weak ones get scaled on revenue that was counted twice.
The goal of this checklist is not to make the four numbers identical. They measure different things, on different dates, under different rules, so a perfect match would itself be suspicious. The goal is to explain the gap between them, line by line, until what is left is small enough to budget against. That is the same reconciliation step we run before designing any data stack, and most businesses can do the first pass in a spreadsheet.
01Start From the Money, Not the Marketing
Most reconciliation attempts fail because they start in the wrong tab. They compare Google Ads to GA4, or Meta to Google, and argue about which platform is lying. Platforms are the last thing you check, not the first.
Work in this order instead. Each layer answers a different question, and each one is the authority for its own question only:
- Bank deposits and processor payouts Cash truth
- What actually arrived, after fees, refunds and payout delays. This is the only number that pays rent, and the only one that cannot be argued with.
- Store backend or CRM Commercial truth
- Orders placed and deals closed, with an ID, a date and a value for each one. If it is not in here, it did not happen commercially, whatever a pixel says.
- GA4 or your analytics tool Behavior truth
- What visitors did on the site, including the purchases and form submissions your tags managed to see. Consent choices and ad blockers decide how much of the picture this layer gets.
- Google Ads and Meta Claims to verify
- What each platform believes it caused, under its own attribution window and counting rules. Useful for steering bids inside that platform. Not a revenue report.
Reconcile downward: bank against backend first, backend against analytics second, and each ad platform against the backend last, one at a time. Never add two platforms together and compare the sum to revenue. The same order can sit inside both platforms’ windows, so the sum double-counts by construction.
02Line Up the Definitions Before You Compare Anything
Half of every mismatch is not missing data. It is two tools answering slightly different questions while using the same word, usually “revenue” or “conversions.” Before you export a single report, write down how each system you use defines these six things:
- Which date? Ad platforms generally report a conversion on the date of the click, and earlier days keep filling in as conversions land. Your store, GA4 and your bank report on the date of the order or the payout. The same sale can sit in different months in different tabs.
- Gross or net? Does the revenue figure include tax? Shipping? Discounts? Does it subtract refunds, and on what date? A store export, a GA4 purchase value and a processor payout routinely use three different answers.
- Which timezone and currency? An ad account set to one timezone and a store set to another will disagree at every month boundary, forever, by a few orders. Converted currencies add a second, moving gap.
- What counts as a conversion? One per click or every purchase? Does the count include phone orders, in-person sales, subscriptions renewing, or only first orders? Does GA4 count a purchase event once per session while the store counts two orders?
- How long is the attribution window? Each platform claims conversions for a set period after a click or a view, and the defaults differ. A longer window claims more of the same orders, without anything on your site changing.
- What is modeled? Where consent is declined or a browser blocks tracking, platforms increasingly estimate the conversions they could not observe. Modeled numbers can be reasonable, but they will never tie to a list of order IDs, because no such list exists for them.
Put the answers in the header of your reconciliation sheet. When a gap appears later, check this list first. A gap you can name is a definition. A gap you cannot name is a bug.
03The Reconciliation Checklist, in Order
Pick one closed month. Not the current one: payouts lag, refunds land late, and platform reports keep backfilling click dates. Give the month a few days to settle, freeze the date range, and use that same range in every export.
Count the orders in your backend
Export the month from your store or CRM with order ID, date and value. Remove test orders, cancelled orders that were never charged, duplicates and $0 orders. What remains is your commercial truth for the month: a count and a total you can point at, order by order.
Bridge the backend to the bank
Walk from the backend total to the deposit total one adjustment at a time: refunds issued, processor fees, chargebacks, and orders near month-end whose payout lands next month. Also look for money in the bank that never touched the store, such as phone, wholesale or marketplace sales. If this bridge closes, your money layer is sound and every later gap is a measurement question, not a cash question.
Compare GA4 to the backend, order by order
Compare counts first, revenue second. Then spot-check ten real orders by transaction ID: can you find each one in GA4, once, at the right value? Missing IDs point at consent, blockers or a tag that does not fire on every path to checkout. The same ID twice points at a duplicate event. A free tracking stack scan shows which tags and pixels are actually running before you start guessing.
Check each ad platform separately against the backend
For one platform at a time, ask: of the conversions it claims, how many can I find in the backend? This only becomes exact if the click ID from the ad is stored on the order or lead, which is the setup described in storing click IDs in your CRM. Without click IDs, compare totals and direction instead, and accept that the answer stays approximate.
Hunt the usual suspects
Work the list in section 04 for whatever gap is left: duplicate tags from a plugin plus Tag Manager, a pixel and a Conversions API sending the same event without a shared event ID, a thank-you page that fires again on refresh, checkout on a different domain losing the session, test traffic, and refunds that never get sent back to the platforms.
Write down what remains, and how big it is
End with one unexplained figure, expressed as a percentage of backend orders. That number is your measurement error. It becomes the baseline you watch next month, and the number a tracking setup or a server-side build has to beat to be worth paying for.
The worked example, bridged
Back to the hypothetical store from the top of this guide. Google Ads claimed 214 conversions worth $24,080 and Meta claimed 286 purchases worth $31,420, a combined $55,500. The store recorded 412 orders worth $48,900. Step 2 of the checklist looks like this:
Store backend to bank deposits, one monthHypothetical store
- Orders in the store backend (412 orders)$48,900
- Less refunds issued during the month−$1,650
- Less payment processor fees−$1,475
- Less month-end orders paid out next month TIMING−$2,500
- Deposited in the bank account$43,275
The $5,625 between the store and the bank is now fully explained, and none of it is a tracking problem. GA4, meanwhile, recorded 398 of the 412 orders. Those 14 missing orders, about 3% of the month, are the measurement gap worth investigating, starting with consent and blocker losses. The platforms’ combined $55,500 was never a candidate for the bank’s job: judged one at a time against the 412 backend orders, each platform’s claim is a statement about its own window, not about revenue.
04The Direction of the Gap Tells You Where to Look
You do not need to chase every difference to zero. You need to know which direction each gap runs, because the direction narrows the cause before you open a single tag:
- One platform claims more than your backend sold.
Look for double-firing first: a theme or plugin sending the purchase event alongside Tag Manager, or a browser pixel and a server-side API sending the same event without deduplication. Then check the counting setting and the window. A single platform beating your entire order book is a bug until proven otherwise.
- GA4 counts fewer orders than the backend.
The expected direction, and usually the healthiest gap on this list. Consent declines, ad blockers and browser privacy features all remove orders from GA4’s view while the store still records them. If the gap is large enough to change decisions, server-side tracking recovers part of it; our guide to server-side tagging covers what it can and cannot see.
- GA4 counts more orders than the backend.
Something is firing that is not a sale. Suspects: the purchase event on a confirmation page that reloads, test orders placed through the live site, a second GA4 property or tag on the same pages, or revenue recorded on orders the backend later cancels. Match transaction IDs both ways and the extra events identify themselves.
- The backend beats the bank by more than fees, refunds and timing explain.
This one is not marketing at all. Look for failed or partially captured payments, unpaid invoices counted as sales, payouts landing in a different account, or a sales channel whose money arrives somewhere else. Hand it to whoever owns the books.
- Platform leads outnumber the leads in your CRM.
For lead generation, this is the mirror image of the first gap. The conversion may fire on a button click or page view rather than a completed submission, the same person may be counted on every visit, or bots may be filling the form. Keeping bad conversions out of bidding data is covered in protecting your campaigns from bot traffic.
- The gap changed suddenly, in either direction.
A stable gap is a definition. A gap that moves is an event: a site release, a new plugin, a consent banner change, a tag edit. Line the date up against your change history before you touch budgets, and never judge a campaign on the weeks either side of the break as if they were measured the same way.
Decide your tolerance before you start: the size of gap that would actually change a budget decision. Investigate gaps bigger than that. Document the rest and move on.
05If You Sell Leads-to-Deals, Your CRM Is the Bank Account
Everything above was written for a store, because orders and payouts make the layers easy to see. A lead-generation business runs the same checklist with different nouns. The store backend becomes the CRM, the order becomes the closed deal, and the bank deposit becomes invoiced or collected revenue.
The bridge to build each month is: platform-reported leads, to leads that actually arrived in the CRM, to qualified leads, to booked meetings or proposals, to closed deals, to money collected. Each arrow loses some records, and each loss has a different owner. Leads that never arrive are a form, routing or integration problem, the territory covered by lead plumbing. Leads that arrive but never qualify are an offer or targeting problem. Deals that close but never get attributed are a tracking problem, fixed by keeping the click ID and first-touch source on the contact from the first form submission onward.
Two adjustments matter more for lead gen than for ecommerce. First, timing: a lead generated in March may close in May, so reconcile a cohort of leads, not a calendar month of revenue, and judge channels on cost per qualified lead or booked meeting until enough deals have closed. Second, feedback: once closed deals carry their click IDs, those deals can be sent back to the ad platforms as offline conversions, so bidding optimizes toward revenue instead of raw form submissions. That loop, and the fields it needs, is the subject of storing click IDs in your CRM.
06One Afternoon a Month Keeps the Numbers Believable
A reconciliation done once is a cleanup. Done monthly, on the same definitions, it becomes an early-warning system: the month a tag breaks or a plugin starts double-firing is the month the unexplained figure moves, while the spend is still small enough to fix.
The monthly routine
- Day 1–5Let the month settle. Wait for the last payouts and the late refunds before exporting anything.
- ExportPull the same four reports, same date range, same settings: processor payouts, backend orders or CRM deals, GA4, and each ad platform on its own.
- BridgeWalk backend to bank, then GA4 to backend. Spot-check ten transaction or lead IDs in both directions.
- LogRecord the unexplained percentage and anything that changed on the site or in the tags that month, next to the figure it affected.
- DecideSet or adjust budgets from backend numbers. Use platform numbers only to steer inside each platform.
One person can run this in a spreadsheet while the order volume is modest and the channel list is short. It stops scaling when the exports multiply: several ad platforms, a store and a CRM that disagree about who the customer is, subscription revenue renewing outside the store. At that point the same reconciliation wants a warehouse underneath it, with orders, deals and spend joined in one place, which is the Data Build end of this work. The monthly sheet you build now becomes the acceptance test for that build later.
07Four Numbers, Four Jobs
After one pass through this checklist, the four tabs from the opening paragraph stop competing. The bank says what arrived. The backend says what sold. GA4 says what visitors did. Each ad platform says what it believes it caused. Every argument about “the real ROAS” is really an argument about which of those jobs the number was hired for.
Budget from the backend. Report cash from the bank. Let each platform optimize on the cleanest conversion signal you can feed it, and check that signal against the backend every month. Some gap will always remain: consent, blockers, windows and modeled conversions guarantee it. The win is not a gap of zero. The win is a gap you can explain in one sitting, small enough that no budget decision would change if it closed.
Pick last month. Export the four reports. Bridge the store to the bank, count what GA4 missed, and judge each platform on its own. Whatever is left unexplained is the first thing worth fixing.
Keep going
