Payments
Payment QR codes compared: PIX, EPC and UPI
By OpenQR · updated 20 October 2026
9 min read · Updated 20 October 2026

The three open standards at a glance
| PIX (BR Code) | EPC (GiroCode) | UPI | |
|---|---|---|---|
| Market | Brazil | Eurozone (SEPA) | India |
| Operator | Banco Central do Brasil | European Payments Council | NPCI |
| Payload format | EMV TLV fields + CRC16 | Ten fixed text lines | upi://pay URI |
| Payee identifier | PIX key (CPF, CNPJ, email, phone, UUID) | IBAN + name | UPI ID (name@bank) |
| Amount in code | Optional, BRL | Optional, EUR | Optional, INR |
| Reference field | txid, alphanumeric ≤25 | ISO 11649 RF reference or free text | tn note, ~50 chars |
| Settlement | Instant, 24/7 | SEPA transfer, up to 1 business day | Instant, 24/7 |
| Checksum on payload | CRC16 required | None (IBAN's own mod-97) | None (URI syntax) |
| Code expiry | Never (static) | Never (static) | Never (static) |
| Payer needs | Any Brazilian bank app | European bank app with EPC scan | Any UPI app |
The formats differ more than the table shows. PIX inherited the EMV structure from card-network QR standards, so every field is tagged, length-prefixed and protected by a CRC16 checksum — a damaged code fails closed. EPC chose radical simplicity: ten lines of text any developer can emit, with correctness resting on the IBAN's built-in checksum. UPI skipped structure entirely and encoded a deep link, which made every UPI app a universal scanner from day one at the cost of having no payload integrity check at all.
Static codes are data; dynamic codes are regulated products
Every payment QR code is one of two kinds, and the difference is legal, not technical. A static code contains payment details: account identifiers, maybe an amount. It is a very small sign that says pay here, and anyone can make one — a generator, a bank app, a text editor in principle. A dynamic code is created per transaction by a payment institution: it encodes a URL that resolves to a one-time payment claim, can change the amount at the moment of sale, expires after use, and reports confirmation back to the till. Minting that claim means moving money on someone's behalf, which is licensed activity in every jurisdiction covered here.
That is why no third-party generator — ours or any other — offers dynamic Alipay, dynamic PIX or per-bill UPI codes. A site advertising one is either routing through your own merchant account or selling something that cannot work. What a static code gives up in return is real: no per-transaction amounts, no automatic confirmation, no scan counts. Sellers reconcile the old-fashioned way, by watching the bank app.
The closed ecosystems
| System | Why not |
|---|---|
| Alipay | Codes are minted by Alipay for merchant accounts; the payload is not a public standard |
| WeChat Pay | Same model: platform-issued codes tied to a merchant ID |
| SWIFT gpi | Interbank rail, not a consumer scanning format; no static payload exists |
| Cash App / Venmo | US person-to-person apps with their own QR handling, no open payload spec |
The pattern across all of them: where a payment platform owns both ends of the scan, it keeps the code format private. Open standards appear where a central bank or industry body forces interoperability — Brazil's Central Bank, the EPC, India's NPCI. If your market has none, the honest options are a link-in-bio page from a PSP or waiting for the regulator.
Choosing for your market
- Selling in Brazil: a static PIX code with an open amount, printed beside the copia e cola string
- Invoicing in the eurozone: an EPC code with a fixed amount and an RF creditor reference for automatic reconciliation
- Selling in India: a static UPI sticker, or one code per fixed menu price
- Serving several markets: one code per market on the same flyer — they do not interfere
A payment QR code never proves a sale
Static codes report nothing back. A customer showing you a payment screen has paid — or has shown you a screenshot. Verification belongs to the payment institution's dynamic product, or to watching your own bank statement.
OpenQR ships free generators for all three open standards, each building the payload in your browser: PIX (BR Code), EPC / GiroCode and UPI, collected in the payment QR codes section. For depth on each: PIX explained, EPC/GiroCode explained and UPI explained. The static-versus-dynamic trade-off in general QR use is covered in static vs dynamic QR codes.