Tracking problems · Store marketers and ecommerce agencies
Why Shopify and Google Analytics Sales Do Not Match
Shopify and Google Analytics sales can disagree because an order record, a measured purchase event and marketing credit describe different things. Compare the same store orders, dates, currency and amount definition first. Then investigate missing events, repeated references and value differences before changing attribution settings.

1. Choose the Orders You Actually Want to Compare
Start with a completed period and a clearly defined group of orders. A store-wide sales total can include activity beyond the online checkout that your analytics measures. An attribution setting cannot make two different groups of orders become the same group.
In Shopify, open Analytics, then Reports, and choose the relevant Sales report. Shopify's sales-report definitions distinguish gross sales, net sales and total sales. Gross sales can include pending, canceled and unpaid orders. Those statuses make it a poor automatic substitute for a list of paid purchases.
| Comparison Choice | Write Down | Reason |
|---|---|---|
| Store and channel | Store, online-store orders and any included POS or other channels | A browser purchase stream need not cover every sales channel. |
| Order status | Paid purchases, with test and other excluded records identified | Placed, paid, canceled and refunded describe different events. |
| Amount | Items only, before-tax order amount, or another explicit definition | Tax, shipping and discounts can create a value gap. |
| Period | Start/end timestamps, time zone and export time | An order near midnight can fall on a different day. |
Keep the metric name beside each export. If the Shopify side is a financial payment view while the GA4 side is item-level revenue, change the comparison before diagnosing tracking. The broader revenue-attribution guide explains why collected payments and source credit also need separate definitions.
2. Align Amounts Before Calling an Order Missing
Check one order whose identifier appears in both systems. Recalculate its products, discounts, tax and shipping. If its values already differ, a larger total comparison will mix collection problems with arithmetic problems.
For example, products cost $100 after discounts, shipping is $8 and tax is $10. The customer pays $118. An item-only figure is $100. Attriboo's current Shopify order handler records the order amount less tax, including shipping, so this example would record $108 before any supported refund. Those values answer different questions; none should be relabeled just to make a chart match.

Google's Ecommerce purchases report defines Item revenue as excluding tax and shipping. That does not mean every GA4 revenue metric has the same definition. Write down the selected metric and inspect the purchase payload rather than treating any column called revenue as interchangeable.
Handle currencies separately. Do not compare a converted reporting-currency total with an original order-currency amount without a documented conversion basis. If a refund happened after the order period, record that timing explicitly. A return, a refund and an order edit can affect different reports. Shopify documents these sales-report discrepancies, including differences between sales reports and order exports.
3. Classify Individual Order Differences
Compare one row per order reference after agreeing the scope. Match Shopify's order reference to the transaction_id your GA4 integration actually sends. The visible order number and the internal order ID may need a mapping. Do not assume similar-looking identifiers refer to the same record.
Export only the fields needed for the review. If your extract repeats an order across product rows, first understand that structure. Adding a full order amount on every product row inflates the total; a repeated identifier is a question to investigate, not permission to delete records.
| Example Reference | Shopify | GA4 | What to Investigate |
|---|---|---|---|
| A100 | 80.00 | 80.00 | Values agree within the chosen scope. |
| B200 | 120.00 | Absent | Check channel, event collection and time boundary. |
| C300 | 60.00 | 55.00 | Check amount definition and adjustments. |
| D400 | Absent | 40.00 | Check store, property, excluded records and identifier mapping. |
| E500 | 12.00 | Two rows at 12.00 | Inspect repeated rows before summing. |
The worksheet flags five distinct outcomes and keeps repeated references visible. It does not query either account or repair historical data. For the example above, there is one reference in each category. Start with a small known batch, assign a person to each unexplained group, and widen the period once the method is repeatable.
4. Fix the Collection Path That the Evidence Points To
For Shopify-only orders, check whether the purchase happened through the measured online checkout, whether tracking was permitted, and whether the expected purchase event reached the intended GA4 property. For GA4-only records, first check identifier mapping, excluded order statuses and the selected store. Avoid installing another tag as the first response.
Google's ecommerce guide describes the purchase and refund events, including the relevant transaction reference. A Shopify refund should not be assumed to have reached GA4 merely because it exists in the store. Inspect what your particular integration sends.
Google's transaction-ID guidance explains purchase deduplication for web streams. A stable, correct transaction_id matters; do not generate a new identifier on every repeat purchase-event send, reuse one identifier for different orders, or send an empty identifier. Check both the payload and the collection paths before changing an implementation.
- Ask your developer to inspect a provider-supported test flow or a known authorized order. Do not create a live charge merely for this checklist.
- Review the ecommerce integration and any additional purchase tags for overlapping collection. Keep a record of which component owns each event.
- Check value, currency, transaction reference and refund linkage. A purchase count without the intended value needs a different fix from a completely missing event.
- Respect a customer's tracking choice. Missing permitted measurement is a coverage limit, not a reason to bypass consent or browser protections.
Shopify lists privacy choices, browser blocking and time-zone differences among the reasons analytics services disagree. Its analytics-discrepancy guidance is a useful starting point when the record exists in the store but is absent from a measured browser path.
5. Verify a New Shopify Payment in Attriboo
Use Attriboo to connect the recorded storefront visit with supported new Shopify payment information, then inspect source credit. Follow the Shopify connection guide for the method available in Setup. App sign-in requires the app to be enabled and authorized; a logo on a marketing page does not establish that your store is connected.
Install the storefront tracker using the Shopify installation instructions as well as connecting payments. In a permitted standard-tracker visit, Attriboo can put _atb_vid in cart attributes, which can reach the order's note attributes. Its matching logic also checks known provider-customer and permitted email links when available. A headless store or replaced cart needs its actual checkout path checked.
The current connection receives new paid-order and refund notifications; it does not import historical Shopify orders. A new payment may still be unmatched if the earlier visit or reference is missing. Imported or delivered payment information cannot recreate visits that were never recorded. Keep your existing Shopify reports for the historical comparison.
- Confirm the correct website and store connection in Setup. Check the recorded visit before investigating payment matching.
- Inspect one known eligible new paid order, its time, currency and visitor linkage. A sample notification is not proof that a customer payment was recorded.
- Open Dashboard and keep All traffic selected in Follow the money for the first total check. Read Sales, Refunds and Net with the full chart in view.
- Review Sources and the chosen attribution model only after the payment scope is understood. A sale with no usable visit reference should remain unmatched.
Where to find itDashboard → Follow the money → Sales, Refunds and Net
Find the chart below the revenue cards. The overview shows its filters, full graph, legend and axes; the Sales, Refunds and Net summary is enlarged below.
Select the overview to open the full screenshot.
Enlarged detail of the outlined area
- Start with the full traffic scope
Keep All traffic selected for the initial order-total review. Choosing a paid or AI channel changes only this chart selection.
- Read the amount basis together
Sales, Refunds and Net describe the same selected chart scope. Confirm the order group and date range before comparing with a store export.
Use the revenue guide to understand how payment and refund dates affect the selected period. Attriboo's reporting has its own data scope and matching limits; it is another evidence view, not a replacement for Shopify's order ledger or a tool that retroactively fixes GA4.
6. Compare Marketing Credit After Reconciling Orders
A corrected order comparison does not require every channel report to agree. Attribution models assign credit to the recorded touches each product can see. Two systems can count the same purchase yet allocate it differently because of their models, windows or available visits.
If the remaining problem is an unclear source, investigate why sales appear as Direct instead of treating that label as proof that the buyer typed your address. If the question is which touch should receive credit, compare attribution models with the same underlying order group. Changing the model cannot restore an uncollected purchase event.
End the review with an explanation and a next action. For example: five Shopify-only references belong to an unmeasured sales channel; two value differences come from shipping; one repeated reference needs a tag-owner review. Name the report, the period, the unresolved amount and who will recheck it. That is more useful than declaring a universal acceptable discrepancy percentage.
Common questions
Should Shopify sales and Google Analytics revenue match exactly?
Only expect agreement after aligning the included orders, amount definition, currencies, dates and statuses. Shopify orders and GA4 purchase events have different collection paths. A remaining difference needs a record-level explanation; there is no universal percentage that proves tracking is healthy.
Why can Shopify show more orders than GA4?
The selected Shopify view may cover orders or channels outside the measured online checkout, or GA4 may not have collected an expected purchase event. Check order status, date boundaries, identifier mapping and permitted tracking before assuming every missing record has the same cause.
Can GA4 show more purchases than Shopify?
Yes, the compared extracts can contain repeated purchase records, mismatched stores or periods, excluded order statuses, or incompatible reference formats. Inspect individual references and event ownership. A repeated row can also be a line-item export, so do not automatically treat it as another purchase.
Does Attriboo import my old Shopify orders?
The current Shopify connection starts with new paid-order and refund notifications. It does not import historical Shopify orders or reconstruct old website visits. Keep the existing store reports and verify a known new order after connecting.
What if a paid order has no matching website visitor?
Keep the payment and missing visitor linkage as separate facts. Check the storefront tracker, consent behavior, cart reference and the actual checkout flow. Do not invent a visitor or source to complete the report. Attriboo's missing-sales guide helps separate a missing payment from a missing visit.



