All posts
MeasurementStep-by-step

GA4 Audit Checklist for Leads That Close Offline

A GA4 audit for leads that close offline: 14 checks, from whether Google Ads bids on GA4 to click ids, consent, time zones and filters.

October 2, 2026·8 min read·by Olexander Cheberko
Table of contentstap to expand

A GA4 audit for a business whose sales close offline starts in Google Ads, with one question: does Google Ads bid on a GA4 key event? The checks after it test whether GA4 counts each accepted lead once, keeps its ad click and files it under the right channel.

Start here

Is Google Ads bidding on GA4?

Check 1: Is a GA4 key event primary for bidding?

WhereGoogle AdsGoalsConversionsSummary
You should see: Every action created from a GA4 key event set to Secondary (observe only). Secondary actions report only in All conversions and do not bid.
If not: Click Edit goal, select Secondary (observe only) and click Save. Demote, never delete: the secondary count is a free second opinion. When the sale closes offline, a GA4 key event counts form fills, not customers, so I never let it bid (why the two counts differ).

Check 2: Does a custom goal still bid on it?

WhereGoogle AdsGoalsConversionsSummaryCustom goals
Do: Expand Custom goals at the bottom of the page.
You should see: No custom goal holding a GA4 action. Every action in a custom goal bids, primary or secondary.
If not: Remove the action, or set the campaign back to account-default goals in its Conversion goals setting.

Does GA4 hold anything it must not?

Check 3: Does any URL or parameter carry an email, phone or name?

Do: In a Free form exploration, put Page location in the rows and filter it for @, for phone-shaped digits and for field names such as email.
You should see: No matches. The URL path and its parameters must be free of anything Google could recognize as personally identifiable information.
If not: Stop it at the source, usually a form that writes its fields into the thank-you URL. Turn on Redact data in the web stream (data redaction), then schedule a data-deletion request for the affected dates.
Careful: For a medical practice, Google offers no Business Associate Agreement for Google Analytics, so I also fail any condition or appointment type in a URL or parameter. What a booking flow should never send to analytics lists the rest.

Does GA4 count each accepted lead once?

Check 4: Does only an accepted lead fire the lead event, once?

WhereGA4AdminData displayDebugView
Do: With debug mode on through Tag Assistant (DebugView) and analytics cookies accepted, submit the form five ways your server rejects, such as an out-of-area ZIP code, then one AUDIT TEST lead it accepts.
You should see: No lead event for the five rejections and exactly one for the accepted lead.
If not: Fire the event from the server's accepted response, or tick Check Validation on the Tag Manager form trigger, which otherwise "will fire whenever a user attempts to submit the form". Two events per lead mean two sources; keep one. Setup is in GA4 key events for leads.

Check 5: Is form_submit marked as a key event?

WhereGA4AdminData displayEvents
You should see: On the Key events tab, your lead event and no form_submit. Enhanced measurement sends it "when the user submits a form", any form, with no word about your server accepting it. Read your lead event's own row, never the total: once ads personalization is on for a linked Google Ads account, GA4 also marks session_start and six other events as key events.
If not: Deselect the star next to form_submit.

Does each lead keep the click that paid for it?

Check 6: Does the visitor keep one session across your domains?

WhereGA4AdminData streamsConfigure tag settingsConfigure your domains
Do: Click your web stream first. Then, on your site, click through to the booking or form tool's domain.
You should see: Each domain in the lead flow that runs your Google tag in the list, and _gl in the address bar on arrival. Without cross-domain measurement, one visitor becomes two users and two sessions.
If not: Add each domain with Add condition. A domain that cannot run your tag goes under List unwanted referrals, so GA4 does not show it as a traffic source, and the confirmation step belongs on your own domain. If _gl vanishes on arrival, a redirect may be dropping it.

Check 7: Does an embedded booking widget report through your page?

WhereGA4AdminData displayDebugView
Do: Book one AUDIT TEST appointment through the widget on a landing page.
You should see: Your lead event in your device's stream, after the landing page's page_view.
If not: If it is missing, the event may fire inside the widget's iframe, where Analytics cannot see the gclid. Google's fix is Analytics on the parent page. For Calendly, see Calendly tracking for Google Ads and GA4.

Check 8: Does the gclid survive your redirects?

WhereChrome menuMore toolsDeveloper ToolsNetwork
Do: Load a live ad's final URL with gclid=TeSter-123 added, before any # (Google's test).
You should see: The value intact, capitals included, once the page loads. A Conversion Linker tag, if the site runs one, also stores the click in _gcl_* cookies such as _gcl_aw.
If not: Find the leg that drops it in the Location header of each 301 or 302, then point the ad at the final URL or carry the query string across. A lowercased value reaches Analytics as google / cpc with the campaign as (not set). More in Google Ads auto-tagging.

Check 9: Is Google Ads linked, with auto-tagging on?

WhereGA4AdminProduct linksGoogle Ads links
You should see: Every Google Ads account that advertises the site linked, and campaign names, not (not set), in the Advertising reports.
If not: The common causes of (not set) there are a missing link, auto-tagging off, or an unlinked account advertising the site. Expand Enable Auto-Tagging while linking; the steps are in how to link GA4 to Google Ads.

Check 10: Do GA4 and Google Ads share a time zone?

WhereGA4AdminProperty details
You should see: Reporting time zone equal to the Google Ads account's. That one is permanently set when the account is created, so GA4 moves.
If not: Change it and note the date. The change only affects data going forward.
Careful: Google Ads still files a conversion under the click date and GA4 under the event date. For daily checks, read Conversions (by conv. time) (conversion time columns).

Check 11: Does the consent state match your banner?

WhereTag AssistantOutput of your tagConsent
Do: In a Tag Assistant session, make a banner choice and compare On-page Default with On-page Update for analytics_storage (consent debugging). With regional defaults, repeat from a simulated US location.
You should see: No denied default where US visitors see no banner, and an update after each choice.
If not: Send the choice with update; a second default in its place loses the session_start event and leaves (not set) sessions. If your consent tool denies analytics on Global Privacy Control, record that rule; measuring leads when visitors decline tracking covers the gap. Setup is in consent mode v2 in Google Tag Manager.

Can the channel reports be trusted?

Check 12: Is the internal traffic filter active?

WhereGA4AdminData filters
You should see: An Internal Traffic filter set to Active. In Testing, it only labels matching data.
If not: Activate it. Filters work from creation forward and never touch past data. Give staff who key in phone callers an internal form, or each call becomes a web lead with no ad behind it.

Check 13: Do your leads land in a named channel?

WhereGA4ReportsAcquisitionLead acquisition
You should see: New leads by channel (lead acquisition report), with Unassigned under 2%, my pass line. GA4 uses Unassigned when no channel rule matches.
If not: Correct source and medium values that match no rule. On links you tag yourself, such as your Business Profile website link, set every UTM parameter: a missing one shows as (not set). A lead your server sends through the Measurement Protocol needs the client_id of the visitor's GA4 tag.

Check 14: Is the BigQuery export on, and are its tables kept?

WhereGA4AdminProduct LinksBigQuery Links
You should see: A link to a project with billing on: in the free sandbox, tables expire after 60 days. Data starts flowing within 24 hours of linking, so link it before you need the history.
If not: Enable billing, then update the default table expiration. Do you need BigQuery for attribution helps you decide.

What the checks decide

A fail in check 1 or 2 retires GA4 from bidding. A fail in check 3 stops the audit until the identifiers are gone. After that, checks 4 to 11 decide whether GA4 lead counts can sit beside Google Ads and the CRM, and checks 6 to 9 plus 12 to 14 whether its channel reports hold.

Either way, GA4 counts form fills, not customers. Sending back which leads paid is the closed-loop attribution I build, for medical practices as patient conversion tracking.

Tags

ga4-auditga4-audit-checklistga4-key-eventsgoogle-ads-ga4-importconversion-reconciliationoffline-conversions

Frequently asked questions

How long does a GA4 audit take?

About 90 minutes for one property, with Editor access to GA4, access to Google Ads and a way to send test leads the business knows to ignore. Most of that time goes to the live tests: rejected and accepted test leads, one test booking and the consent check.

How often should I audit GA4?

Rerun checks 1, 2, 4, 7 and 11 whenever someone changes the lead form, the booking widget, the consent banner or the Google Ads goals. Those are the changes that turn a pass into a fail. The reporting checks can wait for a quarterly pass.

Can a free GA4 audit tool run this checklist for me?

Partly. Tools that read GA4 settings or crawl your tags handle settings such as the time zone, filters and links. They cannot submit a lead your server rejects, and they see your Google Ads goals only if you give them Ads access, so checks 1, 2 and 4 still need a person.

Does a GA4 audit cover my Google Ads conversion tracking?

Only where the two systems touch: the link and auto-tagging, which actions bid, whether the click id survives the landing page, and the time zones. The Google Ads tags and any click-id upload need their own audit.

Related posts