The Problem: Optimising for the Wrong Signal
A personal injury law firm in the southeastern United States was spending $45,000/month on Google Ads across Search campaigns targeting "car accident lawyer", "personal injury attorney", and related terms.
The campaigns were managed toward one goal: form fills. CPL was $342 per form fill.
The problem: most form fills were not qualified leads.
The intake team estimated that only 1 in 6 form fills turned into a retained client. The real cost per retained client was approximately $2,052 — significantly higher than the business could sustain.
More importantly, Smart Bidding (Target CPA) was training on form fill data — not retained client data. The algorithm was finding people who filled out forms, not people who hired lawyers.
The Insight: Connecting Outcome Data Back to Ad Spend
The firm used GoHighLevel (GHL) as their CRM. Every lead from the Google Ads form went into GHL at intake. Over the following days, the intake team would:
- Qualify the lead (is this a valid PI case?)
- Schedule a consultation
- Sign the client (retained)
At each stage, the lead status in GHL updated. The retained clients — the ones that actually generated revenue — were clearly identifiable in the CRM.
The problem: Google Ads had no idea which of its clicks became retained clients. It was getting feedback only up to the form fill, not the retention decision.
Google Ads Offline Conversion Import solves this by allowing you to upload CRM outcome data back to Google Ads, matched to the original ad click via gclid. This closes the feedback loop between real business outcomes and campaign optimisation.
Implementation
Phase 1: gclid Capture in GoHighLevel (Days 1–5)
The first requirement is capturing the Google Click ID (gclid) from the URL when a form is submitted and storing it in the CRM lead record.
We added a hidden field to their contact form and a GoHighLevel workflow step that:
- Extracts
gclidfrom the URL parameters at form submission - Stores the
gclidin a custom field on the GHL contact record - Also captures: campaign, ad group, keyword (from UTM parameters)
Without the gclid, it's impossible to match the CRM lead back to the Google Ads click.
Phase 2: Conversion Actions Setup (Days 6–8)
Created two new conversion actions in Google Ads:
- "Qualified Lead" — fires when intake marks a lead as qualified (days 1–3 after form)
- "Retained Client" — fires when the client signs a retainer (days 3–14 after form)
These were set up as offline conversion actions (import only, not from a website tag).
The "Retained Client" conversion was set as the primary conversion action for Smart Bidding. The "Qualified Lead" conversion was set as secondary/observational.
Phase 3: Automated GoHighLevel → Google Ads Upload (Days 9–14)
We built an automated pipeline using GoHighLevel's webhook triggers + a lightweight middleware:
- Trigger: When a GHL contact's stage changes to "Retained"
- Webhook fires to our middleware with:
gclid, conversion date, optional revenue value - Middleware uploads to Google Ads Conversion Import API
- Latency: conversions typically upload within 4 hours of retention
The pipeline runs continuously — every retained client automatically feeds back to Google Ads without any manual CSV uploads.
Phase 4: Bidding Transition (Days 15–30)
Changed the primary conversion action from form fill to "Retained Client" for the Target CPA bidding strategy.
Important: We did not change the Target CPA immediately. We let Smart Bidding accumulate retained client conversion data for 14 days before transitioning, to avoid the algorithm going into a cold start with insufficient data.
After 14 days with ~22 retained clients uploaded, we switched Target CPA to optimise toward retained clients at a target of $400/retained client.
Results at Day 60
| Metric | Before | After | Change |
|---|---|---|---|
| CPL (Retained Client) | $2,052 | $154 | -92%* |
| CPL (Form Fill) | $342 | $154** | -55% |
| Retained Client Rate | ~17% | ~62% | +45pts |
| Monthly Spend | $45,000 | $45,000 | Same |
| Monthly Retained Clients | 22 | 71 | +223% |
| Revenue Attribution | 28% | 87% | +59pts |
*The $2,052 → $154 comparison reflects the true cost per retained client: previously, the campaigns were attracting unqualified form fillers. After the switch, form fills were self-selecting to higher-quality prospects.
**The $342 → $154 form fill CPL comparison: Smart Bidding, now training on retained clients, started bidding on different keywords and audiences that happen to also be cheaper to acquire — because they convert at a higher rate.
The Core Lesson
Form fills are a proxy metric. For legal, medical, financial, and any high-value B2B service, the real conversion event happens days or weeks after the form fill — and the gap between "filled form" and "became customer" is massive.
If your Google Ads campaigns are optimising toward form fills while your intake team is qualifying leads in a CRM, you are training Smart Bidding on the wrong signal. The algorithm will find form fillers. It needs to find clients.
Offline Conversion Import is not a nice-to-have for these businesses — it's the difference between a profitable and unprofitable campaign.


