Your Meta campaigns optimise on whatever you report to them. Most CRM integrations report too much: a salesperson drags a deal to Won, drags it back, wins it again next week â and Meta records two purchases. A lead is captured by your Pixel and again by the server â two leads. Meta does not deduplicate events coming from the same server source, so the numbers quietly inflate, your cost-per-result looks better than it is, and the algorithm learns from data that is wrong.
This module was built around that problem. Every event is checked, deduplicated and held for review inside your database, before anything is sent. What reaches Meta is what actually happened in your pipeline — once.
One screen tells you if it’s working
The dashboard answers the three questions an advertiser actually asks. Is the integration healthy? Is delivery keeping up? And — the one nobody else shows you — can Meta match the events you send? The match quality panel breaks down what share of your recent events carry a click ID, an email, a phone number. When a campaign underperforms, this is usually where the answer is.
Map your pipeline once, then leave it alone
Rules connect CRM stages, lead creation, won opportunities and confirmed sale orders to Meta events. Each rule carries its own send policy — once per lead, once per time window, or every occurrence — and the module refuses configurations that would double-send: duplicate rules are blocked at save, conflicting policies for the same event name are rejected, and rules that could never fire raise an error instead of failing silently in production.
|
Real amounts beat estimates. A Won stage sends the expected revenue. When the sale order is confirmed, its actual total supersedes the estimate — the pending estimate is cancelled and the real figure goes out instead, whichever happens first. |
Mistakes never leave the building. New events wait out a short grace period before sending. Set a deal to Won by mistake and drag it back — the event is cancelled, with a note in the chatter, and Meta never hears about it. |
|
Pixel and server, counted once. The included website tracker generates one event ID per form submission, fires the browser Pixel with it and stores it on the lead. The server event reuses the same ID, so Meta deduplicates the pair instead of counting two leads. |
Failures are loud, not silent. Timeouts and server errors retry with exponential backoff under the same event ID. Client errors stop immediately and keep Meta’s full error text. Nothing is swallowed; everything is on the record. |
Attribution capture, in detail
Server events are only as good as the identifiers they carry. Meta matches a click-through conversion primarily on the click ID — and most CRM integrations never capture it. This module ships a website tracker that handles the whole chain, with no changes to your forms:
| Click ID (fbc) | The fbclid parameter Meta appends to every ad click is captured from the landing URL and assembled into the fbc click ID in Meta’s required format (fb.1.<timestamp>.<fbclid>). When the URL has no fresh click, the tracker falls back to the _fbc cookie written by your Meta Pixel. |
| Browser ID (fbp) | Read from the _fbp cookie on every page, so even visitors who arrive organically after seeing an ad are matchable. |
| Survives navigation | Attribution is kept in session storage, so a visitor who lands on a campaign page and submits a form five pages later is still credited to the ad click. |
| Stored on the lead | Hidden fields are injected into every Odoo website form automatically: click ID, browser ID, user agent, source URL. The server adds the client IP (invisible to JavaScript) and keeps all of it out of the lead’s notes. Everything lands in a dedicated Meta tab on the lead — visible, auditable, replayed on every event. |
| Leads without a contact | Most CRM leads have no linked contact record. Identifiers are read from the lead itself — email, phone, name, address — with the linked contact used only when one exists. Phone numbers are converted to international E.164 format before hashing; without a country code, Meta cannot match a phone at all. |
| External integrations | Creating leads through the API, n8n or Zapier? Pass the tracking values as plain fields on the lead and the entire pipeline works identically — the field names are documented in the included guide. |
Every event is on the record
Each queued event keeps its frozen payload, state history, retry count, Meta’s response and trace ID. The chatter reads like a logbook — attempt, delivery, retry schedule, cancellation reason — so when finance asks why March shows 41 purchases, you can show them the 41.
Connected and verified in one sitting
Paste your dataset ID and system-user token, press Send Test Event, and watch it arrive in Meta’s Test Events tab — the button reports Meta’s actual response, including the trace ID, and refuses to run without a test event code so dummy data never pollutes production measurement. Access tokens and webhook secrets are encrypted at rest and hidden from non-authorised users.
What’s in the box
|
|
Good to know before you buy
Works with Odoo 19 Community and Enterprise. Installing this module installs the following standard Odoo apps if they are not already present — no third-party modules involved:
| CRM | The pipeline the module reports on — leads, stages, won opportunities. |
| Sales | Powers the Sale Confirmed trigger, which sends the real order amount instead of the CRM estimate. |
| Website + Website CRM | website_crm is what lets Odoo website forms create CRM leads, and it brings website with it. The attribution tracker (click ID capture, hidden-field injection, Pixel deduplication) runs on these forms. If your leads come only from the API or Meta Lead Ads, the apps sit installed but unused — everything else works the same. |
The Python package cryptography (bundled with Odoo) is required for token encryption. Installing phonenumbers is recommended — it converts local phone numbers to international format before hashing, which Meta needs to match them. The module runs without it and logs a warning.
This module transmits hashed customer identifiers and technical data (IP address, user agent, click ID) to Meta. Make sure you have a lawful basis and appropriate consent for your region before enabling it.
No data passes through our servers at any point — events go straight from your Odoo instance to Meta’s Graph API.
You’re not buying code alone — two months of support included
Every purchase includes 60 days of support from our team — the people who wrote the module, not a ticket queue. Write to support@softatt.com with your Odoo version and, for delivery questions, the fbtrace ID from the event’s chatter; it lets us (and Meta support) locate the exact request. We answer within one business day.
Covered
|
Not covered
|
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
CRM (crm)
• Discuss (mail) • Calendar (calendar) • Contacts (contacts) • Website (website) • Invoicing (account) |
| Lines of code | 3034 |
| Technical Name |
softatt_conversions_api |
| License | OPL-1 |
| Website | https://softatt.com/ |
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module