QR Payments
NahuPay QR codes let customers pay by scanning a code at your counter, on your menu, or on a receipt. No card reader, no hardware — customers use TeleBirr, M-Pesa, or their bank app to scan and pay.
How it works
- You display a QR code (static or dynamic, see below)
- The customer scans it with their phone camera or payment app
- NahuPay shows the checkout with pre-filled amount (dynamic) or prompts for amount entry (static)
- Customer confirms on their app; USSD push or app redirect completes
- You receive a
payment.completedwebhook and the dashboard updates in real-time
Generate from the dashboard
- Go to Dashboard → QR Payments → Generate QR
- Choose Static (reusable, customer enters amount) or Dynamic (fixed amount, single-use)
- Download as PNG or SVG
- Print or embed in your storefront
Generate via API
Generate a dynamic QR code programmatically for each order:
const payment = await client.payments.create({amount: 85000,currency: 'ETB',methods: ['telebirr', 'cbe_birr', 'mpesa'],success_url: 'https://pos.myshop.com/complete',cancel_url: 'https://pos.myshop.com/cancel',metadata: { table: 'T7', ticket: 'TKT-0042' },});// The checkout_url IS the QR payloadconsole.log(payment.checkout_url);// → https://checkout.nahupay.com/pay/ch_abc123// Also available: pre-rendered QR as SVG or PNG data URIconsole.log(payment.qr_code.svg);console.log(payment.qr_code.png_data_uri);Static vs dynamic QR codes
| Static | Dynamic | |
|---|---|---|
| Amount | Customer enters amount | Pre-filled from your system |
| Reusable | Yes — print once, use forever | Single use per QR |
| Tracking | By payment method only | Full metadata per transaction |
| Best for | General counter payments | Itemised orders, POS systems |
Print & display tips
- Use the SVG export for high-quality print — scalable to any size without pixelation.
- Include your logo and amount next to the QR so customers know what to expect before scanning.
- For restaurant menus, one static QR per table is the simplest setup; staff note the table number and amount against the payment in the dashboard.
- Minimum print size: 2.5 × 2.5 cm. Smaller codes may fail to scan under poor lighting.
- Add a quiet zone (white border) of at least 4 modules around the code.