Configuration
Every setting in WhatsApp Sales and Payment Automation, and what each one changes.
The number
WhatsApp → Configuration → Numbers. One record per business number.
Setup tab
| Field | Notes |
|---|---|
| Phone Number ID | From Meta, WhatsApp → API Setup |
| Business Account ID | Likewise |
| Access token | A system-user token, not the 24-hour temporary one |
| App Secret | App Settings → Basic. Used to verify webhook signatures |
| Verify token | Generate it here, paste it into Meta |
| Callback URL | Shown here, paste it into Meta |
| Require signed webhooks | On. Leave it on |
| Enabled | Off until you are ready |
The three credentials are on fields restricted to a WhatsApp Administrator and masked afterwards. Configuring rules and holding the access token are different jobs.
Behaviour tab
| Setting | What it changes |
|---|---|
| Answer automatically | Whether rules run at all |
| Create contact for unknown numbers | Whether a new contact is made from an unrecognised sender |
| Office hours | The working calendar; outside it, the after-hours reply |
Office hours send one reply per closed period, not one per message. Somebody sending three lines at midnight should not receive three identical apologies.
Rules
WhatsApp → Configuration → Rules. Tried in order, first match wins, and every automatic reply names the rule that produced it.
Matching
| Match type | Meaning |
|---|---|
| The whole message equals | Exact, after trimming |
| The message contains | Substring |
| The message starts with | Prefix |
| Anything (fallback) | Always matches — put it last |
Actions
| Action | What it does |
|---|---|
| Send a fixed reply | The text you write |
| Send the menu | The numbered menu |
| Answer with the latest order status | Reads their orders |
| Answer with outstanding invoices | Reads their invoices |
| Send a payment link | Odoo's own portal link |
| Send the account statement as a PDF | See the warning below |
| Create a lead | From an enquiry |
| Create a draft quotation and notify sales | Draft, with no lines |
| Hand over to a person | Raises an activity, silences the robot |
| Record an opt-out / opt-in | |
| Do nothing (silently absorb) | For noise you do not want answered |
Rules that cannot be configured away
Five behaviours are enforced in code, not by settings, because a setting that can turn them off is a setting somebody will turn off:
An action that reads somebody's records will not run for an unknown number. Order status, invoices, payment links and statements all need to know whose records to show, and a number matching no contact means guessing. Those conversations go to a person instead. Only the anonymous-safe actions — reply, menu, lead, handover, opt-out, opt-in, nothing — run for a stranger.
A statement request never attaches the statement. The rule confirms the request and raises a task for a person. A phone-number match is not authentication, and a statement shows a customer's entire position with you.
A quotation is created as a draft with no lines, plus a task for sales. "20 of the blue ones" is not an order, and pricing it automatically would be guessing about product, quantity and price on the customer's behalf.
A conversation a human owns is never answered automatically. Once an agent takes it, the rules stop. Two people replying to one customer is worse than a slow reply.
An opt-out is permanent and cannot be overridden. The check lives in the one function that queues a message, so no rule, button or action can route around it. Opting back in has to come from the customer.
Order your rules
Order matters because the first match wins. A sensible list:
- Opt-out — exact match on STOP. First, always.
- Opt-in.
- The specific keywords: order, invoice, pay, agent.
- Menu on a fallback, last.
Putting the fallback first makes every other rule dead, which is the configuration mistake this design makes easy to see and easy to fix — reordering is a drag.
The 24-hour window
Meta delivers an ordinary message only within 24 hours of the customer's last one. Outside that, only an approved template arrives.
This module tracks the window per conversation and refuses the send before making the request, naming the reason. The alternative is a message that silently never arrives, which looks exactly like a customer who did not reply.
An outbound message never extends the window. Only the customer's own message does.
Templates
WhatsApp → Configuration → Templates, for messages outside the window.
Template synchronisation from Meta is unverified — the endpoint for listing a business account's templates could not be confirmed against Meta's published documentation. A failed sync says so and changes nothing rather than inventing templates. Add them by hand and they work.