You have checked the monthly report twice. Then someone opens an ad dashboard in the meeting and asks why its conversion total is different. The campaign discussion stops while you compare the numbers.
A mismatch can mean the tracking is broken. It can also mean the reports count different things. You need to establish which before changing a tag or correcting a spreadsheet.
Why your numbers never match between platforms
Start with the word “conversion.” On one screen, it might mean a submitted form. On another, it might mean a qualified contact. In the sales report, it might mean a deal that finally closed.
A submitted form, a qualified contact, and a closed deal each deserve a place in the report. Calling all three “conversions” makes it harder to see where people drop out between them.
Before comparing totals, agree on what the report counts. Name the event or record, the reporting period, and the source that owns it. For example, “new contacts created this month” is a definition you can check against the CRM.
What makes platform numbers differ?
Choose one record and trace it through the reports. Check the event definition, attribution window, time zone, duplicate handling, and filters. These checks are easier to resolve on a single record than on an unexplained difference between monthly totals.

A person might click an ad, return through search, and fill out a form. Several systems can record that submission. If the person later buys, the sale creates a separate record with its own date.
Each system also decides which interactions can receive credit and which records belong in the report. One may exclude internal traffic. Another may still contain test submissions. A repeated form submission may count as another event without representing another person.
How do attribution windows change the numbers?
Suppose someone clicks an ad and buys ten days later. With a seven-day click window, that click falls outside the window. With a thirty-day window, it falls inside. Check your account settings to see which rule applies.
The window determines which interactions are eligible. The attribution model determines how credit is assigned among them. Changing either can change the story a report tells about the sale.
Check the actual settings before assuming a platform default. Google Ads, for example, distinguishes the lookback window in its attribution reports from the conversion window configured for a conversion action. Its attribution reporting guide explains that distinction.
Put the window and model beside the metric, where the person reading the report can find them. Our guide to attribution models explains how the credit is assigned.
Why do time zones move totals between months?
A purchase at 11:40pm Pacific on the last day of the month falls on the following day in UTC. The event is identical; its reporting date is different.
That is enough to move it out of one monthly total and into the next. If a small gap appears around month-end, check the timestamps before looking for missing purchases.
Apply the same reporting time zone when comparing periods, and document any source that cannot be aligned. Do not assume the difference will cancel out next month.
De-duplicate once, at the source
Adding platform conversion totals is another common mistake. Google and Meta can both claim credit for the same sale. Their combined total does not tell you how many sales took place.
Start by deciding what should be unique. A contact, an order, and a closed deal need different identifiers and different rules. Match records only where a reliable identifier supports the connection.
Leave unmatched records visible. If an identifier is missing or ambiguous, record that limitation rather than guessing which contact or order it belongs to.
How do you reconcile numbers across platforms?
A spreadsheet can handle these checks at first. The person building the report knows which export to use, which records to exclude, and why the CRM total is lower.

When that person is away, someone else has to work out the rules again. This is a good reason to move the recurring checks out of someone’s head and into a documented reporting process.
A reconciliation layer applies those rules to the source records each time the report runs. It records the definitions, exclusions, and matching logic behind each metric so another person can inspect them.
Keep website submissions, qualified contacts, and closed deals separate. Name an owner for each metric and explain how the records connect. You should be able to answer a question about a total without rebuilding the report. If no one in-house can own those definitions, see how fractional analytics leadership works.
A checklist before you send
Before sharing the report, check that someone else could reproduce its totals from the definitions you have written down.
- Name the event or record being counted and the source that owns it.
- State the attribution window and model where they apply.
- Confirm the reporting period and time zone.
- Document duplicate handling and exclusions for tests, spam, and internal traffic.
- Explain expected gaps and flag differences that still need investigation.
- Compare periods using the same definitions, or explain what changed.
If a dashboard still disagrees, include the reason beside the number. If you do not know why, flag it as unresolved. That is more useful to the reader than a total you cannot explain.
Platform-by-platform guides
For a closer look at ad reporting, start with Google Ads and GA4, Meta and GA4, or LinkedIn Ads and GA4.
If the disputed number comes from sales, the HubSpot, Salesforce, and GoHighLevel guides follow the gap between web activity and CRM records.
For ecommerce, compare Shopify revenue with GA4 or work through Shopify, Meta, and Google Ads reconciliation.
Other journeys have their own boundaries. We cover Adobe Analytics and GA4, email and SMS clicks, and web and app measurement separately.
For differences in who gets counted, see the guides to customer and audience counts and ABM and web analytics.
To make the checks repeatable, use the monthly reporting workflow. If you would like help with a disputed report, book a tracking audit. We can start with the number your team needs to explain.
Frequently asked questions
Why do campaign performance numbers never match between platforms?
Campaign performance numbers diverge because platforms use different event definitions, attribution windows, time zones, filters, and deduplication rules.
Should I force every platform to match?
No. The goal is to reconcile differences, name the source of truth for each metric, and publish one accurate number the team reports.
What is the fastest way to reduce reconciliation hell?
Start by documenting attribution windows, date ranges, time zones, exclusions, and the owner for every KPI before the report is shared.
When should a team build a reporting layer?
Build a reporting layer when recurring reviews are spent reconciling the numbers instead of deciding what changed and why.
