ammar.sheikh
All case studies
ShippedFintech · Mobile UX2024 — 2025

ScanPayGo

QR-first checkout designed for small retail — no app, no account required to complete a payment.

Role · Full-stack engineer

Overview

A scan-to-pay experience designed for merchants whose customers shouldn't need an app, an account, or a card on file to complete a purchase.

Problem

Small merchants want UPI-style payment ergonomics without committing to a specific wallet or POS terminal. Existing flows force account creation up front, which kills conversion at the counter.

Solution

A QR-anchored checkout that opens directly to a one-screen pay flow — totals, method, confirmation — with optional account creation moved to after a successful payment.

Architecture

Stateless web client behind a versioned API, idempotent payment intents, server-side retries on webhook failures, and a small reconciliation worker that closes the loop with the provider's settlement reports.

Tech stack

  • React
  • TypeScript
  • Node.js
  • PostgreSQL
  • Stripe

Engineering decisions

  • Idempotency keys at the request boundary — never at the database — to keep retry logic in one place.
  • Account creation deferred to post-payment to remove the largest funnel drop.
  • Webhook handler is the source of truth; the client never marks a payment complete.

Challenges

  • Reconciling provider-side states with local intents required modeling payments as a state machine with explicit transitions and a replayable event log.

Lessons learned

  • The right unit of correctness in payments is the state machine, not the request.
  • Every UX shortcut at the counter pays for itself in conversion.

Future improvements

  • Offline-tolerant capture for spotty venues.
  • Merchant analytics surface with cohort-level retention.

Links

Links coming soon.