Odoo POS refund approval: a manager's code on WhatsApp before every refund
Odoo POS refund approval with a one-time manager code sent by WhatsApp or email, before refunds, credit notes, customer returns and inventory adjustments.
A refund at the till. A credit note. A small stock adjustment. Each one is a tiny change on a screen, and each one moves real money or real goods out of the business. Then at month end you ask who approved that refund, and the honest answer is: nobody did. That is the problem behind Odoo POS refund approval: how do you make every refund pass through a manager without stopping the shop?
The usual fix is a supervisor PIN the manager hands to the cashiers. Two weeks later the whole team knows it and it is written on a sticky note next to the till. A shared PIN protects nothing, because it never tells you who used it or why.
What WhatsApp OTP Approvals does
The add-on puts a manager between the user and the money. A protected action does not go through until the manager gives a 6-digit one-time code, and that code approves one action, on one document, for one amount.
The places you can protect:
- POS refunds at the terminal: the moment the cashier presses Payment on a refund (or any line with a negative quantity), a popup asks for the code.
- POS refunds in the backend: the Payment button on a refund order in Point of Sale > Orders.
- Customer credit notes: when the credit note is confirmed. Credit notes created by the POS are not asked twice.
- Vendor refunds: optional, off by default.
- Customer returns: when goods coming back from a customer are validated. Vendor receipts and deliveries are never asked.
- Inventory adjustments: when Apply is pressed and the change, valued at cost, reaches your amount. A count with no change needs no code.
Each control point has its own switch, a minimum amount (0 means always) and its own approvers. Small refunds can pass freely while large ones wait for a manager.
How it works, step by step
Take a home goods store with two branches:
- The cashier starts a refund for a customer returning a blender, and presses Payment.
- The POS stops and asks for a code before the payment screen. The cashier clicks Send code.
- The code reaches the manager on WhatsApp or by email, with the action, the order, the amount and who is asking. The cashier sees where it went, masked, like "••••0123".
- The manager decides. If they agree, they give the code, the cashier types it and the refund goes through.
- A wrong or expired code is refused. Change the amount or the lines and a new code is needed.
The same flow guards credit notes in Invoicing and returns and counts in Inventory.
WhatsApp or email: what your edition supports
Be clear on this before you buy:
- WhatsApp needs Odoo Enterprise. The add-on never calls Meta itself. It hands the message to Odoo's own WhatsApp app, which is an Enterprise app, so the code goes out from your business number and account with your Meta-approved template. A ready template ships in draft, and you submit it to Meta in one click.
- Email works on any edition: Community or Enterprise, on Odoo.sh or on-premise, through your outgoing mail server.
- Each approver chooses WhatsApp, email or both. If WhatsApp fails, the code is emailed.
If you want the background on Odoo's WhatsApp app, we covered it in Odoo WhatsApp notifications.
The approval log and security
Every code request lands in the approval log: action, document, amount, requester, where the code went (masked), state, attempts, and who typed the code and when. The approved document's chatter gets a line too.
And the code itself:
- Never stored in clear. It is kept only as a salted hash (HMAC) and never written to a log.
- Masked everywhere. Odoo's copy of the WhatsApp message is masked right after sending, and the email is deleted once sent.
- Short-lived. It expires after 5 minutes, locks after 5 wrong tries, and can be resent after a cooldown, at most 3 times. All of this is configurable.
- Rate limited: at most 20 code requests per user per hour, so nobody can flood a manager's phone.
- Checked on the server. Imports, RPC calls and server actions are refused without an approval, whatever the screen does.
- Per-branch managers. An approver can be limited to some points of sale or warehouses.
There is also a test mode for administrators: run the whole flow before Meta approves your template, with no message sent.
Who it is for
- Shops with several cashiers or several branches, where the owner cannot stand at every till.
- Accountants who want to know who approved each credit note without digging through chats.
- Warehouses that want stock adjustments and returns checked by someone before they post.
If your POS is still being set up, read Odoo POS and ZATCA first.
Price and versions
- Price: $99 for the core add-on, a one-time purchase on the Odoo Apps Store.
- The POS, Stock and WhatsApp parts are free and install themselves when those apps are present.
- Versions: Odoo 17, 18, 19 and 20.
- Languages: 12 plus English, with Arabic right to left.
What it does not do
- No WhatsApp on Community. There, codes go by email only.
- It does not call the WhatsApp API itself and never reads your tokens. Everything goes through Odoo's WhatsApp app.
- The template is Utility, not Authentication. Meta requires a copy-code button on authentication templates and Odoo's template editor does not add one. Until Meta approves your template, codes go by email.
- Superuser scripts with a dedicated switch are not blocked. That is the one exception, kept for migrations.
- Vendor receipts and deliveries are not protected, only returns from customers.
Quick questions
Does the cashier wait long?
A WhatsApp message arrives in seconds. Small refunds can skip the code entirely with a minimum amount per control point.
Can a code be reused, or used on another document?
No. A code works once, for the document, action and amount it was sent for.
What happens if I uninstall?
Everything is removed cleanly, and refunds, returns and adjustments work as in standard Odoo.
How we do it
The add-on is on the Odoo Apps Store and installs like any other. If you want help setting it up, we agree the control points and limits per branch with you, add the approvers, submit the WhatsApp template to Meta, and run everything in test mode before your team goes live. Book a call and we will set it up with you.