B2B SaaS only See if you're a fit →

← All articles

Offline conversion tracking

How to Set Up Google Ads Offline Conversion Tracking (2026)

By James Gregg · October 30, 2026

When I audit a B2B SaaS account, the first thing I check is what’s actually being sent back to Google. Usually it’s form fills, and nothing after. So Google optimizes toward whoever fills out forms cheapest, and the easiest thing to get is always unqualified leads.

Setting up offline conversion tracking (OCT) in Google Ads means five things: capture the click ID on every form and keep it alive, create one conversion action per funnel stage with a real value, sync those stages from HubSpot or Salesforce back to Google with the click ID and the email, verify it’s actually landing, and only then let a stage drive bidding. The steps are below — with the parts Google’s help pages leave out, from the setups we run for B2B SaaS clients and the specific things that break them. (If you’re still deciding whether OCT is worth it at all, start with our honest take on offline conversion tracking.)

What do you need before you start?

  • Auto-tagging is on in Google Ads. No auto-tagging, no GCLID.
  • The account-level “Enhanced conversions for leads” toggle is on. I learned this one the hard way: a new account rejects every upload with DESTINATION_ACCOUNT_NOT_ENABLED_ENHANCED_CONVERSIONS_FOR_LEADS until it’s flipped, and the fix takes 10–15 minutes to propagate.
  • Create conversion actions a few hours before you upload to them. Google asks for 4–6 hours.
  • Know your lag. Google only accepts a GCLID up to 90 days old. If your first click lands months before your demo, that matters (more at the end).

Step 1: How do you capture the GCLID so it actually survives?

The default setup grabs the click ID from the URL when someone lands, and hopes it’s still there when they submit a form. It often isn’t. Buyers click an ad, wander to your help center, read the docs, come back on a different browser, or convert eight days later. Every one of those breaks a URL-only capture.

The fix, no server required:

  1. In Google Tag Manager, write every click ID to a first-party cookie on landing: gclid, gbraid, wbraid, plus msclkid, fbclid and li_fat_id if you run Microsoft, Meta or LinkedIn.
  2. Add hidden fields for each click ID to your HubSpot (or any) forms.
  3. Use GTM again to fill those hidden fields from the cookie when the form loads.

The copy-paste GTM tag for all of these, the HubSpot field setup, and a 10-minute test are in how to capture GCLID in HubSpot hidden fields.

One catch worth knowing before you trust it: Safari deletes cookies set by JavaScript after seven days without a visit, and caps them at 24 hours in some link-decoration cases. A localStorage copy doesn’t get around that. So capture on landing, write the value into the form field the moment the form loads, and don’t expect a browser cookie to remember a buyer who comes back three weeks later. That’s the gap server-side tracking closes.

What it’s worth: storing click IDs in a cookie typically lifts coverage 5–10% in our accounts, and the hidden form fields add roughly another 10%. Those overlap — they’re each a lift over the step before, not a sum. And in low-volume B2B SaaS, small percentages are big. In a lot of accounts you’re talking about going from tracking five leads to 10.

It also breaks silently. On one marketing-SaaS account, the Webflow forms weren’t firing the identity capture at all — so conversions were reaching Google with an email and no click ID. Only 7–10% of their high-value conversions could be tied to a tracked session. After two fixes to the capture, that went to 86%.

Step 2: Which stages should you send, and what’s each one worth?

Start where your volume lives. With very long sales cycles we feed in content downloads and subscriptions; with shorter ones we start at the demo request.

Then — before any sales stage — send a quality signal. Most B2B forms ask company size, or you enrich the lead on the back end. Fire a separate conversion when the company clears your ICP threshold: five-plus employees, 10-plus, 10 doctors, whatever “real buyer” means for you. It’s an instant number that tells you there’s quality, and it doesn’t rely on sales doing anything. Some clients go further and have an AI step score each demo as ICP or not, and send that back too.

After that, the CRM stages: SQL (or whatever your team calls it), opportunity, closed-won. Send them, but don’t expect closed-won to carry the account. Between the click and the close sits rep capacity, SDR follow-up speed, someone on vacation, a broken handoff. It’s a great signal and a terrible sole teacher, which is why we lean on quality stages that arrive fast and in volume.

And skip anything admin-noisy. We retired “deal created” on one account because ops created deals for housekeeping, not because a buyer did anything.

What values do you put on them?

Work backward from customer value and your stage-to-stage conversion rates. I don’t overthink the precision here; the gaps between stages matter more than the exact dollars. If a customer is worth $40K and 1 in 20 demos closes, a demo is worth about $2,000 to you — so tell Google that.

The mistake we see in audits is values too flat to mean anything. One accounting-software account sent $5 for a lead and $10 for an opportunity. To the algorithm, those are the same thing. We moved leads to $50–100 and opportunities to $500–1,000 so the difference actually registers. On another account, ICP company signals are valued at $5,000 and an opportunity at $10,000.

Sending every stage also weights itself. For something to become an SQL, it probably had three or four conversions before that. Google sees the whole chain and learns which clicks start it.

(If your CPL looks great but sales says the leads are junk, this step is usually why — here’s that pattern in detail.)

Step 3: How do you get CRM stages back into Google Ads?

You’ve got three paths. Here’s what each one won’t tell you up front.

HubSpot native sync. Marketing → Ads → create a conversion event triggered on a lifecycle stage change (HubSpot’s guide). The catches: it sends a fixed value per stage — the “use the deal amount” option is gone — and it only counts stage changes that happen after you create the event.

Salesforce via Google’s Data Manager. Add a GCLID field to both Lead and Opportunity, map Lead → Opportunity on conversion, and turn on field history for Opportunity Stage and Lead Status (Google’s setup). The catches: the first import only looks back 14 days, failed events don’t retry on their own, and the classic break is the email living on the Contact while the stage and amount live on the Opportunity.

The API. If you’re sending conversions yourself, know this: since June 15, 2026, offline and ECL uploads go through Google’s Data Manager API. The old Google Ads API upload is blocked for developer tokens that weren’t already using it. Ours wasn’t, so we built on Data Manager. Whatever path you pick, send a unique order or transaction ID with every conversion so re-uploads don’t double-count.

The limit all native syncs share: they only see what the integration was built to see. A common B2B journey — one person fills out the form, the lead gets linked to their company, and a different person at that company ends up owning the deal — never ties back to the original click. Google just isn’t built to understand those journeys on its own. More on fixing that below.

Step 4: Should you use GCLID import or Enhanced Conversions for Leads?

Both. Google calls GCLID import “legacy” and wants you on Enhanced Conversions for Leads, which matches a hashed email to a signed-in Google user. I run ECL on every client. I also import click IDs on every client, because in B2B, email matching misses a lot.

Here’s why. Your buyer searches while signed into their personal Gmail, then fills out your form with their work email. Google has no idea those are the same person. Google wants that data, so it’s pushing everyone toward enhanced conversions. And ECL does help. It’s just not the best way to get coverage.

If I had to pick one? GCLID. It’s still the most reliable match. But you don’t have to pick: send the hashed email, every click ID you have, and any other identifiers you collect with every conversion. We send every email that submits. Most won’t match — most of a client’s conversions don’t come from Google Ads at all — and that’s fine. Google checks whether there was a click before the conversion date and keeps the ones that line up.

Step 5: How do you know it’s actually working?

Don’t trust a green checkmark. Check four things:

  • Google’s diagnostics. Each conversion action has a Diagnostics tab, and file uploads show under Goals → Conversions → Uploads with a downloadable error report. The errors you’ll actually hit: “click too recent” (under six hours old), “too old” (over 90 days), and unknown clicks (full list).
  • A real conversion, not a validation. A validate-only test upload proves your setup is accepted. It doesn’t prove anything was delivered. Wait for a real conversion to land before you call it live.
  • Two systems that agree. We run server-side tracking alongside the standard web tag and check that the counts line up. When they drift, something broke.
  • The CRM. Reconcile what Google received against the contacts in HubSpot or Salesforce, so every conversion traces to a real person.

And if you’re backfilling history, dry-run it first. One of our first CRM sweeps queued about 270 conversions stamped with the same second — roughly $1.35M of fake value from an initial data sync, not buyers. Reviewing it before sending kept that out of a client’s bidding.

Step 6: When should an offline stage start driving bidding?

Later than you’d like. It’s very rare that I can use offline stages alone for bidding. The lag adds to the learning period, and the stage has to hit volume on top of that. And expect your cost per conversion to go up when the goal moves deeper. That’s fine, and kind of the point, if opportunities go up with it.

Our ladder:

  1. Keep every stage flowing in, with the deep ones as signal. Primary conversions drive bidding; secondary ones are observe-only (how Google treats each).
  2. Make the first offline stage primary — a demo or your quality signal — once it gets about 10 a month. Then run Maximize Conversions on it. Ten is the floor, and every way you split campaigns divides it.
  3. Move to value-based bidding at about 20–30 conversions a month across the mix, using the values from Step 2. The deeper a conversion sits, the more weight it carries against everything else.

Jump too early and it costs you. On one workplace-safety account, Target CPA experiments ran on campaigns doing about 14 conversions a month; the experiment CPA spiked to about $700 against $535 in the control. Google itself suggests judging Target CPA on at least 30 conversions over 30 days.

The exception is B2B SaaS that behaves more like B2C — construction-management software, widely used AI tools — where volume can be high enough to optimize on quality stages alone. And bidding on pipeline only works if the traffic going in is sane; clean search terms come first.

One pattern worth watching once it’s running: in our accounts, I’ve found Google often turns leads into opportunities at a higher rate than other channels, on less volume. OCT is how you see that — and it’s how you defend the budget.

When is native CRM sync not enough?

Native sync is fine if your cycle is short, your deals stay on one contact, and first click to conversion fits inside 90 days. Plenty of accounts never need more.

It stops being enough when the journey outruns the window. On one fraud-prevention SaaS account, content downloads landed about 30 days after the click and demos came two to three months after that. Server-side tracking linked the events and found the first click was about 120 days before the demo — well past what the platform would ever credit. From the ad platform’s perspective, that doubled the conversions it could see. From ours, seeing the whole life cycle against spend, it’s maybe infinitely more.

That’s what server-side tracking does: it stores the click IDs and identity on your side, links sessions across devices and browsers, credits the right click even when a different contact owns the deal, and lets you backfill as far back as you’ve collected data (native connectors stop at 14 days). In our accounts, adding server-side typically lifts conversion coverage another 20–40% over cookie capture alone.

It doesn’t have to be expensive, either. Our self-hosted setup runs about $50 a month per client. Vendr’s contract data puts the median Segment deal around $55K a year. Hosting isn’t that expensive for this; you’re mostly paying for the product around it. The hub post covers why server-side is where this is all heading; a step-by-step server-side guide is next.

The setup is a day. Coverage is the job.

Every click ID you drop is a buyer Google never learns from — and in an account doing 10 demos a month, losing a few means the algorithm is guessing. Capture everything, value it honestly, check it weekly, and let it bid only when the volume is there. It’s the measurement layer under everything in our multi-channel B2B SaaS PPC playbook.

Not sure how many of your conversions are actually reaching Google with a click ID? That’s one of the first things our free PPC audit checks.

Frequently asked questions

Is GCLID import being deprecated in Google Ads?

Not as of October 2026. Google now calls GCLID import 'legacy' and recommends Enhanced Conversions for Leads, and since June 15, 2026 API uploads go through the Data Manager API. But click IDs are still accepted and still matched. In B2B we send both: the GCLID is the most reliable match, and ECL fills gaps.

How long does it take for offline conversions to show up in Google Ads?

Google usually processes an import within 12 hours, and reporting can lag up to 24 hours after that. Conversions are credited to the date of the original click, not the upload date. A click under six hours old will fail with a 'click too recent' error, so schedule a daily upload and let it retry.

What's the click-to-conversion window for offline conversions?

The GCLID has to be 90 days old or less when you upload. That's fine for demo-led SaaS with short cycles. For long cycles, where the first click can come 120 days before a demo, you need server-side tracking to link later conversions back to the original click.

Does HubSpot's Google Ads integration send deal amounts?

No. HubSpot's native ad conversion events send a fixed value per lifecycle stage; the old 'use the deal amount' option is gone. To send real deal values you need a custom workflow, the API, or a server-side setup that reads the deal and sends it with the click ID.

How many offline conversions do you need before bidding on them?

We make an offline stage a primary bidding goal once that single conversion gets about 10 or more a month, and run Maximize Conversions on it. Value-based bidding comes at 20–30 conversions a month across the whole mix. Google suggests judging Target CPA on at least 30 conversions over 30 days.

Should I send closed-won deals back to Google Ads?

Yes, as a signal with a real value — but rarely as the only bidding goal. Closed-won is slow and low-volume, and it carries sales-team noise: rep capacity, SDR follow-up speed, a broken handoff. Send it alongside earlier quality stages so the algorithm learns from volume and from revenue.

Want to know what's actually holding PPC back?

Get a free audit with real fixes—not a pitch deck.

If we're not the right fit, we'll tell you—and you'll still leave with useful next steps.