Product guide
What Meta Lead Ads Connector does, what it does not do, and the questions buyers ask.
Facebook and Instagram Lead Ads into Odoo CRM — verified before they are believed, de-duplicated by the database, and never silently lost.
Your webhook is a public URL that writes to your CRM
That is true of every Lead Ads connector, including this one. Meta has to reach it without signing in, and it creates opportunities. The only thing standing between those two facts is the signature check — and it is the first thing a quick implementation leaves out, because leads arrive just fine without it.
Meta signs every delivery with X-Hub-Signature-256 : HMAC-SHA256 over the exact bytes of the request body, keyed with your app secret. This module recomputes it over the unparsed body and compares in constant time. A delivery that does not verify is recorded and discarded. It never reaches your pipeline.
Verified deliveries only
The raw bytes are carried through to the check rather than a parsed dictionary. Re-serialising JSON changes key order and separators, so a digest computed over the re-encoded form can never match — which is the usual reason verification gets switched off and left off.
A retry cannot become a second lead
Meta re-delivers whenever it does not get a prompt 200, and it can send the same lead twice. The leadgen id carries a database-level unique constraint , not a search-before-insert, because two deliveries can be in flight at once and a check in Python loses that race.
A lead that cannot be mapped is kept
The payload is stored on arrival, before anything is interpreted. If a mapping is wrong or a value is missing, the event is marked failed with the reason and can be replayed once you fix it. A connector that parses first and stores second loses exactly the leads worth investigating.
Each form maps its own questions
Lead Ad forms ask different things, so mapping is per form rather than a fixed guess at name, email and phone. Pull the real questions from Meta with one button. Unmapped answers are still kept and appended to the opportunity’s notes, so nothing disappears quietly.
The token’s expiry is watched
Page access tokens expire, and a connector whose token lapsed looks exactly like a campaign that stopped working. The expiry date is stored and shown, and a daily check warns before it runs out.
Anything missed can be fetched
Downtime, a lapsed token, or a subscription added after the campaign started all leave real leads on Meta’s side and nowhere else. Backfill reads them for a date range and runs them through the same mapping and the same duplicate check.
What it does not do
Stated plainly, because a connector that overclaims is a connector that fails on somebody’s campaign launch.
Campaigns Reads leads only. It does not create, edit, pause or spend on ads.
Messenger and Instagram DMs Not included. This is Lead Ad forms, not conversations.
Conversions API Not included. Sending events back to Meta is a separate integration.
The Meta app You create it. The app, its leads_retrieval permission, the page access token and the webhook subscription are issued by Meta to you, and are not supplied with this module.
Historic leads Meta keeps leads for roughly 90 days. Nothing older can be fetched, by us or anyone.
Odoo versions 18.0 only. A 19.0 port is not claimed until it has been tested.
Verification status — read this before you buy
No lead has ever reached this module from Meta. There is no Meta app or page access token on our development account, so nothing has been through a real webhook subscription or a real Graph API call.
Verified Signature verification, against a tampered body, a wrong secret, a missing header, a malformed header and a re-serialised body; the duplicate constraint under a concurrent insert; mapping, including unmapped answers and a two-questions-to-one-field clash; failure, replay and payload survival. Unit tests, run against the real code on a real Odoo 18 database.
Verified in shape only The Graph API requests match the documented structure, but nobody has watched Meta accept one.
Not verified A live webhook subscription, a real signed delivery from Meta, and a real lead fetched through the Graph API.
We would rather say this here than have you discover it after paying. If you run Lead Ads and are willing to point a test form at a sandbox database with us, get in touch — that is how this section gets shorter.
Support
info@technovision.dev
Meta, Facebook and Instagram are trademarks of their respective owners. This module is not affiliated with or endorsed by Meta Platforms, Inc.
Questions buyers ask
Every answer here is stated somewhere above as well. This is the same information where a buyer actually looks for it.
Do I need my own Meta app? Yes. You create a Meta app, give it the leads_retrieval permission, subscribe it to the Lead Ads webhook and issue a page access token. Those are issued by Meta to you and are not supplied with this module; it connects your Odoo to your app.
Is it safe to expose the webhook publicly? That is the right question to ask of any Lead Ads connector, because the endpoint has to be reachable by Meta without signing in, and it writes into your CRM. Every delivery is checked against X-Hub-Signature-256 — HMAC-SHA256 over the exact raw body, keyed with your app secret, compared in constant time. A delivery that does not verify is recorded and discarded, and there is no setting to switch that off.
What happens when Meta sends the same lead twice? Nothing, which is the point. Meta re-delivers whenever it does not get a prompt 200. The leadgen id carries a database unique constraint rather than a search-before-insert, because two deliveries can be in flight at the same moment and a check in Python loses that race. The repeat is logged as a duplicate and your original opportunity is untouched.
A lead did not become an opportunity. Is it lost? No. The payload is stored on arrival, before anything is interpreted, so a wrong mapping or a missing value leaves the event marked failed with its reason and a Replay button. Fix the mapping, press Replay. A connector that parses first and stores second loses exactly the leads worth investigating.
My form asks custom questions. Will those answers disappear? No. Mapping is per form, against the form's real questions pulled from Meta with one button, rather than a fixed guess at name, email and phone. An answer you choose not to map is still kept on the event and appended to the opportunity's notes.
How will I know the page token has expired? The expiry date is read from Meta, stored and shown on the account, and a daily check warns before it lapses. This matters more than it sounds: a connector whose token quietly expired looks exactly like a campaign that stopped producing leads, and the two get diagnosed very differently.
Can I get the leads from before I installed it? Within limits. Backfill fetches leads for a form over a date range and runs them through the same mapping and the same duplicate check. Meta keeps leads for roughly 90 days, so nothing older than that can be fetched — by us or by anyone.
Which Odoo version and edition? Odoo 18.0 . It depends only on Odoo's own crm module, so Community is enough . A 19.0 port is not claimed until it has been tested.
Has a real lead ever come through it? No, and the Verification status section above sets out exactly what that means. There is no Meta app on our development account, so the signature checks, the duplicate constraint, the mapping, the replay path and the payload handling are all tested against the real code on a real Odoo 18 database, while acceptance by Meta itself is not. If you run Lead Ads and will point a test form at a sandbox database with us, get in touch.
If it does not work, do I have to buy support? No. If the module has a defect, or does not behave as this page describes, or you need help configuring it, that is included in the price and needs no paid plan — email info@technovision.dev with your Odoo version, edition and hosting. Installation on your instance is a separate optional service, arranged directly with us and not sold through the Odoo Apps Store.