Odoo ERP

PromptPay Reconciliation Odoo: A Daily Close Routine for Thai SMEs

A practical look at matching PromptPay receipts to invoices in Odoo, built from reconciliation setups we have run for Thai SMEs.

Ravi Shanker SinghFounder & Odoo ConsultantPublished 6 min read
Share
On this page

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:

  1. Exact amount match against a single open invoice for a known partner, auto-validated.
  2. Exact amount match against a single open invoice with no partner recognized, suggested but held for manual confirm.
  3. Amount matches the sum of two or more open invoices for the same partner (common with repeat retail customers), suggested as a combined reconciliation.
  4. 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.

Share

Frequently asked questions

Can Odoo automatically reconcile PromptPay transfers without any manual review?

Partially. Reconciliation models can auto-match clean cases where amount and partner both align, but Thai SME invoice amounts repeat often enough that amount-only matching risks posting against the wrong customer. We recommend keeping a short daily manual review step for anything without a confirmed partner match.

What if my bank only provides lump-sum PromptPay settlements instead of itemized receipts?

You will need a suspense account to hold the lump sum until it is broken down against individual invoices, which adds a manual step. Ask your bank whether an itemized sub-ledger export is available, since it removes most of this extra work.

How often should we import PromptPay bank statements into Odoo?

Daily, ideally first thing in the morning before new invoices for the day start arriving. Daily imports keep the reconciliation screen short and make exceptions easy to spot, instead of facing weeks of mixed transactions at month-end.

Does withholding tax affect PromptPay reconciliation in Odoo?

Yes. When a customer applies withholding tax under PND 3 or PND 53, the PromptPay receipt will be net of that tax and will not equal the gross invoice amount. Check the net-of-tax figure before assuming a line is simply unmatched.

Can PromptPay reconciliation be combined with Shopee, Lazada or TikTok Shop settlements in Odoo?

Yes, but each channel arrives as its own batched settlement with different fee deductions, so the reconciliation logic needs separate handling per channel feeding into one accounting pipeline rather than one generic rule covering everything.

Sources

About the author

Ravi Shanker Singh

Founder & Odoo Consultant

Founder of Tech After Me and Odoo consultant. Ravi implements, customises and supports Odoo ERP and builds web, mobile and data products for companies in Thailand, the USA and India, working from Bangkok, New York and Delhi NCR.

More from this author

Keep reading

Odoo e-Tax Invoice Setup for Thai Companies: A GuideOdoo ERP

Odoo e-Tax Invoice Setup for Thai Companies: A Guide

A practical walkthrough of setting up Odoo e-Tax invoice and e-Receipt for Thai companies, covering numbering, providers and the approval flow.

Ravi Shanker Singh5 min read

Put what you read into practice

The team writing these guides is the same team that ships them. Tell us what you are working on.

Get new articles in your inbox

Get new articles in your inbox

Odoo guides and IT news that matter to your business. At most one email a week.