Meta claims one revenue figure, Google claims another, and Shopify shows a third, all for the same time period. None of them are wrong. Each platform measures a different thing through different attribution logic, and the gaps between them are structural rather than fixable. This guide explains what each system actually counts and how to build a reporting framework that uses each for what it measures well.
Every ecommerce operator eventually has the same unsettling experience. Meta Ads Manager reports that campaigns drove 180,000 in revenue. Google Ads claims another 90,000. Shopify, the system that actually processed the orders and moved the money, shows 200,000 in total sales for the same period. The numbers do not reconcile, the gaps are large, and the obvious question is which platform is lying.
The answer is that none of them are lying. They are measuring different things, attributing outcomes through different logic, and reporting against different definitions of what counts as a conversion and when. The discrepancy is not a bug to be fixed but a structural feature of how attribution works across independent systems that do not share a single source of truth. Understanding this is the difference between an operator who panics at the gaps and an operator who reads them correctly and makes good budget decisions despite them.
This guide explains why the numbers diverge, what each platform is actually counting, how attribution windows create overlapping claims on the same sale, why a category of revenue shows up as untracked, and how to build a coherent reporting framework that uses each system for what it measures well. The goal is not to make the numbers match, because they never will. The goal is to stop expecting them to match and start interpreting them correctly.
The Core Misconception: One Sale, One Source
The intuition that creates all the confusion is the belief that a sale has a single cause that a good measurement system should be able to identify. A customer bought a bracelet, the thinking goes, so there must be one channel that deserves credit, and the right reporting setup will tell us which one. This intuition is wrong, and recognizing why it is wrong dissolves most of the confusion.
A typical customer journey to a purchase involves multiple touchpoints across multiple channels over multiple days. The customer sees a Meta ad on Monday and clicks through but does not buy. On Wednesday they search the brand name on Google, click an ad, and browse again. On Friday they receive a marketing email and click it. On Sunday they type the URL directly and complete the purchase. Five touchpoints, four channels, one sale.
Now ask the question that attribution is supposed to answer. Which channel caused the sale? The honest answer is that they all contributed, in ways that are genuinely difficult to disentangle. The Meta ad created awareness. The Google search ad captured intent. The email maintained engagement. The direct visit closed. Removing any one of them might have changed the outcome, or might not have. There is no fact of the matter about which single channel deserves the credit, because the sale was the product of the whole sequence.
Each measurement system resolves this ambiguity differently, and that is the root of the discrepancy. Shopify, looking at the final session, credits direct traffic because that is the session that contained the purchase. Meta, looking at its click history, credits the Monday ad click because that click happened within its attribution window. Google credits the Wednesday search click for the same reason. The email platform credits the Friday click. Four systems, four different answers, all defensible, none complete. The numbers do not match because the systems are answering different questions about the same event.
The depth of this problem becomes clearer when you consider that the question of causation in marketing is genuinely unanswerable in the strict sense. To know which channel caused the sale, you would need to run the counterfactual, where you replay the customer’s journey with one channel removed and observe whether they still buy. This is impossible for any individual customer, because a person can only live one version of their journey. The best any measurement system can do is assign credit according to a rule, and every rule is an approximation of a causal reality that cannot be directly observed. Attribution is not measurement in the way that counting revenue is measurement. It is a heuristic for distributing credit, and different heuristics produce different distributions.
This is why the search for the one true attribution model is a search for something that does not exist. Last-touch, first-touch, linear, time-decay, and data-driven models are all different heuristics, each with defensible logic and each producing different numbers. None of them is correct in an absolute sense, because there is no absolute fact about credit distribution to be correct about. The models are tools for different purposes, and choosing among them is choosing what kind of approximation serves a particular decision, not discovering which one is true.
What Shopify Actually Measures
Shopify Analytics reports sales attributed to the traffic source of the session in which the order was placed. This is a last-touch model, and it is the simplest of all the attribution approaches because it only considers the final session. The customer arrived through some channel, placed an order, and Shopify credits that channel.
The strength of this model is that it is grounded in something real. Shopify processed the order, so it knows the order happened, it knows the exact value, and it knows which session produced it. There is no estimation, no modeling, no probabilistic matching. The order is a fact, and the attribution is based on directly observed session data. When Shopify says total sales were 200,000, that number is the actual money that moved, and it is the closest thing to ground truth that exists in the entire stack.
The weakness is that last-touch attribution systematically undervalues every channel except the last one. The Meta ad that created awareness, the Google search that captured intent, the email that maintained engagement all get zero credit if the final session came through a different channel. Shopify sees only the last step, so it credits only the last step, and the earlier influence is invisible to it.
This is why Shopify’s channel breakdown often shows direct traffic and organic search as the largest revenue sources even for stores whose growth is driven by paid advertising. The paid channels do the work of bringing customers into the funnel, but customers frequently return through direct or organic for the final purchase, and Shopify credits the return channel. Shopify tells you where the sale closed, not what made it happen. Reading Shopify’s channel data as a measure of channel effectiveness is a common and costly misinterpretation.
There is also the matter of the traffic source Shopify cannot identify at all, which deserves its own treatment because it is large enough to distort the entire picture.
The None and Direct Problem
A category that consistently surprises operators is the volume of revenue that Shopify attributes to None or Direct. For many stores, this category exceeds 30 percent of total revenue, and in some cases it is the single largest segment. The instinct is to conclude that a third of the business comes from people typing the URL directly, which is almost never true. The reality is that this category is a collection of sales whose actual source could not be determined.
There are several reasons a sale lands in this bucket. The most common is missing UTM parameters on paid traffic. When an ad links to the store without UTM tags, and the customer arrives without a referrer that Shopify can parse, Shopify has no information about where the visit came from and records it as direct or none. This is purely a tagging failure, and it is entirely preventable. Every paid traffic source should append UTM parameters consistently, and auditing this is the first step in shrinking the unidentified category.
The second reason is browser privacy behavior, and this one cannot be fully fixed. Safari on iOS, which represents a substantial share of mobile commerce traffic, does not send referrer information in many contexts. A customer who clicks a link in an app, or who arrives through a privacy-protected path, shows up with no referrer. Shopify has nothing to work with and records the session as direct. No amount of UTM discipline addresses this, because the information is stripped at the browser level before it ever reaches the store.
The third reason is the gap between when influence happened and when the session occurred. A customer who clicked an ad days ago, then returns by typing the URL, is genuinely a direct visit from Shopify’s perspective even though the original influence was paid. Shopify’s last-touch model has no memory of the earlier click, so the sale is direct.
The practical consequence is that Shopify’s None and Direct category is not a channel, it is a measurement blind spot. Treating it as a real source of demand leads to wrong conclusions, like underinvesting in paid channels because they appear small in Shopify while direct appears large. The correct interpretation is that a meaningful portion of what Shopify calls direct is actually paid traffic that lost its attribution somewhere between the click and the order. Tools that handle click identifiers better, particularly GA4, reveal this by reclassifying much of Shopify’s direct traffic into its true paid sources.
What Meta Actually Measures
Meta Ads Manager reports conversions attributed to ad interactions within a configurable attribution window. The default window is seven days for clicks and one day for views. This means Meta credits itself for any conversion where the customer clicked a Meta ad within the previous seven days, or viewed a Meta ad within the previous one day, regardless of what happened between that interaction and the purchase.
This is a fundamentally different model than Shopify’s. Shopify looks backward from the order to the session that contained it. Meta looks forward from the ad interaction to any conversion that follows within the window. The two models will agree only in the simple case where the customer clicks a Meta ad and immediately purchases in the same session. In every more complex journey, they diverge, and they diverge in a predictable direction. Meta claims conversions that Shopify attributes to other channels.
Consider the customer who clicks a Meta ad on Monday and purchases through direct traffic on Sunday. Shopify credits direct, because the Sunday session came through direct. Meta credits the Monday ad click, because it falls within the seven-day window. Both are counting the same sale, and both are applying their own logic correctly. The sale appears in Shopify’s direct column and in Meta’s campaign reporting simultaneously. This is not double-counting in any system, it is the same event measured by two systems with different rules.
The view-through component adds another layer. Meta credits conversions where the customer saw an ad, did not click, and purchased within one day. The customer may not even remember seeing the ad, and they certainly did not interact with it, but Meta counts the impression as influential. This is defensible in principle, since seeing an ad can influence behavior without a click, but it inflates Meta’s claimed conversions relative to what Shopify, which has no concept of ad impressions, will ever show.
The server-side dimension matters here too. With a Conversions API setup sending purchase events server-side, Meta receives conversion data that includes purchases the browser pixel would have missed due to consent or tracking prevention. This generally makes Meta’s conversion count more complete and accurate from Meta’s perspective, but it can widen the gap with Shopify’s channel attribution, because Meta is now matching more conversions to ad interactions than a browser-only setup would have. A better-tracked Meta account often reports a larger gap with Shopify, not a smaller one, because it is catching more of the conversions it deserves credit for under its own model.
What Google Actually Measures
Google Ads operates on a similar forward-looking attribution model with its own window and its own default attribution logic. Like Meta, Google credits conversions to ad interactions that precede the conversion within a defined window, and like Meta, this produces claims that overlap with both Shopify and Meta.
Google has an additional complexity in the form of its attribution model selection. Google Ads has historically offered multiple attribution models, including last click, first click, linear, time decay, and data-driven attribution. The model determines how credit is distributed across multiple Google ad interactions in a journey, though it does not change the fact that Google only sees its own interactions and not those of other channels. A customer who clicked a Meta ad and then a Google search ad will have the Meta interaction completely invisible to Google, which sees only its own search click and credits accordingly.
The cross-network dimension is worth understanding. Performance Max campaigns span search, display, YouTube, Gmail, and the broader Google network, and conversions from these campaigns are attributed across all of these surfaces. A conversion that GA4 classifies as cross-network in its channel grouping is a Google-driven conversion that touched multiple Google properties, and reconciling this with Shopify’s simpler channel categories requires understanding that Google’s network is internally diverse in ways Shopify does not model.
Enhanced Conversions, Google’s equivalent of server-side matching, improves Google’s ability to attribute conversions by using hashed customer data to match conversions to ad clicks even when cookies are unavailable. As with Meta’s CAPI, this generally makes Google’s conversion count more complete and can widen rather than narrow the gap with Shopify, because Google is recovering attribution that would otherwise have been lost. The improvement in measurement accuracy from Google’s perspective does not translate into closer agreement with Shopify, because the two are still measuring different things.
A particular source of confusion with Google is the relationship between Google Ads conversion reporting and GA4 conversion reporting, which are two different Google products that often disagree with each other even though both belong to Google. Google Ads reports conversions attributed to ad clicks using its own model and window. GA4 reports conversions using its own attribution settings, which can be configured independently. The same Google account can therefore show different conversion numbers in Google Ads and in GA4, and operators who assume the two Google products should agree are surprised when they do not. The resolution is the same as for the broader discrepancy. The two products measure conversions through different configurations, and the right one to consult depends on the question being asked. Google Ads conversion data drives bidding within Google Ads, while GA4 conversion data serves cross-channel analysis.
There is also the matter of how Google handles the distinction between a conversion and a conversion value. A store can track purchases as conversions while also tracking the revenue value of each purchase, and the attribution of the count and the value can diverge in edge cases involving refunds, partial orders, or currency conversion.
Reconciling Google’s reported conversion value with Shopify’s actual revenue requires attention to whether refunds are being subtracted, whether the currency matches, and whether the conversion value reflects the order total or some subset of it. These details are small individually but can accumulate into a meaningful discrepancy that has nothing to do with attribution windows and everything to do with value calculation.
Why the Gaps Are Predictable, Not Random
Once the models are understood, the gaps stop looking like errors and start looking like the predictable output of different measurement logic applied to the same events. The direction and rough magnitude of the gaps can be anticipated, which is what makes them interpretable rather than alarming.
The sum of all platform-claimed conversions will generally exceed Shopify’s total sales. This is because each platform claims conversions within its window, and the same conversion can be claimed by multiple platforms when multiple channels touched the journey. If Meta claims a sale and Google claims the same sale, the two platform reports together count it twice, while Shopify counts it once. The more sophisticated your multi-channel marketing, the more overlap there is, and the larger the sum of platform claims grows relative to Shopify’s actual total. Overlap inflates the sum of platform-reported revenue above the true total, and the inflation grows with marketing complexity.
The gap between any single platform and Shopify depends on that platform’s role in the funnel. A platform that primarily drives top-of-funnel awareness will claim conversions that close through other channels, so its claimed revenue will exceed what Shopify attributes to it. A platform that primarily captures bottom-of-funnel intent will more often be the last touch, so its claimed revenue will align more closely with Shopify’s attribution to it. Meta, which often plays the awareness role, tends to show a larger gap than branded search, which often plays the closing role.
The seven-day window means that on any given day, a platform’s reported conversions include sales from interactions over the previous week. This creates a temporal smearing where today’s platform numbers reflect the past week’s interactions, while Shopify’s numbers reflect today’s actual orders. Comparing a single day across the two systems is comparing different time bases, which is why daily reconciliation never works and why weekly or monthly comparisons are more meaningful.
There is also a structural reason the gaps cannot be eliminated through better tracking. Better tracking makes each platform’s measurement more complete within its own model, but it does not align the models with each other. A perfectly tracked Meta account and a perfectly tracked Shopify store will still disagree, because the disagreement is in the definitions, not in the data quality. Improving data quality sharpens each measurement without converging them.
The Attribution Window as the Central Lever
For operators who want to influence how the numbers relate to each other, the attribution window is the most consequential setting, and understanding its effects is essential for interpreting reports correctly.
A longer attribution window credits a platform with conversions from interactions further in the past. A seven-day click window means a click from a week ago can be credited with today’s purchase. Extending the window to longer periods increases the platform’s claimed conversions, because it captures more of the delayed conversions that follow an interaction. Shortening the window does the opposite, crediting only conversions that follow quickly after an interaction.
The choice of window is a choice about how much delayed credit to assign. A store with a short consideration cycle, where customers tend to buy soon after first contact, can use a shorter window without losing much attributed conversion. A store with a long consideration cycle, where customers research for days before buying, needs a longer window to capture the delayed conversions that the advertising genuinely influenced. Setting the window too short for the actual consideration cycle systematically undercounts the advertising’s contribution.
The view-through window deserves separate consideration. View-through conversions, where the customer saw but did not click an ad, are the most contested form of attribution because the causal link is weakest. Some operators disable view-through attribution entirely to get a more conservative measure of advertising impact, accepting that they will undercount genuine view-driven conversions in exchange for not overcounting coincidental ones. Others keep it enabled to capture the full influence of impressions. There is no universally correct choice, but the choice should be deliberate and consistent, because changing it mid-analysis makes period-over-period comparisons meaningless.
The key insight for reconciliation is that the attribution window explains most of the same-day discrepancy between platform reports and Shopify. When Shopify shows 10,000 in a day and Meta shows 15,000 for the same day, the excess is largely conversions from interactions earlier in the window that Shopify attributed to other channels on the days those orders actually occurred. The platforms are not inventing revenue, they are crediting their past interactions with present conversions, and the window is the mechanism.
Building a Coherent Reporting Framework
Given that the numbers will never match, the practical question is how to build a reporting framework that uses each system for what it measures well and avoids the misinterpretations that the discrepancies invite. The answer is to assign each system a specific role and to stop asking any system to do a job it is structurally unsuited for.
Shopify should be treated as the financial source of truth. When the question is how much revenue the business actually generated, Shopify is the authority, because it processed the orders. Total sales, order count, average order value, and the actual money that moved are all Shopify questions, and no platform report should override Shopify on these. The finance and operations view of the business runs on Shopify numbers.
Platform reports should be treated as each platform’s measure of its own contribution under its own model. When the question is how a specific Meta campaign is performing relative to other Meta campaigns, Meta’s reporting is the right tool, because the comparison is internal to Meta and the model is consistent across the campaigns being compared. The same applies within Google. Platform reports are valid for optimization decisions within the platform, where the attribution model is held constant and only the campaigns vary.
GA4 should be treated as the cross-channel referee. GA4 applies a consistent attribution model across all channels, which makes it the best single source for understanding the relative contribution of different channels to the business. GA4’s channel grouping, particularly its ability to identify paid traffic through click identifiers even when UTMs are missing, gives a more accurate picture of channel mix than Shopify’s last-touch model. When the question is what share of the business each channel drives, GA4 is more reliable than either Shopify or the individual platforms. GA4 is the closest thing to a neutral arbiter because it sees all channels through one consistent lens.
For the highest-stakes budget decisions, where the question is the true incremental contribution of a channel, none of these tools is sufficient on its own, and the right approach is incrementality testing. Geo holdout tests, where advertising is paused in some regions and maintained in others, measure the actual lift that advertising produces by comparing the treated and untreated regions. This is the only method that measures causation rather than correlation, and for stores spending enough that budget decisions carry real financial weight, it is worth the analytical investment.
Communicating the Discrepancy to Stakeholders
A significant part of managing attribution discrepancies is communication, because the people who see the reports often lack the framework to interpret them and will draw wrong conclusions if the discrepancy is not explained. The brand owner who sees Meta claiming more than Shopify shows will suspect the agency of inflating numbers. The finance team that sees platform reports exceeding actual revenue will distrust all marketing reporting. Preempting these reactions with a clear explanation is part of the job.
The explanation that works is the one that frames the discrepancy as expected and explainable rather than as a problem to be solved. The framing is that Shopify measures what happened financially, while ad platforms measure what they contributed under their own attribution rules, and the two answer different questions. The platforms are not wrong and Shopify is not wrong. They are simply not measuring the same thing, and expecting them to match is the actual error.
A useful concrete explanation for the same-day gap is the timing point. Ad platforms credit conversions to interactions from the past several days, so today’s platform numbers reflect the past week’s advertising, while Shopify’s numbers reflect today’s actual orders. This single explanation resolves most of the confusion about why a platform shows more revenue than Shopify on a given day, because it makes clear that the two numbers are built on different time bases.
For the case where platform reports collectively exceed actual revenue, the explanation is overlap. When multiple channels touch a single journey, multiple platforms claim the resulting sale, so the sum of platform claims double-counts conversions that Shopify counts once. This is not fraud and not error, it is the predictable result of independent systems each crediting their own influence on shared outcomes. The sum of platform claims exceeding actual revenue is a sign of multi-channel journeys, not a sign of inflated reporting.
The communication should also set expectations about what reconciliation can and cannot achieve. Stakeholders often want the numbers reconciled to a single figure, and the honest answer is that they cannot be, because they measure different things. What can be done is to establish which number answers which question, so that the right number is used for each decision. This reframing, from making the numbers match to using each number correctly, is the resolution that actually works.
The UTM Discipline That Reduces the Noise
While the structural discrepancies cannot be eliminated, the noise that makes them worse can be substantially reduced, and the single highest-leverage intervention is UTM discipline. Consistent, complete UTM tagging on every paid traffic source shrinks the unidentified None and Direct category and makes both Shopify and GA4 attribution meaningfully more accurate.
The discipline is straightforward in principle and frequently neglected in practice. Every link from a paid source to the store should carry UTM parameters that identify the source, the medium, and the campaign. Meta ads, Google ads, email campaigns, influencer links, affiliate links, and any other paid or tracked traffic should all append these parameters consistently. The naming should follow a documented convention so that the same source is always labeled the same way, because inconsistent naming fragments a single channel across multiple labels and makes the data harder to read than no labels at all.
The audit that reveals UTM gaps is to look at the paid traffic in GA4 and check how much of it is being correctly classified versus falling into unassigned or direct. A well-tagged account shows paid social and paid search clearly, with minimal paid traffic leaking into direct. An account with UTM gaps shows a large direct or unassigned segment that, on investigation, turns out to contain paid clicks that lost their attribution. Closing these gaps is unglamorous work, but it directly improves the accuracy of every channel-level decision the business makes.
A subtlety worth noting is that UTM parameters interact with click identifiers. GA4 can identify Google traffic through the gclid parameter and Meta traffic through the fbclid parameter even when UTMs are missing, which is why GA4 handles the unidentified category better than Shopify. But relying on click identifiers alone is fragile, because they can be stripped in some contexts, and they do not carry campaign-level detail. UTMs and click identifiers together give the most complete and robust attribution, and neither fully substitutes for the other.
The payoff for UTM discipline is not that it makes Shopify and the platforms agree, because nothing does that. The payoff is that it removes the preventable portion of the discrepancy, leaving only the structural portion that is inherent to the different models. Good UTM hygiene does not eliminate the gap, it removes the part of the gap that is your own fault and leaves only the part that is unavoidable.
Reading the Numbers Correctly
The skill that ties all of this together is interpretation. The numbers are what they are, and the value comes from reading them correctly rather than from forcing them into agreement. An operator who has internalized the models can look at a set of conflicting reports and extract the right signal from each without being misled by the conflicts.
When Shopify shows strong total sales but a single channel looks small in Shopify’s breakdown, the correct reading is that the channel may be driving demand that closes through other channels, and Shopify’s last-touch model is hiding its contribution. The next step is to check GA4 and the platform’s own reporting to see whether the channel is doing upper-funnel work that Shopify cannot see.
When a platform shows strong claimed revenue but Shopify’s total is much lower, the correct reading is that the platform is claiming conversions across its window that overlap with other channels, and the platform’s claim should not be added naively to other platforms’ claims. The platform number is valid for comparing campaigns within that platform, not for summing across platforms.
When the unidentified category in Shopify is large, the correct reading is that attribution is leaking, partly through fixable UTM gaps and partly through unfixable browser privacy behavior. The next step is to audit UTM coverage and to lean on GA4 for the channel picture, accepting that a residual unidentified portion will always remain.
The operators who make good budget decisions are not the ones who found a way to make the numbers match, because that way does not exist. They are the ones who understand what each number means, use each for the decisions it supports, and resist the temptation to trust the system that tells the most flattering story. The reports do not need to agree to be useful. They need to be understood.
The final discipline worth cultivating is skepticism toward any single number that seems to settle a question cleanly. When a report offers a tidy answer, the right instinct is to ask what that report cannot see. Meta’s claimed revenue cannot see the conversions that closed without an ad interaction in its window. Shopify’s channel breakdown cannot see the upper-funnel influence that preceded the closing session. GA4’s channel grouping, while broader, still applies one model and inherits that model’s blind spots. Every number is partial, and the operator who remembers this reads each report as one perspective among several rather than as a verdict.
This perspective also guards against the most expensive mistake in attribution-driven budgeting, which is reallocating spend based on the system that happens to flatter a particular channel. A channel that looks weak in Shopify’s last-touch view but strong in Meta’s window-based view is not definitively weak or strong. It is a channel whose role in the funnel makes it look different through different lenses. Cutting its budget because Shopify undercounts it, or inflating its budget because Meta overcounts it, are both errors driven by trusting one lens over the others. The defensible decision considers all the lenses, weighs them according to what each measures well, and ideally tests the conclusion with incrementality data before committing real budget to it.
The reward for developing this interpretive skill is decisions that hold up. An operator who understands the attribution landscape does not get whipsawed by conflicting reports, does not overreact to a single platform’s claims, and does not mistake a measurement artifact for a business reality. The numbers will keep disagreeing, because they always will, but the disagreement stops being a source of anxiety and becomes a source of triangulated insight. Three imperfect measurements, read correctly, reveal more than one measurement that pretends to be perfect.