Marketing, Advertising & AdTech// diagnostic

The click identifier is missing on half the conversions that need one

In short

A click identifier missing on conversions is lost at one of 5 hops: a redirect that drops the query string, a consent gate that stores nothing until an answer arrives, a value never copied onto the lead record, a cross-domain jump, or an import older than the window the platform accepts. Counting landing hits, persisted sessions and submissions per entry path names the hop in a morning.

Key takeaways

  • Measure per entry path, not in aggregate: one redirect on one campaign can produce a 50% gap that looks site-wide.
  • Landing hits carrying the parameter should sit within a point or two of the clicks the platform reports.
  • A consent gate that stores nothing before an answer loses the parameter for everyone who reads the banner slowly.
  • The commonest single failure is not technical at all — the value is captured, and never written onto the lead record the sales team works from.
  • Capture on the first server response and persist server-side; anything that depends on a later page view has already lost a share of the traffic.

The parameter arrived and something between the landing request and the lead record ate it. There are 5 candidate hops, they leave different fingerprints, and three counts per entry path separate them: landing requests that carried the parameter, sessions where it was persisted, and submissions that had it attached. Whichever number collapses first is the hop, and every fix after that is targeted rather than hopeful.

What a click identifier is, how it differs from a campaign tag, and why only one of the two can be joined back to an ad are set out in the parameters that tie a click to a sale. Assume here you already have one arriving and it is not surviving.

Build the three-point funnel before touching the form

Aggregate numbers hide this problem completely, because a single misconfigured entry path — one paid landing page behind a redirect, one campaign pointing at a vanity domain — can produce a large sitewide gap while everything else is healthy. Split by entry path from the first query.

  1. Count landing requests whose URL carried the identifier, taken from server or CDN access logs rather than from the tag. The tag only sees requests where the page and the script both ran.
  2. Compare that count with the clicks the ad platform reports for the same window. Within a point or two is expected; a 20% shortfall means the loss is already happening before your page renders.
  3. Count sessions where the value was persisted into storage you control, and record the timestamp of the write relative to the landing request.
  4. Count submissions with the identifier attached to the payload, and separately count lead records in the CRM with a non-empty field. These are different numbers and the gap between them is its own diagnosis.
  5. Repeat all 4 counts for each entry path and each device class. Publish it as a table — the shape of the collapse is the answer, and a single ratio is not.
Entry pathLanding hits with parameterPersistedAttached to submissionReading
Direct paid landing page98%96%94%Healthy
Campaign via short link41%40%39%Lost before the page — redirect chain
Paid landing, strict consent gate97%58%56%Lost at the store — nothing written before an answer
Multi-step quote form96%93%31%Lost at the record — never copied onto the lead
Illustrative funnel, split by entry path — the collapse points to the hop

Five hops where the value disappears

HopFingerprint in the funnelFix
Redirect or gateway drops the query stringLanding hits with the parameter fall far short of platform-reported clicksPreserve the query string through every 301 and 302, and test each hop of the chain individually
Storage written only after a consent answerLanding hits healthy, persisted count collapses, and the shortfall tracks banner interaction timeCapture at the first response into a strictly necessary store, and gate what you do with it, not whether you keep it
Never copied onto the lead recordPersisted healthy, submissions healthy, CRM field empty on most rowsAdd the field to the record and to every write path, including manual and imported ones
Cross-domain jumpLoss appears only on journeys that leave the first domain — a booking engine, a payment host, a partner formHand the value across explicitly and re-persist it on arrival on the receiving domain
Import older than the accepted windowEverything present, the platform rejects the row at uploadUpload on a shorter cycle, and read the current maximum age from the platform's own documentation
Ranked by how often each turns out to be the cause

The first two are infrastructure and the third is data modelling, which is why the third is the one that survives longest: nothing is broken, no error is logged, and every engineer who checks their own layer finds it working.

A common design writes nothing at all until the visitor answers the banner. The identifier arrives in the landing URL, the visitor reads for 8 seconds, clicks through to a second page, and by the time consent is granted the original URL is history and the parameter with it. The loss is not random — it is concentrated in the people who read the banner, and it grows with every second the decision takes.

The field nobody added to the lead record

This is the least technical failure and the most common. The parameter is captured, it is present in the form payload, and the CRM object it lands in has no field for it — or has one that only the web form populates, while the same object is also created by a chat widget, a phone-call log, an imported spreadsheet and a salesperson typing. Every one of those paths produces a lead with an empty field, and the import that reads them cannot tell a lost identifier from a lead that never had one.

  • Add the field to the object, not to the form. Anything created by a second path will otherwise be blank for reasons nobody can reconstruct months later.
  • Store the capture timestamp beside it. Without that you cannot tell whether an offline conversion is inside the platform's accepted window before you upload it.
  • Record a source for every empty value — no parameter present, consent denied, path not instrumented — because an untyped blank is the reason these projects get re-run every year.
  • Land the same field in the warehouse, not just the CRM. The join that turns a lead into revenue happens in the derived layer described in turning raw event rows into a model people can query.
  • Include agent and automation write paths. Anything creating leads on a human's behalf has to carry the field, which is part of why the AI agents and automation work we do writes through the same validated record shape as the form does.

Capture at the first response, persist where the browser cannot reach

  1. Read the parameter server-side on the landing request, before any client script runs. This survives ad blockers, script failures, slow networks and visitors who leave after 3 seconds.
  2. Write it into a first-party store from that same response, and treat the write as strictly necessary to the service you are providing. A value written by page script inherits the browser storage caps that also cause returning visitors to arrive as new ones.
  3. Attach it server-side at submission from your own store, rather than reading it back out of a hidden input. Hidden inputs are rewritten by autofill, stripped by extensions and lost on multi-step forms that re-render.
  4. Send it with the conversion, alongside every other matching field the platform will use — the ordering of those fields by matching power is in assembling a server-sent conversion a platform will match.

Where the capture point should sit is really the client-versus-server question in miniature, and it resolves the same way: on the server when the value is load-bearing for revenue, in the browser when it is not. The full version of that decision, including the case for staying client-side, is client-side or server-side tagging. Rolling it out is one event, one parallel run, one gate — as in moving one conversion server-side first.

A hidden input is a promise that nothing between page load and submit will touch the form. On a multi-step quote flow, that promise is broken by your own code before any extension gets involved.

When the click is older than the window will accept

Long sales cycles hit a ceiling that no capture improvement fixes. Platforms accept offline conversion uploads only for clicks within a stated age, and a deal that closes 5 months after the click will be rejected however perfectly the identifier was stored. The window is published, it changes, and it is worth reading from the platform's own documentation rather than from an internal wiki written two years ago.

  • Upload at an interval shorter than the window, so a slow-closing deal is reported at the stage it reaches rather than only at signature.
  • Report an intermediate event that happens inside the window — a qualified lead, a completed demo — and value it from your own close-rate data rather than guessing.
  • Document the residual and stop rebuilding capture for it. A deal that closes outside every window is not a tracking failure, and treating it as one produces a permanent project.
  • Accept a modelled match for the remainder, understanding that it is an estimate that will never reconcile row by row — the mechanics are in why modelled conversions never reconcile to rows.

The same identifier scarcity shows up at the opposite end of the ecosystem. A bidder deciding which requests are worth answering is making the mirror-image judgement — a request carrying nothing joinable is worth less than one that does, and filtering on that is the subject of deciding which bid requests to answer at all. Building the capture into the flow rather than bolting it on afterwards is the habit behind what an AI-native product studio is, and the rest of this silo sits under tracking, consent and event pipelines, part of our marketing and advertising practice.

Frequently asked questions

Short answers to the follow-ups this page tends to raise.

Why is the click ID missing on so many conversions?

Because it is lost at one of 5 hops between the ad click and the record you upload. A redirect drops the query string before your page sees it, a consent gate stores nothing until the visitor answers, the value is never copied onto the lead record, a cross-domain jump discards it, or the conversion is older than the window the platform accepts. Counting landing hits, persisted sessions and attached submissions per entry path tells you which.

Does a redirect remove URL parameters?

It does whenever the redirect is configured to rewrite the target rather than pass the query string through, which is the default in more link shorteners and edge rules than teams expect. Test each hop of the chain separately with a parameter attached, because a 3-hop chain can preserve it twice and drop it on the third. The symptom is landing hits with the parameter falling far short of the clicks the platform reports.

Can the click identifier be stored before consent is given?

That is a decision for whoever owns privacy in your organisation, not a technical default, and it turns on separating capture from use. Retaining the value so a later lawful basis can be applied is a different operation from transmitting it to an ad platform, and the two can be governed separately. What is certain is that a design storing nothing until the banner is answered will lose the parameter for every visitor who reads it slowly.

How do I attach a click identifier to an offline conversion?

Persist it server-side at the landing request, write it onto the lead record with its capture timestamp, and upload it with the conversion when the deal reaches a reportable stage. The timestamp is the part teams skip and then need, because it is the only way to know whether a row is inside the platform's accepted age before you upload. Deals that close beyond that window should be reported through an earlier valued event instead.

  • click identifiers
  • conversion tracking
  • attribution
  • diagnostics
// shipped work

The work behind this page

Builds from our portfolio that this page draws on.

Read next

Working on something in this space?

Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.

Start the conversation