Florentin Purcea

Academy · E-commerce · Lesson

E-commerce tracking and feeds: GA4 events, Merchant Center and the revenue that does not match

GA4 e-commerce events with items and transaction_id, deduplication, feed quality in Merchant Center, the feed → Shopping / Performance Max path and why revenue in Ads, platform and bank never matches.

Level
Intermediate
Time
6 min
Updated
Valid for
GA4 · Google Merchant Center · Google Ads, 2026

The situation

The store reports 412 orders last month. GA4 shows 380. Google Ads says it drove 210 conversions with a value 18% higher than what you see in the platform. The bank collected less than all three. Each is right in its own way and none tells you what to do with the budget.

For an online store, measurement is not a formality. It is the instrument you use to decide how much money goes into ads and on which products. If it is skewed, automated bidding optimises towards the wrong things and the feed sends products with the wrong price into the results.

The GA4 events that describe a store

GA4 has a standard set of e-commerce events. The four that matter in any store:

  • view_item — someone viewed a product page.
  • add_to_cart — they added to cart.
  • begin_checkout — they entered checkout.
  • purchase — they completed the order.

Every event must carry an items array: for each product, at least item_id (your product code, the same one as in the feed), item_name, price, quantity. Without items, GA4 knows something happened, but not which product. Product reports stay empty, and Performance Max does not learn what sells.

The purchase event has three more required parameters: transaction_id (the order number), value (the total) and currency (RON). Optional but useful: tax and shipping, so you can compare properly with the platform.

Deduplication: why transaction_id is sacred

The "thank you" page loads twice — once at the order, once when the customer comes back from the email. Or the platform plugin sends purchase, and GTM sends it again. Without a unique transaction_id, you have two orders instead of one.

GA4 uses transaction_id to avoid counting the same purchase twice. Google Ads does the same if you send the order ID in the conversion tag. The rule: one order, one ID, one single source of truth for purchase — either the platform plugin or GTM. Not both.

The Merchant Center feed: quality decides

The feed is the product list you send to Google to appear in Shopping and Performance Max. What matters:

  • Titles — "Shoes" helps nobody. "Men's running shoes Nike Pegasus 41, size 43, black" contains exactly what people search for. Brand, type, attribute, size, colour.
  • GTIN (the EAN barcode) — when it exists, Google matches the product to the global catalogue and displays it better. Missing it on products that do have a barcode leads to warnings or weak performance.
  • Price and availability in sync — the feed price must be identical to the product page price, to the cent. Same for stock. Differences lead to disapprovals ("price mismatch", "availability mismatch"). The feed updates at least daily; during promotions, more often or through automatic updates.
  • Images — clean background, no text or watermark, the minimum resolution required.
  • Disapprovals — check the products section in Merchant Center weekly. A disapproved product does not appear at all. Ten disapproved products among your best sellers means money lost in silence.

From feed to Shopping and Performance Max

The feed powers two campaign types. Standard Shopping — you control product groups and bids. Performance Max — Google combines the feed with text, images and video and decides on its own where each product appears. PMax is stronger when conversion data is clean and the feed is complete. With a doubled purchase or products without GTIN, PMax optimises blindfolded.

Revenue in Ads, in the platform and in the bank

Three sources, three different numbers, all "correct":

SourceWhat it countsWhy it differs
Google AdsConversions attributed to Ads clicks, within the attribution window, on the click dateIncludes partially attributed orders, may count cancelled orders, uses its own exchange rate
GA4All orders sent as purchase, attributed across channelsMisses users without consent or with blockers, dedupes on transaction_id
Platform (Shopify, Woo, etc.)All orders placed, including cancelled, unpaid, refused cash-on-deliveryThe operational truth, not the marketing truth
Bank / payment processorOnly what was actually collected, minus fees, minus refundsThe financial truth

Do not try to make them equal. Try to understand why they differ and keep the gap stable. If Ads has always reported 15–20% more than the platform and suddenly reports 60% more, something broke in tracking.

Returns

In Romanian e-commerce, refused cash-on-delivery and returns are real and large in some categories. Google Ads supports conversion adjustments: you can retract or reduce the value of a conversion after the order was cancelled or returned, using the same transaction_id. Done monthly, at least for categories with high returns, automated bidding learns on real revenue, not gross.

What to remember

  • Four core events: view_item, add_to_cart, begin_checkout, purchase — all with items.
  • purchase carries transaction_id, value, currency — and a single source sends it.
  • The feed: complete titles, GTIN, price and stock identical to the page, disapprovals checked weekly.
  • Ads, GA4, the platform and the bank will never match; keep the gap stable and explainable.
  • Returns go back into Ads as conversion adjustments, so bidding learns on real revenue.

Check yourself

GA4 revenue doubled since yesterday, but platform orders are the same. Most likely cause?

Frequently asked

Why does GA4 show fewer orders than the platform?

GA4 only sees users who accepted cookies and have no blockers, and only orders where the thank-you page loaded with a working tag. A 10–25% gap is common; a 50% gap indicates a problem.

Platform plugin or GTM for purchase?

Either, but only one. The plugin is simpler and usually correct; GTM gives you control. What never works: both active in parallel.

How often must the feed be updated?

At least daily. If prices or stock change often, use more frequent updates or Merchant Center's automatic mechanisms, to avoid "price mismatch" disapprovals.

Want Valhalla to check this for your business?

Valhalla Pulse scans the public signals of your website for free, in seconds.

Analyse my business

Sources

Analyse my businessWhatsApp