QR Code Payments
A technical guide to EMVCo QR Code standards, Merchant Presented and Consumer Presented modes, and the regional QR payment ecosystems powering PIX, PromptPay, UPI, PayNow, QRIS and more.
EMVCo QR Code Specification
EMVCo published two specifications in 2017: one for Merchant Presented Mode (MPM) and one for Consumer Presented Mode (CPM). Both use a TLV-like encoding — 2-digit ID, 2-digit decimal length, value — nested recursively for template fields.
Encoding Format
Every field is encoded as ID (2) + Length (2) + Value (N) where Length is the number of characters in Value (decimal, zero-padded to 2 digits). Fields are concatenated without separators.
MPM Root-Level Fields
| ID | Field Name | Format | Notes |
|---|---|---|---|
00 | Payload Format Indicator | Fixed "01" | Must be first field, always "01" |
01 | Point of Initiation Method | "11" or "12" | 11 = static, 12 = dynamic |
02–51 | Merchant Account Information | Template | Network-specific data; 26–51 most common. Contains GUID + payment identifier sub-fields |
52 | Merchant Category Code | 4 digits | ISO 18245 MCC (e.g. 5411 = grocery) |
53 | Transaction Currency | 3 digits | ISO 4217 numeric (764=THB, 986=BRL, 356=INR) |
54 | Transaction Amount | Numeric string | Optional in static QR; mandatory in dynamic |
55 | Tip or Convenience Indicator | "01"/"02"/"03" | 01=prompted, 02=fixed fee, 03=percentage fee |
56 | Value of Convenience Fee Fixed | Numeric | Only present if field 55 = "02" |
57 | Value of Convenience Fee % | Numeric | Only present if field 55 = "03" |
58 | Country Code | 2 alpha | ISO 3166-1 alpha-2 (TH, BR, SG, IN…) |
59 | Merchant Name | ≤ 25 chars | Displayed to payer in their app |
60 | Merchant City | ≤ 15 chars | City of the merchant |
61 | Postal Code | ≤ 10 chars | Optional |
62 | Additional Data Field Template | Template | Bill number, reference, terminal label, purpose |
63 | CRC-16 | 4 hex chars | Must be last. CRC-16/CCITT over entire string including "6304" |
64 | Merchant Info Language Template | Template | Alternate language name/city (e.g. Thai script) |
Additional Data Template (ID 62) Sub-fields
| Sub-ID | Name | Max Length | Purpose |
|---|---|---|---|
01 | Bill Number | 25 | Invoice or bill reference |
02 | Mobile Number | 25 | Payer mobile for confirmation |
03 | Store Label | 25 | Merchant store identifier |
04 | Loyalty Number | 25 | Loyalty card / membership number |
05 | Reference Label | 25 | Transaction reference (for reconciliation) |
06 | Customer Label | 25 | Customer identifier |
07 | Terminal Label | 25 | POS terminal identifier |
08 | Purpose of Transaction | 25 | Description (e.g. "Lunch", "Rent") |
09 | Additional Consumer Data | 3 | Flags requesting extra data from consumer app |
CRC-16 / CCITT Validation
The last 4 characters of every EMVCo QR string are a CRC-16 checksum (polynomial 0x1021, initial value 0xFFFF). The checksum covers the entire string up to and including"6304" (the CRC field ID + length), but not the 4-character CRC value itself.
Use the EMVCo QR Parser tool to validate any QR string's CRC and decode all fields.
Merchant Account Information Structure (IDs 26–51)
Each payment network registers one or more ID slots in the range 26–51. Inside each template, sub-field 00 is a Globally Unique Identifier (GUID) that identifies the payment network. Sub-fields 01–99 carry network-specific data (account number, VPA, phone number, etc.).
26370016A000000677010111 ← PromptPay GUID01130066812345678 ← country code + phoneTry the QR Parser
Parse and build EMVCo QR strings with live CRC validation and field-by-field decoding.