Send offline conversions from any CRM (Pipedrive, Close, Zoho, Salesforce) with a webhook

PipedriveCloseZohoSalesforce
Direct or Zapier, Make, n8n

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.

Setup in 5 minutes
No credit card
One lead from a Meta ad
From form fill to won deal in HighLevel
With DataCops
Form fillSent to Meta
Booked callSent to Meta
Showed upSent to Meta
Deal wonSent with its value
Matched to the original ad click by email

Trusted by agencies and brands running paid media

AffilinoBigfishClever DigitalKeetraxLegendListingLogicNumeroStormZealdBurst Digital
Definition

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

Pipedrive, Close or Zoho by webhook
What your ads see today Form Deal won, with value
With DataCops Form Deal won, with value
Any CRM with a sales cycle
What your ads see today Form Qualified Deal won, with value
With DataCops Form Qualified Deal won, with value

What happens to one webhook post

From a deal moving in your CRM to a conversion in your ad accounts.

  1. Step 01
    Saved on yourdomain.com
    fbclid from Meta Kept
    gclid from Google Ads Kept
    ttclid from TikTok Kept
    Kept for up to 90 days

    The DataCops script keeps each ad click on your own domain when the visitor first arrives.

  2. Step 02
    Stages your CRM reports
    Booked call Reported
    Showed up Reported
    Won, with value Reported

    A deal changes stage. Your CRM posts the event, email or phone, value and order_id.

  3. Step 03
    Finding the ad click again
    Won dealby email or phone
    Ad click, 23 days earlierMatched

    DataCops finds the click: from click IDs in the post, or an email it already linked to a visit.

  4. Step 04
    Won 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

  1. 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.
  2. Did the call reach DataCops? Every post is logged. No line means the request never arrived or the URL is wrong.
  3. 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.
  4. Are email and phone clean? No extra spaces, a real address, and a phone with the country code.
  5. Was it a test or a duplicate? Test posts are logged, not sent. The same order_id twice counts once.
  6. 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.
  7. 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

Capture Background

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

10%
20%
30%
40%
50%
60%
70%
80%
90%
100%

First-Party Script

~78%

Blockers and ITP cut your sessions

Real people only

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 bots
Meta, delivery
Real people only
Bots and datacenter traffic never reach Meta. VPNs and proxies too, if you choose.
Send everything
Meta gets every visitor, bots included.
Lead from a bot Skipped

Set up the CRM webhook

About 5 minutes for the site, then one automation in your CRM.

  1. Step 1
    code

    Add the DataCops script
    One script and one DNS record keep each ad click on your own domain.

  2. Step 2
    link

    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.

  3. Step 3
    hub

    Post a test sale
    Add a webhook action to your CRM with the test flag on, and check the line in the log.

In short

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

1

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.

2

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.

3

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.

4

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.

5

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.

6

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.

Connect your CRM to your ads

Start free, then post a test sale from your CRM in minutes.

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