How to create QR codes
Use this guide when you want a payment QR code customers can scan right away.
Before you start
- You can sign in to your Tillify dashboard.
- You have at least one receiving bank account connected.
- You know if this QR is for one fixed price or variable pricing.
What you will finish with
- A live QR code linked to your chosen bank account.
- Optional settings applied (one-off, customer details, tickets, webhook).
- A ready-to-share code for print, display, or online links.
Exact steps
Menu path: Dashboard → QR Codes → Create. Follow in order.
- 1
Open Dashboard, then click QR Codes in the left menu.
- 2
Click Create QR code.
- 3
In Item or Service name, enter what the customer is paying for (for example: Coffee, Event Entry, Donation).
- 4
In Receiving bank account, choose the account where money should be deposited.
- 5
Choose pricing: turn on Set fixed amount for one exact price, or leave it off for customer-entered amount.
- 6
If using customer-entered amount, set Minimum amount if you want a payment floor.
- 7
Optional: turn on One-off QR code to auto-expire after the first successful payment.
- 8
Optional: turn on Require customer details if you need payer name/email/notes for fulfilment.
- 9
Optional: turn on Ticket mode if this QR sells event tickets.
- 10
Optional: add statement particulars/code/reference and a webhook URL for downstream systems.
- 11
Click Create QR code and wait for the success message.
- 12
Open the QR details page, then choose how to use it: print, show on device, or share link.
Types and use cases
| Type | Best use case | Setup note |
|---|---|---|
| Fixed amount | One product, one price (coffee, entry fee, set menu) | Turn on Set fixed amount and enter the exact amount. |
| Open amount | Donations, honesty box, custom quoting | Leave fixed amount off so the customer enters a value. |
| Open amount + minimum | Flexible pricing with a minimum floor | Leave fixed amount off and set Minimum amount. |
| One-off code | Single customer invoice-style payment | Enable One-off QR code (expires after one successful payment). |
| Require customer details | You need email/notes for fulfilment | Enable Require customer details. |
| Ticket mode | Events and paid entry | Enable Ticket mode, then add ticket items on the QR detail page. |
| Webhook-enabled | Send payment success to another system | Expand Webhook notification and add your endpoint URL. See Webhook payload below. |
Webhook payload
When a customer completes a payment on a QR code with a webhook URL, Tillify sends a POST request to that URL with a JSON body like this:
{
"event": "payment.completed",
"data": {
"id": "8f0c2a4e-…",
"checkout_session_id": null,
"external_order_id": null,
"qr_code_id": "3b9d71c2-…",
"status": "completed",
"amount": 11.39,
"currency": "NZD",
"completed_at": "2026-10-14T01:23:45.678Z",
"customer_reference": "Sam Smith",
"metadata": {
"product_name": "Coffee cart",
"description": "Flat whites and long blacks",
"items": [
{ "id": "c41e…", "name": "Flat white", "price": 5.5, "quantity": 2 }
],
"customer_email": "sam@example.com",
"customer_notes": "Oat milk please"
}
},
"created_at": "2026-10-14T01:23:46.012Z"
}- event
- Always payment.completed for a QR code.
- data.id
- The payment's ID. Use it to ignore a repeated request.
- data.qr_code_id
- The QR code that was paid.
- data.amount
- What the customer paid, in dollars (not cents), including any fee you pass on to the customer.
- data.currency
- Always NZD.
- data.completed_at
- When the payment completed (UTC, ISO 8601).
- data.customer_reference
- The reference the customer typed when paying. Empty if they left it blank.
- data.metadata.product_name
- The QR code's item or service name.
- data.metadata.description
- The QR code's description, if it has one.
- data.metadata.items
- For QR codes with items: what was bought, with each item's unit price in dollars and quantity.
- data.metadata.customer_email
- The customer's email, if they gave one.
- data.metadata.customer_notes
- The customer's notes, if they left any.
- data.metadata.invoice_number
- The invoice number, when the QR code is an invoice's payment link.
- checkout_session_id, external_order_id
- Always null for QR code payments. They're used by API payments.
metadata may contain other keys. Don't rely on any that aren't listed here.
Answer with any 2xx status within 10 seconds. Otherwise we send the same body again after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 24 hours, then stop. You may occasionally get the same payment twice, so handle each data.id only once.
Only payment.completed is sent to a QR code's webhook. Nothing is sent for failed, cancelled or refunded payments.
QR code webhooks aren't signed, so anyone who knows your URL could send a request that looks like a payment. Keep the URL private, and check your Tillify dashboard before you hand over anything valuable. If you need webhooks you can verify, create API credentials under Dashboard → Ecommerce: their webhooks are signed.