Here's the most common attribution setup I see at B2B SaaS companies: Google Ads fires a conversion event when someone submits a demo request form. That's it. The campaign reports a CPL. The budget gets allocated based on that CPL. Nobody checks whether those demo requests ever became pipeline.
This is not attribution. It's form tracking. And it's the reason demand gen teams get defunded — not because paid media doesn't work, but because they can't prove it does. The finance team sees spend. They don't see pipeline. When it comes time to cut, paid media looks like a cost center instead of a revenue driver.
I've rebuilt attribution from scratch at three companies. Here's the stack that actually works — and how I use Claude to diagnose it when it breaks.
Why standard conversion tracking lies to you
When you set up a Google Ads conversion action based on a thank-you page view or a form submit event, you're measuring intent signals, not business outcomes. A person who filled out a demo form and was immediately disqualified by your SDR counts as a conversion in exactly the same way as the enterprise deal that closed six months later.
This creates two problems. The first is obvious: your CPL metric is meaningless. A $200 CPL on a campaign full of unqualified leads is worse than a $400 CPL on a campaign that fills your enterprise pipeline. The second is less visible but more damaging: Google's Smart Bidding algorithm optimizes toward whatever conversion signal you give it. If you're feeding it form submits from unqualified leads, it will find you more people who look like those unqualified leads. You train the algorithm to be bad at your job.
The fix is a three-layer attribution stack that connects your ad platform data to Salesforce, sends pipeline milestones back as conversion signals, and gives you the reporting surface to see cost-per-SAO and cost-per-opportunity alongside CPL.
Layer one: GCLID capture
Everything else depends on this. Google Click ID (GCLID) is the unique identifier Google appends to your landing page URL when someone clicks a Google Ad. If you capture it at form submission and store it in your CRM, you can trace any future pipeline milestone back to the original ad click — weeks or months later.
The implementation has three parts. First, add a hidden field to every form on your site: field name "gclid", value populated by a URL parameter reader that checks for the gclid query parameter on page load. Second, write that GCLID value to a custom field on the Lead or Contact object in Salesforce at the moment the form submits. Third, make sure your Salesforce admin doesn't delete or overwrite it when records get updated — this is the most common place it breaks.
For LinkedIn, the equivalent is the LinkedIn Insight Tag plus UTM parameters. LinkedIn doesn't pass a click ID the same way Google does, so you're relying on UTM-based attribution. This is why LinkedIn attribution tends to be less precise than Google — and why "dark social" attribution matters more for LinkedIn campaigns than for search.
Layer two: Enhanced Conversions for MQLs
Once you have GCLID capture working, you can send MQL status back to Google Ads as a conversion event using Enhanced Conversions. This is different from standard conversion tracking: instead of firing a pixel when someone hits a thank-you page, you're sending a server-side conversion event from Salesforce (or your MAP) when a lead crosses the MQL threshold.
The setup requires a conversion action in Google Ads with the "Import from CRM" source type, a Google Ads API connection or a connector like Zapier or Make, and a Salesforce workflow that fires when Lead Status equals MQL. The conversion event you send back includes the GCLID (so Google can tie it to the original click), a conversion value (optional but recommended — use average MQL-to-close rate times ACV), and a conversion timestamp.
When this is working correctly, your Google Ads reports will show conversions that lag your click data by days or weeks — which is accurate, because that's how long it actually takes a click to become a qualified lead. The CPL you see in platform will be higher than form-submit CPL. That's also accurate. It's the number you should have been using all along.
Layer three: Offline Conversion Import for SAOs and pipeline
MQL attribution is useful. Pipeline attribution is what finance actually cares about. Offline Conversion Import (OCI) lets you send Sales Accepted Opportunity creation events back to Google Ads — again tied to the GCLID from the original click.
The mechanics are the same as Enhanced Conversions for MQLs, but the Salesforce trigger fires when an Opportunity is created with Stage = Sales Accepted (or whatever your equivalent is). The conversion value here should be the actual opportunity amount, which gives you a real cost-per-dollar-of-pipeline metric that you can bring to your CFO.
A few things that break OCI in practice:
- GCLID expiration: GCLIDs are only valid for 90 days. If your sales cycle is longer than 90 days from click to SAO, the import will fail silently. For long-cycle businesses, send the SAO conversion at the point of MQL creation instead, with a flag that it represents pipeline intent rather than closed pipeline.
- Duplicate opportunity records: If your SDR team creates multiple opportunity records before settling on one, your import process needs deduplication logic or you'll double-count.
- CRM integration lag: If you're using a native Salesforce-Google integration, test the latency. Some integrations batch-sync daily, which means your Smart Bidding algorithm is working with day-old signal.
Using Claude to diagnose broken attribution
Attribution stacks break constantly. A developer updates the form library and the GCLID hidden field stops populating. Someone changes the Salesforce workflow and MQL conversions stop sending. A campaign manager changes a landing page URL and the UTM parameters get stripped. Any one of these can make a perfectly good campaign look like it stopped generating pipeline — and cause you to cut budget that was working.
I built a diagnostic workflow using Claude that runs weekly and checks for attribution degradation signals before they corrupt budget decisions. The inputs are: GCLID population rate from Salesforce (what percentage of leads created this week have a non-null GCLID value), MQL conversion import match rate from Google Ads (what percentage of GCLIDs sent as conversions were matched to a click), and SAO-to-click attribution rate (what percentage of new SAOs this week have a traceable ad source).
I pass those three metrics to Claude along with their 4-week averages and ask it to identify whether any signal shows a statistically meaningful drop, likely root cause, and recommended diagnostic steps. It's not magic — it's pattern matching on numbers that would take me 20 minutes to calculate manually. But it runs every Monday before I open a single dashboard, so I catch attribution problems the week they start rather than the quarter they surface in a budget review.
Frequently asked questions
What if our sales cycle is longer than 90 days?
Use MQL-to-close rate as a proxy for pipeline value. Send the MQL conversion with a conversion value of (historical MQL-to-close rate) × (average ACV). This gives Smart Bidding a pipeline-predictive signal without the GCLID expiration problem. Reassess the conversion value quarterly as your MQL-to-close rate changes.
Does this work for LinkedIn Ads too?
LinkedIn supports offline conversion import via the Conversions API (CAPI). The implementation is similar but uses LinkedIn's member ID instead of a GCLID — which means you need LinkedIn's Insight Tag on your landing pages and you need to be capturing the li_fat_id URL parameter at form submission. The match rates are lower than Google's because LinkedIn's ID has a shorter lifespan, but even a 40–50% match rate on SAO conversions meaningfully improves LinkedIn's bidding algorithm.
What's the minimum viable version of this stack?
If you're starting from zero: implement GCLID capture first. Everything else depends on it. Once GCLIDs are populating consistently on 85%+ of leads, set up MQL Enhanced Conversions. Once that's stable, add SAO Offline Conversion Import. Don't try to do all three at once — each layer needs to be validated before the next one is useful.
Want the full system PRD?
Subscribe to The Demand Engine(er) — free — and get instant access to all 5 system PRDs.
Get the PRDs →