What this guide helps you do
Ad platforms are useful, but they do not close your books.
Meta, Google, TikTok, LinkedIn, your CRM, Shopify, Stripe, and finance can all report different answers to the same question: what did we acquire last month?
That does not automatically mean anyone is lying. Each system is counting from its own position. The problem starts when the business uses a platform number as if it were closed revenue.
This guide gives you a monthly reconciliation workflow. The goal is to compare what platforms reported against what the business actually closed, identify the gap, and decide what is safe to change.
Use it before budget increases, agency reviews, board updates, channel cuts, and AI-generated performance summaries.
Define the system of record first
Before pulling platform data, decide which system gets to answer the question “what closed?”
Examples:
| Business type | Likely system of record |
|---|---|
| Ecommerce | Shopify, WooCommerce, ERP, finance export |
| SaaS | Stripe, subscription system, CRM closed-won |
| Lead generation | CRM closed-won, qualified opportunity, booked appointment plus close status |
| Services | CRM closed-won, signed agreement, invoice, finance system |
| Marketplace | Order database, payout system, finance ledger |
Write that source at the top of the reconciliation file. If the team cannot agree on it, stop there. That is the first operating problem.
The monthly reconciliation table
Create one worksheet with these tabs:
system_of_recordplatform_exportsmapping_rulesreconciliationdecision_log
Keep it boring. A spreadsheet is fine. The point is repeatability, not software elegance.
Step 1: Pull closed revenue or closed customers
From the system of record, export the period you are reviewing.
Minimum fields:
| Field | Why it matters |
|---|---|
| customer, order, or deal ID | Prevents duplicate counting |
| close/order date | Aligns the time period |
| revenue | Shows the business result |
| margin if available | Prevents scaling unprofitable volume |
| refund/cancel status | Keeps bad revenue out of the win count |
| source/medium/campaign if available | Helps match back to marketing activity |
| first-touch or last-touch fields if available | Useful, but not always complete |
Clean the export before comparing it. Remove test orders, duplicates, canceled deals, refunded orders if the decision depends on net revenue, and records outside the period.
Do not average your way through bad records. Flag them.
Step 2: Pull platform-reported performance
Export the same period from each platform.
Minimum fields:
| Field | Why it matters |
|---|---|
| platform | Separates source claims |
| campaign | Lets you inspect budget decisions |
| spend | Needed for CAC or ROAS |
| conversions | Platform claim |
| conversion value | Platform revenue claim |
| attribution setting/window | Explains part of the gap |
| conversion action name | Prevents mixing leads, purchases, calls, and signups |
Do not combine platforms yet. Keep each platform’s claim separate until the comparison is done.
Step 3: Normalize the definitions
Most reconciliation problems hide in definitions.
Before comparing totals, answer:
- Is the platform counting leads, purchases, calls, form fills, trials, or qualified opportunities?
- Is the business counting gross revenue, net revenue, booked revenue, collected cash, or margin?
- Are returning customers included?
- Are refunds or cancellations removed?
- Are branded and nonbrand campaigns mixed together?
- Is the platform using click-through, view-through, data-driven, or another attribution model?
- Does the sale happen inside or outside the platform attribution window?
Create a mapping_rules tab like this:
| Platform metric | Business metric it maps to | Safe for budget decisions? | Notes |
|---|---|---|---|
| Meta Purchase value | Gross ecommerce revenue | Maybe | Needs refunds removed |
| Google Ads lead conversion | Form submit | No | Not all leads qualify |
| CRM closed-won revenue | Closed revenue | Yes | Source of truth |
This table protects the team from pretending unlike numbers are the same.
Step 4: Compare totals and calculate the gap
Now build the reconciliation tab.
| Source | Reported customers | Reported revenue | Spend | CAC | ROAS |
|---|---|---|---|---|---|
| System of record | 38 | $63,500 | — | — | — |
| Meta | 24 | $41,200 | $18,000 | $750 | 2.29 |
| 31 | $57,800 | $21,000 | $677 | 2.75 | |
| Combined platform claims | 55 | $99,000 | $39,000 | $709 | 2.54 |
Then add the gap:
| Comparison | Customer gap | Revenue gap | What it may mean |
|---|---|---|---|
| Platform claims vs system of record | +17 | +$35,500 | Possible double counting, view-through inflation, duplicate conversion actions, or gross-vs-net mismatch |
Sometimes platforms overcount. Sometimes they undercount. Both matter.
If the platform undercounts, the team may cut channels that are helping. If it overcounts, the team may scale campaigns that are not producing real business value.
Step 5: Match records where possible
If you have IDs, emails, GCLIDs, UTMs, order IDs, or CRM campaign fields, match records directly.
Use three buckets:
| Bucket | Meaning | Action |
|---|---|---|
| Matched | Platform and system-of-record both see the conversion | Usually safe to include |
| Platform-only | Platform reports it, system of record does not show a closed result | Inspect duplicate, lead quality, attribution window, cancellation, or wrong conversion action |
| Business-only | Business closed it, platform does not claim it | Inspect direct/organic return, long sales cycle, missing tracking, offline conversion upload, or assisted path |
This is where the useful work happens. The operator is not looking for a perfect match rate. The operator is looking for a pattern that changes the decision.
Step 6: Classify the reconciliation gap
Use these classes:
| Gap class | Description | Owner |
|---|---|---|
| Counting gap | Duplicate events, multiple conversion actions, gross vs net mismatch | Marketing ops / analytics |
| Timing gap | Sale happens before or after the platform window | Growth owner / analytics |
| Qualification gap | Platform counts a lead the business would not count as qualified | Sales / lifecycle |
| Revenue gap | Order value, refunds, discounts, or margin are treated differently | Finance / ecommerce |
| Source gap | UTM, campaign, or source field is missing or overwritten | Marketing ops / CRM owner |
| Assisted-path gap | Platform influenced demand but did not get direct credit | Growth owner |
Assign one owner per class. A reconciliation gap without an owner becomes a recurring meeting topic instead of a fix.
Step 7: Decide what is safe to change
Use the decision log.
| Decision | Evidence | Safe? | Owner | Follow-up |
|---|---|---|---|---|
| Increase Meta retargeting budget | Platform ROAS strong, but system record shows heavy returning-customer overlap | Not yet | Growth owner | Split new vs returning customers |
| Cut Google nonbrand | Platform underreports closed-won customers with long sales cycle | No | Sales ops | Upload offline conversions / inspect assisted path |
| Reduce campaign with high lead volume | CRM shows poor qualification and low close rate | Yes | Paid media lead | Lower bid or tighten targeting |
This is the difference between reporting and operating. The table has to protect decisions that are not ready.
Step 8: Use AI to accelerate the review
AI can help once the tables exist.
Good prompts:
textReview this reconciliation worksheet. Classify each gap as counting, timing, qualification, revenue, source, or assisted-path. Return owner, likely cause, and the next question to ask.
textFind decisions in this budget review that are unsafe because platform-reported performance does not match closed revenue. Explain what evidence is missing.
textTurn this reconciliation table into a one-page operator summary: what changed, what is safe to decide, what needs owner review, and what should not move yet.
Do not paste sensitive customer data into an unapproved tool. Use row IDs, aggregated tables, or approved internal AI environments when the data is private.
The monthly operating rhythm
Run this once per month before budget review.
- Export system-of-record outcomes.
- Export platform claims for the same period.
- Normalize definitions.
- Compare totals.
- Match records where possible.
- Classify the gap.
- Assign owners.
- Write the decision log.
- Decide only what the evidence supports.
The first run may be messy. That is expected. Mess is the signal. The second run should be cleaner because the team knows which fields, conversion actions, and owner rules need repair.
What good looks like
A good reconciliation review ends with plain-language decisions:
- We can increase this campaign because closed revenue supports the platform trend.
- We cannot cut this channel yet because the sales cycle falls outside the platform window.
- We need to repair offline conversion uploads before judging nonbrand search.
- We need to split new and returning customers before trusting ROAS.
- We need finance to define whether this review uses gross revenue, net revenue, or margin.
That is the point. The business stops arguing about which dashboard is right and starts deciding what can safely change.