PaymentsLocal QR payments

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

RailCurrencyWhat you enterThe QR on the invoice
UPIINRYour UPI ID (VPA) and payee nameGenerated for each invoice in the open upi://pay format, with the amount, currency INR and the invoice number as the note
RaastPKRYour Raast ID (mobile number) or IBAN, account title and bankYour merchant Raast QR, uploaded as an image from your bank or app
JazzCashPKRYour mobile account or till number and account titleYour merchant QR, uploaded as an image
EasypaisaPKRYour mobile account or till number and account titleYour 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 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:

  1. The client scans and pays.
  2. The client clicks I have paid on the pay page and can upload a screenshot or receipt as proof.
  3. You check that the money arrived in your account.
  4. 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

1

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.

2

Enter your details

For UPI, enter your UPI ID and payee name. For Raast, JazzCash or Easypaisa, enter your account details as listed above.

3

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.

4

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.

ActionRESTPermission
Upload a file (merchant QR image)POST /v1/filesthe permission of what the file is for
List railsGET /v1/railsrails.manage
Create a connectionPOST /v1/connectionsrails.manage (fresh sign-in)
Set payment methodsPUT /v1/businesses/{id}/payment-methodsrails.manage
Record a paymentPOST /v1/paymentspayments.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:

MCP tool call
{
  "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

KeyNeeded forDefault roles
rails.manageAdding QR rails and uploading merchant QR imagesOwner, Admin
payments.recordRecording QR payments and accepting proofsOwner, Admin, Editor
payments.viewSeeing payments and proofsOwner, Admin, Editor, Viewer, Accountant

Errors

CodeWhen
currency_mismatchThe invoice is not in the rail's currency (PKR or INR)
fresh_signin_requiredAdding or changing a rail without a recent sign-in
validation_failedA field is missing, or the QR image has the wrong type or size
rail_not_connectedThe rail is offered but its connection is not active