Guide Posted by the DataCops team

Salesforce offline conversions to Facebook and Google Ads: how to send opportunity stages

Short answer

Capture gclid, fbclid, ttclid and li_fat_id in hidden form fields, map them across lead conversion, pick a few stages, and send each one on change. There is no native Salesforce app, so use the private webhook.

"Salesforce Facebook offline conversions integration" is one of the searches we see most. So let me answer it properly, including the part where I tell you what we don't have.

The pattern has three parts.

Part one: capture the click ID when the lead is created. On your web-to-lead form or your landing page form, add hidden fields for the click IDs you care about: gclid for Google, fbclid for Meta, ttclid for TikTok, li_fat_id for LinkedIn. Store them on the Lead, and make sure they carry over to the Contact and the Opportunity when the lead converts. This is the step people skip, and it decides how well everything else matches.

Part two: decide which stages to send. Salesforce opportunity stages are usually too many and too custom. Pick a few that separate buyers from form fillers: a qualified opportunity, a meeting held, a closed-won with its amount. Ignore the rest.

Part three: send each stage when it changes. A Salesforce Flow can make an HTTP callout when the stage changes, or you can pass the event through a tool like Zapier, Make or n8n. The message carries the event name, the person's email or phone, the value and currency, an order ID, and any click IDs you stored.

On our side, the receiving end is a private webhook URL. It takes those fields, finds the ad click, and sends the stage to the platforms you've connected. The order ID means a resend of the same stage counts once, so retries are safe.

A made-up example of the mapping. Stage "Qualified" becomes a lead event. Stage "Meeting held" becomes a scheduled or showed event. Stage "Closed Won" becomes a purchase event with the amount. "Closed Lost" is not sent.

Some Salesforce-specific pitfalls that catch teams out.

Lead conversion. When a lead converts into a contact and an opportunity, custom fields don't always carry across automatically. Map your click ID fields explicitly, or they'll be empty on the opportunity, which is where the stage change happens.

Several opportunities per contact. A person with two opportunities can trigger two events for what's really one customer. Decide what counts, and use an order ID that's unique to the sale you mean.

Stage names. Salesforce stages are customised in every org, and someone will rename one. Map by a stable value where you can, and keep a written list of what each stage means.

Testing. Use a sandbox or a test record, and use the test flag on the receiving end so nothing reaches your ads until you've checked the payload.

Ownership. Somebody in your team has to own this flow. An unowned flow is the same as no flow after six months.

Are you on Salesforce? Which stages are you thinking of sending?

DataCops in short

For this question: DataCops reads Salesforce stages through the webhook, matches them to gclid, fbclid, ttclid or li_fat_id and sends each stage on change, with a log of every send.

DataCops is a tool that makes the ads learn from real sales: it sends booked, showed, won and paid stages from your CRM back to your ad platforms, gives every visit a bot verdict with a Real people only switch per platform, warms up new campaigns with your existing customers, and logs every send. It is not an attribution report.

How DataCops does it

  • The sale after the form. HighLevel natively (lead, booked, showed, won with value, paid; cancelled, no-show and lost are never sent), any other CRM through a private webhook, matched to the click by click ID or hashed email and phone.
  • The click is kept on the server. Click IDs are stored for up to 90 days, so a deal that closes weeks later still finds its click.
  • Real people only. Every visit gets a bot verdict against 360+ billion IPs and 350+ monitoring points, with a Real people only switch per ad platform, off by default. CRM events carry no bot flag.
  • Counted once, logged every time. Pixel and server events share an event ID, and a delivery log shows each send as sent, held, skipped or failed, with the reason.
  • One script, one DNS record. Collection runs on your own domain; with DNS on Cloudflare, the free Worker reads the click at the edge before the page loads.

Best for: ad-funded businesses whose sales close in a CRM or on a call: clinics, home services, agencies, B2B and lead gen.

Ads Warmup: tell the ads who pays

Ads Warmup, DataCops' flagship feature, sends customers you already have to Meta, Google Ads and TikTok before a new campaign spends: upload a CSV (only email is required, up to 20,000 rows), see a 0 to 10 match score per person, pick the event, and send. Rows are dated when you send, and Google Ads credits only people who clicked a Google ad. Preview is free; sending needs a paid plan. Check your own consent basis for the list first. See Ads Warmup.

Ways to do this job

OptionBest for
DataCopsCRM stages to Meta and Google Ads, with a bot verdict and a delivery log
Zapier or MakeOne simple CRM-to-ad flow you build and maintain
Direct API uploadTeams with an engineer
Manual CSV uploadOccasional batches

When not to use DataCops

  • You want a reporting dashboard. DataCops cleans and sends what goes into your ads. It is not a multi-touch reporting layer.
  • Your sales never leave one store checkout. If everything happens in one checkout, the platform's own pixel plus server events may be enough.

More on this: Salesforce offline conversions, and the complete guide to offline conversion tracking.

1 comment

Comments (1)

DataCops team author · 30 Sep 2026

If you're building the flow, start with just one stage (Closed Won) and one platform. Once that works end to end, adding stages is a copy job.

1
Replies from DataCops account holders are coming soon. Until then, questions about your own setup can go to the team.

More threads

See what your own setup is missing

Send CRM sales back to the ad click that started them, logged per send.

Setup in 5 minutes. No credit card.

Live traffic quality

Updated just now

Visits · last 24h

487
Real users
35873.5%
Bots · auto-filtered
12926.5%

Without filtering, 26.5% of your reported traffic is bot noise inflating dashboards and draining ad spend.

Don't trust your analytics!

Make confident, data-driven decisions withactionable ad spend insights.

Setup in 2 minutes
No credit card