GA4's ecommerce event schema is public, documented, and still gets implemented incorrectly often enough that it's worth walking through as a checklist rather than assuming "we added the GA4 snippet" covers it. Most broken setups aren't missing events entirely, they're firing the right events with subtly wrong data, which is harder to catch because the dashboard still populates, just with numbers that are quietly off.
The event set that builds a real funnel
A purchase event alone answers "how much revenue happened." It doesn't
answer "where are visitors actually dropping off," which is the question
that's worth acting on. The full funnel needs view_item, add_to_cart,
begin_checkout, and purchase, each carrying consistent item-level data
(item ID, name, price, quantity), so GA4's funnel exploration can show the
real drop-off at each stage instead of just a top-line conversion number.
Transaction IDs: the single most common failure point
The purchase event's transaction_id has to be unique per real purchase
and has to be present and consistent every time that purchase's data is
reported. Two failure modes show up constantly: a confirmation page that
refires the purchase event on page refresh without reusing the same
transaction ID, silently inflating revenue, and a transaction ID that's
missing or inconsistent between a client-side and a server-side
implementation, which breaks GA4's own deduplication and can undercount
instead.
Currency, explicitly, on every event
GA4 converts reported values to your property's configured reporting
currency using the exchange rate on the event's date, which is correct and
expected behavior. It depends on every event explicitly setting its own
currency parameter to match what was actually charged. A store selling
in multiple currencies that defaults every event to a single hardcoded
currency value will report revenue that's wrong by exactly the exchange
rate gap, consistently, in a way that doesn't throw an error and doesn't
look obviously broken in the dashboard.
Not confident your GA4 ecommerce numbers are actually accurate?
A broken event, a duplicated transaction ID, or a currency mismatch can all look fine in the dashboard while quietly misreporting revenue. We'll audit your actual event stream and tell you what's wrong.
Talk to an engineer →Client-side alone is usually not enough
A pure client-side GA4 implementation is vulnerable to ad blockers and browser tracking prevention dropping events before they're ever sent, which under-reports conversions in a way that's invisible unless you're actively comparing GA4 numbers against a source of truth like actual order records. For a store running paid acquisition, where the ad platform bids against what GA4 reports as a conversion, that gap has a direct cost. We cover a real production example, including why server-side tagging closes most of it, in wiring GA4 and Google Ads conversion tracking for a storefront that actually buys traffic.
The rule
Treat the full ecommerce event set, not just purchase, as the baseline. Audit transaction IDs for uniqueness and consistency before trusting revenue numbers. Set currency explicitly on every event rather than relying on a property-level default. And if real ad spend depends on this data, assume client-side tracking alone is under-reporting and plan for server-side backup before it becomes an expensive surprise. We wire analytics and conversion tracking like this under headless commerce and ecommerce development engagements.