GA4, GTM, Google Ads, and the CRM are not four counters watching the same moment under the same rules. A mismatch can be an implementation defect, a valid reporting difference, or both.
Start with one controlled business action that has a stable opaque identifier. A form thank-you message is not enough. Use a non-PII submission ID, order ID, transaction ID, call ID, or CRM record that can connect the browser test to the business outcome.
Never send an email address, phone number, name, form message, or another value recognizable as personally identifiable information to GA4 or Google Ads. Google states this boundary in its PII policy guidance. Keep the test ID opaque and resolve it to the private business record outside analytics.
The evidence chain
| Handoff | Evidence to capture | Failure this isolates |
|---|---|---|
| Business action | Submission/transaction ID, server timestamp, outcome state | UI success without a durable lead or purchase |
dataLayer or application event | Exact event name, parameters, value, currency, ID | Missing, duplicated, or malformed application signal |
| GTM trigger and tag | Tag Assistant timeline, trigger conditions, exceptions, consent state | Tag did not fire, fired twice, or targeted the wrong destination |
| Network request | Request URL, destination/measurement ID, event name, response | Interface says “fired” but request was blocked or misrouted |
| GA4 debug collection | DebugView/Realtime device and event | Request reached the intended property under the test state |
| GA4 standard reporting | Event/key-event record after processing | Debug collection exists but reporting configuration differs |
| Google Ads conversion | Conversion action, source, counting, window, Primary/Secondary state | Import, eligibility, attribution, or Ads configuration difference |
| CRM/business count | Same durable ID and qualification state | Analytics event count is being compared with a different business definition |
GA4 DebugView helps inspect debug events. GTM Preview and Tag Assistant helps inspect container and tag behavior. Neither alone proves how a later Ads or standard Analytics report should attribute and count the action.
Implementation defects versus valid reporting differences
| Category | Examples | Required comparison |
|---|---|---|
| Missing implementation | Trigger never fires, request blocked, wrong property ID, wrong conversion action | Controlled browser trace and destination IDs |
| Duplicate implementation | Hard-coded tag plus GTM tag, duplicate listeners, SPA history trigger plus custom event | One action ID mapped to every outgoing request |
| Consent sequencing | Defaults arrive late, additional consent checks block a Google tag, update does not precede the action | Test each agreed consent state with Tag Assistant and network evidence |
| Event definition | GA4 key event and Ads action represent different steps | Written business definition for each event/action |
| Time basis | GA4 and Ads reports place a conversion on different dates | Conversion time, ad-interaction time, property/account timezone |
| Counting | One-per-click/action versus every purchase/action | Conversion-action counting setting and transaction-ID behavior |
| Eligibility | Only some channels/interactions qualify for an Ads conversion | Source, conversion window, eligible interaction, channel |
| Attribution | Different model, lookback window, or impression/engaged-view coverage | Report and conversion-action attribution settings |
| Column choice | Primary “Conversions,” secondary actions, or “All conversions” | Exact Ads column and action inclusion state |
| Processing/import delay | Debug/Realtime appears before standard reports or Ads import | Same ID checked after documented processing time |
Google documents that imported Analytics conversions can be delayed and that conversion windows differ in its GA4-to-Google Ads conversion documentation. Record the current account settings instead of assuming a universal delay or window.
Controlled test worksheet
| Field | Recorded value |
|---|---|
| Test ID | |
| Business action and expected state | |
| Browser, device, hostname, and environment | |
| Consent state | |
dataLayer event and timestamp | |
| GTM container/version, trigger, and tag | |
| Network destination and event payload | |
| GA4 property, DebugView event, and device | |
| GA4 standard report date/timezone | |
| Ads account, conversion action, source, and status | |
| Ads counting, window, attribution, and Primary/Secondary | |
| CRM/business record |
Run at least these states when they are in scope:
- first page load before consent choice
- granted analytics/ad consent
- denied consent
- returning visitor with stored choice
- form validation failure
- successful action once
- refresh/back-button/repeated submit path
- cross-domain or embedded-form path
Debug in order
- Prove the real lead or transaction exists.
- Prove the application emits one intended event with the stable ID.
- Prove GTM evaluates the intended trigger and tag once.
- Prove the browser sends the request to the intended destination.
- Prove GA4 receives the debug event in the intended property.
- Wait for and check the applicable standard report.
- Inspect the Google Ads conversion action and import path.
- Reconcile valid time, counting, eligibility, attribution, and column differences.
Do not “fix” attribution settings to force two totals to match. Fix an implementation defect when the evidence chain breaks; document a reporting difference when the chain is intact but the systems apply different rules.
Definition of done
- one controlled action maps to one stable business identifier
- intended tags and requests occur exactly once for each tested state
- property, account, destination, event, and conversion-action IDs are recorded
- consent behavior matches the agreed implementation
- GA4 and Ads reporting settings are included in the reconciliation
- processing time is allowed before declaring a downstream miss
- the final note distinguishes implementation defects from valid differences
A technically correct event does not prove conversion lift. It proves that the named signal moved through the documented path under the tested conditions.