Skip to content

Test bench · Growth engineering

Your ad platform counts clicks. Your business needs leads.

We sent eight scripted enquiries through a test form. The server stored 4 leads. A tag on the Send button counted 7. Count the lead instead, with one event that fires after your server confirms it.

We sent eight enquiries through a test quote form and counted each one five ways. Our server stored 4 leads. A tag on the Send button counted 7. A tag on the form’s submit event counted 7. A tag on the thank-you page counted 5. An event that waited for the server to confirm the lead counted 3. It did not count one visitor, who had declined cookies, as a consent-aware event should. That enquiry reached us anyway.

If your primary conversion is a button click or a thank-you page view, your bidding is learning from a number that includes failed attempts and repeats.

What your ad budget learns from

An ad platform has no idea what a lead is worth to you. It learns from whatever you tell it is a conversion. Google Ads lets you count a click as one; its help page on click conversions says the setting “tells Google Ads to record a conversion only when a customer clicks on the link or button.”[1]

Which conversions steer the spend is a separate setting. Primary actions are the ones “reported in the ‘Conversions’ column in your reports and used for bidding”, provided their goal is set for bidding. For Google’s automated bidding, the help page warns that “Misconfiguring these settings can prevent Smart Bidding from optimizing effectively”.[2] If the primary action is a click on Send, automated bidding goes looking for more people who click Send. Some of them become customers. Some of them leave an email field empty and give up.

Four ways a lead gets miscounted

1. A failed attempt counts as a lead

A click on Send is an attempt. So is a submit event. Google Tag Manager’s form trigger has a Check Validation option, and its help page is plain about what happens without it: “If unselected, the trigger will fire whenever a user attempts to submit the form.”[3] Even with it on, the browser can only check the form itself. It cannot know whether your server stored the enquiry. GA4’s automatic form tracking has the same limit: it records form_submit “when the user submits a form”.[4]

2. One lead counts twice

People double-click buttons and reload pages. A thank-you page tag counts every view, so a visitor who refreshes it, or comes back to it from their history, adds a conversion each time. Google Ads counts conversions one of two ways, One or Every. Its own advice points the same way: for leads, “usually only one, unique lead per ad click likely adds value for your business”. That is the One setting.[5]

3. The browser never sees it

Google’s EU user consent policy sets consent and disclosure duties for anyone whose Google agreement or Google product incorporates it, covering “end users in the European Economic Area, the UK and Switzerland”.[6] When a visitor declines, the tags that wait for consent do not fire, and the lead exists only in your inbox or CRM. Google can model some of the missing conversions when an account meets its eligibility conditions, which include a click threshold: “You have a daily ad click threshold of 700 ad clicks over a 7 day period, per country and domain grouping.”[7] A small account can sit below it. Google also says that “Consented users are typically 2-5x more likely to convert than unconsented users”, and adds that this varies widely.[7]

Browsers trim what tags can see as well. When Safari’s tracking prevention detects click IDs added to a link, it “caps the expiry of cookies created in JavaScript on the landing webpage to 24 hours.”[8] A visitor who reads your page on Monday and sends the form on Wednesday may arrive as a stranger.

4. It counts on a different day

Your CRM files a lead on the day it arrived. “Google Ads reports conversions from the date and time of the click that led to the successful action”.[9] A click on 28 March that becomes an enquiry on 2 April is, by default, a March conversion in Google Ads and an April lead in your CRM. Conversions are counted inside a window after the click, and “the default window is 30 days.”[10] Monthly totals from the two systems can differ even when both are right.

What our test form counted

To see these effects side by side, our engineers built a sample quote form with name, email and message fields and a hidden field that only bots fill in. A server stores each enquiry once. Four browser rules, each waiting for the visitor’s consent as a consent-aware tag does, watched the attempts: a tag on the Send button, a tag on the form’s submit event, a tag on the thank-you page, and an event that fires once per lead ID after the server confirms it. On 10 November 2026 we scripted eight enquiries through it in headless Chrome, a browser driven by code.

Eight test enquiries, counted five ways
EnquirySend button clickedForm submittedThank-you page viewedServer confirmedLead in your records
Valid enquiry11111
Required field left empty10000
Message too short11000
Double click on Send22111
Server error11000
Thank-you page reloaded twice11311
Cookies declined00001
Bot fills the hidden field01000
Total77534

The button tag counted three enquiries that never became leads: an empty email field, a message too short for the form’s own check, and a server error. It counted the double click twice. It missed the visitor who declined cookies. The submit tag skipped the empty field but still counted the short message, the server error, the bot and both clicks of the double click. The thank-you page tag counted one reloaded page as three leads. The confirmed event matched the stored leads in every case the browser could see.

  1. Send button clickedA tag on the button's click0
  2. Form submittedA tag on the form's submit event0
  3. Thank-you page viewedA tag on the thank-you page0
  4. Server confirmedAn event fired once per lead ID, after the server said yes0
  5. Lead in your recordsWhat the server stored0baseline

Pick an enquiry to send it through the form.

Send the test enquiries one at a time, or all eight, and compare each counting rule with the leads stored. Highlighted counters disagree with the stored leads. The numbers are the bench results above.

A 30-minute audit

Run the first pass yourself. You need your ad account and your inbox.

  1. List your primary conversions. In Google Ads, open the conversion actions and note each primary action and what triggers it: a click, a page view, a form event or an import.
  2. Send a broken enquiry. Leave the email field empty and press Send. If a conversion appears, your tag counts attempts.
  3. Send a good one, then misbehave. Double-click Send, then reload the thank-you page twice. Count the conversions that appear for one lead.
  4. Check the counting setting. Lead actions should usually count One per click.
  5. Compare 30 days. Put the ad platform’s lead count next to the leads in your CRM or inbox for the same period, and expect some gap from dates and consent. Its size depends on how many visitors decline cookies. A gap of several times is a sign the tracking needs a closer look.

Count the lead when the server says yes

Report a lead at the moment your server has stored it. Only the server knows it exists. GA4’s recommended event for this is generate_lead, which “measures when a lead has been generated (for example, through a form).”[11] Fire it after a successful response, once per lead, with the lead’s ID attached.

JavaScriptconfirmed-lead.js
// Browser: send the enquiry, and report a lead only after the server has stored it.
form.addEventListener("submit", async (event) => {
  event.preventDefault();
  const res = await fetch("/api/enquiry", { method: "POST", body: new FormData(form) });
  if (!res.ok) return showError(); // nothing stored, nothing counted

  const { leadId } = await res.json(); // a random ID your CRM also keeps, not a record number
  // Your tag manager fires ad tags on this event only when the visitor's consent allows it.
  window.dataLayer = window.dataLayer || [];
  window.dataLayer.push({
    event: "generate_lead",
    lead_id: leadId, // reuse as the Meta and LinkedIn event ID
  });
  location.assign("/thanks");
});

// Server: store the enquiry once, even if the button was pressed twice.
// The form carries a one-time key; the same key returns the same lead.
async function saveEnquiry(fields, key, clickIds) {
  const existing = await db.leads.findByKey(key);
  if (existing) return existing.id;
  // Keep the click ID only where consent and your privacy notice allow it.
  return db.leads.insert({ ...fields, key, gclid: clickIds.gclid, status: "new" });
}

The ID matters once you send the same lead from the browser and from your server, which is how Meta’s and LinkedIn’s server-to-server conversion APIs work. Meta drops a repeat when the events share an ID and name “sent to the same Pixel ID within 48 hours”.[12] LinkedIn, given the same eventId from both, says “we discard the Conversions API event and count only the Insight Tag event”.[13]

Teach the platform what a good lead is

Counting leads correctly removes one source of noise from what the budget learns. Telling the platform which leads turned into customers lets it learn from your sales. Google has goal types for this, and describes their purpose this way: “Automated systems can optimize for specific, high-value business outcomes rather than just maximizing lead volume.”[14]

  • Enhanced conversions for leads use details from your form to connect a later outcome to the ad. Google lists the benefit as “Improves measurement of offline transactions that came from a website lead or visitor.”[15]
  • Offline conversion imports send closed or qualified leads back with their click IDs. Google reports that advertisers who added first-party data to their click-ID imports “saw a median 10% increase in conversions compared to those using standard offline conversion imports”. That is Google’s own figure about its own product.[16]
  • Conversion adjustments correct the record when a lead turns out to be spam or a duplicate: “Retract: Allows you to permanently remove a conversion and change the conversion value to 0.00”.[17]

The first two send data about a person to the ad platform, so they sit under your consent setup and your privacy notice. Enhanced conversions send details such as an email address or phone number to Google in hashed form.[15] Treat a hashed email as personal data. Send a lead back only when its visitor’s consent and your privacy notice allow it.

When server-side tagging is worth it

Server-side tagging pays off when you run several ad platforms or need to control what leaves your site. For many small and mid-sized accounts, four steps come first: count confirmed leads, set lead actions to One, store click IDs, then send qualified outcomes back.

Server-side tagging moves part of the work from the visitor’s browser to a server you control. You decide what is sent and can strip fields before they leave. Moving a call to the server does not change what the visitor agreed to. For Google’s own tags, Google’s documentation says: “Because of this architecture, you only need to set up consent mode in the web container.”[18] Tags and API calls for other platforms, including Meta and LinkedIn, follow the visitor’s choice only if you build that check in. Store the consent state with the enquiry, and send nothing the visitor’s choice does not allow.

On our bench, the declined-cookies enquiry was stored like any other lead. Passing it to an ad platform is a separate step, and depends on the consent the visitor gave and your privacy notice. Settle that before you build the upload.

What the bench shows

The bench is one sample form, scripted in headless Chrome on 10 November 2026. Its four counting rules model the documented behaviour of common setups. The counts show how each rule behaves in each case. How often those cases occur on your site depends on your visitors, your form and your consent banner. The 30-minute audit measures that.

Verne’s growth engineers can run this audit with you inside your own stack, then wire the confirmed-lead event into your form and CRM. The code and documentation are handed over at full delivery. Fix the counting first, then decide what to spend.

Frequently asked questions

Why does Google Ads show more leads than my CRM?

Three causes are common. The conversion fires on a click or a page view instead of a confirmed lead. The counting setting records every conversion per click instead of one. And the dates differ: Google Ads reports a conversion, by default, on the date of the ad click, while a CRM records the date the lead arrived.

Should lead conversions count one or every?

One, for most lead forms. Google's guidance is that for leads, usually only one unique lead per ad click likely adds value. Every suits purchases, where each sale has value.

What event should I use for a lead form?

An event that fires once, after your server has accepted and stored the enquiry, carrying the lead's ID. GA4's recommended event for this is generate_lead.

Does server-side tagging recover conversions lost to cookie consent?

No. Google's documentation says that with server-side tagging, consent mode is set up in the web container, so a visitor's consent choice still applies to Google's tags. Tags and server calls for other platforms need the same check built in.

Sources

  1. Track clicks on your website as conversions (opens in a new tab) Google Ads Help, accessed 2026-11-10. A link or button click can be recorded as a conversion.
  2. About primary and secondary conversion actions (opens in a new tab) Google Ads Help, accessed 2026-11-10. Primary actions are reported as conversions and used for bidding.
  3. Form submission trigger (opens in a new tab) Tag Manager Help, accessed 2026-11-10. Check Validation and when the trigger fires.
  4. Enhanced measurement events (opens in a new tab) Analytics Help, accessed 2026-11-10. form_submit fires when the user submits a form.
  5. About conversion counting options (opens in a new tab) Google Ads Help, accessed 2026-11-10. One per click for leads.
  6. EU user consent policy (opens in a new tab) Google, accessed 2026-11-10. Covers the EEA, the UK and Switzerland.
  7. About consent mode modeling (opens in a new tab) Google Ads Help, accessed 2026-11-10. Eligibility threshold and Google's consented-user figure.
  8. Tracking Prevention in WebKit (opens in a new tab) WebKit, accessed 2026-11-10. Cookie caps after link decoration.
  9. Create conversions from Google Analytics events in Google Ads (opens in a new tab) Google Ads Help, accessed 2026-11-10. Why Ads and Analytics dates differ.
  10. About conversion windows (opens in a new tab) Google Ads Help, accessed 2026-11-10. Default click-through window.
  11. Recommended events: generate_lead (opens in a new tab) Google Analytics developers, accessed 2026-11-10. The recommended lead event.
  12. Deduplicate Pixel and server events (opens in a new tab) Meta for Developers, accessed 2026-11-10. Event ID and name, 48 hours.
  13. Conversions API deduplication (opens in a new tab) LinkedIn Marketing API, Microsoft Learn, updated 2025-08-29. Same eventId keeps the Insight Tag event.
  14. About qualified leads and converted leads (opens in a new tab) Google Ads Help, accessed 2026-11-10. Lead goals beyond volume.
  15. About enhanced conversions for leads (opens in a new tab) Google Ads Help, accessed 2026-11-10. Offline outcomes from website leads.
  16. About offline conversion imports (opens in a new tab) Google Ads Help, accessed 2026-11-10. Google's median 10% figure, Google's own.
  17. About conversion adjustments (opens in a new tab) Google Ads Help, accessed 2026-11-10. Retracting a conversion.
  18. Consent mode in server-side tagging (opens in a new tab) Google Tag Platform, accessed 2026-11-10. Consent is set in the web container.