A lead-gen account without EOC feeds Smart Bidding one signal: the form submit. Smart Bidding then optimises for whoever submits forms cheapest — tyre-kickers, competitor snooping, people who came from a lead magnet and never intended to buy. The clean-quality campaigns look expensive; the noisy ones look great. Six months in, the account has drifted toward the wrong audiences and the sales pipeline is drying up while the dashboard looks fine.
EOC fixes this by feeding CRM-truth back to Google Ads. When a lead becomes a qualified opportunity, a booked appointment, or a signed contract, EOC uploads the event tagged with the original click ID (or hashed user data when the click ID is missing). Smart Bidding then knows which campaigns produce real customers versus form-fills, and reallocates spend accordingly. The behavioral change in bidding is visible within 4–6 weeks; the revenue change is visible within 8–12.
EOC vs Standard OCI — What's Actually Different
| Standard OCI | Enhanced Offline Conversions | |
|---|---|---|
| Match key | gclid only | gclid + hashed PII fallback |
| Recovery when gclid missing | 0% — event dropped | 40–70% via email/phone match |
| iOS 14.5+ recovery | Limited to wbraid/gbraid | Extends via hashed PII to iOS clicks |
| Setup complexity | Click ID capture + upload script | Click ID + PII collection + hashing + upload |
| Compliance load | Low — click ID is not PII | Medium — PII collection requires consent |
EOC is a superset of OCI. Every account that currently runs OCI can turn on EOC in-place — the same upload endpoint accepts both. Accounts that haven't started should build EOC from day one; the additional PII plumbing is small compared to reimplementing it later.
The Pipeline, End to End
Read gclid, gbraid, wbraid from URL on every page. Store in localStorage with 90-day expiry. Never rely on the URL still being intact at form submit — SPAs and multi-step funnels destroy it.
On submit, capture the user's email and phone from the form fields. Store as raw values in your CRM alongside the click IDs. Don't hash on the client — hash later in the upload pipeline where you can verify correctness in one place.
The point of EOC is to feed qualified events back, not raw leads. Wire a CRM webhook (Bitrix24, HubSpot, Pipedrive, Salesforce) on stage transitions — Qualified, Meeting Booked, Contract Signed — and upload one EOC event per stage.
SHA-256, lowercase, trimmed. Phone in E.164 (+491234567890, no spaces or dashes). Email lowercased. First name / last name hashed separately. Getting the format wrong is the #1 reason EOC uploads “succeed” but match rate stays low.
UploadClickConversions with the conversion action, value, currency, timestamp, and user identifiers. Same-day uploads let Smart Bidding react within its normal cadence; weekly batches starve it of fresh signal.
Google Ads → Goals → Conversions → your action → “Diagnostics”. Match rate should be > 70% within a week. Below 40% means the hashing is wrong or PII capture is broken.
The Two-Action Split — Qualified vs Won
Almost every lead-gen account we set up runs two EOC actions in parallel, not one. The reason is Smart Bidding's learning-signal math.
| Action | Primary? | Include in Conv metric? | Value strategy |
|---|---|---|---|
| Form submit (online) | No (secondary) | No | Static, low (10–20 units) |
| SQL / Qualified (EOC) | No (secondary) | No | Static, medium (100 units) |
| Won / Contract (EOC) | Yes (primary) | Yes | Actual deal value in account currency |
This structure lets Smart Bidding use the form-submit and SQL signals as learning input while optimising primarily against Won revenue. See the primary/secondary lever piece for why this configuration is the actual bidding control.
Consent, PII, and Compliance
EOC requires user PII (email, phone) to be sent to Google, even hashed. This is a legitimate concern under GDPR and equivalent frameworks. The defensible pattern:
- Consent Mode v2 respected — if the user denied marketing consent, don't upload EOC for that record
- Data Processing Agreement in place with Google Ads (already covered by the standard Google Ads terms in most regions)
- Privacy policy explicitly names Google Ads as a data recipient for measurement
- Hashing happens server-side, never in the browser — cleaner audit trail
- Retention: uploaded records automatically age out at Google's side after 30 days from upload; only the hash is retained for matching
Meta's CAPI has the same shape of PII flow with the same defensibility. A single consent-aware pipeline usually feeds both — see the Meta CAPI dedup piece for the mirror workflow on the Meta side.
Common Failure Modes
1. Uploading form-submit as the primary Won conversion
Some teams enable EOC but only upload the form-submit event via EOC instead of setting up the stage-triggered pipeline. That's worse than the standard online conversion — same signal, more infrastructure. EOC is only valuable when the event uploaded is CRM-truth downstream of the form.
2. Uploading raw (unhashed) PII
Google Ads accepts unhashed PII in some API paths but silently downgrades match quality. Always hash SHA-256 lowercase. The diagnostic panel will report unhashed uploads as accepted but match rate will hover around 20%.
3. Batch uploads on 7-day cadence
Smart Bidding's learning cadence is 3–7 days. Uploading offline conversions weekly means every week's bidding decisions are made without knowledge of that week's CRM outcomes. Upload within 24 hours of stage change; 6 hours is even better.
4. Not extending the click look-back window
Default click look-back is 90 days. B2B sales cycles routinely exceed this. Conversion action settings → Click through conversion window → set to your longest realistic cycle up to 540 days. Uploads for older clicks are silently rejected without this extension.
5. No reconciliation between CRM and Google Ads
Uploads succeed as HTTP 200 but individual records fail with partial_failure reasons Google returns in the response. Log every failure with the deal ID and audit weekly — otherwise you'll believe the pipeline is working when 30% of records never make it.
Audit Checklist
What Changes in the Account
Once EOC is running with clean match rate for 6–8 weeks, the account behaves differently in three visible ways. First, campaign performance starts diverging — previously-similar campaigns split into clear winners and clear losers on true revenue metrics. Second, Smart Bidding reallocates spend on its own; you'll see budgets shifting between campaigns without your intervention, following the new signal. Third, and most importantly, the gap between reported cost-per-conversion and business cost-per-customer collapses — because Google is now measuring closer to what the business measures.
EOC is one of the highest-leverage tracking upgrades available in 2026. It is not glamorous, it is not new, and the checkbox in the UI is the easy part. The real work is the CRM plumbing, the hashing, the reconciliation. Any lead-gen account without it in 2026 is running Smart Bidding half-blind — and Smart Bidding half-blind is worse than manual bidding, because it's confidently wrong. See how we approach these rebuilds inside Enhanced Conversions setup.