PromptPay has made collecting money in Thailand faster than it has ever been. It has also made reconciliation messier for finance teams that still match payments by hand. We have set up PromptPay reconciliation Odoo workflows for retail chains, clinics and B2B distributors across Bangkok, and the pattern is always the same. The money arrives instantly. The reference data does not. Someone ends up squinting at a bank app, trying to match a 1,250 baht transfer to one of six open invoices.
This post walks through how we structure bank statement import, reconciliation models and a daily close routine for PromptPay reconciliation in Odoo. Done right, PromptPay stops being a manual chore and becomes a five-minute end-of-day task. If you are weighing this against a wider Odoo implementation services project, the same discipline applies to every payment rail you bring in.
Why PromptPay breaks naive reconciliation
A PromptPay transfer settles through the recipient bank as a generic credit line. The payer name is often truncated to a few characters, and there is no invoice number at all. Compare that to a traditional bank transfer with a reference field your customer actually fills in, and you can see why accountants dread it. If your Odoo setup assumes every bank line carries a clean invoice reference, PromptPay will punch holes in that assumption on day one.
The fix is not a single app or a toggle. It is three things working together: a disciplined bank statement import, reconciliation models tuned to how your PromptPay narrations actually look, and a short daily routine that catches exceptions before they pile up into a month-end mess.
PromptPay reconciliation Odoo setup: get the raw data right first
Most Thai banks that support PromptPay merchant accounts (Kbank, SCB, Bangkok Bank, and a few others) offer a CSV or Excel export, and some larger accounts get a direct feed. In Odoo, we import these as bank statements under the relevant journal. We do one statement per business day where possible, rather than batching a week at a time. Daily statements keep the reconciliation screen short. It is much easier to spot the one unmatched line among eight than to hunt through eighty.
A few things we check before the first import for any client:
- The CSV encoding and date format match what Odoo expects, since Thai bank exports are inconsistent on this and a bad date column silently reorders transactions.
- The payer reference field, however short, is mapped into the statement line's "Payment Ref" column, not dropped during import.
- Transaction amounts are split correctly when a bank batches several PromptPay credits into one settlement line, which some merchant accounts do overnight.
That last point catches people out. If your bank nets ten PromptPay receipts into a single lump sum credit, Odoo sees one statement line, but you have ten invoices to clear. Either get your bank to provide the itemized sub-ledger, or set up a suspense account that holds the lump sum until the itemized detail is reconciled against it line by line. We generally push clients toward the itemized feed when the bank offers it, even if the file is uglier to parse. Reconciling a lump sum against many invoices with no reference data is a real downside worth naming: it adds a manual step you cannot fully automate away.
Reconciliation models tuned for PromptPay narrations
This is where the PromptPay reconciliation Odoo setup earns its keep. Odoo's reconciliation models let you define matching rules based on the statement line's label, partner, or amount, and auto-suggest or auto-validate the journal entry. For PromptPay we build models around amount and rough partner matching rather than exact text matching, because the narration text is unreliable.
Typical model priority order we use:
- Exact amount match against a single open invoice for a known partner, auto-validated.
- Exact amount match against a single open invoice with no partner recognized, suggested but held for manual confirm.
- Amount matches the sum of two or more open invoices for the same partner (common with repeat retail customers), suggested as a combined reconciliation.
- No match found, left in the exceptions queue for the daily review.
We deliberately keep rule 1 auto-validated only when both amount and partner line up, not amount alone. Thai SME invoice amounts repeat a lot. Two different customers can easily owe exactly 850 baht in the same week, and amount-only auto-matching will occasionally post against the wrong customer. That kind of error stays invisible until a statement goes out at month-end and a customer calls asking why they are being billed again.
The daily close routine for PromptPay in Odoo
Reconciliation models do most of the work, but they are not a substitute for a short daily habit. The routine we train finance teams on looks like this:
- Import yesterday's PromptPay statement first thing in the morning, before new invoices for today start arriving.
- Run the reconciliation models and review every item in the exceptions queue, not just the auto-matched ones.
- For unmatched lines, check the payer's last four phone digits (if your bank provides them) against the customer record, since many Thai SME customers are set up with a phone number as a secondary identifier.
- Close out anything still unmatched after five minutes by flagging it to the sales or support team rather than letting it sit in suspense indefinitely.
- At true month-end close, confirm the PromptPay bank journal balance ties to the bank portal balance before locking the period.
Doing this daily, in five to ten minutes, beats trying to reconcile two or three weeks of PromptPay traffic in one sitting at month-end. By then the context behind an odd 1,250 baht transfer has long since evaporated from everyone's memory.
Where PromptPay reconciliation connects to the rest of your stack
If you run Shopee, Lazada or TikTok Shop alongside PromptPay as a direct collection channel, the reconciliation logic needs to account for marketplace payouts too. Those arrive as batched settlements with their own fee deductions. We typically handle this through the same Odoo API integration services work we use for connecting bank feeds, marketplace APIs and POS terminals into one accounting pipeline, so finance is not juggling three separate reconciliation habits for three payment rails.
For companies issuing e-Tax Invoices on these receipts, the reconciliation timing also needs to respect your e-Tax Invoice submission windows. For amounts subject to withholding tax, the net PromptPay receipt will not equal the gross invoice value, and that mismatch trips up teams new to this. We have covered the mechanics of PND 3 and PND 53 withholding separately. It is worth flagging here: do not let a withholding-tax invoice sit in your PromptPay exceptions queue assuming it is simply unmatched. Check the net-of-tax amount first.
What to automate and what to leave manual
A fair question we get from CFOs considering a PromptPay reconciliation Odoo project: how far should automation go? Our answer, after several of these rollouts, is to automate the matching logic but keep a human decision point before anything auto-posts without a confirmed partner. Full straight-through processing sounds appealing. But Thai SME transaction volumes are usually modest, a few dozen to a few hundred PromptPay receipts a day, so the risk of a silent misposting outweighs the minutes saved by removing the human check. If your volume runs into the thousands per day, that calculus changes and heavier automation starts to make sense. Most SMEs we work with are not there yet.
If your accounting work extends to multi-entity or multi-currency setups, or you are integrating PromptPay data alongside other accounting automation, our broader work in Odoo ERP support services covers ongoing reconciliation tuning as transaction patterns shift. They shift every time you add a new sales channel or payment provider. For teams running marketplace storefronts, our e-commerce development services work often sits right next to this reconciliation layer, since storefront changes tend to ripple into how payouts arrive.
Getting the setup right the first time
Most of the PromptPay reconciliation problems we get called in to fix are not Odoo limitations. They are configuration gaps: no daily import discipline, reconciliation models that auto-match on amount alone, or no process for lump-sum settlements. Fixing the configuration, not the software, resolves the majority of these cases within the first week of a proper setup. If you want this scoped as a discrete phase with fixed deliverables before you touch your chart of accounts, our Odoo consultancy services team can walk the process with you before we configure anything. That is how we start every engagement, regardless of company size.



