In this guide
- The pattern: CRM stage change → webhook → server container → Meta. The server turns a CRM record into a Meta event.
- It only works if the lead record carries the identifiers saved at the form:
fbc,fbp, hashed e-mail and phone. - Send each stage once, with a stable event ID, and promptly, because Meta limits how old an event may be.
Most CRMs can call a web address when something changes. That small feature is enough to send your sales results back to Meta, so the ad platform learns which leads became customers. This page describes the pattern in a way that fits HubSpot, Pipedrive, Salesforce, Zoho, GoHighLevel and custom systems, and the next pages show the details for each. The overall idea is in how to send offline conversions, and the Meta side in how to set up the Conversions API.
The flow in detail
A visitor submits a form
Your site saves fbc, fbp, the page URL and the hashed e-mail and phone in hidden fields, and the CRM stores them on the lead.
A salesperson moves the deal
The deal changes from "new" to "qualified" or "won".
The CRM calls a webhook
A workflow or automation posts a small JSON message to your tagging subdomain.
Your server container accepts it
A client in the container recognises the request and turns it into event data.
The Meta tag sends the conversion
It reads the identifiers and sends a Conversions API event named for the stage.
Meta matches it
It links the event to the person who clicked the ad, if the identifiers are good.
Connected in minutes
Add your domain, install the pixel, connect your ad platforms and watch the first events land.
What the webhook should contain
| Field | Example | Why |
|---|---|---|
event_name | QualifiedLead | The name of the Meta event for this stage |
event_id | lead_4821_qualified | A stable ID so a repeat send is not counted twice |
event_time | 1735689600 (Unix seconds) | When the stage changed |
fbc, fbp | Stored at the form | Matching to the ad click and browser |
email_hash, phone_hash | SHA-256 values | Matching to the person |
value, currency | 2500, USD | What the deal is worth, if known |
Hash e-mail and phone before they leave the CRM or in the server container, after trimming and lower-casing. See event match quality. Do not put plain e-mail in a URL, only in the body of a POST request over HTTPS.
Receiving it in the server container
A server container needs a client that recognises the webhook and turns it into event data. You can use a client from the gallery that accepts JSON posts, or write a small custom client. The Meta tag then fires on the event name. Keep the path obscure, and add a shared secret in a header that the client checks, so that nobody else can post events to your server. With Open Tracked, the tagging server runs for you on your own subdomain, so the webhook target is a path under that domain.
Works with your stack
Grab a logo and throw it. These are the tools Open Tracked already talks to.

Timing
Meta only accepts events within a limited time window, generally about 7 days, though some sources allow longer. Send the stage at the moment it changes. If your CRM only supports a nightly export, you will lose events that are older than the window when they arrive. The Request Delay power-up (Business plan) can hold a request for 1 to 2,000 minutes if you want to delay a stage on purpose.
Testing
- Create a test lead through the real form, so the identifiers are stored.
- Move it through each stage.
- Watch the server container Preview: the webhook should arrive, be claimed and fire the Meta tag.
- Open Meta Events Manager, Test Events, and look for the custom event with its match keys.
- Check that moving the stage twice does not create two events.
Mistakes that lose data
Runs on your domain, anywhere
Your tracking runs on your own domain, so a visit from any country is handled the same way.
Frequently asked questions
Can any CRM send data to Meta?
Any CRM that can call a webhook or an API when a record changes can, through a server container or your own code.
Do I need the click ID?
It helps matching. Hashed e-mail and phone are the main fallback.
How do I stop duplicates?
Use a stable event ID per lead and stage, and trigger the webhook on change only.
Is a server container required?
Not strictly. You can call the API directly. A container lets you reuse the data for Google and others.
Does Open Tracked have a CRM?
Yes. Its CRM pipeline sends stages back to Meta and Google Ads. If you use another CRM, use webhooks as described here.
Do I need spreadsheets to read my results?
No. Once tracking is live, the Open Tracked analytics shows spend, revenue, ROAS and profit, and you can ask Ari, the built-in AI assistant, questions about your own numbers in plain words. Ari's allowance depends on your analytics plan.
Is Open Tracked different from Open Track or Open Space Track?
No. Open Tracked is the official name of our server-side tracking platform, and the website is opentracked.io. Many people search for it as Open Track, OpenTrack or Open Space Track. All of them lead to the same product: server-side Google Tag Manager hosting, first-party analytics and a CRM pipeline.

Fix your tracking at the source
Open Tracked hosts your server-side Tag Manager, keeps first-party cookies alive and shows what each ad is really worth.
The Open Tracked team
We build Open Tracked: server-side tracking hosting, analytics and the tools around them, for stores that spend on ads. Questions about this guide, or an idea for the next one?
Comments
Loading comments...
