Instant Form leads leave Meta in six ways: manual download, a native CRM integration, middleware such as Zapier, a Google Sheets or Excel connection, webhooks with the Graph API, or Graph API bulk reads. A real Facebook lead ads CRM integration is one of the last five: it runs unattended, which matters because Meta keeps leads downloadable for 90 days.
| Method | Speed | Effort | What reaches you | Limits |
|---|---|---|---|---|
| Manual download | whenever someone downloads | nothing to set up, repeated by hand | lead ID, ad, ad set and campaign IDs, form ID, answers; Leads Center exports only contact fields, stage, source and owner | 90-day window; organic leads only in the Business Suite file; 10,000 leads per Leads Center export |
| Native CRM integration | automatic; Meta says real time | low: connect once from Meta Business Suite | whatever the CRM maps; tracking parameters pass through | not every CRM stores Meta’s lead ID; leads access rules apply |
| Middleware (Zapier, LeadsBridge, Make) | automatic | low, no code, plus an account with the tool | the fields you map, lead ID included if you map it | one more tool and one more mapping to maintain |
| Google Sheets or Excel | automatic | low | a row per lead with a Lead ID and a lead_status column | a spreadsheet, not a CRM |
| Webhooks + Graph API | near real time; Meta says pings can take up to a few minutes | developer, Meta app, App Review, Business Verification | lead ID, ad ID, form ID, Facebook Page ID and time, then the answers | rate limit per Facebook Page; the token’s owner needs leads access |
| Graph API bulk read | on your schedule | developer | lead ID, created time, ad ID, form ID, answers, filtered by date | same permissions and rate limit; as fresh as your last run |
Whichever route you pick, store two IDs on every lead: Meta’s lead ID, so your CRM can send stages back to Meta, and the ad ID, so you can compute CPL per ad.
How to download Facebook leads manually
Meta lets you download leads as a CSV or XLS file from three places:
- Ads Manager: open the Ads tab, click the On-Facebook leads link in the Results column, filter by ad, location, language and date range, and download. You can pull leads from several campaigns at once.
- The Instant forms section of Meta Business Suite: All tools, Instant forms, then Download next to the form. Download new leads exports only what arrived since your last download.
- Leads Center in Meta Business Suite: the download icon exports your current filter, but the fields are limited to date, name, email, phone, stage, source and owner, and a file holds up to 10,000 leads.
The Ads Manager and Business Suite files carry the useful columns: the lead ID (id), creation time, ad, ad set and campaign IDs and names, form ID and name, is_organic and platform, then one column per question (Information included when you download your leads data). Meta says you need both Facebook Page admin permissions and a role on the ad account to see all of them. Ad fields come out blank for organic leads, ad preview submissions, and anyone without advertiser privileges on the ad account.
Meta’s own developer guide calls manual download “not recommended”, acceptable as a temporary solution when an integration has issues (Connecting your CRM to download leads). The reason is the clock: Meta keeps leads available for download for up to 90 days from submission, citing security and storage, and recommends downloading often or using a CRM (About expired leads).
Why your download doesn’t match Ads Manager
Example: an Instant Form ad set shows 300 leads in the Results column for March.
| Where you look | Leads | Why |
|---|---|---|
| Results column, March | 300 | leads that came from the ads |
| Business Suite download, pulled 2 April | 312 | the 300, plus 11 organic leads and 1 test lead you submitted yourself |
| Any download pulled in July | 0 | every March lead is past the 90-day window |
The organic and test rows come from Meta’s notes on organic leads: organic leads exist only if the form’s sharing setting is Open (Restricted is the default), they’re downloadable from Business Suite but not from Ads Manager, and neither they nor test leads count in Results. The last row is the 90-day rule: Results keeps counting leads you can no longer download.
Native Facebook lead ads CRM integrations
Meta keeps a searchable directory of CRM systems with a lead ads integration. To connect one (Connect your CRM system to Meta Business Suite):
- In Meta Business Suite, open All tools, then Instant forms.
- Select the CRM setup tab and search for your CRM.
- Click Connect from website and finish the steps on the CRM’s side. Entries marked “through Zapier” connect through Zapier instead.
Meta’s article on CRM integration benefits says new leads then reach the CRM automatically and in real time. Only admins of the Facebook Page who have leads access permission can connect a CRM, and if someone with full control of the business portfolio has customized leads access, the CRM must be assigned there before any lead arrives (Assign or remove permissions in leads access). An integration set up from the CRM’s website can’t be edited or disconnected in Business Suite; you manage it on the CRM side.
Before you commit, check one thing: does the integration store Meta’s lead ID? Meta’s guide to finding the lead ID lists where it lands:
| Route | Meta lead ID stored? |
|---|---|
| Webhook or Graph API | yes, in the lead’s id field (leadgen_id in the webhook) |
| Zapier or LeadsBridge | yes, in the id field, if you map it |
| Make | yes, in the Lead ID field, if you map it |
| Salesforce Lead Capture | yes, in the Lead ID field; map it to a custom field |
| HubSpot Lead Sync | no |
| Zoho CRM Social integration | no |
| Microsoft Dynamics 365 | no leads integration at all |
| Manual file | first column, id, with a leading label you may need to strip |
Without the lead ID, sending stages back to Meta later loses its best match key.
Two form settings make any integration cleaner. Both are easier to set when you build the form, because published forms may need to be duplicated and modified (About tracking parameters):
- Field names. Under Settings, Field names, rename the columns to match your CRM’s field IDs, so Meta leads land in the same fields as leads from other channels (Change the field names).
- Tracking parameters. Under Settings, Tracking parameters, add name and value pairs such as
utm_source=Facebook. People never see them; they’re included in downloads, passed to integrated CRMs and available to webhook and API integrations. Names and values can’t be empty or reuse a form field name (Set up tracking parameters).
The rest of the form setup is in Facebook lead ads best practices.
Middleware: Zapier, LeadsBridge and Make
If your CRM has no native integration, Meta points to third-party tools such as Zapier and LeadsBridge as the easy, no-code option. Meta’s Zapier walkthrough starts from the same CRM setup tab: connect your Zapier account, pick the Facebook Page and the Instant Form, test the trigger, choose the action in your CRM (usually Create contact) and map the form fields to CRM fields.
Map three IDs on day one: lead ID, ad ID and form ID. Meta’s walkthrough is blunt about the first: storing the lead ID is required if you want to set up a Conversions API for CRM integration. And because the walkthrough has you pick a specific Instant Form, check that new forms are covered when you launch them.
Google Sheets or Excel: a two-way spreadsheet
For a small team without a CRM, Meta can write leads straight into a spreadsheet. Connect Google Sheets or Microsoft Excel from the Instant forms section of Meta Business Suite, pick the spreadsheet and the form, and new leads appear as rows. An option creates a new worksheet automatically for every new form. If you start the Sheets setup from Ads Manager instead, the spreadsheet has to be empty.
The useful part runs the other way. Each row gets a Lead ID and a lead_status column with stages such as Intake, Qualified, Converted, Lost and Not qualified. Every time you update lead_status, Meta pulls the change and creates a Conversions API event from it. And if you work your leads in Leads Center, Meta says Instant Form leads are sent automatically, with no setup required (Connect your CRM using Conversions API for CRM).
A spreadsheet won’t assign leads, remind anyone to call, or stop two people calling the same person. Move to a CRM once more than one person works the leads.
DropCPL doesn’t sync Instant Form leads: it handles the leads your landing pages collect, and forwards each one by webhook with its ad and landing page attached. The click is logged on the landing page’s own domain and the Lead event goes to Meta through the Conversions API, so those leads reach your CRM with an ad ID you can join to spend. Start free →
Send Facebook leads to a CRM with webhooks and the Graph API
This is the route for agencies with many Facebook Pages, custom routing rules, or a CRM nobody integrates with. Meta’s Retrieving Leads guide describes two methods: webhooks, which notify you of each new lead, and bulk read, which you call on your own schedule.
What you need first
- A Meta app that has passed App Review with
leads_retrievalandpages_manage_ads, followed by Business Verification. An app in Development mode can’t retrieve leads, except those submitted by people with a role on the app (Lead Ads overview). - A token from the right person: a Page or User access token requested by someone who can advertise on both the ad account and the Facebook Page. Prefer a Page access token: Meta warns that User tokens are rate-limited by the app’s active users, usually one for a lead ads integration. Meta also suggests a long-lived Page token, so the integration doesn’t stop when a token expires.
- These permissions to read all lead data and ad-level data:
ads_management,leads_retrieval,pages_show_list,pages_read_engagementandpages_manage_ads, pluspages_manage_metadatafor webhooks. - Leads access for the person behind the token. If the business has customized leads access and that person isn’t assigned, the fetch fails.
The webhook flow
- Subscribe your app to the Page object’s
leadgenfield, then install it on the Facebook Page with a POST to/{page-id}/subscribed_apps?subscribed_fields=leadgen(Webhooks for lead ads). - For each new lead, Meta posts a notification to your endpoint. Meta says these real-time pings can arrive with a delay of up to a few minutes.
- Fetch the lead by its
leadgen_id. - Save it, then route it.
The notification carries IDs, not answers. This is Meta’s sample:
{
"object": "page",
"entry": [
{
"id": 153125381133,
"time": 1438292065,
"changes": [
{
"field": "leadgen",
"value": {
"leadgen_id": 123123123123,
"page_id": 123123123,
"form_id": 12312312312,
"adgroup_id": 12312312312,
"ad_id": 12312312312,
"created_time": 1440120384
}
}
]
}
]
}
Then fetch the lead itself:
GET https://graph.facebook.com/{API_VERSION}/{LEADGEN_ID}?fields=created_time,ad_id,campaign_id,form_id,field_data&access_token={PAGE_ACCESS_TOKEN}
field_data holds the answers as name and values pairs. Responses to optional custom disclaimer checkboxes aren’t in it; request custom_disclaimer_responses separately.
Bulk read as a safety net
Bulk read pulls leads from an ad or a form, with GET /{AD_ID}/leads or GET /{FORM_ID}/leads and a filtering parameter on time_created to fetch only what’s new. A form can serve many ads, so it often holds more leads than any single ad using it. Meta’s overview suggests bulk read if you fetch a few times a day, and webhooks for anything more frequent.
The rate limit is 200 × 24 × the number of leads the Facebook Page created in the past 90 days, per 24 hours. Example: a Facebook Page with 500 leads in the last 90 days allows 2,400,000 calls a day.
My setup: webhooks for speed, plus one bulk read a day that compares lead IDs with what’s already stored. A lead the webhook missed turns up the next morning; with a 90-day window, a lead nobody notices eventually becomes a lost lead.
Test before launch
Meta’s Lead Ads Testing Tool creates a test lead for a form and shows whether your webhook received it, with the payload. You get one test lead per form at a time (delete it to create another), the tool doesn’t work in developer mode, and its leads are organic and not tied to any ad, so don’t expect an ad_id on them.
What each lead should carry into your CRM
| Field | Where it comes from | Why you store it |
|---|---|---|
Lead ID (id, leadgen_id) | downloads, webhooks, the API and integrations that map it | the match key for sending stages back to Meta |
ad_id, adset_id, campaign_id | downloads and the API, with advertiser access; the webhook carries ad_id | joins each lead to spend: CPL per ad |
form_id | downloads, webhooks and the API | one form can serve many ads |
is_organic, platform | downloads | separates paid from organic, Facebook from Instagram |
| Tracking parameters | set per form, in Settings | fixed labels such as a client name or an offer code |
phone_number_verified | downloads, when phone verification is on | Meta warns it may not come through a CRM integration |
Store the IDs as text and join on the ID, never the name: how to track the Facebook ad ID in your CRM explains why, and how to turn them into CPL per ad. If you also run landing pages, DropCPL’s lead routing sends the ad, the campaign and the landing page with each landing page lead, so both sources join to spend the same way.
Send CRM stages back with the Conversions API for CRM
Getting leads out is half the loop. The other half sends each lead’s progress back to Meta, and since April 2026 Meta requires it for the qualified leads performance goal on new campaigns, with existing campaigns affected from August 2026 (About performance goals for lead ads).
Meta’s developer guide calls it the Conversions API for CRM integration and stresses that it’s separate from a website Conversions API setup: the required parameters differ, and the data comes from your CRM rather than your web server. Each stage change becomes one event, as the payload specification shows:
{
"data": [
{
"event_name": "Marketing Qualified Lead",
"event_time": 1793787302,
"action_source": "system_generated",
"user_data": {
"lead_id": 1234567890123456
},
"custom_data": {
"lead_event_source": "HubSpot",
"event_source": "crm"
}
}
]
}
event_name is your own stage name, lead_event_source the name of your CRM, and lead_id the Meta lead ID; without it, Meta accepts a hashed email or phone number, or a click ID.
The rules that trip people up, from Meta’s developer implementation and FAQ:
- Send every stage, raw lead included. Meta’s example: 100 leads that become 70 marketing qualified leads, 30 opportunities and 15 sales mean 215 events.
- Mind the timestamps.
event_timemust come after the lead was created, and no more than 7 days before you send it. - Batch carefully. A batch holds up to 1,000 events, and one error discards the whole batch, so keep batches small and retry.
- Upload at least daily. If you batch, send each status change, not a snapshot of the latest one.
- Don’t change the Pixel later. Meta says switching starts a new integration and restarts training.
Validation needs at least seven days of data and at least two funnel stages, three if possible.
You don’t need a developer. Meta’s list of Conversions API for CRM partners includes HubSpot, LeadsBridge, Make, Salesforce, Stape, Zapier and Zoho, and the Google Sheets and Excel connections do it from a column. Meta’s timeline puts a partner or Zapier setup at under a day and a developer build at 3-4 weeks, followed by 2-4 weeks of training. One HubSpot detail: since Lead Sync doesn’t store the lead ID, Meta suggests a webhook or partner integration instead, or HubSpot’s Lifecycle Stage Sync on Professional and Enterprise plans.
One boundary: Meta says this payload is for Meta lead ads only, not for website leads. Landing page leads go back as a regular website Lead event, covered in how to set up the Conversions API. Meta’s thresholds for the goal itself are in Facebook lead quality and the conversion leads entry.
Which Facebook lead ads CRM integration should you choose?
- No CRM, one or two people calling: the Google Sheets or Excel connection, or Leads Center. Sheets turns your
lead_statusupdates into Conversions API events, and Meta says Leads Center needs no setup for Instant Form leads. - A CRM with a native integration that stores the lead ID: use it, then set field names and tracking parameters on every form.
- A CRM whose integration drops the lead ID: middleware with
idmapped, or webhooks. - An agency with many clients and Facebook Pages: webhooks plus a daily bulk read, with a clear owner for the token, because the integration breaks the day that person loses access to the ad account or the leads.
- Manual download: a backup for when something breaks, as Meta itself says.
Whatever you pick, send a test lead before launch, and recount against the Results column after the first week.