Skip to main content
Scan & Pay lets you pay a merchant by scanning their QR code. The flow moves through several screens: scan, review merchant, enter amount, confirm with PIN, and success.

Standard payment flow

1

Open the scanner

Tap the Scan & Pay card on the dashboard. The app requests camera permission (Android) and opens the SCAN screen with a live camera feed.The screen shows a QR overlay frame and a status indicator at the bottom that reads Scanning… while the camera is active.
2

Scan the QR code

Point the camera at any DOSS QR code. Once the camera reads a code, the app immediately calls:
POST /v2/scan-link
{
  "link": "<scanned QR value>"
}
The response determines which screen to navigate to next.
3

Review the merchant or user profile

The API response is interpreted in one of three ways:If scanning fails, an error modal appears with options to Scan Again or Cancel.
4

Enter or review the amount

The PAY screen shows the merchant logo, business name, address, and cashier name.
The Android hardware back button is disabled on the Pay screen. Use the on-screen back arrow, which returns you to the SCAN screen.
5

Review and confirm

Tapping Pay or Redeem navigates to the CONFIRM_PURCHASE screen. Here you enter your 4-digit PIN to authorize the payment.The PIN is entered using the app’s OTP input component.
6

Submit payment

Tapping Confirm Payment calls:
POST /v2/confirm_payment_with_pin
{
  "confirm_pin": "1234",
  "link_type": "string",
  "merchantId": 234,
  "cashier_id": 23,
  "amount": "25.00",
  "note": "lunch",
  "logo": "https://...",
  "merchantDefaultCurrencyCode": "usd"
}
For string link types, the merchant and cashier objects are removed from the payload before submission. For url link types, the payment_id is included instead.
On success, the dashboard and transaction history queries are invalidated so balances and history reflect the new payment immediately.
7

Payment successful

The PAYMENT_SUCCESSFUL screen is shown with the transaction timestamp. Tap Continue to return to the main tab navigator.

Payment requests flow

When a merchant initiates a payment request (for example, a cashier-initiated payment), you receive a notification or see the transaction listed as Awaiting in your dashboard or transaction history.
1

Open the payment request

Tap the Awaiting transaction from the dashboard or transaction history. The PAYMENT_REQUESTED screen opens (blue background) showing:
  • Your current balance (with show/hide toggle)
  • Merchant logo
  • Request date and time
  • Amount requested
  • Store name
  • Cashier name
2

Approve or reject

Two buttons are shown:
  • Pay $X.XX (green) — proceed to approval
  • Reject (red) — proceed to rejection
Both options navigate to the PAY_ENTER_PIN screen, passing the action type (approve or reject) along with the transaction details.
3

Enter PIN

On the PAY_ENTER_PIN screen, enter your 4-digit PIN and tap Confirm Payment. This calls:
POST /v2/payment-request-action
{
  "confirm_pin": "1234",
  "txn_id": "<transaction UUID>",
  "type": "approve"
}
4

Result screen

  • ApprovedREQ_PAYMENT_SUCCESS screen (green background) — shows the transaction ID (copyable to clipboard), amount, and time.
  • RejectedREQ_PAYMENT_FAIL screen (orange background) — shows the failure message, amount, and time.
Tapping Close on either screen invalidates the dashboard and transaction history queries and returns you to the home screen.

Scan error handling

If the QR code cannot be read or the /v2/scan-link call fails, a modal appears with the server error message (or a generic fallback). You can choose to:
  • Scan Again — re-enables the camera and resets the scanning state
  • Cancel — dismisses the modal and returns to the previous screen

Build docs developers (and LLMs) love