Standard payment flow
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.Scan the QR code
Point the camera at any DOSS QR code. Once the camera reads a code, the app immediately calls:The response determines which screen to navigate to next.
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.
- Merchant (string link)
- User profile
- Payment link (URL)
When
is_string is true, the response contains merchant details. The app navigates to the PAY screen directly, passing:link_type: 'string'merchant— business name and addresscashier— first and last namemerchantIdandcashier_idlogo— merchant logo URLmerchantDefaultCurrencyCode
Enter or review the amount
The
PAY screen shows the merchant logo, business name, address, and cashier name.- String link (manual amount)
- URL link (fixed amount)
Enter the amount you want to pay. The input automatically formats as you type (cents to dollars conversion). Your current balance is displayed below the input.If the entered amount exceeds your balance, an Insufficient Balance toast appears and the amount is capped.You can optionally tap Write A Note to attach a note to the transaction.
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.Submit payment
Tapping Confirm Payment calls:On success, the dashboard and transaction history queries are invalidated so balances and history reflect the new payment immediately.
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.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.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
Approve or reject
Two buttons are shown:
- Pay $X.XX (green) — proceed to approval
- Reject (red) — proceed to rejection
PAY_ENTER_PIN screen, passing the action type (approve or reject) along with the transaction details.Result screen
- Approved →
REQ_PAYMENT_SUCCESSscreen (green background) — shows the transaction ID (copyable to clipboard), amount, and time. - Rejected →
REQ_PAYMENT_FAILscreen (orange background) — shows the failure message, amount, and time.
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