Send offline conversions from any CRM (Pipedrive, Close, Zoho, Salesforce) with a webhook
If your CRM can send a web request when a deal changes, it can tell Meta, Google Ads, TikTok, LinkedIn, Microsoft Ads, Reddit, Pinterest and X which clicks turned into customers. Here is the field list, a JSON example, holds, dedup and a debugging checklist.

Trusted by agencies and brands running paid media










How does a CRM webhook send offline conversions?
Every CRM keeps a record of what really happened: who bought, when and for how much. Your ad platforms only see the form fill. A webhook closes that gap. When a deal moves to a stage you care about, the CRM posts a short message to a private DataCops address, and DataCops sends it on to the ad platforms you connected.
One private sales webhook works for Pipedrive, Close, Zoho, Salesforce and any other CRM, directly or through Zapier, Make or n8n. DataCops matches the person to the ad click it kept on your own domain, by click ID or by an email linked to their visit.
DataCops accepts sales from any CRM through a private webhook, matches them to the ad click it kept, and sends them to Meta, Google Ads, TikTok, LinkedIn, Microsoft Ads, Reddit, Pinterest and X.
What your ads learn from
What happens to one webhook post
From a deal moving in your CRM to a conversion in your ad accounts.
- Step 01Saved on yourdomain.comfbclid from Meta Keptgclid from Google Ads Keptttclid from TikTok KeptKept for up to 90 days
The DataCops script keeps each ad click on your own domain when the visitor first arrives.
- Step 02
Stages your CRM reports
Booked call ReportedShowed up ReportedWon, with value ReportedA deal changes stage. Your CRM posts the event, email or phone, value and order_id.
- Step 03Finding the ad click againWon dealby email or phoneAd click, 23 days earlierMatched
DataCops finds the click: from click IDs in the post, or an email it already linked to a visit.
- Step 04Won deal sent
Meta Sent once
Google Ads Sent once
TikTok Sent once
LinkedIn Sent once
Consent, holds and duplicates are checked, then the sale goes out to every platform you connected.
Every post is logged in plain words: sent, not sent, duplicate, ignored or rejected.
Why a webhook is the simplest CRM connection
Native apps for every CRM sound nice, but each one has its own login, its own permissions and its own way of breaking. A webhook is the opposite. Almost every CRM can post a small JSON message when a deal changes, and every automation tool can too. One address, one format, every CRM.
It also keeps you in control of what leaves your CRM. You choose the trigger, you choose the fields, and nothing else is read. If your CRM holds sensitive notes, they never come near the ad platforms, because you never map them.
The webhook fields, one by one
The fewer things you send, the fewer things break. Here is what the private sales webhook reads.
- event (required): the stage that just happened, such as lead, booked, showed, won or paid. The accepted names are in the offline conversions docs.
- email or phone (at least one): how DataCops finds the person. Send both when you have them. Phone should include the country code.
- value and currency (optional): the amount of a won or paid sale, so the ad platforms can optimize for revenue and not only for counts.
- order_id (optional, strongly advised): your own ID for the deal or invoice. The same order_id sent twice counts once.
- test (optional): set to true to send a test that shows in the log and is not sent as a real sale.
- Click IDs (optional): gclid, wbraid and gbraid for Google, fbclid, fbc and fbp for Meta, ttclid for TikTok, li_fat_id for LinkedIn. If your CRM stored a click ID on the contact, send it, since it is the strongest match.
An example JSON body
This example uses made-up values. Post it as JSON to your private sales webhook URL, which you copy from the DataCops dashboard. Keep that URL private, like a password.
{
"event": "won",
"email": "sam.okafor@example.com",
"phone": "+447700900123",
"value": 2400,
"currency": "GBP",
"order_id": "deal-10482",
"gclid": "Cj0KCQjw-example",
"ttclid": "E.C.P-example",
"test": false
} A lead-stage call is the same shape with event set to lead and no value. Nothing else changes, so one automation template can cover every stage.
How the webhook finds the ad click
A CRM post usually carries an email, not a browser. DataCops bridges the two. The script on your site keeps the Google, Meta, TikTok, Microsoft, LinkedIn and X click IDs with each visitor for up to 90 days. When that visitor shares an email on a form or at signup, DataCops links the email to their visit. When the CRM later posts a sale with that email, the click is found.
If the person comes back on a new session and uses the same email, the earlier click can still be credited. Email, phone and names are cleaned and SHA-256 hashed before they go to any ad platform, and Google can match on hashed email alone. DataCops shows a match score out of 10 for the details you send, so you can see when adding a phone number or a click ID would help.
Direct, or through Zapier, Make or n8n?
Both work, and they feed the same webhook. Direct means the CRM calls the webhook itself: a Pipedrive automation with a webhook action, a Close workflow on a status change, a Zoho workflow rule, or a Salesforce Flow with an HTTP callout. There is no middle layer, no task quota and one fewer login to lose.
Zapier, Make and n8n make sense when the CRM has no webhook action on your plan, when you need to map field names, or when several tools should react to the same event. If you use one, keep the payload identical to the example above. Developers who prefer an API key can post to the public conversions API instead. It counts a repeated messageId once and returns a clear duplicate answer.
Hold leads until your CRM says they are real
Form fills are noisy. Some teams want the ad platforms to learn only from leads that sales accepted. Set the Lead event to hold, and DataCops stores each lead with its original click IDs instead of sending it. When your CRM marks the lead qualified, post a release with the event name and email. DataCops sends the held lead, oldest first, and a release runs only once.
HubSpot is released automatically: DataCops checks your chosen qualified field every 5 minutes. Leads can also be released or dropped by hand from the lead list. Anything not released within 14 days expires.
One sale, one conversion
CRMs fire the same automation more than once. Someone moves a deal back and forward, or two workflows both react. DataCops keeps a sale ledger per ad platform. A Purchase with an order_id is sent once per order per platform and remembered for 400 days. A Lead with an email is sent once per platform in a 30-minute window. Repeats show as duplicates, with the first send they matched. If a send fails, the claim is released so a retry can go through.
Send leads out to your CRM, too
The webhook is the way in. DataCops also sends verified leads out. HubSpot and Klaviyo connect with one click, Brevo and ActiveCampaign with an API key, and any other tool can receive each lead through an outgoing webhook to your own URL, Zapier, Make or n8n, with an optional condition. LeadCops forms, the DataCops lead forms, keep the ad click with every lead and can block disposable emails, free emails, dead domains and VPN submissions before they reach either side.
Refunds
Post a refund through the conversions API and DataCops corrects Google Ads: a full refund retracts the conversion, a partial one lowers its value, and a repeated refund adjusts once. Meta and TikTok have no correction call, so nothing is sent to them.
Debugging checklist, in this order
- Did the CRM fire? Open the automation history or the Zapier, Make or n8n run log. If nothing ran, the trigger or filter is wrong.
- Did the call reach DataCops? Every post is logged. No line means the request never arrived or the URL is wrong.
- Is the body valid? JSON with an event and an email or phone. A missing event or contact detail is the most common reason a post is rejected.
- Are email and phone clean? No extra spaces, a real address, and a phone with the country code.
- Was it a test or a duplicate? Test posts are logged, not sent. The same order_id twice counts once.
- Is the sale too old? Meta rejects events more than 7 days after they happened. Google Ads ignores uploads more than 90 days after the click.
- Read the reason. The delivery report says why a conversion was held, skipped or failed, per platform, for up to 400 days.
Consent and alerts
The built-in cookie banner is built to the IAB TCF v2.2 standard, shows in Europe by default and turns on Google Consent Mode v2. The server re-checks consent before every send, and for EU, UK and Swiss visitors nothing goes to an ad platform until they opt in. Email alerts tell you when deliveries start failing or a platform token is about to expire, and a new-lead email can arrive the moment a form lead comes in.
Good to know before you start
- HighLevel has a free native app. Every other CRM uses the webhook, directly or through Zapier, Make or n8n.
- Capture email on your website forms so later CRM posts can find the ad click.
- Send an order_id with every sale so repeats count once.
- Qualify leads in the CRM before the stage you send, since CRM posts carry no browser bot check.
Everything behind each CRM conversion

One first-party script, served from your own domain
- Runs first-party from datacops.yourdomain, not a blockable third-party host
- One script, one CNAME, live in about 5 minutes, no container to host
- Server-side collection on Cloudflare's edge, close to every visitor
- Captures click IDs at the network level, so fbclid and gclid still reach your CAPI feed after browsers strip them
- Recovers 15 to 25% of the sessions other setups lose
Traffic Visibility
First-Party Script
Blockers and ITP cut your sessions
Filter fake leads before you send
A bot that fills in your form becomes a lead your ads try to find more of. DataCops checks every visit for bots and datacenter traffic, and for VPNs and proxies if you choose. Switch on Real people only for a platform and flagged visits never reach it.
Sales that come from your CRM are sent as your CRM reports them, with no bot check, so qualify them there before you send.
How DataCops spots botsSet up the CRM webhook
About 5 minutes for the site, then one automation in your CRM.
- Step 1code
Add the DataCops script
One script and one DNS record keep each ad click on your own domain. - Step 2link
Connect ads, copy the webhook
One-click sign-in for Meta, Google Ads, TikTok, LinkedIn and X; an API key for Microsoft Ads, Reddit and Pinterest. Then copy your webhook URL. - Step 3hub
Post a test sale
Add a webhook action to your CRM with the test flag on, and check the line in the log.
CRM webhook offline conversions with DataCops, in short
DataCops is a tool that takes offline sales from any CRM through a private webhook, directly or through Zapier, Make or n8n, and sends them to Meta, Google Ads, TikTok and LinkedIn, matched to the ad click.
How DataCops does it
Any CRM that can send a web request
Pipedrive, Close, Zoho, Salesforce and others post to your private sales webhook when a deal changes, directly or through Zapier, Make or n8n. HighLevel has a free native app, so it does not need the webhook.
The fields to send
Email or phone, the value and currency, an order ID, a timestamp and any click IDs. Send an order ID with every sale so repeats count once. The page gives a JSON example and a debugging checklist.
How a sale finds its click
DataCops matches by the click ID in the payload, or else by the last stored click for that hashed email, phone or customer ID. Clicks are kept on the server for up to 90 days, and a signed server-set cookie lasts up to 400 days where enabled.
Holds and timing
A lead can be held when it is captured and released by the webhook. Held leads wait up to 14 days. Meta takes events up to 7 days old, so post each stage when it happens.
Qualify before you send
Every visit gets a bot verdict against 360+ billion IPs and 350+ monitoring points, with a Real people only switch per platform, off by default. CRM posts carry no bot flags, so the check applies to the site visit. Every form email is checked for disposable providers, domains with no mail server and an email risk score, and LeadCops can hold a lead.
Warm up, and see every send
Ads Warmup sends a CSV of up to 20,000 existing customers to Meta, Google Ads and TikTok, dated when you send. A delivery log row shows each send as sent, held, skipped or failed with the reason.
Best for: teams on a CRM other than HighLevel who want their won deals to reach Meta, Google Ads, TikTok and LinkedIn without code.
Free to start. See pricing.
When not to use DataCops
You use HighLevel
Use the free native app. It sends form lead, booked, showed, won and paid without a webhook.
You need a native connector for each CRM
Every CRM except HighLevel connects through the webhook. There is no native Pipedrive or Salesforce app.
You need Stripe or Paddle sales directly
Payments from Stripe or Paddle are not sent directly. Post them to the webhook.
You need bot checks on CRM posts
CRM posts carry no browser bot check. Qualify leads in the CRM first.
Sources
Platform rules checked October 2026. Rules change; check the platform's own page before you build.
FAQ
Any CRM that can send a web request or connect to Zapier, Make or n8n, including Pipedrive, Close, Zoho and Salesforce. HighLevel also has a free native app in the HighLevel Marketplace.
Works with the rest of DataCops
Conversion API
Server-side conversions to Meta, Google Ads and TikTok, no code.
See Conversion APIAds Warmup
Feed your customer list to the ad platforms before you spend.
See Ads WarmupLeadCops
Verified leads, and conversions only once a lead qualifies.
See LeadCopsOffline Conversions
CRM, store and CSV sales matched back to the ad click.
See Offline ConversionsConnect your CRM to your ads
Start free, then post a test sale from your CRM in minutes.
Setup in 5 minutes. No credit card.