A QR-to-pay flow with digital age verification, Stripe checkout, and real-time tablet confirmation — built for UK retail.
1. Scan QR
Customer scans QR on display unit.
2. Verify age
OIDC flow with OneID / Yoti.
3. Pay
Stripe Checkout — Card / Apple / Google Pay.
4. Webhook
Stripe confirms payment to backend.
5. Tablet
WebSocket pushes green confirmation.
Customer device
VerifyPay backend
Retail tablet
Identity provider
Stripe
PostgreSQL
Every transaction passes through a deterministic rules pipeline. Any failure short-circuits the flow.
age >= 18 (Challenge 25 enforced via document scan)
ID document not on revocation list
Liveness score >= 0.92
Outlet active and within trading hours
Stripe payment_intent.succeeded received within 60s
Customer hash not flagged in fraud register
Core entities. PII is hashed; only minimum required data is retained.
— id
— reference
— outlet_id
— product_id
— amount
— status
— stripe_session_id
— verification_id
— created_at
— id
— provider (oneid|yoti)
— customer_hash
— age_band
— liveness_score
— verified_at
— expires_at
— id
— name
— city
— tablet_id
— trading_hours
— active
— id
— actor
— action
— entity
— payload_hash
— ip
— created_at
TLS 1.3 only
PCI-DSS via Stripe
AES-256 at rest
Signed webhooks