Skip to content
LangtonTools
← All posts
3 min read

How I built a Salesforce → BigQuery → Google Ads attribution pipeline that actually works

Alex LangtonSenior B2B paid media manager · ~$650K/mo industrial spend

Native Salesforce to Google Ads connections don't work for B2B.

They work fine if you're a simple lead gen shop with a 30-day cycle. Opportunity created, Google Ads records conversion, done. But in enterprise manufacturing with a 6-9 month cycle and custom opportunity stages, the native sync is brittle.

It fails silently. It drops GCLIDs. It overwrites historical data. It doesn't handle your custom stage mapping. So you end up with a system that looks connected but is actually corrupting your bidding data.

I spent $2M in budget before I realized our native sync was only capturing 40% of actual closed deals.

So I built a custom pipeline. Adobe Analytics → BigQuery → Salesforce → Google Ads. Full control. Real data. Defined stage mapping. It took about 6 weeks to build. Now it's the source of truth for $3.78M in attributed revenue.

Why the native sync fails

The native Salesforce to Google Ads integration assumes:

  • One person per account
  • Opportunity created = qualified lead
  • Close date = conversion date
  • One-to-one GCLID to opportunity mapping

None of those assumptions are true in enterprise B2B.

One company has 3-5 decision makers at different email addresses. Only one of them might have clicked your ad. The opportunity is created after two months of back-and-forth. The close date is six months after the original click. And GCLIDs don't survive device switches or browser cache clears.

The native sync tries to retrofit these assumptions onto complex data. It breaks.

The architecture that works

Step 1: Pixel everything. Adobe Analytics (not GA4, it's too simple for this) tracks every site interaction with anonymous IDs.

Step 2: Hidden form fields capture GCLID, UTM parameters, and referrer.

Step 3: When someone converts (demo request, quote, etc.), Adobe captures it and sends a batch export to a GCS bucket daily.

Step 4: BigQuery picks up that data, deduplicates by domain and date, and creates a staging table.

Step 5: Daily, a script queries Salesforce for all closed-won opportunities from the past 90 days. It pulls company domain, opportunity ID, amount, close date, stage progression history.

Step 6: The script matches Salesforce opportunities to Adobe clicks by:

  • Domain matching (where possible)
  • First-touch attribution (first click from that domain in the past 180 days)
  • Time window logic (click must be within 6 months before close)

Step 7: The matched records are uploaded to Google Ads via the offline conversions API with proper GCLID mapping, conversion value (deal amount), and conversion date (close date, not click date).

Step 8: I query the results weekly to find mismatches and investigate.

Why this beats the native sync

Control. The native sync makes assumptions. This pipeline makes the assumptions I specify.

I decide what counts as a conversion (closed deal, not opportunity created). I decide what conversion value to track ($50K deal, not $0 lead). I decide the time window (180 days, not 30). I decide the matching logic (domain-first, not GCLID-only). I decide the cadence (daily, not whenever Salesforce decides to sync).

And I can audit it. If something looks wrong, I can query the BigQuery tables and see exactly what happened. With the native sync, it's a black box.

The numbers

Before: Google Ads reporting said $1.2M in new customer revenue. Salesforce said $860K actual closed-won. Gap: $340K unattributed.

After: Google Ads pipeline captures $3.78M in closed-won revenue. The system correctly attributes deals that take 6-9 months to close and involve multiple decision makers.

The before/after comparison isn't perfect (different time windows, different definitions). But the real number is: we're now tracking nearly 4x as much actual revenue through the system, and we're confident in it.

How to build it

You need:

  • Analytics platform that can export daily (Adobe, custom logs, events pipeline)
  • BigQuery access
  • Salesforce API access
  • Google Ads offline conversion API access
  • Basic SQL and Python knowledge

Timeline: 4-8 weeks depending on your complexity and data quality.

Cost: ~$500/month for the GCP infrastructure.

Is it worth it? If you're running a $50K+/month B2B account with a long sales cycle, yes. You're probably leaving millions of dollars in budget optimization on the table without it.

The native sync looks connected. But it's not actually telling you which campaigns drive closed deals. This pipeline does.

Alex Langton

Senior B2B paid media manager · ~$650K/mo industrial spend

12+ years running B2B Google Ads accounts in industrial, manufacturing, and B2B e-commerce. Builds Langton Tools because generic PPC SaaS was never designed for the multi-MCC, complex- pacing, B2B-vocabulary reality of the accounts that actually drive industrial revenue.