You know the sales happened — the bank statement says so and the customers left reviews. But open GA4 and the Ecommerce purchases report shows a fraction of them, or a flat, blank revenue line. The money is real; the tracking is broken.
At ZenWeb we see this across our 500+ Malaysian client accounts, and it’s one of the most expensive faults to leave alone. When GA4 under-records sales, every digital marketing decision built on that data is wrong — you starve the campaigns that actually sell and feed the ones that don’t. Ad platforms learn from the same broken signal, so the damage spreads to your bidding too.
The good news: broken e-commerce tracking is almost always a setup fault, not lost sales. Once the purchase event sends the right data, your reports match reality again. This guide shows the signs, the causes, and the fix — starting with the short official Google walkthrough below.
Source video: Google Analytics on YouTube
E-commerce tracking is the set of events that tells GA4 what shoppers do — view a product, add to cart, start checkout, and buy. The one that matters most for your bottom line is the purchase event. It carries the sale: how much, in what currency, which items, and a unique order ID.
When that event is broken, GA4 doesn’t invent a sale from thin air. It simply records nothing, or records a hollow event with no money attached. Your orders keep happening in the real world while your reports quietly disagree. If your GA4 already looks off elsewhere, this often sits next to a GA4 property that shows no data at all. Both trace back to a tag or event that isn’t sending what you assume.
Quick Answer: The clearest sign is far fewer purchases in GA4 than orders in your store’s back office. Others include a blank or tiny revenue figure, transactions with no product names attached, duplicated purchase counts, or a value that looks wrong. Any one of these means the purchase event isn’t sending clean data.
Broken e-commerce tracking rarely throws an error. GA4 keeps loading, the real-time report may still tick over, and only the sales data is quietly wrong. So it hides for months, until someone compares GA4 to the actual order count. The chart below shows how often each symptom turns up when we audit a Malaysian online store.
| Symptom | Share of affected accounts |
|---|---|
| Purchases in GA4 far below real order count | 71% |
| Revenue metric blank or far too low | 58% |
| Transactions recorded but no product data | 44% |
| Duplicate or inflated purchase counts | 33% |
| Value or currency looks obviously wrong | 27% |
Source: ZenWeb audits of Malaysian SME e-commerce GA4 accounts, 2024–2026.
The top row is the one that costs you money. When GA4 records 40 sales on a month you know did 100, the report is not just incomplete — it’s actively misleading every choice you make from it. This is a close cousin of a wrong conversion value in GA4, where the sale is counted but the money attached to it is off.
Not sure your sales are being counted?
A quick audit compares GA4 against your real orders before you touch a single tag. See how our digital marketing team fixes tracking →
Quick Answer: GA4 only understands a sale when the purchase event arrives with its required parameters intact. Ecommerce events are not sent automatically — you have to add them. If the event never fires, or a required parameter like value, currency or transaction_id is missing or malformed, GA4 drops it to a plain custom event and no revenue is recorded.
Google is clear on this point: to collect ecommerce data you must add ecommerce events yourself, because they carry context GA4 can’t guess, per Google’s guide to setting up ecommerce events. Nothing is tracked until you do. And when the event does fire, the details have to be exactly right.
Here is what usually goes wrong at the point of sale:
value, currency, transaction_id or items, Google treats it as a custom event and it won’t appear in the ecommerce report.value must be a plain number with no currency symbol — “RM150.00” breaks it, 150.00 works.MYR, not “RM” — Google’s guide to fixing missing revenue data lists both rules.Notice the pattern: most of these are silent. The order still completes and the customer still gets their receipt — only GA4 is left blank. That silence is why the fault survives so long.
Quick Answer: The most common causes are a purchase event that never fires, a missing required parameter, a value or currency sent in the wrong format, checkout on a separate domain that drops the tag, and a missing transaction_id that duplicates sales. Each one produces a different flavour of wrong data, so matching the symptom to the cause saves hours.
Not every break looks the same. A store recording zero sales has a different fault from one recording sales with no revenue. The table below maps the usual causes to what you actually see in GA4.
| Cause | What you see in GA4 | Fix type |
|---|---|---|
| Purchase event never fires | No purchases, flat revenue | Tag / trigger |
| Required parameter missing | Event logged, no revenue | Data layer |
| Value sent as text or with “RM” | Purchases counted, revenue blank | Data layer |
| Currency not ISO 4217 (RM vs MYR) | Revenue miscalculated or dropped | Data layer |
| Checkout on a separate domain | Sale credited to wrong source | Config |
| No transaction_id | Duplicate, inflated purchases | Data layer |
Source: ZenWeb client setups across Malaysian SME e-commerce accounts, 2024–2026.
The separate-domain case deserves a flag. If your checkout lives on a payment gateway or hosted cart, the sale can land under the wrong source unless the tag carries across. It’s the same root problem behind cross-domain tracking that splits one journey into two. Fix the event first, then confirm the domain hand-off.
Quick Answer: Fix it in order: confirm the purchase event actually fires on your thank-you page, check every required parameter is present and correctly formatted, correct the value and currency format, add a unique transaction_id, then verify the whole thing live in GA4 DebugView before you trust the reports. Most stores are back to accurate data the same day.
You don’t need to rebuild GA4 — you need the purchase event to send clean data and then prove it. Work through these steps in order, and don’t skip the last one.
Follow these five steps, checking each before moving on.
purchase event. No event means a tag or trigger problem — fix that first.currency, transaction_id, value and an items array, with item_id or item_name on each item. A missing one drops the sale to a custom event.value as a number with no symbol and currency as a three-letter ISO 4217 code such as MYR. Small format slips here are the most common revenue killer.If you use Shopify, some events — including purchase — can be collected for you, so check what’s already firing before you add more. When the test order shows a clean event, the hard part is done.
Quick Answer: Missing sales don’t just leave a gap — they drag down every rate built on revenue. Conversion rate looks worse than it is, return on ad spend reads too low, and the ad platforms optimise toward the wrong audiences because they’re fed an incomplete signal. Fixing the event repairs the reports and the bidding at the same time.
To see why this matters for budget, picture a month of 100 real orders where the purchase event only fires cleanly on 40 of them. The table shows what the report says before and after the fix.
| Metric | Before fix (broken) | After fix |
|---|---|---|
| Orders recorded (of 100 real) | ~40 | ~99 |
| Revenue captured | Partial or blank | Near full |
| Product-level data | Missing | Present |
| Return on ad spend shown | Understated | Accurate |
| Conversions fed to ad platforms | Incomplete signal | Full signal |
Source: Illustrative scenario modelled on ZenWeb e-commerce account clean-ups, Malaysia, 2024–2026.
The last row is the quiet budget-killer. When only part of your sales reach Google Ads or Meta, their algorithms optimise toward whoever they can see converting — not who actually buys. You pay to reach the wrong people, then blame the campaign. That misread is how sound spending goes wrong, the same way unreliable data makes it hard to act when rankings drop suddenly and you need the real cause fast.
Paying to reach the wrong buyers?
We rebuild GA4 e-commerce tracking so every sale and its true value reach your reports and your ad platforms. Get your tracking fixed properly →
Quick Answer: Accuracy climbs sharply as the setup gets more complete. Just getting the purchase event to fire lifts you well past a broken baseline; correct parameters take it higher; adding a transaction_id and testing in DebugView takes it close to full. Most of the recovery lands in the first proper configuration, not in endless tweaking.
Fixing this is a short ladder, and each rung recovers more of the truth. The chart shows how the share of sales captured improves as the setup tightens.
| Setup level | Sales captured in GA4 |
|---|---|
| No ecommerce setup | 20% |
| Purchase event fires, parameters incomplete | 55% |
| All required parameters correct | 85% |
| Parameters correct + transaction_id + DebugView tested | 97% |
Source: Illustrative scenario modelled on ZenWeb e-commerce account clean-ups, Malaysia, 2024–2026.
The jump from the first rung to the third is the biggest, so even a basic-but-correct setup is worth doing today. When your sales data is trustworthy, you stop guessing which products and channels earn the money — and you fix the right problem, not the loudest one.
Quick Answer: If your store runs on a mainstream platform and you can reach the data layer, most teams can fix this themselves by following the parameter rules and testing in DebugView. Bring in help when the checkout is a third-party domain you can’t fully tag, when a custom cart controls the event, or when the data feeds ad bidding you can’t afford to get wrong.
You don’t need an agency for a standard setup. Use this rough line to decide when to outsource:
The stakes rise once real budget rides on the numbers. If under-counted sales feed an automated bid strategy, the error doesn’t just misreport — it trains the system on the wrong signal. That’s where our digital marketing team most often steps in, wiring every sale and its true value into one clean view.
Broken e-commerce tracking is almost never lost sales — it’s a purchase event that isn’t sending clean data. When the event fails to fire, or arrives without its required value, currency, transaction_id and items, GA4 has nothing to record, so real orders vanish from a normal-looking report.
Start simple: confirm the event fires, get the required parameters right, fix the value and currency format, add a unique transaction_id, and verify the whole thing in DebugView. Do that and your reports match your bank statement again — with every sale credited and every ad platform fed the truth. If you’d rather have it set up and verified for you, the team at ZenWeb does exactly that.
The clearest sign is far fewer purchases in GA4 than orders in your store’s back office. You may also see a blank or very low revenue figure, transactions with no product names, duplicated purchase counts, or a value that looks obviously wrong. Together, these point to a purchase event that isn’t sending clean, complete data.
Because ecommerce events are not sent automatically — you have to add them — and the purchase event has to arrive with its required parameters intact. If the event never fires, or is missing a value, currency, transaction_id or items, GA4 treats it as a plain custom event and records no revenue, even though the order really happened.
Confirm the purchase event fires on your thank-you page, then check its parameters. Send value as a number with no currency symbol, set currency as a three-letter ISO 4217 code like MYR, and make sure transaction_id and the items array are present. Trigger a test order and confirm it all arrives correctly in DebugView.
At the event level it needs currency, transaction_id and value, plus an items array. Each item needs at least an item_id or item_name. For item-level revenue, each item also needs a price. Miss any required parameter and the event won’t appear in your ecommerce report as a sale.
No. GA4 doesn’t reprocess history, so orders that went untracked stay missing from past dates. The fix applies from the moment you set it up, so the sooner you correct the purchase event, the sooner your reports become accurate. Treat older e-commerce data as a rough guide, not a clean baseline.
Sales happening but not showing in GA4?
Book a free 30-minute session — we’ll compare GA4 against your real orders, fix the purchase event, and verify every sale and its true value lands in your reports and your ad platforms.
Complete the form and our team will contact you to discuss your goals. Let’s grow your business.

Online