Short answer GA4 and your ad platforms count conversions by different rules: different attribution models and windows, different reporting dates, different counting settings, and, in some reports, modeled data. A gap between them is normal, even when the tracking works. Before you change a tag, check that you are comparing the same thing. Only then look for events that are missing, counted twice, or arriving broken.
The question is not “why don’t the numbers match?”. They are not supposed to. The question is whether the gap you see is the one the rules produce, or a bigger one that the tracking added.
Align these before you compare
Most discrepancy tickets close at this step. Put the two reports side by side and check each line.
| Check | Why it moves the total |
|---|---|
| The event or action | A GA4 key event, a Google Ads conversion action, a Meta Purchase, and a TikTok purchase event can be four different definitions of “purchase” |
| Period and time zone | A day ends at a different hour if the accounts use different time zones |
| Conversion date or interaction date | Google Ads dates a conversion by the ad interaction; GA4 by the day it happened |
| The column | Google Ads “Conversions” and “All conversions” are different counts |
| Attribution model and window | Each platform credits its own ads, within its own window |
| Counting method | One conversion per click, or every conversion |
The details, platform by platform, are below. Keep each platform’s rules with that platform: a field name, a window, or a deduplication rule from one does not carry over to another. For Google Ads alone, see why Google Ads conversions don’t match Analytics; for Meta, the Meta Ads vs GA4 conversion mismatch.
Cause 1: attribution, windows, and reporting dates
Each platform credits its own ads. Google Ads only reports conversions with Google Ads interactions from the same account, while other tools may credit other channels. GA4 credits the channels in its own reporting attribution model. Meta and TikTok credit their own ads within the windows set on each ad set or ad group. One purchase can therefore be claimed by three platforms and by one channel in GA4.
The windows differ.
- GA4: the lookback window is 30 days by default for acquisition key events and 90 days for all other key events. Changing the reporting attribution model applies to historical data too, and only to event-scoped traffic dimensions such as Source, Medium, and Campaign.
- Google Ads: a conversion window can be between 1 and 90 days, set per conversion action.
- Meta: with standard attribution, the attribution setting counts events within 1 or 7 days of a link click, 1 day of an impression, or 1 day of an engaged view, chosen per ad set. Meta also notes that results from ad sets with different attribution models cannot be compared directly.
- TikTok: windows are chosen per ad group: 1, 7, 14, or 28 days after a click, and off, 1, or 7 days after a view.
The dates differ. Google Ads reports a conversion on the date of the click or impression that led to it; Google Analytics on the day it happened. A purchase on Monday after a click the Friday before lands in different weeks. Google suggests the “Conversions (by conv. time)” columns to align closer with Analytics.
The latest days are not final. Google Ads conversion data can take up to 7 days to fully appear after significant changes, and Analytics key events are imported into Google Ads up to 24 hours after they occur. Compare closed periods, not this morning.
The columns differ. In Google Ads, a conversion action counts “One” or “Every” conversion per interaction, and “All conversions” adds secondary actions and view-through conversions. View-through conversions are not in the Conversions column by default.
Cause 2: consent, and observed versus modeled data
When a visitor declines, the tags send less, or nothing. That gap is the consent working, and it has to be respected. Never try to work around it to recover conversions.
Some platforms fill part of that gap with models, and each one models something different:
- GA4 behavioral modeling estimates user and session metrics, such as users, sessions, and new users, for visitors who decline analytics cookies. It is not applied to event counts such as
page_view,first_visit, andsession_start. It needs Consent Mode on every page and a minimum volume of consented and unconsented traffic, it shows only with the Blended reporting identity, and it is not in the BigQuery export. A GA4 report and a BigQuery query over the same days can differ for that reason alone. - Google Ads may include modeled conversions as estimates where Google can’t observe every conversion, and models cross-device conversions.
- Meta’s incremental attribution uses models that predict whether a conversion is due to an ad, and reports on that basis.
So one report may show observed conversions and another a blend of observed and modeled ones. Neither is wrong. They answer different questions.
Cause 3: browser and server events, counted once or twice
Many setups send the same purchase twice on purpose: once from the browser and once from the server. The platform is supposed to keep one. It only can if both copies carry the right keys.
- Meta deduplicates a Pixel event and a Conversions API event when the Pixel’s
eventIDmatches the server’sevent_idand the event names match, within 48 hours of the first one. Events sent from only one channel are not deduplicated. Meta also warns that server events sent 24 hours or more after they occurred may have significant attribution issues. - TikTok requires the same
event_idand event name through both the Pixel and the Events API, within a 48-hour window, and keeps the first event it receives.
If the server sends an event_id the browser never sent, or a new one on every retry, the platform counts two purchases and reports both. GA4, receiving one copy, counts one. That gap is a defect, not attribution. We covered the Meta side in more depth in CAPI deduplication issues.
Cause 4: values, currency, order IDs, and event names
A gap in revenue is not always a gap in conversions.
- Value. One platform receives the purchase value with tax and shipping, another without. The counts match; ROAS does not.
- Currency. The wrong currency, or none, can turn the same order into different revenue on each platform.
- Order ID. Without a stable order ID, such as GA4’s
transaction_id, you cannot match a platform’s conversion to an order in the backend, and repeated purchase hits are hard to spot. - Event names. A release renames an event or a key event, and one destination stops counting it. In Google Ads, a renamed Analytics key event can take up to 24 hours to be reflected.
Cause 5: click IDs, UTMs, and redirects
Attribution needs the context of the click to survive until the conversion. It often doesn’t.
- Click IDs. A redirect that drops the query string can strip
gclidorfbclidbefore the landing page reads it. The conversion still happens; the connection to the ad is gone. - UTMs. A campaign tagged with the wrong
utm_source, or with an emptyutm_campaign, shows up in GA4 as another channel. The ad platform still claims the conversion through its own click data, so GA4 under-credits paid and the gap grows. - Payment redirects. A visitor returning from a payment provider can show up in GA4 as a referral from that provider unless you list it as an unwanted referral.
A diagnostic sequence
Work from definitions to hits, in this order. Each step rules out a cause before you touch anything.
- Compare definitions. Fill the alignment table above for the two reports. Re-run both with the same dates, time zone, column, and, where you can, the same window. Many gaps shrink to their expected size here.
- Reconcile against the backend or CRM. List the orders or qualified leads for the period with their order IDs. The backend tells you what happened; it does not tell you which ad deserves the credit. Use it to see which of the two reports is closer to reality on the count, not to settle attribution.
- Check that each event reached each destination. For a sample of orders, check whether the purchase hit left the browser or the server and reached GA4, the Pixel, the Conversions API, and the other platforms. Google points to the conversion tracking status troubleshooter and Tag Assistant for its side; each ad platform has its own event testing tools.
- Inspect what each hit carried. Consent state,
event_id, order ID, value, currency, click IDs, and the timestamp. Compare the same order across destinations. - Look at what changed, and when. A gap that jumps on a specific day usually has a release, a GTM container version, a CMP update, or a new server-side setup behind it. Line up the date of the jump with the changes made around it.
Illustrative example Meta reports 1,180 purchases for a week; GA4 reports 1,050; the backend has 1,090 orders. Meta’s ad sets count 1-day view-through conversions, which GA4 does not, and some visitors declined analytics cookies. That can explain a gap of this size, and nothing needs fixing. If the same week also showed Meta conversions with two server events per order ID since a release, part of the gap would be a defect, and that part would need a fix.
Expected difference, signal defect, or still open
Classify the case before you act. Most of the time, the first answer means you don’t touch the tags.
Expected reporting difference. The gap disappears or shrinks to a stable size once definitions are aligned. The backend count is consistent with what each platform’s rules would produce. The gap has not moved since the last comparison. Document the definitions, label the reports, and leave the tags alone.
Signal quality defect. One or more of these is true: orders in the backend have no hit in a destination; one order produces two conversions with different or missing event_id; values or currencies differ for the same order; click IDs or UTMs are missing on paid landings; the gap jumped on a date that matches a change. Fix the implementation, then check that the next orders arrive correctly.
Unresolved. The evidence is not enough. You cannot see what a platform received, the gap sits inside modeled data, or consent limits what you can observe. Say so, record what you ruled out, and keep watching the trend. A stable unexplained gap is a reporting caveat; a growing one is worth escalating.
Where Trackingplan fits
Trackingplan does not unify attribution models, and it does not make platform numbers match. A conversion in an ad platform stays that platform’s definition. What it does is show you the signal behind each number, so you can tell which kind of gap you have.
It watches the hits your site, apps, and server send to analytics and ad platforms, on real traffic, and compares Pixel, CAPI, and GA4 for the same purchase: whether it is counted once, with the same value, on every platform. It also reads the dataLayer, so it can follow a payload from the dataLayer to each destination and tell you whether a gap starts in the data your site exposes or in one tag.
Ask the agent “Why is Meta showing more purchases than GA4 this week?” and it compares both counts for the same period, finds the cause, and tells you which tag, trigger, or variable is behind it. Ask how to fix it and it tells you what to change, in GTM or wherever the change belongs. Connect your ad accounts and it also compares spend and platform-reported conversions with what your site sent. It only observes the data you already send; it never works around consent.
The gap between GA4 and your ad platforms will not close, and it doesn’t have to. What matters is knowing which part of it the rules explain, and which part your tracking added.
Frequently asked questions
Should GA4 and my ad platforms ever show the same number of conversions?
Rarely, and it is not the goal. Each platform credits conversions to its own ads, inside its own attribution windows, on its own reporting dates. Aim for a gap you can explain and that stays stable, not for identical totals.
Which number should I report?
It depends on the decision. Use the ad platform’s numbers to compare campaigns inside that platform, GA4 to compare channels under one model, and the backend or CRM to confirm how many orders or leads actually happened. Label each number with its source and definition.
Can I recover conversions lost to consent?
Not by tracking people who declined. Consent has to be respected. What you can do is check that the consent signal reaches every tag correctly, and read the modeled data each platform documents as an estimate, not as observed conversions.