WIREFRAME — 1QR · The Honest Total (Screen 4 of the core flow)

390px mobile frame · iOS · Authenticated · Reached from Merchant → Total · No design applied — structure, hierarchy, and copy intent only

Where this sits in the flow
Home Scan Merchant The Honest Total Confirm Paid / Proof
This is the decision screen — everything before it earns trust; everything after it is commitment. The whole case study lives or dies here.
Screen header
Returns to Merchant — never loses the scan context
Som Tam Nua
Merchant name persists as a quiet anchor
Total hero — the one thing the eye lands on
You pay
฿420.00
THB
≈ $11.50 USD  home estimate
◷ Rate locked   00:58
Local currency is the dominant number; home currency is secondary, never the other way round. Rate-lock countdown is visible the entire time the screen is open.
Conditional — name-match confirmation pill
✓ CONFIRMED You confirmed the stall name matches the code
Only shown if the user came via the "Uncertain" edge state and confirmed the name. Reassures, doesn't nag.
Rate & fees — nothing hidden
Itemised, not summarised. Every line a card would bury is shown — including the zeros, because "free" is the point.
Line Detail Amount
Exchange rate mid-market · no markup 1 USD = 36.52 THB
Merchant amount what the stall asked for ฿420.00 · ≈ $11.50
1QR fee free under ฿1,000 ฿0.00
Network fee covered by 1QR ฿0.00
Total you pay ฿420.00 · ≈ $11.50
✓ You save ≈ $0.34 vs a typical card's ~3% conversion markup
Savings stated in home currency — the unit the traveler feels. Computed live from the locked rate.
Payment summary — what happens next
Paid toSom Tam Nua ✓
Method1QR balance · USD   [tap to change]
Arrivesinstantly, in THB
CTA restates the exact amount — never a bare "Pay". Tapping leads to Confirm (Hold-to-pay), not an instant charge.
Cancel any time before you confirm.
Currency hierarchy rule
The single most important visual decision on the screen.
ElementCurrencyWeight
Hero amountTHB (local)Dominant
Home estimateUSDSecondary
CTATHBDominant
SavingsUSDSupporting
Rate-lock states
StateBehaviour
Locked (>0:10)Countdown ticks; Pay enabled
Expiring (≤0:10)Countdown emphasised; still payable
Expired (0:00)Re-fetch rate, re-confirm new total before Pay
The rate the user agreed to is the rate they pay — or they re-agree. No silent re-pricing.
Fee logic — what drives the zeros
Condition1QR fee
Amount < ฿1,000฿0.00 (free)
Amount ≥ ฿1,000shown as a line, never folded into the rate
Network feealways ฿0.00 — covered by 1QR
Savings calculation (spec)
card_cost = amount × (1 + ~0.03)
oneqr_cost = amount × mid_market
savings = card_cost − oneqr_cost
display = round(savings, home_ccy)

Shown only when savings > 0; else hide the strip (never show "$0.00 saved").
Screen states to cover in Figma
  • Free tier (฿0 fees) — default, shown here
  • Paid tier (≥฿1,000) — fee line populated
  • Rate expired — re-confirm variant
  • Method = card vs balance vs baht pocket
  • Name-match pill present / absent

Wireframe notes — for Figma reference