Skip to content

QR code for payment: how it works and how to make one

A QR code for payment holds the details a bank app needs to send you money: your account or payment key, your name, the currency, sometimes an amount, and a checksum. You can make one for free when the scheme lets the code carry details you already know, such as a Pix key, an IBAN or a Bakong account ID; otherwise your bank issues it.

Payment QR codesUpdated 5 min read

How payment QR codes work

Most national payment QR codes follow the same EMVCo standard for merchant-presented codes. The code is a line of text split into short fields. Each field has a two-digit tag, a two-digit length and the value. One tag names the scheme and holds the account; others hold the currency, country, name, city and, if set, the amount. The last field is a four-character checksum (a CRC), so the payer's app can tell when a code was read wrongly or changed.

When someone scans the code, their bank app reads those fields and shows a payment screen with the recipient and the amount. Nothing passes through the QR code itself: the money moves through the country's payment system, from the payer's bank to yours.

There are two kinds of code:

  • Static: the same code works for every payment. It suits a sticker by the till, a menu or a flyer. The payer usually types the amount.
  • Dynamic: made for one payment, with the amount and often an expiry time. Shops, payment providers and banking apps make these for each bill.

Which payment QR codes you can make yourself

Our free tools build codes field by field from the scheme's published specification, and each one is tested against that specification's own example codes, checksum included. Each runs in your browser and stores nothing.

  • Brazil, Pix: a static Pix code and the copia e cola text from your Pix key, in the Pix QR code generator. Banco Central's manual says any software may build a static code.
  • Cambodia, KHQR: a static code from your Bakong account ID, in riel or dollars, in the KHQR code generator.
  • Malaysia, DuitNow: the recipient ID inside a DuitNow QR is assigned by your bank, so you start from the code in your banking app. The DuitNow QR tool reads it and adds or removes a fixed amount.
  • Europe, SEPA transfers: the EPC QR code generator makes the GiroCode that many European banking apps scan on invoices.
  • Switzerland: the Swiss QR-bill generator makes the payment part of a QR-bill as a PDF.
  • India and Singapore: the UPI QR code generator builds a UPI link from your UPI ID, and the PayNow QR code generator a PayNow code from your mobile number or UEN.

Where your bank or e-wallet has to issue the code

Some schemes put an ID in the code that only the bank or acquirer can assign. Nobody can build those from a phone number, and a site that claims to is guessing. Get them in your app:

  • QR Ph in the Philippines comes from GCash, Maya or your bank; see what QR Ph is and how to get your GCash QR code.
  • SGQR labels in Singapore come from your merchant acquirer; see SGQR and the SGQR ID.
  • QRIS in Indonesia comes from a licensed payment provider; see what QRIS is.
  • VietQR in Vietnam comes from your banking app; see what VietQR is.
  • Bangla QR in Bangladesh comes from your bank or mobile financial service; see Bangla QR and bKash.
  • FPS in Hong Kong: the HKMA's Common QR Code Specification (version 1.0, December 2017) reserves tag 26 for the Faster Payment System and leaves its contents to the scheme, and HKICL tells merchants to ask their payment provider for a compliant code. Its own example of a person-to-person payment has the plumber generate a code for HKD800 in his payments app.

Payment limits

Limits come from the scheme and from your bank. The scheme sets the most one payment can be; your bank may set a lower daily limit. These are the scheme limits published by the operators themselves:

  • DuitNow QR (Malaysia): up to RM50,000 per transaction, according to PayNet.
  • QRIS (Indonesia): at most Rp10,000,000 per transaction, according to Bank Indonesia. Issuers may set daily or monthly totals.
  • NAPAS 247 transfers (Vietnam), including by VietQR: under 500 million dong per transaction, according to NAPAS.

For any other scheme, check your bank app's limits screen, because that is the limit that stops a payment.

Printing and designing a payment QR code

Design matters less than contrast and size. Keep the code dark on a light background, leave a clear white border around it, and don't put a logo over a payment code. A logo works by using up the code's error correction, the spare capacity meant for scratches and smudges, and a payment code that misreads by one character fails its checksum and won't open. Print it at least 3 cm wide, and put your name or shop name and the scheme's label next to it, so people know which app to use.

Test it before you print

Scan the code with a different bank app from the one you use, and send yourself a small amount. Check that the name on the payment screen is yours and that the money lands in the right account. Do this every time you make a new code. If you are paying, scan with your own bank app and read the confirmation screen before you approve.

Sources

Questions

Can I make a payment QR code for free?

Yes, for schemes where the code only holds details you already know, such as your Pix key, Bakong account ID, UPI ID or IBAN. Where the bank assigns the account ID inside the code, as with DuitNow, QR Ph or SGQR, you get the code from your bank or e-wallet app.

Is it safe to show my payment QR code?

A receiving code only lets people send you money. It holds details such as your key or account ID and your name, so share it where you'd share those.

Why does my bank app show a different name from the one in the code?

Several schemes, including Pix and PromptPay, tell apps to show the name registered with the account, looked up at payment time, not the name written in the code. That protects payers from codes with a false name.

How do I check a payment QR code before I pay?

Scan it in your own bank app, but don't confirm yet. Check the recipient name and the amount on the confirmation screen. If either looks wrong, cancel.