Payments
Local QR payments
Show a UPI, Raast, JazzCash or Easypaisa payment QR code on your invoices so clients can pay by scanning with their banking or wallet app.
Coming the week of 25 January 2027
This feature ships in the week of 25 January 2027. This page describes how it will work; details can change before release.
Local QR rails put a payment QR code on your invoice. Your client scans it with their banking or wallet app and pays you directly, in seconds. Four rails are supported: UPI for invoices in Indian rupees, and Raast, JazzCash and Easypaisa for invoices in Pakistani rupees. They work like bank transfer: the money goes straight to your account, the client tells you they have paid, and you record the payment.
The four rails
| Rail | Currency | What you enter | The QR on the invoice |
|---|---|---|---|
| UPI | INR | Your UPI ID (VPA) and payee name | Generated for each invoice in the open upi://pay format, with the amount, currency INR and the invoice number as the note |
| Raast | PKR | Your Raast ID (mobile number) or IBAN, account title and bank | Your merchant Raast QR, uploaded as an image from your bank or app |
| JazzCash | PKR | Your mobile account or till number and account title | Your merchant QR, uploaded as an image |
| Easypaisa | PKR | Your mobile account or till number and account title | Your merchant QR, uploaded as an image |
UPI QR codes carry the exact amount and invoice number, so your client does not have to type anything. For Raast, JazzCash and Easypaisa, the QR is your own merchant code, so the client enters the amount shown on the invoice. A per-invoice Raast QR with the amount built in is planned only once a partner bank provides the State Bank of Pakistan's merchant QR format.
Where the QR appears
The QR code and your plain account details appear on:
- the pay page,
- the invoice PDF,
- the share link.
The plain details are always shown next to the QR, for clients who cannot scan (for example when they open the invoice on the same phone they would pay with).
A QR rail is shown only when the invoice currency matches the rail: UPI on INR invoices, Raast, JazzCash and Easypaisa on PKR invoices. A USD or EUR invoice never shows these rails, even if they are enabled for the business.
How a QR payment is confirmed
QR rails are instruction rails. We show where to pay, but the payment happens in your client's app, outside our system. So:
- The client scans and pays.
- The client clicks I have paid on the pay page and can upload a screenshot or receipt as proof.
- You check that the money arrived in your account.
- You accept the proof or record the payment. The invoice moves to paid or partially paid, with an audit entry.
Scanning the code, or clicking I have paid, never marks the invoice paid by itself.
Set up a QR rail
Open Settings > Payment methods
Choose the business. Businesses created in Pakistan have Raast, JazzCash and Easypaisa pre-selected, and businesses in India have UPI pre-selected; you still need to fill in your details.
Enter your details
For UPI, enter your UPI ID and payee name. For Raast, JazzCash or Easypaisa, enter your account details as listed above.
Upload your merchant QR (Pakistan rails)
Download or screenshot the merchant QR from your bank or wallet app and upload it. PNG, JPEG and WebP images up to 2 MB are accepted (proposed limit). The image is re-encoded and stored privately, like a logo.
Confirm and enable
Adding a payment method asks for a fresh sign-in. Then enable the rail. It appears on every new invoice in its currency.
Scan your own invoice once with your phone before you send it to clients, to make sure the uploaded QR is sharp and points to your account.
Through the API
QR rails use the same connection capabilities as every other rail. For Raast, JazzCash and Easypaisa, upload the merchant QR image first, then pass its attachment id when you create the connection.
| Action | REST | Permission |
|---|---|---|
| Upload a file (merchant QR image) | POST /v1/files | the permission of what the file is for |
| List rails | GET /v1/rails | rails.manage |
| Create a connection | POST /v1/connections | rails.manage (fresh sign-in) |
| Set payment methods | PUT /v1/businesses/{id}/payment-methods | rails.manage |
| Record a payment | POST /v1/payments | payments.record |
GET /v1/rails returns each rail's connection schema, so you can see exactly which fields UPI, Raast, JazzCash and Easypaisa expect. The details you enter (UPI ID and payee name, Raast ID, till numbers, account titles) are not secret: they are shown on pay pages.
Recording the payment after you checked your account works with an API key or over MCP:
{
"name": "record_payment",
"arguments": {
"document_id": "0193f2b4-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
"amount_minor": "2500000",
"currency": "PKR",
"reference": "Raast TXN 88231"
}
}Here "2500000" is 25,000.00 PKR in minor units.
Rules and edge cases
- Currency must match. If you try to accept a QR rail on an invoice in another currency, you get
currency_mismatch. - No refunds through QR rails. To refund, pay the client back from your account and record the refund manually. See Refunds.
- Partial payments are recorded as they arrive, like bank transfers.
- Voided invoices have their pay link cancelled, so the QR is no longer shown on the pay page for that invoice.
- No fees from us. Your bank or wallet's own terms apply.
- Other local rails (for example bKash, M-Pesa or PIX) are added when users ask for them.
Permissions
| Key | Needed for | Default roles |
|---|---|---|
rails.manage | Adding QR rails and uploading merchant QR images | Owner, Admin |
payments.record | Recording QR payments and accepting proofs | Owner, Admin, Editor |
payments.view | Seeing payments and proofs | Owner, Admin, Editor, Viewer, Accountant |
Errors
| Code | When |
|---|---|
currency_mismatch | The invoice is not in the rail's currency (PKR or INR) |
fresh_signin_required | Adding or changing a rail without a recent sign-in |
validation_failed | A field is missing, or the QR image has the wrong type or size |
rail_not_connected | The rail is offered but its connection is not active |