All articles
    Analytics & Tracking

    Why Your Meta ROAS Never Matches Your Shopify Revenue

    Digital Jutsu Team July 1, 2026 8 min read
    Why Your Meta ROAS Never Matches Your Shopify Revenue

    You set a target of 3x ROAS in Meta Ads Manager, the dashboard says you hit 4.1x, and then you open Shopify and the revenue is thousands of dollars lower than what Meta claims it drove. If you added up Meta, Google, and Klaviyo attributed revenue, you would somehow have sold more than you actually did. Something is clearly wrong, but nobody can tell you whether it is a reporting quirk or a broken pixel bleeding money.

    This is one of the most expensive sources of confusion in paid media. Marketers scale budget on a ROAS number that is inflated, or they kill a profitable campaign because Shopify made it look weak. Both mistakes cost real money. The uncomfortable truth is that Meta and Shopify are supposed to disagree, up to a point. Your job is to know where the normal disagreement ends and a real tracking bug begins.

    The two platforms are not measuring the same thing

    Meta Ads Manager and Shopify answer different questions. Meta answers "how much revenue can I attribute to ads I served," and it is generous about it. Shopify answers "how much money came into this store," and it only counts orders that were actually placed. Those are different questions, so different answers are expected.

    Meta credits a sale to an ad when someone clicked within the last 7 days or, by default, viewed the ad within the last 1 day and then purchased. That view-through credit alone explains a large share of the gap, because Shopify's native reporting gives no weight to an ad someone merely saw. Meta also credits the full order value to itself. If a customer clicked your Meta ad on Monday, got a Klaviyo email on Wednesday, and searched your brand name on Google before buying Friday, Meta may claim the entire order, Google may claim it in Google Ads, and Klaviyo may claim it too. Each platform is telling its own version of the truth from inside its own walls.

    Attribution windows and models drive most of the legitimate gap

    The single biggest lever is the attribution setting. Meta's default is 7-day click and 1-day view. Shopify's native sales reports lean on a last non-direct click model, which is much stricter and usually hands credit to whichever touch happened closest to the purchase. When those two models look at the same customer journey, they routinely disagree about who earned the sale.

    Modeled conversions widen the gap further. Since iOS 14.5 and Apple's App Tracking Transparency prompt, a meaningful share of iPhone users opt out of tracking, so Meta cannot observe every conversion directly. Meta fills those blind spots with statistical modeling and Aggregated Event Measurement, then reports the modeled result as revenue. Those conversions are real sales in aggregate, but they are estimated attributions, not one-to-one records. Shopify, sitting on your own server, records every order with certainty. Modeled data versus observed data is a structural reason the numbers will never line up perfectly.

    What each source actually measures

    Before you decide which number to trust, it helps to see them side by side. Here is what each of your four common revenue sources really reports.

    SourceAttribution modelDefault windowDeduplicationWhat to use it for
    Meta Ads ManagerPlatform attribution, click plus view7 day click, 1 day viewPixel and CAPI by shared event_idRelative decisions inside Meta, creative and ad set testing
    GA4Data driven or last click, cross channelConfigurable, often 90 dayClient id plus event paramsCross channel comparison and funnel behavior
    Shopify analyticsLast non direct clickSession basedOrder id, one row per orderStore level revenue and channel share
    Bank deposits and Shopify ordersNone, actual transactionsNot applicableSettled transaction recordsGround truth revenue, refunds, and profit

    Read that table as a map of trust. As you move down the rows, the attribution gets stricter and the number gets closer to money that actually moved. Meta at the top is the most generous. Your bank at the bottom is the least debatable.

    How to tell normal discrepancy from a broken pixel

    Attribution differences move revenue around. Tracking bugs change the count of events. That distinction is your diagnostic tool.

    Open Meta Events Manager and compare the number of Purchase standard events fired in a given window against the number of Shopify orders for the same window. If Meta shows roughly the same order count as Shopify, your event volume is healthy and the revenue gap is almost certainly attribution. If Meta shows far more purchases than Shopify has orders, you are double-counting, and the usual culprit is a Pixel firing the Purchase event more than once per checkout. We cover that failure mode in detail in Meta Pixel Purchase event double firing.

    Deduplication is the other thing to verify. If you run both the Meta Pixel in the browser and the Meta Conversions API from your server, which most stores should, each purchase is sent twice on purpose for reliability. Meta only collapses those into one conversion when the browser event and the server event carry the same event_id along with a matching event_name of "Purchase." When that shared id is missing, every sale counts twice and your reported revenue roughly doubles. Check the deduplication rate and event match quality in Events Manager. Poor numbers there are a bug, not a window setting.

    A few patterns reliably signal a real problem rather than normal variance:

    • Meta reports more Purchase events than Shopify has orders for the same dates.
    • The gap widens week over week instead of holding steady.
    • Purchase counts collapsed right after a theme update, an app install, or a checkout change.
    • Revenue is inflated by a fixed multiple, a classic double-firing or missing-dedup signature.

    If you want a full end-to-end checklist for isolating these failures, the conversion tracking broken audit guide walks through the same tests in order.

    Currency, refunds, and the Shopify checkout migration

    Two smaller issues quietly distort the comparison. First, currency and refunds. Meta reports the value passed at the moment of purchase and does not subtract refunds, chargebacks, or cancellations later. Shopify shows net revenue after those adjustments. If you sell internationally and pass order values in local currencies while your ad account reports in one currency, rounding and conversion timing add a few more percentage points of drift. None of this is a bug. It is just two systems accounting for the same dollar at different moments.

    Second, if you are on Shopify, the platform that carries your Pixel is changing under you. Shopify has deprecated checkout.liquid and the old additional-scripts field and is moving stores to checkout extensibility. Tracking that used to live in those legacy scripts does not automatically survive the migration. Purchase events implemented the old way can silently stop firing on the thank-you and order-status pages, which shows up as a sudden collapse in Meta purchases while Shopify orders keep flowing. The current, supported path is the Shopify Customer Events system and the Web Pixels API. If your Meta purchase count fell off a cliff and you cannot explain it, confirm your tracking was actually rebuilt for checkout extensibility rather than left in a deprecated field.

    Which number to trust for which decision

    Stop trying to reconcile the platforms to a single figure. They will never agree, and forcing them to wastes time. Instead, assign each source the job it is actually good at.

    Use Shopify and your bank for anything involving real money: total revenue, blended ROAS across all spend, refund rate, and profit. These are the numbers you report to yourself and pay taxes on. Use Meta Ads Manager for relative decisions inside Meta, where the attribution model is applied consistently across every ad set and creative. Even if Meta's absolute revenue is inflated, that inflation is roughly even across your campaigns, so "ad set A beats ad set B" stays trustworthy. Use GA4 as the neutral referee for cross-channel questions, since it applies one model across Meta, Google, and email at once.

    The healthiest measurement setup blends the two. Watch blended ROAS, meaning total Shopify revenue divided by total ad spend across all platforms, as your north star for whether the business is actually profitable. Then use Meta's in-platform ROAS only to steer budget between ads inside Meta. A steady 20 to 40 percent gap between the two is a sign your system is working as designed. A gap that is growing, erratic, or accompanied by mismatched event counts is a sign that money is leaking through a broken pixel.

    Find out what your tracking is hiding

    If your Meta purchases outnumber your Shopify orders, your deduplication rate looks poor, or your numbers cratered after a checkout or theme change, the gap is no longer attribution. It is a bug, and it is quietly distorting every budget decision you make. Our conversion tracking repair service audits your Pixel and Conversions API setup, verifies deduplication and event match quality, confirms your Purchase event survived the Shopify checkout extensibility migration, and hands you back numbers you can actually build a budget on. Book an audit and stop scaling on a number you cannot trust.

    FAQ

    Why is my Meta ROAS higher than my actual Shopify revenue?

    Meta Ads Manager reports revenue from every conversion it can attribute inside its own attribution window, including 1-day view-through and 7-day click, and it credits the full order value to the ad even when other channels helped. Shopify records only orders that actually happened, and its native analytics tend to use a last-click model that gives Meta far less credit. Because Meta claims credit that Shopify assigns elsewhere, Meta's reported revenue and ROAS will almost always look higher. A gap of roughly 20 to 40 percent is common and does not by itself mean anything is broken.

    Which number should I trust, Meta Ads Manager or Shopify?

    Trust Shopify and your bank deposits for total revenue, refunds, and profit, because those numbers reflect money that actually moved. Trust Meta Ads Manager for relative decisions inside Meta, like which ad set or creative is outperforming another. Do not add Meta, Google, and email attributed revenue together and expect it to equal your Shopify total, because every platform claims overlapping credit. Use Shopify for truth and Meta for direction.

    What is a normal difference between Meta and Shopify revenue?

    For most direct-to-consumer stores the platforms disagree by about 20 to 40 percent, driven by attribution windows, view-through credit, and modeled iOS conversions. A steady, explainable gap in that range is usually healthy. A sudden jump to 60 percent or more, a gap that widens week over week, or Meta reporting purchases that never show up in Shopify orders are signs of a real tracking problem worth investigating.

    How do I know if the gap is a tracking bug and not just attribution?

    Compare the raw event counts, not just revenue. Check that the number of Purchase events in Meta Events Manager is close to your Shopify order count for the same window, and confirm your Pixel and Conversions API events share an event_id so they deduplicate. If Meta reports far more purchases than Shopify has orders, or your match quality and deduplication rates are poor, the gap is a bug rather than normal attribution.

    Get the next one in your inbox

    No spam. One insight every other week.

    Want us to run the playbook for you?

    Book a free 15-minute strategy call. We'll pull up your site and map the exact next moves.

    Get Your Free Growth Audit