states.html · 24 screens
Edge states & legal
Empty lists, errors, maintenance, offline PWA, geo-block, suspended accounts, legal text-heavy pages, plus Wedge G/H/I/J/K edge states across booking, growth, monetization, jurisdiction, and mobile/PWA surfaces.
📋 SCENARIO
Patient (P1.a) hits one of three representative degraded surfaces: empty quotation list, 503 service-unavailable, or 404 not-found. The trio shows the canonical recovery pattern — empty states route to discovery, errors route to retry plus the status page, and missing pages route home or to support.
⌕
EMPTY_QUOTATION_LIST
No quotations yet
Start your first medical-tourism quotation by searching providers.
Find providers →
⚠
503 SERVICE_UNAVAILABLE
Service temporarily unavailable
We're working on this. Tracking the incident now.
↻ Retry
✕
404 NOT_FOUND
Page not found
The page you're looking for moved or doesn't exist.
Back to home
📋 SCENARIO
Patient (P1.a inquirer) applied 4 filters during provider discovery (procedure: dental implant · destination: Bangkok · price: under $1,000 · JCI-only) and got 0 matches. Instead of a generic empty state, the surface identifies the most-restrictive filter, surfaces the 'try removing' CTAs in priority order, and offers two non-blocking alternatives — relax filter, or save the search and get notified when matches appear.
NO_MATCHES_FILTER_COMBINATION
0 providers match all 4 filters
Try relaxing one or more filters. We're showing the most-restrictive ones first.
Active filters · click × to remove
Price · under $1,000×
Accreditation · JCI-only×
Destination · Bangkok×
Procedure · Dental implant×
💡 Most-restrictive filter detected
Removing 'price under $1,000' would surface 12 providers — dental implants in Bangkok run $1,200-$2,800 median per the live ArokaGO quotation index.
🔐 Foundation primitives
Search ranking (pgvector + filter weights) · Live quotation index (median pricing per procedure × destination) · Saved-search notify (Novu/ReNovu workflow). Cross-refs: m02 search results · m03 AI deep search.
📋 SCENARIO
Anonymous visitor (P0) or any signed-in persona hits the maintenance page during a planned upgrade or live P1 incident. The scheduled tab shows a calm ETA and which services are affected; the incident tab surfaces the on-call A1 admin, paging time, and a status-page subscribe path.
🛠
Scheduled maintenance
We're upgrading our quotation infrastructure to make it faster.
Started2026-05-09 03:00 UTC
Expected completion2026-05-09 05:00 UTC (~1h remaining)
Affected servicesQuotation, Discovery
Public marketing pages remain accessible. Existing bookings are unaffected.
🚨 P1 incident · ongoingA1 PAGED · sarah_admin
Quotation submission failures · payment-rail timeouts · ~12% of users affected.
🚨
Service degraded
We're investigating an issue. ETA to mitigation: 30 minutes.
Detected2026-05-09 14:23 UTC
Status⏱ Investigating
Affected servicesQuotation submit · Stripe payment rail
A1 on-callsarah_admin · paged 14:25 UTC
📋 SCENARIO
Patient (P1.b active traveler) loses network mid-trip and the PWA falls back to the offline shell. Cached itinerary, prescriptions, and emergency contacts remain readable; messages, drafts, and KYC uploads queue locally and sync the moment connectivity returns.
📡
You're offline.
Some features are unavailable. Your trip itinerary, prescriptions, and emergency contacts are cached locally.
⏱ Last synced 2h 14m ago
Available offline
✓ Trip itinerary (last synced 2h 14m ago)
✓ Prescription list
✓ Emergency contacts
✓ Saved providers (cached pages)
— New quotations require connection
— Live chat unavailable; messages will queue
📤 Queued for sync
• 3 messages will send when you reconnect
• 1 review draft saved locally
• 1 KYC step pending upload
↻ Try reconnecting
📋 SCENARIO
Anonymous visitor (P0) browses from a payment-restricted country (Iran in the example) and hits the regional block before any provider surfaces load. Browsing stays open for research, booking and deposit are disabled for sanctions compliance, and a notify-me waitlist captures latent demand.
🌍
ArokaGO is not yet available in your region.
We're not currently serving patients in Iran due to international payment-processing restrictions, not content rights.
🔓 You can still browse
While we can't book in your region, you can browse providers, read articles, and research procedures + pricing. Booking + deposit are blocked for compliance.
Get notified when we launch
✈ Are you traveling and seeing this?
If you're a current ArokaGO patient on the road and seeing this in error, please contact support — we'll route you to the right region.
Contact support →
Note: regions are blocked due to payment-processing + sanctions compliance, not content rights. VPN use is at your own risk and may violate local law.
📋 SCENARIO
Provider (PR1/PR2) signs in to find their account suspended after A4 trust-and-safety review flagged advertising-policy violations. The page surfaces the assigned A1 reviewer, the specific reasons, a 14-day response timeline, and confirmation that existing patient bookings continue uninterrupted.
⊘
Your account is suspended.
Pending review by ArokaGO A1 team. No bookings are affected. Existing trips continue.
Your A1 reviewer · Anita V.
ArokaGO platform operator · expected response time 24h · email anita@arokago.com
ASSIGNED
Why this happened
Multiple reports of advertising claims in violation of medical-advertising guidelines. A4 reviewed and recommended suspension pending response.
What happens next
- Review the specific posts flagged (3 items)
- Submit your response within 14 days
- A1 team makes final decision in 3 business days
Timeline
May 1 · First report received
P1 patient flagged a marketing claim · queued for A4 review
May 3 · Second report received
Independent report cited same content · escalated
May 4 · A4 reviewed
Content moderator confirmed violation · recommended suspension
May 5 · Suspension issued
A1 paged + assigned (Anita V.) · provider notified by email + this page
May 18 · Final decision deadline
A1 makes final ruling · response window closes 14 days after suspension
📋 SCENARIO
Patient (P1) or Provider (PR1) navigates to the legal-document hub to review Privacy, Terms, Cookies, DPA, DSAR, SCC, or Refund policy across 13 Tolgee-translated locales. Each document offers a PDF export and quick-action bar for jurisdiction-specific requests (EU/TH/global) — F core launch-blocker compliance surface.
LEGAL DOCUMENTS · F core launch blocker
LEGAL · PRIVACY POLICY
Privacy policy
Last updated: 2026-04-30 ·
View revision history ▾
1. Information we collect
🔗
ArokaGO collects information you provide directly (account creation, quotation submissions, provider profile data) and information collected automatically (device and usage information, log files). We collect personally identifiable health information only with your explicit consent and only when necessary to facilitate medical-tourism services on your behalf.
2. GDPR & Thai PDPA rights
🔗
You may request access, rectification, deletion, or portability of your personal data at any time under GDPR Articles 15-22 and Thai PDPA equivalents. ArokaGO honors right-to-erasure within 30 days; audit aggregates required by Thai PDPA, GDPR Art. 30 and equivalent regulations are preserved with PII removed (per F.X2 audit chain).
3. Data residency & cross-border transfers
🔗
Patient health data is tagged at write-time with the patient's residency jurisdiction and stored in the corresponding regional Postgres partition. Cross-border transfers respect SCCs (EU patients) and patient consent (other regions).
Data residency map
EU patient data → Frankfurt. Thai PDPA data → Bangkok. APAC residents → Singapore. US patients → N. Virginia. Static assets only at global edge.
We use four categories of cookies. Essential cookies are required for the platform to function; the rest are opt-in for EU + UK + Thai PDPA users.
| Category | Purpose | Retention | Opt-out |
| Essential | Sign-in, CSRF, region routing | Session | Required |
| Functional | Locale preference, saved providers | 12 months | ON |
| Analytics | PostHog · funnel + heatmaps | 26 months | ON |
| Advertising | None at F (no ad tech) | — | OFF |
For privacy questions, data subject access requests, or to exercise your GDPR / Thai PDPA rights, contact our Data Protection Officer.
📧 dpo@arokago.com
Response within 14 days per GDPR Art. 12. For DSAR-specific requests, see the
DSAR doc.
LEGAL · TERMS OF SERVICE
Terms of service
Last revised: 2026-04-15
📝 Sketched for F · full document ships continuously.Privacy policy is the F core launch blocker. Terms · Cookies · DPA · DSAR · SCC · Refund are stubbed at F and matured continuously per Tolgee + A4 review chain.
LEGAL · COOKIES
Cookies policy
Last revised: 2026-04-15
📝 Stub at F.See Privacy section 4 (Cookies & tracking) for the per-cookie purpose + retention + opt-out table.
LEGAL · DATA PROCESSING ADDENDUM
Data Processing Addendum (DPA)
Last revised: 2026-04-01
📝 Stub at F.For B2B providers using ArokaGO as a processor of patient data. Required for EU GDPR Art. 28 compliance.
LEGAL · DATA SUBJECT ACCESS REQUEST
DSAR procedure
Last revised: 2026-04-01
📝 Stub at F.How to file a Data Subject Access Request under GDPR Art. 15-22 / Thai PDPA. Email dpo@arokago.com or use the in-app consent center.
LEGAL · STANDARD CONTRACTUAL CLAUSES
SCC (EU module 2)
Last revised: 2026-04-01
📝 Stub at F.EU Commission-approved Standard Contractual Clauses for cross-border data transfers. Module 2 (controller -> processor).
LEGAL · REFUND POLICY
Refund policy
Last revised: 2026-04-15
📝 Stub at F · disclosure required for deposit T&C consent ledger.Deposit refund windows · provider cancellation policy · dispute mediation by A1 · payment-rail-specific reversal timelines (Stripe / Kbank). See
patient deposit confirmation for the consent ledger entry recorded at deposit time.
📋 SCENARIO
Patient (P1.a → P1.b transition) tries to book a slot that disappears mid-checkout — sold-out at picker, held during checkout, race-condition overbooked, or Cal.com sync drift. The screen surfaces the failure variant, suggests alternative slots with hold timers, and opens a waitlist + conversion-recovery offer.
EDGE STATE · 4 VARIANTS · CLICK TO SWITCH
Slot conflict — hold-release pattern
P1.a → P1.b transition · slot disappears mid-checkout. Insight events: slot_conflict · conversion-recovery offer next (spec L81 funnel observability).
✕
This slot was just booked
Jun 12 · 09:00 · Dr. Pongsak T. · sold 8 seconds ago to another patient.
SOLD_OUT_LIVE
⏰
Your slot is held for 14:23
Complete checkout to confirm · Jun 12 · 09:00 · Dr. Pongsak T. · spec G hold-release pattern (15 min).
HOLD_ACTIVE
14:23 remaining00:37 elapsed of 15:00
What happens if hold expires
- Slot is released back to the public pool
- Your draft booking is saved · resume from your dashboard
- If slot is booked by another patient, you'll see Variant 1 (sold-out)
⚠
Two patients booked the same slot simultaneously
We're resolving · expected resolution 5 min · we'll either confirm your booking or auto-refund + suggest alternatives.
RACE_RESOLVING
Resolution timeline
14:23:01 · Both deposits capturedStripe held both holds · race detected by commerce reconciler
14:23:14 · Provider calendar checkedFirst-write-wins · timestamp arbitrates · A1 sync-monitor paged
~14:28 · Resolution + emailLoser auto-refunded · alternative slots offered with priority hold
🔧
Provider's calendar sync detected drift
We paused new bookings on this Package for 10 min while we reconcile · existing bookings unaffected · spec L134 risk mitigation.
CAL_SYNC_DRIFT
Drift detectedArokaGO calendar shows 4 free slots · Cal.com upstream shows 2 · 2-slot delta over last 90s
Reconcile window10 min · resumes 14:38 GMT+7
Provider notifiedBumrungrad · staff_pongsak · email + dashboard banner
📊 Insight events emitted
slot_conflict.detected · conversion_recovery.shown · waitlist.joined · alternative_slot.held — feeds funnel observability (spec L81) for conversion-recovery analysis.
📋 SCENARIO
Patient (P1.a → P1.b) submits a deposit and the payment rail fails — Stripe degraded, PayPal account flag, Kbank pending, 3DS challenge, or sanctioned-country review. Each variant explains the issuer-side or compliance cause, keeps the slot held while resolution is in flight, and offers a resilient alternative payment path.
EDGE STATE · 5 VARIANTS · CLICK TO SWITCH
Deposit failed — slot still held
P1.a → P1.b transition · deposit fails · slot release on timeout. Insight events: deposit_failed · failure_reason=...
✕
Card payment temporarily unavailable
Stripe is degraded · try PayPal or Kbank instead, or retry in 5 min · slot held for 15 more minutes.
STRIPE_503
Status: Stripe payment_intents API returned 503 · 4 retries failed · last success 8 min ago.
View status page →
⚠
PayPal returned: insufficient funds OR risk-flag
Please choose another payment method · this is a PayPal-side decision, not an ArokaGO block.
PAYPAL_DECLINED
Decline reason from PayPal: PAYER_ACCOUNT_RESTRICTED · contact PayPal support directly to resolve account flag.
⏳
Bank transfer initiated
Kbank confirms clearing within 2 hours · slot held until confirmed · we'll email when settled.
KBANK_PENDING
Reference: BK-2026-06-12-XYZ · Kbank clearing window 2h · slot extended to 16:30 GMT+7 (auto-extends past hold expiry while bank settles).
🔒
Your bank requires extra verification
Approve in your banking app within 5 min · slot held · this is normal for amounts over THB 10,000 in EU/UK markets.
3DS_CHALLENGE
What to do: Open your bank app or check SMS for a verification prompt. We'll auto-detect approval and complete the booking.
Re-send 3DS prompt →
🚫
Payment from this country requires manual review
A1 will contact within 24h · slot reserved · this is a compliance review, not a denial. Per trust-and-safety.md L49.
SANCTIONS_REVIEW
What happens next: A1 reviews your booking + payment-source country against current sanctions lists. Most reviews clear within 4 hours.
A1 manual-review queue →
Available actions
Slot remains held for 15 minutes from the original hold start. After that, slot is auto-released and your draft is saved to your dashboard.
📊 Failure telemetry · Insight events
deposit_failed · failure_reason=stripe_503 | paypal_declined | kbank_pending | 3ds_required | sanctions_review · payment_method_switched · slot_released_after_failure — feeds Commerce G payment-rail resilience SLO + Trust & Safety sanctions-screening dashboard.
📋 SCENARIO
Patient (P1) revokes consent for a previously published before/after photo and lands here to track the 24-hour propagation sweep. Four propagation steps (revocation logged → public-surface removal → CDN purge → audit seal) progress live, third-party cache stakes are disclosed, and a 24h grace window allows un-revocation.
EDGE STATE · CONSENT LEDGER PROPAGATION
Consent revocation in progress
Photo will be removed within 24 hours · spec G L110 acceptance #6 · revocable consent + audit-log integrity.
📷
"Before/after rhinoplasty · Bumrungrad · Mar 2026" — revocation in progress
Originally consented Mar 28, 2026 · revoked May 10, 2026 14:23 GMT+7 · estimated full removal by May 11, 2026 14:23 GMT+7.
PROPAGATING
Propagation steps (4 of 4)
✓
Step 1 · Revocation logged
Consent ledger entry sealed · audit hash 3fa8c9e2… · 14:23:01
2
Step 2 · Removal from public surfaces — 18% complete
Surfaces affected: m03 (gallery), pr52 (provider profile), pr01 (provider dashboard hero) · ETA 4h.
3
Step 3 · Cache purge (CDN) — pending
CloudFront + edge invalidation · runs after Step 2 completes · ETA 4h after Step 2.
4
Step 4 · Audit-log entry sealed
Final ledger seal · 24h propagation acceptance verified · F.X2 audit-chain alignment.
⚠ Stakes disclosure · third-party caches
Once propagated through ArokaGO surfaces (within 24h), cached web archive (~7 days) may still show this photo. We cannot remove from third-party caches (Wayback Machine, Google Image cache, etc.) but ours are clean within 24h. If you need third-party removal, we provide a takedown-letter template via DPO.
🌐 Cross-jurisdiction propagation
Photo also removed from translated surfaces (TH · JA · ZH · 9 more locales). Tolgee revocation event broadcast at 14:23:14 · all locale-specific gallery cards rebuild on next ISR cycle.
EN ✓
TH ✓
JA ✓
ZH ✓
DE ⏳
FR ⏳
ES ⏳
PT ⏳
IT ⏳
KO ⏳
VI ⏳
ID ⏳
AR ⏳
🔔 Notify provider of revocation
Notify Bumrungrad of revocation · they may want to know to update their gallery curation. Default OFF for patient privacy — opt-in only.
↺ Restore option · 24h grace window
Revoked in error? You can cancel revocation · keep photo published within the first 24h. After that, restoration requires a fresh consent grant from your patient dashboard.
🔐 Compliance · Trust G
Foundation primitives: Compliance (revocable consent + 24h propagation · L38 + acceptance #6) · Trust G (consent ledger integrity) · F.X2 audit chain alignment.
📋 SCENARIO
Provider (PR1/PR2) opens the GBP integration page after Google review sync stops working. The screen explains the four failure modes — OAuth permission_denied, 90-day token expiry, Google rate-limit, or policy change — and offers re-grant, refresh, or A1 escalation paths so syndicated review history is restored within minutes.
EDGE STATE · 4 VARIANTS · CLICK TO SWITCH
Google review sync — failure modes
PR1/PR2 OAuth grant fails OR token expires OR Google rate-limit hit · spec L138 risk + L120 open question.
✕
Google declined our request
Provider must re-grant Business Profile access · spec G capability 5 · Google returned permission_denied on last sync attempt.
OAUTH_DENIED
What happened: The Google account owner revoked ArokaGO's Business Profile permission, OR the OAuth scope was rejected during initial grant. Re-grant restores sync within 5 min.
⚠
Your Google sync token expired
Re-grant in 1 click · 4,237 reviews remain cached for 24h grace · normal 90-day token lifecycle.
TOKEN_EXPIRED
Why this happens: Google's OAuth tokens for Business Profile API expire every 90 days for security. ArokaGO auto-attempts refresh 7 days before expiry — re-grant means refresh failed too. Once you re-grant, sync resumes immediately.
⏳
Google API quota reached
Sync will resume tomorrow at 02:00 GMT+7 · cached reviews still serving · spec L138 mitigation: graceful degradation.
QUOTA_429
Quota window: Daily limit per OAuth client (10K Business Profile reads). ArokaGO batches reads with exponential back-off · resets at midnight Pacific = 02:00 Bangkok. No action required from you.
🔧
Google changed Business Profile API
ArokaGO engineering reviewing · sync paused · A1 escalating · ETA 24-72h. Spec L138 risk: third-party API breaking change.
POLICY_CHANGE
Status: ArokaGO engineering replicated the new schema in staging · adapter rebuild in progress · production sync resumes after staging soak. Cached reviews continue serving with 24h fallback.
📅 Cache-TTL disclosure
Cached reviews remain visible for 24h after sync failure · then fall back to V3 verified-booking reviews only. Trust-signal stack on profile gracefully degrades:
0-24h failure:Google reviews + ArokaGO verified-booking reviews · trust-signal stack 100%
24-72h failure:ArokaGO verified-booking reviews only · trust-signal stack ~70%
72h+ failure:Provider profile shows "Google sync paused" badge · A1 escalation surfaced to patients
🔔 A1 sync-monitor alert
A1 sync-monitor alert auto-fires at 48h downtime · 12 providers affected last incident (Mar 2026 Google API schema rev). Observability dashboard tracks failure-rate per OAuth client + per region.
🔐 Foundation primitives
Trust G (Google review sync resilience · spec L32, L138) · Identity (OAuth token lifecycle · 90d refresh) · Observability (sync health alerts · 48h auto-page A1).
📋 SCENARIO
Patient (P1.b active traveler) reaches checkout for a $7,500 booking but their KYC tier is below the threshold required for bookings over $5,000 USD. Instead of a generic error, the surface explains the AML/fraud rationale, surfaces the exact verification asks (passport scan + selfie liveness · 1–3 min), offers a deep-link to p74 KYC flow, and provides two non-blocking alternatives: reduce booking value below $5K, or save the booking for later.
KYC_TIER_2_REQUIRED
Verify your identity to continue
Bookings over $5,000 USD require KYC tier 2. This protects you and your provider against fraud and meets Thai PDPA + cross-border AML obligations. Most patients complete it in under 3 minutes.
Why this is required
- AML compliance · Thai BoT cross-border rule for bookings ≥ $5K USD
- Reverse-payment protection · escrow release requires identity match
- Fraud prevention · 1.2% of high-value bookings flagged historically
What we ask for
- Passport scan · machine-readable zone (clear photo of bottom 2 lines)
- Selfie liveness check · turn head left + right · ~10 seconds
- Proof of funds · optional · only for bookings ≥ $20K USD
🔐 Foundation primitives
Identity (Zitadel KYC tier ledger) · Compliance (Thai PDPA + cross-border AML threshold table) · Booking (escrow gate · spec L189). Cross-refs: p74 KYC flow · p44 deposit checkout.
📋 SCENARIO
Provider marketer (PR2) launches a drip and the send is blocked — per-patient cap hit, WhatsApp Business template pending Meta approval, or A4 editorial reject. The page explains the cause, lists affected recipients with skip/requeue/cancel actions, and offers email failover or template-swap so the campaign keeps moving.
EDGE STATE · 3 VARIANTS · CLICK TO SWITCH
Drip can't send right now
PR2 lands here when drip is throttled, a channel is paused, or A4 rejects the campaign copy. Compliance H rate-limit + cap enforcement · Trust & Safety editorial path.
⏸
Drip paused · per-patient send-cap reached
3 messages / 7d limit hit for 18 recipients in this segment · sends will resume Mon 06:00 ICT · cap policy enforced per Compliance H spec L136.
RATE_LIMIT_HIT
Window: 7d rolling per recipient · 3 sends max · resets 168h after each send. Why it exists: Marketing-fatigue prevention — providers who exceed the cap burn list health and trigger opt-outs across the platform.
Affected recipients · 18 pausedresume Mon 06:00 ICT · 2d 14h
P-2841 · sarah.k@…3rd send in 7d · last: 2026-05-08 09:14
P-2856 · mira.t@…3rd send in 7d · last: 2026-05-09 11:03
P-2902 · daichi.y@…3rd send in 7d · last: 2026-05-09 18:42
🚫
WhatsApp Business pause · Meta template approval pending
Template welcome-dental-v3 · 2 days in queue at Meta · email failover engaged for 247 recipients.
WA_TEMPLATE_PENDING
Why this happens: Meta Business Platform requires pre-approval for any template before it can be sent at scale. Median approval is 24-48h · 2d is in normal range. ArokaGO detected the pause and auto-engaged email failover so the drip keeps moving.
📡 Email failover · activeFAILOVER_ON
247 recipients re-routed to email · open-rate fallback ~22% vs WhatsApp's ~67% · expected lift will resume when WA template approves.
WhatsApp queue0 / 247 sent
Email failover112 / 247 sent · 28 opened · 9 clicked
Resume on approvalqueued recipients re-route to WA on Meta approval webhook
📋 Audit log
2026-05-08 09:14 ICT · Template welcome-dental-v3 submitted to MetaPR2 staff_marketing_lead
2026-05-08 09:14 ICT · Drip paused on WhatsApp channel · failover engagedsystem
2026-05-08 09:15 ICT · Email failover started · batch-1 of 247system
2026-05-10 14:23 ICT · 2d in queue · A4 notified for follow-upsystem
✗
A4 editorial rejected campaign copy
Reason: "Implies guaranteed clinical outcome" · banned-phrase line 12 · revise + resubmit to clear editorial review.
A4_REJECTED
Why this exists: ArokaGO editorial guardrails block claims that imply clinical guarantees — these expose the platform to advertising-standards complaints in TH, EU, and JP markets. A4 reviews every drip campaign before launch · median turnaround 4h.
🔍 Rejected line · context
Line 12 · template body
"Our 4-implant solution will give you a perfect smile guaranteed for 25 years."
Banned phrases detected: "perfect smile guaranteed", "guaranteed for 25 years"
AI suggestion · compliance-safe
"Our 4-implant solution is designed for long-lasting results — many of our patients enjoy their restorations for 20+ years with proper care."
Removes guarantee language · adds qualifier · individual-outcome safe.
📋 Editorial audit log
2026-05-10 09:14 ICT · Campaign submitted to A4 review queuePR2 staff_marketing_lead
2026-05-10 13:42 ICT · A4 reviewer assigned · staff_a4_linasystem
2026-05-10 14:23 ICT · Rejected · banned-phrase line 12A4 staff_a4_lina
ETA on resubmit · 2-4h editorial turnaroundSLA
📊 Insight events emitted
drip.rate_limit_hit · drip.cap_overridden · channel.paused · failover.email_engaged · a4.template_rejected · a4.template_resubmitted — feeds Compliance H rate-limit dashboard + Trust & Safety editorial throughput SLO.
🔐 Foundation primitives
Compliance H (rate-limit + cap enforcement · spec L136) · Growth H (drip throttling resilience · spec L147) · Trust & Safety (A4 editorial reject path · banned-phrase guardrails) · Identity (PR1 override authorization).
📋 SCENARIO
Patient (P1) clicks "Stop all marketing across all providers" and lands here for confirmation. A 4-channel × 6-category matrix shows exactly what is now off (promotions, drips, newsletters) and what stays on (booking, refunds, account/security), with an aggregated reason code feeding back to providers as anonymized fatigue insight.
EDGE STATE · CROSS-PROVIDER OPT-OUT · CONFIRMATION
You're unsubscribed from all marketing
P1 lands here after clicking "Stop all marketing across all providers" in p31 or m41. Effective immediately · cross-provider persistence · GDPR/PDPA-grade audit.
✓
You're unsubscribed from all marketing
Effective immediately · no further marketing sends from any provider on ArokaGO · transactional and account alerts (deposits, refunds, booking changes) continue uninterrupted.
OPTOUT_ALL_LIVE
📋 What's now off · what's still on4 channels × 6 categories
Marketing-class messages are off across every channel. Transactional messages (deposits, refunds, booking changes, account security) are unaffected — they're a separate compliance class.
| Category |
Email |
WhatsApp |
LINE |
Push |
| Promotions & offers drips, deals, seasonal campaigns |
✗ |
✗ |
✗ |
✗ |
| Newsletters & editorial provider stories, treatment digests |
✗ |
✗ |
✗ |
✗ |
| Re-engagement / drip post-quote follow-ups, win-back |
✗ |
✗ |
✗ |
✗ |
| Booking confirmations slot confirmed, deposit, rescheduled |
✓ |
✓ |
✓ |
✓ |
| Refunds & payment alerts deposit captured, refund issued |
✓ |
✓ |
✓ |
✓ |
| Account & security password reset, MFA, suspicious login |
✓ |
✓ |
✓ |
✓ |
Legend: ✗ opted-out (no further sends) · ✓ still on (transactional · cannot be opted out per terms of service).
💬 Reason captured
You selected: "Too many emails — I'm overwhelmed". This feeds back to the affected providers as aggregated insight only (never linked to your identity) so they can recalibrate cadence.
FATIGUE
↺ Changed your mind?
You can restore marketing at any time — fine-grained or all-at-once. The standard 90-day cooldown is waived for resubscribe so you don't have to wait.
📋 Audit log
This action was logged · 2026-05-09 14:22 ICT · auditable per GDPR Art. 7(3) · PDPA Sec. 24 right-to-withdraw-consent.
Action IDOPTOUT-ALL-2026-05-09-A8F2
Triggered byP1 patient_3142 · IP 124.122.x.x · Bangkok
Effective2026-05-09 14:22:08 ICT · immediate · ledger sealed
Audit hash9b3c4e7d…
Affected providers7 providers in your subscription history · all notified at provider-level only (no PII)
🔐 Compliance H · cross-provider opt-out persistence
Per
Compliance H · cross-provider opt-out persists
indefinitely until you resubscribe. New providers you discover and engage in the future also inherit this opt-out by default — they cannot bypass it. See
privacy policy → s26.
🔐 Foundation primitives
Compliance H (opt-out confirmation + audit trail · GDPR Art. 7(3) · PDPA Sec. 24) · Trust (cross-provider persistence · transactional class isolation) · Notifications (Novu suppression list propagation across all channels).
📊 Insight events emitted
consent.optout_all · consent.reason_captured · reason=fatigue · consent.cross_provider_persisted · audit.confirmation_generated — feeds Compliance H opt-out-rate dashboard + provider-level cadence-health insight (aggregated, no PII).
📋 SCENARIO
Provider (PR1 or PR2) on Free tier tries to add a 31st service and hits the hard quota cap (30 services). The page surfaces the quota meter at 100%, a tier comparison showing Pro/Premium/Enterprise unlimits, three escape routes (upgrade, deactivate one, defer), and previews of other quotas approaching limit.
EDGE STATE · QUOTA-EXCEEDED · /dashboard/services/new
Service limit reached
PR2 (or PR1) attempted to add a 31st service · Free tier caps at 30 · grace-period UX surfaces with tier-aware upgrade prompt per subscription.md:152.
✓ Wedge I live · Quota enforcement · grace-period UX
Quota guardrails enforce per-tier maxima · existing data preserved · downgrade path is non-destructive (read-only retention).
🚫
Service limit reached · Free tier allows 30 services
You have 30 active · adding more requires upgrade. Your data is preserved · upgrade anytime to unlock more capacity · grace period: services already created stay accessible read-only if downgraded later.
QUOTA_30_OF_30
Quota meter · max_services30 / 30 · 100%
Pro tier: unlimited · Premium tier: unlimited · Enterprise: unlimited.
📋 Tier comparison · max_servicesyour tier highlighted
| Tier |
max_services |
monthly |
| Free YOU |
30 |
$0 |
| Pro |
unlimited |
$99 |
| Premium |
unlimited |
$299 |
| Enterprise |
unlimited |
contact sales |
📊 Other quota usage · Free tierPro tier lifts these to ∞
max_packages · close to limit4 / 5 · 80%
max_active_campaigns · headroom0 / 3 · 0%
max_drip_sequences · half-used1 / 2 · 50%
📊 A2 telemetry footer · tier-conversion analytics
This prompt logged for tier-conversion analytics (no PII). Events: tier.quota_exceeded · resource=services · current_tier=free · target_tier=pro · feeds A2 conversion-funnel dashboard.
🔐 Foundation primitives
Subscription (quota enforcement · grace-period UX per subscription.md:152) · Insight (tier-conversion telemetry · A2 funnel) · Identity (PR1 vs PR2 upgrade authority gating).
📋 SCENARIO
Provider marketer (PR2) finds three campaigns paused after auto top-up failed — issuer card decline, daily FX limit, or expired card. Each variant explains the issuer-side reason code and recovery (update card, retry tomorrow), with self-approve top-ups under $1k and a PR1 approval gate above the threshold.
EDGE STATE · 3 FAILURE-REASON VARIANTS · /dashboard/ads/billing
Ad budget depleted · 3 campaigns paused
PR2 sees auto top-up failure · campaign paused · failure-reason explainer · manual top-up CTA · large top-ups (> $1k) routed to PR1 approval gate per advertisement.md:121-126.
✓ Wedge I live · Auto-recharge failure handler · PR1 approval gate
Campaigns auto-pause when balance ≤ $0 · failure-reason classifier surfaces issuer-side cause · payment-method recovery flow + manual top-up with PR1 gate above $1k threshold.
⛔
Ad budget depleted · auto top-up failed
3 campaigns paused · auto top-up failed (Visa ****4242 · declined by issuer 2026-05-09 14:23 · suspected fraud-flag) · campaigns will resume when balance > $0.
CARD_DECLINED
Issuer response: do_not_honor (R-05) · suspected fraud-flag · most common when issuer hasn't seen this merchant before. Solution: update card or manual top-up · alternative: increase auto-recharge cap with issuer.
⚠
Ad budget depleted · daily FX limit hit
3 campaigns paused · auto top-up declined (Mastercard ****8821 · foreign-exchange daily limit reached for THB→USD on issuer side · 2026-05-09 14:23) · campaigns resume on balance > $0.
FX_LIMIT_HIT
Issuer response: withdrawal_count_limit_exceeded (R-65) · daily international FX cap hit on issuer side. Solution: retry tomorrow · pay via local rail (Kbank) · or call issuer to lift cap.
📅
Ad budget depleted · card on file expired
3 campaigns paused · auto top-up failed (Amex ****3007 · expired 04/2026 · 2026-05-09 14:23) · campaigns resume on balance > $0.
CARD_EXPIRED
Issuer response: expired_card (R-54) · expiration date passed. Solution: update card on file · reissued card may have new number — update the full PAN, not just exp.
📋 Affected campaigns · 3 pausedresume once balance > $0
"Bangkok dental — May seasonal"daily cap $80 · paused since 2026-05-09 14:23 ICT
Resume on top-up →
"Featured-provider boost · Phuket"daily cap $40 · paused since 2026-05-09 14:23 ICT
Resume on top-up →
"Search-rank lift · implants Q2"daily cap $120 · paused since 2026-05-09 14:23 ICT
Resume on top-up →
🔐 PR1 approval gate · top-ups > $1,000RBAC_GATE
Top-ups above the threshold route to PR1 (provider owner / authorized billing approver). Sarah Khan is the on-file PR1 for this org · ETA 24h business · approval link emailed + LINE Notify push. Audit log captures: requester (PR2) · amount · timestamp · approval/decline reason.
Threshold$1,000 USD per single top-up
Routed PR1sarah.khan@bangkokdental.co · Owner
ChannelsEmail · LINE Notify · in-app inbox
Audit IDTOPUP-APPR-2026-05-09-1500-9F2A
💡 Why did this happen?
Most common: card issuer flagged auto-recharge as suspicious activity (especially for first-time international ad-spend merchants) · Solution: update card, retry, or do a manual top-up to "warm up" the issuer. Alternative: increase auto-recharge cap with your issuer (most issuers raise the cap on a single phone call once you confirm the merchant).
Current: balance triggers refill at $50 · refill amount $200 · max attempts 3 / 24h · failure handler escalates to manual top-up + PR1 if > $1k.
📊 Insight events emitted
ads.balance_depleted · ads.auto_topup_failed · reason=card_declined · campaign.paused · count=3 · topup.pr1_approval_requested — feeds Wedge I billing-health dashboard + admin ad-spend reconciliation.
🔐 Foundation primitives
Advertisement (failure handler · auto-pause · resume-on-balance) · Commerce (payment-method recovery flow) · Compliance (audit log of approval gates) · Identity (PR1 RBAC gate above threshold).
📋 SCENARIO
Provider (PR1/PR2) on Pro tier opens a Premium-only feature (demand forecasting, AI sales associate, custom reports, multi-branch rollups) and lands on the gated preview. A blurred dashboard mock plus centered upgrade card explains what the upgrade unlocks, with per-feature dismissal so the prompt isn't repeated.
EDGE STATE · 4 FEATURE VARIANTS · CLICK TO SWITCH · /dashboard/insight/forecast
Tier-required feature locked
PR1 / PR2 on Pro tier attempted to access a Premium-only feature · cross-cutting tier-eligibility modal surfaces · this is the dedicated states.html demonstration of the pr24 pattern.
✓ Wedge I live · Tier eligibility check pattern · cross-cutting reusable
Eligibility-check pattern per subscription.md:133 · greyed dashboard mock + scrim + centered upgrade card · anti-fatigue per-feature dismissal.
Pick a locked feature to preview the gate
Demand forecasting · Bangkok dental · 90-day outlookMAPE 14.2%
30-day forecast
+18% inquiries
60-day forecast
+24% inquiries
90-day forecast
+31% inquiries
By procedure × city × season · trained on 12+ months · provider-level + market-level signals.
AI sales associate · live inquiries14 active
Pat · BKK · "How long is recovery for full-arch?"AI drafted reply: "Most patients return to soft food in 2-3 days · full healing in 4-6 months. Your case is similar to 87% of our recent patients in your age range…"
Lin · Tokyo · "Total cost in JPY?"AI drafted reply: "Estimated ¥420,000-¥480,000 incl. consultation, all-on-4 implant, crown, and 2 follow-ups…"
Custom report builderDRAG · DROP
+ Drag dimension
+ Drag metric
+ Drag filter
Schedule: weekly · CSV / PDF / API webhook · share with team or export to BI tool.
Multi-branch rollups · 7 branchesCONSOLIDATED
| Branch | Inquiries | Bookings | Revenue |
| BKK · Sukhumvit | 412 | 87 | $48k |
| BKK · Silom | 298 | 54 | $31k |
| Phuket · Patong | 186 | 42 | $24k |
| All branches | 1,420 | 312 | $184k |
📊 A2 telemetry footnote · conversion-funnel logging
Logged on each gate impression:
tier.block_event · feature=demand_forecasting · current_tier=pro · target_tier=premium · also:
tier.dismiss_per_feature · feature=... on anti-fatigue checkbox · feeds A2 conversion-funnel analytics + per-feature gate-throughput SLO (per
a67).
🔐 Foundation primitives
Subscription (eligibility check pattern · states-page reference · per subscription.md:133) · Insight (A2 telemetry on conversion funnel) · Trust (anti-fatigue per-feature dismissal · upgrade-pressure throttling per wedge spec risk row 1).
📋 SCENARIO
Patient (P1.window window-shopping from Germany) opens Pharmacy search, but the archetype isn't licensed in DE because of Schedule II controlled-substance and BtMG §3 restrictions. The page suggests the three live archetypes available in DE (Healthcare, Diagnostic, Insurance) and captures a notify-me waitlist for launch.
EDGE STATE · ARCHETYPE NOT LICENSED · /search/pharmacy?country=DE
This archetype isn't yet available in your country
P1.window in a jurisdiction where the chosen archetype isn't licensed · generic header + specific reason chip + alternative-archetype suggestion + notify-me on launch · per-archetype regulatory overlay reference per a48.
✓ Wedge J live · per-jurisdiction archetype availability varies
Archetype gate fires before any product surfaces · Compliance regulatory overlay (per J-archetype-expansion.md:36) determines licensing footprint per country · alternative-archetype suggestion routes to live archetypes only.
🌍
Pharmacy archetype not yet licensed for your country
You're browsing from Germany (DE). We can't surface Pharmacy products here yet · the other 3 archetypes (Healthcare, Diagnostic, Insurance) are live in your country.
ARCHETYPE_NOT_LICENSED
SPECIFIC REASON
Pharmacy controlled-substance (Schedule II)
Schedule II controlled substances aren't licensed for cross-border delivery to DE from Thailand-based pharmacies under BtMG §3 + customs cold-chain + counterfeit-prevention requirements per J-archetype-expansion.md:133. Non-controlled OTC pharmacy is also out of v1 international scope.
🔁 Available archetypes in your country3 of 4 live in DE
🩺Healthcare
In-country + cross-border procedures · 412 providers serve DE patients.
🧪Diagnostic
Sample-by-mail labs licensed in DE · 28 partners with EU customs cleared.
🛡️Insurance
Travel-medical + supplemental products approved by BaFin for DE residents.
📬 Notify me when Pharmacy launches in DE
We'll email you the moment Pharmacy archetype clears regulatory footprint in your country · no spam · you can unsubscribe anytime.
Stored in archetype_launch_waitlist · country=DE · archetype=pharmacy · feeds A2 demand-signal forecast.
🔐 Compliance disclosure · per-archetype regulatory overlay
Per-archetype regulatory overlay (per
a48 Compliance audit chain) · v1 footprint: Healthcare (global) · Diagnostic (EU + SEA + select USA states) · Insurance (per-state OIC + BaFin + EU IDD overlays) · Pharmacy (Thailand domestic only · cross-border deferred per
J-archetype-expansion.md:133). Footprint expands as licenses clear.
🔐 Foundation primitives
Compliance (per-archetype regulatory overlay · J-archetype-expansion.md:36) · i18n (country detection + locale-bound disclosure) · Trust J (transparent footprint disclosure).
📋 SCENARIO
Patient (P1.window or P1.a) selects a travel-medical-evac insurance product not yet approved in their jurisdiction. The default variant shows OIC-pending status with expected Q3 2026 approval; the rare AML/sanctions variant routes to compliance review with A1 mediation per compliance.md:42.
EDGE STATE · 2 BLOCK VARIANTS · CLICK TO SWITCH · /insurance/product/travel-medevac
This insurance product isn't yet approved in your state / country
P1.window or P1.a attempting to purchase Insurance product not approved in their state · regulatory-block default + sanctions-trigger fallback (rare path) per compliance.md:42.
✓ Wedge J live · per-archetype regulatory states
Insurance regulator-overlay fires before checkout · OIC / BaFin / state DOI overlays per jurisdiction · sanctions/AML fallback diverts to compliance message + A1 mediation per compliance.md:42.
Pick a block reason to preview the gate
📋
Travel-medical-evac product pending OIC approval
You selected Travel-medical evacuation with non-resident applicant in Thailand. This product is pending OIC approval for non-resident applicants · we expect approval Q3 2026.
OIC_PENDING
SPECIFIC BLOCK
OIC filing · non-resident scope
Travel-medevac product is approved for Thai-resident applicants only · non-resident scope filed with OIC 2026-02-14 · ref OIC-NR-2811 · estimated approval window Q3 2026 · alternative products available now.
🔁 Approved alternatives in Thailand · non-resident applicant
Travel-medical (basic) · OIC approved$60-$420 · covers ER + hospital + repatriation cap $50k
Compare →
Trip-cancellation supplement · OIC approved$28-$140 · covers cancellation + delay + lost-baggage
Compare →
Procedure-complication rider · OIC approved$120-$680 · covers post-op complication treatment up to 90 days
Compare →
📞 Regulator-contact info · for transparency
If you'd like to verify product status with the regulator directly: Office of Insurance Commission Thailand (OIC) · +66 2 515 3995 · info@oic.or.th · cite filing ref OIC-NR-2811.
📬 Notify me on approval
We'll email you the day OIC approves non-resident scope · stored in insurance_approval_waitlist · product=travel_medevac · jurisdiction=TH-NR.
⛔
Compliance review required · we cannot complete this purchase online
Per our Compliance partner (Refinitiv per J-archetype-expansion.md:132) some details from your application matched a sanctions/AML watchlist · we need to verify with you before proceeding · this is rare and often a name-similarity false positive.
SANCTIONS_REVIEW
What happens next:
- An A1 compliance specialist contacts you within 24h for a brief identity verification call.
- Most flags clear in < 1 business day · purchase resumes from where you stopped.
- If we cannot verify, we'll refund any holds and remove the application from queue.
Logged to Compliance audit chain per compliance.md:42 · sanctions_event · provider=refinitiv · disposition=pending_review.
🔐 Foundation primitives
Compliance (sanctions/AML overlay · per-jurisdiction insurance overlay · OIC / BaFin / state DOI per compliance.md:42 + J-archetype-expansion.md:132) · Trust J (transparent block reason + regulator contact) · A1 mediation pipeline.
📋 SCENARIO
Patient (P1.b) ordered a diagnostic test and the courier confirms specimen loss between BKK hub and lab. The page surfaces a tracker with a red ✗ at the lost step, an auto-issued refund, free re-collection with pickup-window selector, and an A1 mediation CTA for time-sensitive cases.
EDGE STATE · SPECIMEN LOST · /diagnostic/order/dx-7741/tracker
Your specimen was lost in transit
P1.b who ordered a diagnostic test where sample-logistics tracker shows lost-in-transit · auto-refund + free re-collection + A1-mediation CTA · sample-loss event logged to Compliance audit chain.
✓ Wedge J live · per-archetype regulatory states
Sample-loss event auto-issues refund per
pr88 sample-loss policy · free re-collection offered with pickup window selector · audit-log entry written to Compliance chain (per
a48).
✗
Order DX-7741 · specimen lost between courier hub and lab
Last scan 2026-05-08 19:42 ICT · BKK courier hub · subsequent hub-to-lab leg never registered arrival · partner courier confirmed loss 2026-05-09 14:10. We've already issued your refund + arranged free re-collection per pr88 sample-loss policy.
SPECIMEN_LOST
📦 Sample logistics tracker · Order DX-77413 of 4 steps completed before loss
✓
Pickup at home
2026-05-08 09:14 ICT
Courier · Lalamove DX-7741
✓
Courier hub · BKK
2026-05-08 19:42 ICT
Last successful scan
✗
Hub → Lab transfer
LOST · expected 2026-05-09 06:00
Courier confirmed loss 14:10
—
Lab analysis
Never reached
Bumrungrad partner lab
💸
Refund issued automatically · $148.00
Per pr88 sample-loss policy · arrives in 3-5 business days · ref RF-DX-7741-202605
AUTO_REFUND_ISSUED
Refund breakdown: Test fee $128.00 · Pickup fee $20.00 · Total $148.00 to original payment method (Visa ****4242) · audit-log entry written.
🔄
Free re-test · we'll arrange a new collection
No charge · pickup at home · upgraded courier route · pick a window below
FREE_RECOLLECTION
🤝
Want to escalate? Speak with A1.
If the auto-refund + re-test path doesn't fit your situation (urgent test · time-sensitive diagnosis · provider concern) · A1 mediation responds within 24h.
Speak with A1 · 24h response
🔐 Compliance disclosure · sample-loss event logged to audit chain
Logged to Compliance audit chain (per
a48):
sample_loss_event · order=DX-7741 · last_scan=2026-05-08T19:42+07 · disposition=lost_hub_to_lab · refund=auto_issued · re_collection=offered. Aggregated to A2 courier-quality scorecard · feeds Diagnostic accountability metrics per
pr88 sample-loss policy.
🔐 Foundation primitives
Commerce J (refund flow · auto-issued without ticket) · Compliance (audit chain · sample-loss event logging) · Trust J (Diagnostic accountability · transparent loss disclosure + free re-test).
📋 SCENARIO
Patient (P1.b active traveler) loses connectivity mid-trip on the mobile PWA. The app falls back to reduced functionality — cached trip vault, prescriptions, and chat history stay readable while search, payment, and live chat are blocked; queued messages and KYC uploads sync the moment connectivity returns.
EDGE STATE · MOBILE OFFLINE · /mobile · network=offline
📡 You're offline · reduced functionality
Mobile-shaped reduced state · trip vault + cached chat available · search/payment/live chat blocked · queued actions sync on reconnect. Reuses pattern from s94 but mobile-specific (375px frame · K-spec capability #4).
📡 Offline · reduced functionalityLast synced 2h 14m ago · cached data available · live features blocked.
🔄 Reconnecting…Probing network · queued actions will replay if successful.
✓ Back online3 queued actions synced · 1 chat draft sent · trip vault updated.
✓ Available offline
✓ Trip itinerary (cached 2h 14m ago)
✓ Documents (passport · visa · insurance card)
✓ Cached chat (last 30 days)
✓ Prescription list + emergency contacts
✗ Not available offline
✗ New search
✗ Payment / checkout
✗ Live chat (will queue)
✗ Video / live broadcast
📤 Queued for sync
• 3 messages will send when you reconnect
• 1 review draft saved locally
• 1 KYC step pending upload
📋 SCENARIO
Patient (P1.a) tapped "Don't ask again" on the PWA install prompt and later visits Settings. The page respects the dismissal (no nags), provides a re-enable affordance, a browser-menu fallback, and a "Why install" reminder covering offline vault, push, faster launch, and biometric sign-in.
EDGE STATE · PWA INSTALL · /mobile/settings · prompt=dismissed_permanent
PWA install prompt dismissed permanently
User chose "Don't ask again" on the install prompt · respect that choice but provide a re-enable affordance in settings (no nags).
📵
PWA install dismissed permanently
You won't see install prompts again on this device. You can re-enable from settings any time, or just install from your browser menu.
✓ Install prompt re-enabledIt will reappear on your next session if your device meets the install criteria (engagement + HTTPS + manifest).
✓ ArokaGO installedOpen from your home screen · launch is 2× faster than browser tab.
Why install?
📦 Offline trip vault works without connection
🔔 Push notifications for slot reminders + chat
⚡ 2× faster launch from home screen
👁 Biometric sign-in (Face ID · Touch ID)
📋 SCENARIO
Patient (P1.a) declined the OS-level push permission prompt on first install. The app cannot prompt again, so it surfaces alternative notification channels (email, SMS) and per-OS re-enable instructions for iOS, Android, and PWA, with deep-links into the right Settings screen.
EDGE STATE · PUSH DENIED · /mobile/notifications · permission=denied
🔕 Push notifications disabled
User denied OS-level notification permission · ArokaGO cannot prompt again · provide alternative channels (email/SMS) and per-OS re-enable instructions.
🔕
Push notifications disabled
You'll miss slot reminders · doctor messages · refill prompts. Re-enable from your device settings or use email/SMS instead.
📱 iOS · re-enable
1. Open Settings app
2. Scroll to ArokaGO
3. Tap Notifications
4. Toggle Allow Notifications on
Open Settings app →
🤖 Android · re-enable
1. Long-press the ArokaGO app icon
2. Tap App info
3. Tap Notifications
4. Toggle each channel on
Open app info →
🌐 PWA · re-enable
1. Click the lock icon in the URL bar
2. Open Site Settings
3. Set Notifications to Allow
4. Reload the page
📨 Use alternative channels instead
Slot reminders + doctor messages + refill prompts can also reach you via email and SMS.
AUDIT_LOGGED
Notification preference change recorded · notif_pref · push=denied · email=on · sms=on · ts=2026-05-09T14:22+07
📋 SCENARIO
Patient (P1.a) fails Face ID three times in a row (poor lighting, angle, or post-iOS-update mismatch). The app falls back to password sign-in and offers a re-enroll affordance after success; 5+ failures escalate to an A1 suspicious-login review and link to the s96 suspended path.
EDGE STATE · BIOMETRIC FAIL · /mobile/signin · biometric_fails=3
👁 Face ID failed 3 times · use password instead
After N biometric failures, fall back to password sign-in · offer re-enroll affordance post-sign-in · escalate to A1 suspicious-login at 5+ failures.
👁
Face ID failed 3 times
Lighting · angle · or recent iOS update can affect Face ID. Sign in with your password instead.
💡 After signing in
Set up Face ID again? Some users re-enroll after iOS updates.
Re-enroll Face ID →
FAIL_COUNT=3
5+ biometric failures triggers A1 suspicious-login review · cross-link to s96 suspended state.
⚠ 5+ biometric failures · suspicious-login flagAccount temporarily protected · A1 suspicious-login review triggered · email + SMS verification required to proceed →
s96
✓ Signed in via passwordWelcome back · biometric fail count reset · re-enroll Face ID anytime from settings.
📋 SCENARIO
Patient (P1) declines on-camera consent right before joining a live clinic broadcast. The broadcast is blocked, the screen captures an optional anonymous reason chip, offers a recorded 18-minute clinic tour as a fallback, and auto-notifies the provider so they can suggest one-on-one consult or recorded Q&A.
EDGE STATE · CONSENT DENIED · /mobile/live · consent=declined
🎙 On-camera consent declined
User declined live-broadcast consent · cannot proceed with broadcast · offer recorded-tour fallback · provider notified to suggest alternative scheduling.
✗
Cannot proceed with live broadcast
On-camera consent is required for live broadcasts · we respect your choice · offering you a recorded alternative below.
Tell us why · optional
Helps providers improve the experience · 100% anonymous.
📺 Watch a recorded tour instead
Bumrungrad's 18-minute clinic tour was recorded last week with the same surgical team.
Watch recorded tour →
📩 Provider notified
Bumrungrad has been auto-notified · they'll offer alternative scheduling (one-on-one consult or recorded Q&A).
✓ Reason sharedThanks · feedback aggregated to provider · helps improve consent UX.
✓ Rerouted to recorded tourNow watching Bumrungrad recorded clinic tour · 18 min · captions available in 16 languages.
📋 SCENARIO
Patient (P1.b) is browsing on slow 3G (~80 KB/s) and the PWA auto-switches to lite mode to keep core flows usable. Image quality drops to 320px, video is disabled, auto-translate uses cached strings only, and forms/search/text-chat stay full; manual override is offered with a data-cost warning.
EDGE STATE · NETWORK DEGRADED · /mobile · network=slow_3g · lite_mode=auto
📶 Slow network · using lite mode
Detected slow 3G · auto-switched to lite mode to keep core flows usable · image quality reduced · video disabled · auto-translate uses cached strings only.
📶 Slow network · using lite mode2G/slow 3G detected (≈80 KB/s). Image quality reduced · video disabled · auto-translate cached only.
⚠ Forced full mode on slow networkPages will load slowly · video may stall · this can use 5-10× more data than lite mode.
✓ Network recovered · back to full modeNow on stable Wi-Fi · all features restored · video re-enabled.
Auto-degraded features
📷 Image qualityREDUCED · 320px
🎥 Video / live streamsDISABLED
🌐 Auto-translateCACHED ONLY
💬 Live chatTEXT-ONLY
📝 Forms · searchFULL
Manual override
Force full mode if you need video or HD images · uses 5-10× more data · may stall on slow connections.