How to send CRM leads and deals to Meta's Conversions API.
By Santi ·
How do I send HubSpot leads and deals to Meta’s Conversions API?
Create a Conversions API token in Events Manager, then send each stage as a server event to your dataset, matched on the lead ID when the lead came from a Meta lead ad, and on the fbc click ID and hashed email and phone when it came from your website. HubSpot’s own Meta sync sends lifecycle stages only for contacts from lead generation campaigns, and for a website lead it can send the HubSpot form submission but not later stages, like a closed deal. Send each event when the stage changes, because Meta takes events up to 7 days old.
What does HubSpot’s Meta sync cover?
HubSpot’s ads tool creates Meta events on a form submission, a lifecycle stage change or a page view. From its help page, updated October 7, 2026:
- “Meta only supports syncing lifecycle data from contacts who interacted with your lead generation campaigns.” Data from website traffic or engagement campaigns isn’t synced.
- It works only for campaigns “using the Conversion Leads optimization and delivery goal”.
- Form events take HubSpot forms only: “Submissions from non-HubSpot forms cannot be synced with Meta.”
- It needs a Meta pixel installed through HubSpot, and “Clicking the Add pixel button will immediately add the pixel to all pages that include the tracking code.”
- Form submission events take one value you type in. The lifecycle stage setup lists no value field.
If your leads come from instant forms and you optimize for Conversion Leads, that may be all you need. It doesn’t cover a lead who filled in a form on your website and became a customer three weeks later.
How do website-form leads match?
A lead from your website has no Meta lead ID, so Meta matches it on what you send about the person:
- fbc, the click ID. It comes from the
fbclidon the landing page URL, or from the_fbccookie Meta’s pixel sets. How to capture it on your forms. - fbp, the browser ID, from the
_fbpcookie. Meta recommends that you “always send_fbcand_fbpbrowser cookie values in thefbcandfbpevent parameters” when you have them. - em and ph, hashed with SHA-256. Email: trim it and lowercase it. Phone: digits only, and it “must include a country code to be used for matching”, even if all your customers are in one country.
fbc, fbp and the lead ID go to Meta as they are, unhashed.
Should I send CRM events or standard events like Purchase?
Short answer: leads from Meta lead ads get CRM events. Leads from your website get standard events: Lead when they come in, Purchase with the deal amount when they buy.
CRM events follow Meta’s “Conversions API for CRM” format: action_source is system_generated, custom_data.event_source is crm, and the event name is your stage, like “Qualified” or “Closed won”. They power Conversion Leads, which is built for Lead Ads instant forms. Meta’s guide asks you to:
- send every stage as it happens, including the raw lead: “a minimum of two stages”, and three or more if you can
- upload at least once a day
- keep each
event_timeafter the lead was created, or “your events may be discarded”
Meta’s guide for platforms describes a good fit as an advertiser with at least 200 leads a month, whose target stage happens within 28 days of the lead at a 1 to 40% conversion rate.
Standard events like Lead or Purchase carry a value and a currency. Meta’s parameter reference says value is “Required for purchase events or any events that utilize value optimization”, with an ISO 4217 currency code. For a closed deal from a website lead, a Purchase with the deal amount says what it was worth.
action_source tells Meta where the conversion happened. For a CRM update, system_generated fits. Meta says “All action sources enable ad optimization capabilities”, so you don’t need website for that, and website events need a source URL and user agent that a CRM record doesn’t have.
Which match keys should I send?
| Key | Where it comes from | Hashed |
|---|---|---|
lead_id |
Meta Lead Ads, for leads from instant forms | No |
fbc |
The fbclid on the landing URL, or the _fbc cookie |
No |
fbp |
The _fbp cookie |
No |
em |
The contact’s email | Yes |
ph |
The contact’s phone, with country code | Yes |
Send every key you have. More keys give Meta more ways to find the person.
Why send the event when the stage changes?
Because of Meta’s time limit. Its reference: “The event_time can be up to 7 days before you send an event to Facebook. If any event_time in data is greater than 7 days in the past, we return an error for the entire request and process no events.”
The 7 days run from the stage change, not from the lead. A deal that closes six weeks after the lead is fine if you send it the day it closes. With a weekly export, anything that happened more than 7 days before export day fails, and takes the rest of its request with it.
How do I get the access token and dataset ID?
- In Meta’s Events Manager, open the dataset your ads use.
- Open Settings. Under Conversions API, in Set up manually, click Generate access token. Meta notes the link “is only visible to users with developer privileges for the business”.
- Meta creates a Conversions API app and system user for you. “There is no need to go through App Review or request any permissions.”
- Copy the token, and the dataset ID at the top of the settings.
The step-by-step with screenshots: Connect Meta.
How do I test the events?
In Events Manager, open your dataset’s Test events tab, copy the test code and send it as test_event_code. Events show up in that tab, and Meta says you can verify them in Events Manager “within 20 minutes after they were sent”.
Test events still count. Meta: “Events sent with test_event_code are not dropped. They flow into Events Manager and are used for targeting and ads measurement purposes.”
Can I use Event Match Quality to check matching?
Meta scores Event Match Quality from 1 to 10 in Events Manager and suggests aiming for 6.0 or higher. I haven’t found a Meta page that says whether CRM events get a score, so count your keys as well: the share of events you send with a lead ID, fbc, email or phone. If that share is low, fix the capture before anything else.
I built Ledion to send to Meta this way. Its Send conversion step runs in a HubSpot contact or deal workflow, so each stage goes out when it changes, well inside Meta’s 7 days, as a CRM event or a standard event with the record’s amount. How Ledion sends to Meta. What a custom build has to handle instead: the full list.
Questions
Do I need Meta App Review?
Not with a token you create in your own Events Manager. Meta: “There is no need to go through App Review or request any permissions.” The token belongs to a Conversions API app and system user that Meta creates in your business.
Can I send website-form leads?
Yes. They have no lead ID, so send the fbc click ID, the fbp browser ID and hashed email and phone, with a standard event like Lead, or Purchase with a value. Meta’s Conversion Leads optimization is built for Lead Ads instant forms, so for website leads the standard event is the better fit.
How do I test without polluting my data?
Use the Test events tab in Events Manager, but know that Meta doesn’t throw test events away: they “flow into Events Manager and are used for targeting and ads measurement purposes”. Test with a real lead you’d send anyway, or with a dataset you don’t use for ads.
Sources: 9 pages, checked
- HubSpot Knowledge Base: Create and sync ad conversion events with your Meta Ads accounts using Meta's Conversion API (updated October 7, 2026)
- Meta for Developers: Conversions API: get started
- Meta for Developers: Conversions API: server event parameters
- Meta for Developers: Conversions API: customer information parameters
- Meta for Developers: Conversions API: standard parameters (custom data)
- Meta for Developers: Conversions API: ClickID and the fbp and fbc parameters
- Meta for Developers: Conversions API for CRM: integrate as a platform
- Meta for Developers: Conversions API: using the API (Test Events)
- Meta for Developers: Conversions API: verifying your setup