Appearance
How QRIS Works — A Visual Guide
Think of a QRIS code as a shopping receipt packed into a QR image. Just like a receipt lists items, prices, and the merchant name, a QRIS code stores the same information in a machine-readable format.
The Secret Language: Tag-Length-Value
A QRIS code uses a pattern called TLV (Tag-Length-Value). Every piece of information is stored in the same three-part structure:
Real Example
The raw QRIS string starts with these characters: 000201
Breaking it down:
| Part | What it says | Meaning |
|---|---|---|
00 | This is tag 00 | The "Payload Format Indicator" |
02 | The value is 2 characters long | Length of the data |
01 | The value is 01 | Version 1 of the EMVCo format |
So 000201 means: "This QRIS code follows format version 01."
Anatomy of a QRIS Code
A QRIS code is a sequence of TLV blocks, one after another:
🏷️ Header Information
| Tag | Name | What it does |
|---|---|---|
00 | Payload Format Indicator | Always 01. Marks this as a payment QR code. |
01 | Point of Initiation Method | 11 = Static (customer types the amount themselves) • 12 = Dynamic (merchant sets the amount) |
🏪 Merchant Information
| Tag | Name | What it does |
|---|---|---|
26–51 | Merchant Account Templates | Contains nested TLV with payment provider details (like DANA, GoPay, OVO). Each template has its own sub-tags (see below). |
52 | Merchant Category Code (MCC) | A 4-digit code describing the business type. 5411 = restaurant, 5411 = grocery store. |
59 | Merchant Name | The business name (e.g., "Toko Berkah Jaya"). |
60 | Merchant City | City where the merchant operates. |
61 | Postal Code | ZIP or postal code (optional). |
💰 Payment Details
| Tag | Name | What it does |
|---|---|---|
53 | Transaction Currency | Currency code. 360 = Indonesian Rupiah (IDR). |
54 | Transaction Amount | The payment amount. Only present on dynamic QRIS codes. |
55 | Tip or Convenience Indicator | 01 = ask customer for tip • 02 = fixed fee added • 03 = percentage fee added |
56 | Convenience Fee (Fixed) | A flat fee in Rupiah (e.g., 2000 = Rp2.000 fee). |
57 | Convenience Fee (%) | A percentage fee (e.g., 250 = 2.50% fee). |
🌍 Location & Miscellaneous
| Tag | Name | What it does |
|---|---|---|
58 | Country Code | ID for Indonesia. |
62 | Additional Data | Extra info like bill numbers or references (contains nested TLV). |
✅ Integrity Check
| Tag | Name | What it does |
|---|---|---|
63 | CRC Checksum | A 4-character "fingerprint" that detects accidental corruption. Always appears last. |
Static vs Dynamic QRIS
Static (11) | Dynamic (12) | |
|---|---|---|
| Has amount (tag 54)? | No — customer enters amount | Yes — amount is pre-set |
| Reusable? | Yes — same QR code forever | No — new code per transaction |
| Used by | Warung, street vendors, small shops | Payment terminals, e-commerce, apps |
Merchant Account Templates (Tags 26–51)
These tags contain nested TLV — a TLV inside a TLV. Think of it like a folder inside a filing cabinet:
Common sub-tags inside merchant account templates:
| Sub-Tag | Name | Example |
|---|---|---|
00 | Globally Unique Identifier (GUID) | ID.DANA.WWW0115 identifies DANA as the provider |
01 | Merchant Account Number / PAN | The merchant's account number with that provider |
02 | Merchant ID | Alternative ID for the merchant |
03 | Merchant Criteria | Additional routing information |
Common Payment Providers
| GUID Prefix | Provider Name |
|---|---|
ID.DANA.WWW | DANA |
ID.GOPAY.WWW | GoPay |
ID.OVO.WWW | OVO |
ID.SHOPEEPAY.WWW | ShopeePay |
ID.LINKAJA.WWW | LinkAja |
ID.BNI.WWW | BNI |
ID.BRI.WWW | BRI |
ID.MANDIRI.WWW | Mandiri |
ID.BCA.WWW | BCA |
The CRC "Fingerprint"
The CRC (Cyclic Redundancy Check) is like a seal on an envelope. It ensures nobody accidentally changes the QRIS data.
If any character in the QRIS string gets altered, the CRC won't match, and the system knows the code is corrupted.
Converting Static to Dynamic
Complete Example
Here's a full QRIS string broken down into its TLV parts:
String: 00020101021126190015ID.DANA.WWW01155204541153033605802ID
5922Toko Berkah Jaya6010Surabaya6304C8C0
00 02 01 → Format version 01
01 02 11 → Static QRIS (customer enters amount)
26 19 0015ID.DANA.WWW0115 → Merchant account: DANA
52 04 5411 → Category: Restaurant
53 03 360 → Currency: IDR
58 02 ID → Country: Indonesia
59 22 Toko Berkah Jaya → Merchant name
60 10 Surabaya → City
63 04 C8C0 → CRC checksum