How PromptPay Works – Complete Guide to Thai Payments
Everything about Thailand's instant payment system: PromptPay keys, EMV QR payload, phone normalization, ASEAN cross-border network and supported banks.
What is PromptPay?
PromptPay (พร้อมเพย์) is Thailand's national instant payment system, jointly developed by the Bank of Thailand (BOT) and the Thai Bankers' Association (TBA). Launched in January 2017 as part of the government's National e-Payment Master Plan, PromptPay changed how Thais send and receive money — replacing slow inter-bank transfers with a system that settles in under five seconds, around the clock, every day of the year. The core innovation is the PromptPay ID — an alias linked to a bank account. Instead of sharing a bank account number and branch code, a recipient registers their Thai mobile phone number (starting with 06, 08 or 09) or their 13-digit National ID. Businesses register using a Tax ID. The ITMX switching network routes the payment to the correct bank account automatically. All Thai banks are required by the Bank of Thailand to participate; PromptPay is free for consumers.
How PromptPay Works – Step by Step
- 1
Recipient shares PromptPay QR or key
The payee provides a phone number, National ID or a PromptPay QR code. Static QR codes work for any amount; dynamic QR codes include a pre-set amount for invoices and e-commerce.
- 2
Payer opens any Thai banking app
All 30+ participating banks are fully interoperable. A payment from KBank arrives instantly in an SCB account — there is no lock-in to any specific institution.
- 3
Payer scans QR or enters phone/ID
The app activates the camera for QR scanning, or the payer types the PromptPay key manually. The recipient's name is shown for confirmation.
- 4
Payment details confirmed on screen
The recipient's name (as registered with ITMX) is displayed. If a dynamic QR is used, the amount is pre-filled. Static QR requires the payer to enter the amount.
- 5
Payer authenticates (biometric or PIN)
Authentication happens entirely within the banking app. The PromptPay QR contains no passwords, PINs or sensitive banking credentials.
- 6
Transfer completes instantly
The ITMX infrastructure routes the payment through the PromptPay network. Funds settle in real time between the two bank accounts — typically within 5 seconds.
- 7
Both parties receive app notification
Sender and recipient both get instant push notifications. The payer's app shows a receipt with a transaction reference number for records.
PromptPay Keys – Phone vs National ID
A PromptPay key is an alias registered in the ITMX NPCI (National Payment Central Infrastructure) directory that maps to a specific bank account. Individuals typically use their phone number (easiest to share) or National ID (most stable). Companies use their Tax ID. E-wallet accounts use an E-Wallet ID format. Each key type has different formatting rules — phone numbers are normalized to the 0066XXXXXXXXX format in the QR payload.
| Key Type | Format | Example | Best For |
|---|---|---|---|
| Phone Number | 06/08/09 + 7 digits | 0812345678 | Individuals, easiest to share |
| National ID | 13 digits | 1234567890123 | Formal registration, individuals |
| Tax ID | 13 digits (starts 0) | 0105543012345 | Companies and juristic entities |
| E-Wallet ID | 00 + 13–15 digits | 0012345678901234 | Digital wallet accounts |
The PromptPay QR Payload – EMV Format
PromptPay QR codes follow the EMV Merchant Presented QR Code (MPM) specification — the same international standard used by Brazil's PIX and India's BharatQR. Thailand's version uses merchant account tag 29 (vs. tag 26 for PIX) and the PromptPay AID A000000677010111. The payload is a continuous TLV (Tag-Length-Value) string. A CRC16-CCITT checksum at the end (tag 63) guarantees data integrity.
000201 ← Tag 00: Payload Format Indicator 010211 ← Tag 01: Static QR (11) 2937 ← Tag 29: Merchant Account (length 37) 0016A000000677010111 ← Sub-tag 00: PromptPay AID 01130066812345678 ← Sub-tag 01: Normalized phone key 52040000 ← Tag 52: Merchant Category Code 5303764 ← Tag 53: Currency (THB = 764) 5406100.00 ← Tag 54: Amount 5802TH ← Tag 58: Country Code 5903N/A ← Tag 59: Merchant Name 6007Bangkok ← Tag 60: Merchant City 62070503*** ← Tag 62: Additional Data 6304ABCD ← Tag 63: CRC16 Checksum
| Tag | Example Value | Description |
|---|---|---|
| 00 | 01 | Payload Format Indicator – always 01 |
| 01 | 11 / 12 | Point of Initiation: 11 = static, 12 = dynamic (with amount) |
| 29 | … | Merchant Account Information (PromptPay sub-fields) |
| 29.00 | A000000677010111 | PromptPay Application ID (AID) |
| 29.01 | 0066812345678 | Normalized recipient key (phone or national ID) |
| 52 | 0000 | Merchant Category Code (0000 = uncategorized) |
| 53 | 764 | Transaction Currency – ISO 4217 code for THB |
| 54 | 100.00 | Transaction Amount (omitted in static QR) |
| 58 | TH | Country Code – ISO 3166-1 alpha-2 |
| 59 | N/A | Merchant Name (optional in PromptPay) |
| 60 | Bangkok | Merchant City (optional) |
| 62 | … | Additional Data Field Template (transaction ref) |
| 63 | ABCD | CRC16-CCITT Checksum – 4 uppercase hex characters |
Phone Number Normalization
PromptPay QR codes do not embed the raw Thai phone number — they use a normalized international format. The rule: start with a local Thai number (e.g. 0812345678), remove the leading 0, then prepend the country code prefix 0066. Result: 0066812345678. If the input already starts with +66, replace the + with 00. National IDs and Tax IDs (13 digits) are used as-is without transformation.
- 1️⃣
Start with a local Thai number: 0812345678 - 2️⃣
Remove the leading 0: 812345678 - 3️⃣
Prepend the country code prefix 0066: 0066812345678 - 🔁
If the input starts with +66 (international format), replace the + with 00: +66812345678 → 0066812345678
function normalizePromptPayKey(key: string): string {
const digits = key.replace(/\D/g, '');
// National ID or Tax ID (13 digits) — use as-is
if (digits.length === 13) return digits;
// Phone number normalization
if (digits.startsWith('0') && digits.length === 10) {
return '0066' + digits.slice(1); // 0812345678 → 0066812345678
}
if (digits.startsWith('66') && digits.length === 11) {
return '00' + digits; // 66812345678 → 0066812345678
}
return digits;
}PromptPay's ASEAN Cross-Border Network
PromptPay is no longer purely domestic. Thailand has established bilateral QR payment linkages with seven countries — Singapore (PayNow), Malaysia (DuitNow), Indonesia (QRIS), Vietnam (VietQR), Cambodia (Bakong), Japan (JCB QR) and China (WeChat/Alipay). These linkages allow citizens to send and receive money across borders by scanning a local QR code, with automatic currency conversion at interbank rates and no international wire transfer fees. The framework is championed by the BIS and ASEAN central banks as a model for regional payment interoperability.
Singapore
PayNow
Malaysia
DuitNow
Indonesia
QRIS
Vietnam
VietQR
Cambodia
Bakong
Japan
JCB QR
China
WeChat / Alipay
Supported Banks
All Thai banks authorized by the Bank of Thailand are required to offer PromptPay. This includes every commercial bank, savings bank and specialized financial institution with significant retail operations. Full interoperability is guaranteed by the ITMX network — a payment sent from any participating bank app arrives in any other participating bank account within seconds. There is no need for both parties to use the same bank or app.
PromptPay's Impact on Thailand
PromptPay has transformed Thailand's payment landscape: 55M+ registered users, ~1 billion transactions per month, 30+ participating banks, and connections to 7 ASEAN countries. The Bank of Thailand eliminated all interbank transfer fees for PromptPay in 2019. During the COVID-19 pandemic, the Thai government distributed welfare payments directly via National ID-linked PromptPay accounts. Thailand jumped from primarily cash-based to one of the most digitally-transacting populations in Southeast Asia, driven almost entirely by PromptPay adoption.
Ready to generate your PromptPay QR Code?
Free, instant, works with all Thai banking apps. No sign-up required.