Skip to content
flowpeek
flowpeek
Try free for 30 daysBook a demo(30 minutes online, opens in a new tab)

30 days for PLN 0 · first payment after the trial · cancel anytime

flowpeekresources / guides / Analytics

Why do GA4, your store and your ads show different results?

You'll go from two totals that don't match to the specific cause of the gap and a shared reporting rule.

10 min readUpdated: AnalyticsAdvanced

Short answer

The key answer

Your store report, ad platform and analytics tool may count different events, use different dates and credit sales to channels in different ways. Start by comparing definitions and the same orders. Only then judge how big the gap is. Two different totals alone don't prove that an integration is broken.

  • One definitions sheet for the whole team
  • A step-by-step procedure for comparing orders
  • Sales and their attribution to sources, kept separate

Key terms in plain language

Attribution
The rule for assigning credit for a sale to ads and other traffic sources.
Event
A recorded action, e.g. viewing a product, adding to cart or making a purchase.
Sync
Passing new data between your store and a connected tool.

1. Make sure you're comparing the same thing.

Say the owner sees 120 orders in the store, the marketer sees 105 purchases in analytics and the ad platform credits campaigns with 112 conversions. These numbers don't necessarily describe the same set. An order is a sales record in the store. A purchase event is a signal sent to analytics. Crediting a purchase to an ad also depends on the rule you've chosen, that is, the attribution model.

Start with a sentence like: "We want to reconcile the number of orders placed this week, excluding canceled ones." That way you're not trying to settle sales accuracy, customer recognition and ad performance all at once. Write down the report name and the exact metric name from each tool. The word "purchases" without a definition isn't precise enough.

1. Make sure you're comparing the same thing.
What to compareWhat to write down
UnitOrder, event, product unit or share credited to a channel
ScopeStore, dates, time zone, currency, filters
ValueTaxes, shipping, discounts, cancellations and returns
Read timeWhen the report was pulled and whether syncing had finished

2. Close the period and check the dates.

Compare a completed range, e.g. Monday to Sunday. The current day is hard to judge: orders keep coming in, statuses change, and cost and sales imports run on their own schedule. Google Analytics also processes data at different intervals and may update results later. So write down the time you read both reports.

Check which date the purchase was assigned to. Placing an order, paying for it and clicking an ad are different moments. A Sunday-evening transaction may fall on Monday in another time zone. If the gap appears at a month boundary, look at the last and first hours of the period. Don't shift dates by hand just to make the totals match.

3. Break revenue down into its components.

Agree whether the report shows order value before adjustments, after reported returns or only paid transactions. None of these definitions is interchangeable with the others. In Flowpeek, read the description of the report you're using; an amount after adjustments doesn't by itself confirm that the payment has been settled.

Next, check shipping costs, discounts and tax. The word "net" is sometimes used to describe the value after adjustments, so without a description don't assume it means the amount excluding VAT. Compare currencies separately. If one table contains PLN and EUR, you need an explicit conversion rule, not a simple sum of the values. This often explains a gap bigger than a single missing event.

4. Compare specific order numbers.

Pick a sample that covers different situations: a normal purchase, a cancellation, a partial return, a purchase with a recognized source and a purchase without attribution. Compare the same ID, status, time and value. If the event report doesn't let you trace back to the order, note it as a limitation of the comparison.

In a working spreadsheet, mark four states: present in both systems, only in the first, only in the second, present with a different value. Each state points to a different cause. For an extra event, check whether the purchase could have been sent twice; for a missing record, check the integration and the import scope. Don't correct the total with a ballpark factor, because the problem will come back next month.

  • The same order number and currency.
  • The same status and the same point at which a return is taken into account.
  • Checking for duplicate events instead of treating them as extra orders.

5. Only now compare channel attribution.

A correctly imported order may have no link to an observed visit. In that case the sale exists, but the source stays unattributed. A historical order import doesn't recreate old clicks. Don't turn a missing source into Direct: that would be new information added without evidence.

Attribution credits a share of sales to the sources the customer came from before the purchase. The result depends on the crediting rule, the time window considered before the purchase and the visits that were recorded. So it can change even though the number of orders stays the same. Don't add conversions from separate ad platforms into a single store total: the same purchases may be claimed by more than one system. In Flowpeek, look at the sources and the journey, then write down which rule you use in your recurring report.

Flowpeek gives you your own point of reference. It doesn't favor an ad platform because of its name: it credits shares based on the recorded journey and the selected model. That's why you should compare channels under the same rule and the same time window before purchase. This doesn't mean every channel gets the same result. It does let you discuss budget on a common basis.

In the report shown, Google Ads has 47 conversions under First Touch and 39 under Last Touch. Direct changes from 74 to 83. That doesn't mean the store gained or lost orders after switching models. What changed is the rule for crediting sources. Both tables still show 136 unattributed purchases — picking a different model alone doesn't restore the missing link.

Flowpeek also supports Last Non-Direct, a linear model, a 40/20/40 position-based model and Time Decay with a seven-day half-life. Assisted conversions are a separate breakdown of a source's earlier presence on the journey. They aren't extra orders to be added to store sales.

Two Flowpeek attribution tables: First Touch and Last Touch, each with a separate Unattributed row
The same sales range, two models. Compare the source row and the "Unattributed" category (labeled in Polish in the screenshot).

6. Example: 100 orders turn into three different results.

Say a store has 100 orders of PLN 200 each, five of them canceled. The report before adjustments will show PLN 20,000, and the breakdown excluding cancellations PLN 19,000. On top of that, ten of the remaining orders have no recognized source. A channel report that leaves out the "Unattributed" row will show yet another total.

The fix is to agree on statuses and make unattributed sales visible again. Only the rest of the gap goes to an integration check. The figures above are an arithmetic example, not a Flowpeek customer's results. They show why, before judging data quality, it's worth building a simple bridge between reports: starting point, adjustments, end point.

Common mistakes

01

Comparing all orders with purchases credited to ads

Agree on the set of sales first. Analyze how well purchases are attributed to channels as a separate step.

02

Fixing the gap without writing down the definition

Record the settings before you change anything. Otherwise you won't know which change actually helped.

03

Expecting the same history after a new installation

Keep the order import separate from behavior that is only recorded once measurement goes live.

For your next review

Checklist

  • We chose a closed period and a common time zone.
  • The revenue definition covers statuses, adjustments, taxes and shipping.
  • We compared the IDs of at least five different cases.
  • Unattributed sources are visible and have not been changed to Direct.
  • Every remaining difference has an owner and a next check.

Now your store

Prepare a reconciliation sheet for one week.

  1. 1

    Pick two reports and write down their definitions, dates and the time you read them.

  2. 2

    Break the gap down into statuses, values, missing records and channel attribution.

  3. 3

    Bring unresolved cases to a Flowpeek consultation; work with IDs, not just totals.

From report to decision

Example of a finished note: the gap explained, not masked

For the example of 100 orders at PLN 200, the reconciliation sheet could look like this. The amounts are an arithmetic exercise; for your store, the reference point will be its own sales records.

Starting point
100 orders × PLN 200 = PLN 20,000 before cancellations.
Scope adjustment
5 canceled orders × PLN 200 = PLN 1,000. After excluding them, 95 orders and PLN 19,000 remain.
Channel gap
10 of those 95 orders have no source. Recognized channels cover 85 orders and PLN 17,000; "Unattributed" makes up the remaining PLN 2,000.
Team decision
In the sales review we show PLN 19,000. We track the 10 unattributed orders separately and check their IDs.
Check the following week
We keep the same statuses and currency, and describe any remaining discrepancies using specific records.

The outcome of the analysis is an agreed result and a short list of cases to check. There's no need to "fix" a correct report or to artificially assign sales to a channel.

Questions and answers

Does a difference between GA4 and the store always mean an error?

No. It can come from the unit of measurement, dates, adjustments or attribution. You confirm an error on a specific case, using agreed definitions.

Which report should be the basis for sales?

Pick the source that fits the decision: for the operational order list, use store records and statuses; for crediting channels, use the attribution report. An analytics report doesn't replace accounting records.

Will server-side tracking remove every discrepancy?

No. It can deliver events from the server, but it doesn't remove differences in definitions, history scope, identification or consent settings. Verify the specific data flow.

Read the next guide.

All guides

Free · 30 minutes · online

GA4, your store and your ads show different numbers? We'll check it with you.

We compare one month of sales across your tools and point out three fixes to your measurement. No strings attached. What we check

Book a free review(online meeting, opens in a new tab)

30 days on your own data

Turn mismatched totals into one conversation about sales.

During the 30-day trial, compare sales, sources and attribution in your own store. We'll complete the setup within 48 hours, and the first consultation will help you agree on definitions and explain selected discrepancies.

  • No fixed-term contract
  • We set everything up for you in 48 h
  • App servers in Germany (EU)
  • Cancel anytime