TechnoVision WhatsApp Core
by TechnoVision · Odoo App
The plumbing every WhatsApp module needs, written once. One call to send, one place to see what was sent, to whom, and what the provider said back. Meta ships with it; the interface means the next gateway is a subclass rather than a rewrite.
One-off licence per Odoo instance, invoiced directly. Not on the Odoo Apps Store yet.
Security Center
Live82
Score
1.2k
Events / 24h
3
Alerts
Export volume · 14 days
Unusual export detected
res.partner · 4,812 rows · outside business hours
Illustrative UI. Product screenshots to be dropped into this frame.
What it does
A gateway is a subclass with one method. Meta’s WhatsApp Cloud API ships with it, and nothing above the interface knows which provider is configured - so the second gateway is a small file rather than a search across the codebase.
Recipient, full text, template, the record it came from, state, the provider’s own message id and its own error text, attempt count and next attempt. The question after something goes wrong is never "did the API return 200".
Delivered and Read move only when the provider says so, and never backwards - providers repeat and reorder callbacks. A channel that marks its own messages delivered is telling you what it hopes happened.
Exponential backoff up to an attempt limit for a failure that could plausibly succeed later. No retry at all for one the provider says never will: a number that is not on WhatsApp, a malformed request, a missing credential.
Written {{ object.field }} and rendered through Odoo’s own engine rather than by evaluating user content. A template with placeholders refuses to render without a record, because "Dear , your invoice is overdue" reaching a customer is worse than a visible failure.
The simulated provider records exactly what would have been sent, with the full text and the delivery state, and sends nothing. Install it, configure it, demonstrate it and test it while the WhatsApp Business approval is still pending.
Screenshots
5 captures of the shipped product: message log, a single message, account, templates, composer.

Message log

A single message

Account

Templates

Composer
How it works
Depends on base and mail. No extra Python library unless you are actually sending.
Leave the provider on Simulated. Everything works; nothing is sent.
From the composer, to yourself. It appears in the log with its full text.
When Meta approves you, the token goes in a system parameter - never a field, never a backup, never a screenshot.
FAQ
No. It is the channel. Another module - or your own code - decides what to send and when. That separation is why the payment-reminder module does not contain its own copy of the retry logic.
Yes. On the simulated provider everything works except the sending: the message is created, queued, rendered, logged and shown with its full text and state. It is how the module is tested - 80 tests, no network, no Meta account.
In ir.config_parameter, which Odoo encrypts and only a system administrator can read. Deliberately not a field: a token in a column is a token in every backup, every duplicated database and every screenshot of that form.
It applies to your account whichever software sends. Outside it Meta requires a pre-approved template; a free-text send is rejected, and the rejection appears on the message in Meta’s own words.
Not yet. It is finished, tested and licensable direct - talk to us. It goes on the store once the suite has its first dependent module.
This module is built and shipping, and is not on the Odoo Apps Store yet. We licence it directly in the meantime - same code, same support, same price.