Feeding Offline CRM Conversions Back to Google Ads via Enhanced Conversions
The Attribution Gap in B2B
B2B sales cycles break the assumptions Google Ads was built on. A click happens on day 1. A form fill happens on day 1 or 2. The deal closes in ActiveCampaign or Pipedrive on day 30, 60, or 90. By then, the browser session is gone, the cookie is expired, and Google Ads has zero visibility into whether that click produced revenue.
The result: Smart Bidding optimizes for form fills (the last observable event), not for closed deals. Campaigns that generate high-volume, low-quality leads get rewarded. Campaigns that produce fewer but higher-value opportunities get starved of budget.
Three compounding factors make this worse in 2026:
- Ad blockers —
gtag.jsnever fires for ~30% of desktop users. The click happened, the GCLID was captured in the URL, but no conversion event was recorded client-side. - ITP and cookie expiry — Safari caps JavaScript-set cookies at 7 days. A 30-day sales cycle means attribution is impossible via client-side mechanisms.
- Manual upload friction — Google Ads supports offline conversion imports via CSV, but teams rarely do it consistently. The process requires exporting from the CRM, formatting the file, mapping fields, and uploading weekly. It breaks within a month.
What Enhanced Conversions Solve
Google’s Enhanced Conversions API accepts conversion data server-side, matched to the original click via two mechanisms:
- GCLID match — the Google Click ID captured at the time of the ad click, stored alongside the lead in the CRM.
- User-provided data match — SHA-256 hashed email, phone, or address. Google matches these against its logged-in user graph when GCLID is unavailable.
The server-side path bypasses every client-side limitation: no JavaScript execution required, no cookies involved, no browser dependency. The conversion is posted from your server (or a third-party pipeline) directly to the Google Ads API.
The Data Flow: CRM to Google Ads
True Conversions connects ActiveCampaign or Pipedrive to Google Ads via a generic webhook URL — no code, no server of your own. The architecture:
Step 1: GCLID Capture at Lead Creation
When a visitor clicks a Google ad and lands on your site, the URL contains a gclid parameter. Your form submission (whether native, HubSpot, Typeform, or custom) must pass this value into the CRM as a custom field on the contact or deal record. True Conversions also offers a free hosted script (tc.js) that captures the GCLID automatically and fills the hidden field for you, provided Google Ads auto-tagging is on.
Most form tools support hidden fields populated from URL parameters. The critical requirement: the gclid must persist in the CRM record. If it’s lost, Enhanced Conversions falls back to hashed PII matching — still functional, but lower match rates.
Step 2: CRM Webhook on Deal Won
When a deal moves to “Won” (or your equivalent closed-won stage) in ActiveCampaign or Pipedrive, a webhook fires to the True Conversions endpoint. The payload contains:
- Contact email and phone (PII that will be hashed before transmission)
- Deal value (the actual revenue, not the projected pipeline value)
- The GCLID stored in the custom field
- Timestamp of the stage change
Step 3: PII Hashing and Payload Construction
True Conversions hashes all PII fields using SHA-256 before the data leaves the pipeline. Google requires specific normalization before hashing:
- Email: lowercase, trim whitespace.
" [email protected] "becomes[email protected], then hashed. - Phone: E.164 format.
(555) 123-4567becomes+15551234567, then hashed. - Name: lowercase, trim. Hashed separately (first name, last name).
The constructed payload sent to the Google Ads API:
{
"conversionAction": "customers/1234567890/conversionActions/987654321",
"gclid": "EAIaIQobChMI8d2x...",
"conversionDateTime": "2026-05-07 14:30:00-04:00",
"conversionValue": 15000.0,
"currencyCode": "USD",
"userIdentifiers": [
{
"hashedEmail": "a8f5f167f44f4964e6c998dee827110c3e2e4e6e1ea4db5f8b42e1b9f12e5b3a"
},
{
"hashedPhoneNumber": "1b3d4c8e9f5a2c7d6e8b1f4a3c9d2e7f5b8a1c6d4e9f2a3b7c5d8e1f6a4b9c2d"
}
]
}
Step 4: Google Ads API Submission
The payload is submitted via the ConversionUploadService.UploadClickConversions endpoint. True Conversions handles:
- OAuth2 token management — refresh tokens, expiry, re-authentication.
- Retry logic — transient failures get exponential backoff. Permanent failures (invalid GCLID, conversion action not found) are logged with actionable error messages.
- Deduplication — the same deal-won event won’t be uploaded twice, even if the CRM webhook fires multiple times.
Why Not Zapier or Make
The common alternative is a Zapier/Make workflow: CRM trigger → formatter step → Google Ads upload step. Three operational problems (for a detailed breakdown of how these compound at scale, see The Zapier Tax):
- No native hashing — Zapier doesn’t SHA-256 hash PII. You need a Code step (JavaScript or Python) to normalize and hash each field. This is fragile: format changes in the CRM break the normalization logic silently.
- Rate limits and task costs — each deal-won event consumes one or more Zapier tasks. High-volume pipelines (50+ deals/day) hit plan limits or incur overage costs that exceed the value of the integration.
- No retry or deduplication — if the Google Ads API returns a transient 500, Zapier marks the step as failed. You get an email notification. The conversion is lost unless someone manually replays it.
True Conversions handles hashing, retries, and deduplication as core infrastructure, not as bolted-on workarounds.
Setup: ActiveCampaign
-
Sign up at conversions.nexopath.com and copy your account’s webhook URL.
-
Create an automation in ActiveCampaign that fires when a deal reaches your closed-won stage, with an action that posts to the True Conversions webhook URL.
-
Map the fields in the True Conversions dashboard — email, phone, deal value, GCLID custom field — using the point-and-click field mapping with auto-suggestions.

-
Connect Google Ads — authenticate your Google Ads account. The conversion action must already exist in Google Ads as type “Import,” with enhanced conversions for leads enabled; select it in True Conversions (True Conversions does not create it for you).
-
Test — manually move a test deal to the trigger stage. Verify the conversion appears in Google Ads within 4-6 hours (Google’s processing delay, not True Conversions’).
Total setup time: under 30 minutes. No API keys to copy, no code.
Setup: Pipedrive
The same flow applies:
- Sign up and copy the webhook URL.
- Create a Pipedrive automation on the won stage that posts to the True Conversions webhook URL.
- Map the fields (email, phone, deal value, GCLID) in the dashboard.
- Connect Google Ads and select the existing conversion action.
- Test with a manual deal.
Pipedrive’s webhook infrastructure delivers events within seconds of a stage change. True Conversions processes and submits to Google Ads in near-real-time; the only delay is Google’s own ingestion window.
Match Rates and Troubleshooting
Expected match rates depend on your GCLID capture rate:
| Scenario | Expected Match Rate |
|---|---|
| GCLID present on deal, user logged into Google | 95%+ |
| GCLID missing, hashed email matches Google account | 40-60% |
| GCLID missing, no email match | 0% (unattributable) |
The single highest-impact action for improving match rates: ensure your lead capture form persists the GCLID into the CRM. Everything else is secondary. If your rate is stuck below 50% even with GCLID present, work through how to get from 35% to 70%+ before changing anything in the pipeline.
Common failure modes:
- GCLID field is empty — the form doesn’t capture URL parameters, or the landing page strips query strings. Fix the form, not the pipeline.
- Conversion action mismatch — the conversion action in Google Ads must be set to “Import” type, not “Website” or “App.” Check this in Google Ads directly before going live with a client.
- Time zone drift — the
conversionDateTimemust use the same time zone as your Google Ads account. If conversions show up with shifted timestamps, check the account time zone setting in Google Ads.
What Changes in Google Ads After Activation
Once offline conversions flow consistently (minimum 2-4 weeks of data), two things shift:
- Smart Bidding recalibrates — the algorithm sees which clicks produce actual revenue, not just form fills. Campaigns optimizing for Target ROAS or Maximize Conversion Value now factor in deal-won events with real revenue values.
- Audience signals improve — Google builds better lookalike audiences from users who actually converted to paying customers, not from users who filled out a form and never responded.
Neither of these effects is immediate. Budget reallocation based on offline conversions requires a minimum data volume. Google recommends at least 30 conversions per month per conversion action for Smart Bidding to function reliably. When the events are arriving and Smart Bidding still doesn’t move, the cause is usually one of four specific conditions — see why your offline conversions aren’t improving campaign performance.
Limitations
- Attribution window — Google Ads accepts offline conversions up to 90 days after the click. Deals that close beyond 90 days cannot be attributed.
- Per-destination setup — this guide walks the Google Ads API path. The same CRM milestones also route to the Meta Conversions API, but each destination is connected and configured separately: Meta needs its own OAuth authorization (business, ad account and dataset/pixel) plus the Dataset/Pixel ID.
- CRM data quality — if the email in the CRM doesn’t match the email the user has on their Google account, the hashed PII match fails. There is no workaround for this at the pipeline level.
Next Step
Sign up for True Conversions at conversions.nexopath.com — free trial, no card required. The event log dashboard shows delivery status per event so you can validate the pipeline before committing.