Follow the whole chain
When an event is missing, inspect the chain in order: Did the user action happen? Did the trigger fire? Did the tag send? Did it use the right Measurement ID? Did GA4 receive it? Did a filter, consent state, or report setting hide it?
Tag Manager Preview helps you inspect triggers and variables in the browser. GA4 DebugView shows a near-real-time stream for enabled debug devices. Realtime provides another quick view. Browser developer tools can help confirm that a network request was sent. Use the tools together; one green check is rarely enough.
- Reproduce the action in a controlled test.
- Check trigger conditions and variable values.
- Confirm the event name and destination.
- Inspect parameters, not just the event count.
- Check the final report after processing.
Duplicates and splits hide in plain sight
Duplicate purchases can appear when both a thank-you page load and a purchase confirmation request fire the same event. Duplicate page views can come from two installations. Split sessions can appear when related domains are not configured for cross-domain measurement or when payment gateways return visitors as new referrals.
Use a unique transaction_id for ecommerce purchases and verify that your implementation sends it consistently. Review unwanted referrals where appropriate. Treat single-page applications carefully: route changes may require deliberate history-change handling rather than assuming a normal page load happened.
Trace an event through DebugView
DebugView event timeline
Test device • controlled purchase journey
Event sequence in the last 30 minutes
| Time | Event | Inspection |
|---|---|---|
| 14:32:08 | begin_checkout | Expected |
| 14:32:41 | add_payment_info | Expected |
| 14:32:44 | purchase | Missing value |
| 14:33:02 | purchase | Duplicate test |
Parameter inspection
transaction_idT-TEST-1042
currencyUSD
valueEmpty!
ContainerVersion 42
Follow the sequence
Check whether earlier checkout events occurred and whether purchase arrives once at the expected moment.
Data quality is a continuing practice
Create rules for internal traffic and verify them before relying on filters. Keep a change log for tags, consent banners, site releases, and campaign launches. Schedule a small set of automated or manual tests for your most valuable events.
A drop in data is not automatically a marketing problem. Compare events, users, and sessions across several reports, then check recent releases. If collection is affected by consent choices, ad blockers, or browser restrictions, describe the limitation honestly rather than presenting the visible data as the whole audience.
Use each debugging tool for the evidence it can actually provide
The browser shows what the user action and page code did. Tag Manager Preview shows how a container evaluated triggers, tags, and variables in its preview environment. Network requests show that a request was constructed and sent. DebugView shows events GA4 associated with debug-enabled measurement. Reports show processed output.
These checkpoints are complementary. A variable can look correct in Preview while the tag uses the wrong destination. A request can be sent while consent or filtering changes what is available later. An event can appear in DebugView while a custom parameter is absent from reports because it was never registered.
Record evidence at the checkpoint where the chain breaks. “GA4 is not working” is not a useful diagnosis. “The success trigger fires, but the transaction_id variable is empty because the data layer uses order_id” gives a developer a precise place to act.
| Tool | Best evidence | Limitation |
|---|---|---|
| Browser console / elements | Page behavior and script errors | Does not prove GA4 received data |
| GTM Preview | Trigger and variable evaluation | Preview state can differ from published state |
| Network request | Payload and destination request | A sent request is not a processed report |
| DebugView | Near-real-time debug event stream | Not a substitute for final report QA |
| Standard reports | Processed reporting output | Later processing and different rules apply |
Debug by symptom with a structured decision tree
If an event never appears, begin with the trigger and destination. If it appears twice, look for duplicate listeners, duplicate installations, and repeated route or confirmation events. If it appears with missing parameters, inspect variable timing and data-layer structure. If it appears in one browser but not another, investigate consent, blockers, script errors, and browser-specific behavior.
If purchase revenue is wrong, separate count problems from value problems. Count problems involve triggers and transaction deduplication. Value problems involve currency, numeric types, item arrays, tax and shipping conventions, and refund handling. Fixing the event count will not repair an invalid currency or a string where a number was expected.
If acquisition changes unexpectedly, review redirects, cross-domain settings, referral exclusions, campaign tagging, and consent before assuming audience behavior changed. Preserve a reproducible example with the exact URL, steps, expected payload, actual payload, and release version.
| Symptom | First checks | Likely evidence |
|---|---|---|
| No event | Trigger, tag status, destination, consent | Preview and network |
| Duplicate event | Multiple tags, listeners, refresh behavior | Event sequence and transaction ID |
| Missing parameter | Variable name, timing, type | Data layer and request payload |
| Unexpected source | Redirects, UTMs, domains, referrals | Landing URL and session acquisition |
Handle single-page applications and ecommerce edge cases
Single-page applications change content without always performing a traditional page load. Depending on the framework and history behavior, enhanced measurement may or may not represent every meaningful view the way you expect. Define what constitutes a page or screen, then test direct loads, internal navigation, browser Back, and repeated visits to the same route.
Ecommerce needs a reliable transaction identifier and a consistent item structure. Test quantity changes, multiple items, coupons, zero-value orders where relevant, currency formatting, refunds, and confirmation-page refreshes. A purchase event without items may still count an order but will not support useful product analysis.
Third-party checkout and payment flows add boundary risk. Test the entire route across domains and back again. Watch for new sessions, lost parameters, duplicate page views, and referrals from the payment host. Work with the checkout provider’s documentation because platform limitations can determine what is technically possible.
Turn QA into a durable release record
A QA record should let another person reproduce your test. Include the date, property, stream, container version, site release, test URL, consent state, browser, expected payload, actual result, and evidence links. Record failures and retests rather than keeping only the final green screenshot.
Prioritize tests by business risk. Purchase, lead, login, signup, and checkout events usually deserve more frequent coverage than low-value interface clicks. Create a small smoke suite for every release and a broader suite for scheduled audits.
After a fix ships, verify both the original failure and nearby behavior. A trigger change that stops duplicate purchases might also prevent legitimate purchases. Good QA closes the loop by checking the business outcome, not just the absence of the original bug.
QA release record
Date: 2026-11-02
Property: Northstar production
Container: GTM version 42
Journey: Guest checkout, mobile Chrome
Expected: one purchase, unique transaction_id, USD value, 2 items
Result: PASS after confirmation refresh and Back-button test
Owner: Analytics engineering
Evidence: DebugView + request payload + processed reportWorked example: a purchase disappears after a site release
A store releases a new checkout on Tuesday. On Wednesday, purchase events fall 80% while begin_checkout remains stable. The analyst starts with a controlled test order rather than a campaign theory. The application shows confirmation, but the data layer no longer contains the expected ecommerce object.
GTM Preview shows that the purchase trigger still exists, yet the transaction_id and items variables are empty. The release renamed the backend field from ecommerce.purchase to orderConfirmation. The fix is to restore a stable, documented data-layer contract or deliberately update every consumer with review and QA.
After the fix, the analyst repeats refresh, Back-button, multi-item, coupon, payment-failure, and second-order tests. They also annotate the incident period so stakeholders understand that the drop includes a measurement outage rather than only a demand decline.
- Reproduce one controlled order and preserve expected versus actual payloads.
- Check application state, data layer, trigger, variables, request, and GA4 processing in order.
- Repair the contract at the first broken checkpoint.
- Run the full critical ecommerce regression suite.
- Document the affected reporting window and reconciliation approach.
The 15-minute critical-event smoke test
A smoke test is a fast release gate, not a complete audit. It checks that the highest-value journey still works and that no obvious duplicate or destination error appeared. Keep the steps short enough that teams will actually run them after every meaningful release.
Record the result immediately. A simple timestamped pass with container and site versions is more useful than a verbal “looks fine,” while a failure should include the exact step and evidence needed for diagnosis.
- Open the production test URL and confirm the intended container and property.
- Complete one valid critical journey with debug measurement enabled.
- Verify one event, destination, transaction or lead identifier, and essential parameters.
- Repeat the confirmation once to catch obvious duplication.
- Check the live published state and log pass, failure, versions, and owner.
Build a purchase QA script
Write a repeatable test for an ecommerce purchase event that includes product and revenue parameters.
- List the exact action that should trigger purchase.
- Record the expected transaction_id, currency, value, and items.
- Test refresh, Back button, and a second order.
- Check DebugView and the eventual standard or exploration report.
- Document the result and the release version tested.