missing conversions

Your form submissions are being counted twice

A lead event counted more than once per person inflates GA4 and your ad platforms alike. The usual causes are a key event left counting once per event, a trigger bound to the submission attempt rather than the confirmed success, a listener trigger left in place alongside a thank-you page trigger, and several different forms sharing one event name.

Updated

The symptom: more leads than CRM rows

GA4 reports more leads than your CRM holds rows. The gap is not stable the way ad blocking is. It moves with traffic mix and it favors particular devices or landing pages. Cost per lead in Google Ads looks better than the sales team’s experience of it. Reported conversion rate creeps upward with no change to the funnel.

Look at the event stream and the duplicates cluster. Two lead events on the same session inside the same second. Or three spaced a minute apart, only the last of which produced a record. Or one at the moment of clicking submit and another when the thank-you page renders.

Why lead events fire more than once

Four causes, and accounts often carry more than one at once.

Counting method. GA4 lets you set a key event to count once per event or once per session. New key events default to once per event. For a purchase that is usually correct. For a lead form, where one person completing one form is one lead, once per event counts every single fire.

Validation re-fires. A trigger bound to the submit button click, or the built-in form submission trigger in Google Tag Manager, fires on the attempt rather than the outcome. A visitor who mistypes an email address and resubmits produces two or three events for one lead. The built-in trigger’s validation check only detects the browser’s native validation blocking a submit. It cannot see a server rejecting the record, and it does not apply at all to forms managed by a JavaScript framework that never performs a native submit.

Double triggers. Someone adds a thank-you page trigger, the original listener trigger is never removed, and every successful submission fires twice. The same thing happens when one tag carries two triggers, when a second GTM container is installed alongside the first, or when a Meta base pixel sits in both the theme and the container. A conversion fired on a thank-you pageview also re-fires on refresh and back navigation, which is covered in full in duplicate purchase events.

Several forms, one event name. A contact form, a demo request and a gated download all push the same generic lead event, so one person moving through two of them in a session reports as two leads. This is a definition failure rather than a trigger failure, and it stays invisible in GA4 until the event is broken out by a form identifier parameter.

How to confirm a double count

Start with the outside number. Count CRM rows for a window, count GA4 lead events for the same window in the same timezone, and divide. A ratio meaningfully above 1.0 is inflation, not a reporting quirk.

Then find the shape, because the interval between duplicates names the cause.

  • Same second, same session: a tag firing on two triggers, or two containers on the page.
  • Seconds to minutes apart, same session, only the last one producing a record: validation re-fires.
  • Two events in one session from different forms: one event name covering several forms, which is a definition problem rather than a firing problem.
  • Same person, different sessions, days apart: not a duplicate at all, a repeat submitter, and a counting method decision rather than a bug.

In GA4, an exploration reporting event count alongside total users for the lead event gives you events per converting user. Healthy is close to 1.0.

Then go into the container. Open GTM preview, submit the form for real including one deliberate validation failure, and watch how many times the tag fires and which trigger fired it each time. Check the tag’s trigger list for a second entry. Check the rendered page for a second container ID.

In Meta Events Manager, put the browser and server counts for the lead event side by side and check whether deduplication is being reported. In Google Ads, open the conversion action and read its counting setting.

How to fix duplicate lead events

Decide the definition before touching anything: one lead per person, one per session, or one per submission. Every fix below follows from that answer.

Fire on success, not on intent. Push a dataLayer event from the form’s success callback or from the server-rendered confirmation, and trigger the tag on that custom event. Retire the click and built-in submit triggers. This eliminates validation re-fires entirely, because the event only exists once the record was accepted.

Pass a lead ID. Include a unique identifier for the submission as an event parameter. Use it as the transaction ID for Google Ads and as the event_id for Meta so browser and server events deduplicate. It also lets you count duplicates exactly in BigQuery instead of estimating them.

Name the form on every event. Send a form identifier as an event parameter and register it as a custom dimension. Where two forms represent two different outcomes, give them separate key events instead of one shared name. Until you can split the number by form, you cannot tell a duplicate from a second form filled by the same person.

Set counting to once per session on the GA4 key event where one person can only meaningfully convert once. It is a blunt instrument and it does not deduplicate across sessions, but it removes the most common inflation immediately.

Set Google Ads to count one conversion per click for lead actions. Counting every conversion is for repeat purchases, not for form fills.

Remove the duplicates you found. One tag, one trigger, one container, one base pixel. For single page apps, trigger on a deduplicated route change rather than a raw history listener.

Note that GA4 gives you no event ID you can set to suppress a repeat send. The counting method changes how key events are counted, not what is collected, so the real fix has to happen at the trigger.

What inflated leads cost you

Inflated leads make performance look better than it is, then quietly misdirect the budget.

Take a lead gen account spending $20,000 a month and reporting 400 leads. Reported cost per lead is $50. If 60 of those are duplicates, the real count is 340 and the real cost per lead is close to $59, which puts the reported figure roughly 15 percent below reality. Every scaling decision made on the $50 number is made on a false floor.

The second effect is worse. Smart Bidding optimizes toward the conversion signal it receives, and duplication is almost never uniform. If one browser double fires, or one landing page carries both triggers, the model reads that segment as cheaper and moves budget into it. You end up paying more for the traffic that happens to be counted twice.

Downstream, the sales team sees fewer leads than the dashboard promised, close rate looks worse than it is, and the argument about lead quality starts from numbers that were never real.

Over-counting and under-counting usually live in the same container, which is why fixing one without measuring the other tends to move the total in the wrong direction. The Missing Conversions Audit reconciles GA4 and ad platform lead counts against your CRM, logs every gap in both directions with severity, and fixes the top 10 in a separate GTM workspace, published only with your approval. $900 flat, 5 business days.

Questions

Does GA4 deduplicate events?

No. GA4 has no event ID field you can set to suppress a repeat send, and no deduplication step in standard reports. It offers a counting method on key events, once per event or once per session, which changes how conversions are counted but not what is collected. Real deduplication has to happen at the trigger, in the dataLayer, or downstream in BigQuery using a unique lead ID.

Should a lead key event count once per session or once per event?

Once per session suits most lead forms, because one person completing one form is one lead however many times the tag fires. Once per event is right when each submission is independently valuable, such as separate quote requests for different products. Be aware that once per session still counts the same person again if they return in a new session.

How do Meta and Google handle duplicate conversions?

Meta deduplicates browser and server events that share the same event name and event_id, provided they arrive close enough together. Google Ads has a conversion counting setting of every or one per click, and discards a repeat conversion carrying an order or transaction ID it has already recorded for that same conversion action. Neither will clean up duplicates created by a tag firing twice in the browser with different IDs.

What does an inflated lead count do to Smart Bidding?

It teaches the model the wrong thing. Reported cost per lead falls below the real one, so targets get set too aggressively. Worse, inflation is rarely uniform: if one browser, device or form double fires, the model reads that segment as cheaper and shifts budget into it, so you pay more for the traffic that is being counted twice.

Next step

Find out what this is costing you.

The Missing Conversions Audit is a fixed-price teardown of your GA4, Google Tag Manager, ad pixels and consent setup. Every gap logged, the top 10 fixed and validated. $900 flat. 5 business days.

A 15 minute call

  • We look at your setup from the outside and say what we can already see.
  • You get a straight answer on whether the audit is worth it for your account.
  • If it fits, we book the slot and send the access checklist.
Open the booking calendar

Opens the calendar here. Nothing loads from Calendly until you do.

Prefer email? hello@missingconversions.com