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

  1. You display a QR code (static or dynamic, see below)
  2. The customer scans it with their phone camera or payment app
  3. NahuPay shows the checkout with pre-filled amount (dynamic) or prompts for amount entry (static)
  4. Customer confirms on their app; USSD push or app redirect completes
  5. You receive a payment.completed webhook and the dashboard updates in real-time

Generate from the dashboard

  1. Go to Dashboard → QR Payments → Generate QR
  2. Choose Static (reusable, customer enters amount) or Dynamic (fixed amount, single-use)
  3. Download as PNG or SVG
  4. 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

StaticDynamic
AmountCustomer enters amountPre-filled from your system
ReusableYes — print once, use foreverSingle use per QR
TrackingBy payment method onlyFull metadata per transaction
Best forGeneral counter paymentsItemised orders, POS systems
  • 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.