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.
25Empty / 503 / 404 trio
representative
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.
23Filter zero · 0 results due to filter combination
representative · most-hit empty state
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.
93Maintenance (scheduled vs incident)
arokago.com/maintenance
🛠

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.
94Offline PWA state
arokago.com/offline
📡

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.
95Geo-blocked / unavailable in region
arokago.com/unavailable
🌍

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.
96Account suspended
arokago.com/suspended

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
  1. Review the specific posts flagged (3 items)
  2. Submit your response within 14 days
  3. 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.
26Legal — Privacy / Terms / Cookies / DPA / DSAR / SCC / Refund (F core launch blocker)
arokago.com/legal/privacy
LEGAL DOCUMENTS · F core launch blocker
🇪🇺 / 🇹🇭 / 🌍 This document applies to: EU · Thailand · international patients.
⚙ Manage your consents →
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
Frankfurt
🇹🇭
TH/SEA
Bangkok
🇸🇬
APAC
Singapore
🇺🇸
US
N. Virginia
🌍
Global
CDN edge
EU patient data → Frankfurt. Thai PDPA data → Bangkok. APAC residents → Singapore. US patients → N. Virginia. Static assets only at global edge.

4. Cookies & tracking

🔗

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.

CategoryPurposeRetentionOpt-out
EssentialSign-in, CSRF, region routingSessionRequired
FunctionalLocale preference, saved providers12 monthsON
AnalyticsPostHog · funnel + heatmaps26 monthsON
AdvertisingNone at F (no ad tech)OFF

5. DPO & contact

🔗

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.
10Slot conflict (sold-out · held · race · sync drift)
Wedge G · spec L31 + L134
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
Suggested alternatives
Jun 12 · 11:00 · Dr. Pongsak T.Hold this slot →
Jun 12 · 14:30 · Dr. Pongsak T.Hold this slot →
Jun 13 · 09:00 · Dr. Sirikul N. (similar specialty)Hold this slot →
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 captured
Stripe held both holds · race detected by commerce reconciler
14:23:14 · Provider calendar checked
First-write-wins · timestamp arbitrates · A1 sync-monitor paged
~14:28 · Resolution + email
Loser 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.
11Payment-rail-down booking failure (Stripe · PayPal · Kbank · 3DS · sanctions)
Wedge G · payment resilience
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.
12Photo-consent revocation propagation (24h ledger sweep)
Wedge G · spec L110 acceptance #6
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.
13Google Business Profile API failure (OAuth · token · rate-limit · policy)
Wedge G · spec L138 risk + L120 open question
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.
22Booking blocked by KYC tier · explain + path forward
Wedge G · compliance gate · feeds p44 → p74
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.
14Drip rate-limit · channel paused · template rejected
Wedge H · spec L136 cap + L147 risk
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
+ 15 more recipients hidden · show all 18
🚫
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.
15Opt-out-all confirmation · cross-provider marketing stop
Wedge H · Compliance H · GDPR/PDPA Art. X
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.
16Quota exceeded · tier upgrade prompt
Wedge I · subscription.md:152 grace-period
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.
17Ad budget depleted · campaign paused · auto top-up failed
Wedge I · advertisement.md:121-126 + PR1 gate
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).
⚙️ Auto-recharge settingsAdjust thresholds → pr67
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.
18Tier-required feature locked · Premium-only feature accessed by Pro user
Wedge I · pr24 pattern · subscription.md:133
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.
🔒
Demand forecasting requires Premium

Forecast your inquiries 30 / 60 / 90 days out by procedure × city × season · trained on 12+ months of platform data · MAPE 14.2% accuracy.

PRO → PREMIUM
What Premium adds:
  • + Demand forecasting (this feature)
  • + AI sales associate
  • + 1.4× ranking boost
  • + $200/mo ad credit · 3% commission rate (vs 4% on Pro)
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…"
🔒
AI sales associate requires Premium

AI drafts personalized replies to inbound inquiries · trained on your provider voice + procedure catalog · PR2 reviews and sends · 3× faster reply time observed in pilots.

PRO → PREMIUM
What Premium adds:
  • + AI sales associate (this feature)
  • + Demand forecasting
  • + 1.4× ranking boost
  • + $200/mo ad credit · 3% commission rate
Custom report builderDRAG · DROP
+ Drag dimension
+ Drag metric
+ Drag filter
Schedule: weekly · CSV / PDF / API webhook · share with team or export to BI tool.
🔒
Custom report builder requires Enterprise

Drag-drop dimensions × metrics × filters · schedule weekly · CSV / PDF / API webhook · BI-tool integration. For multi-branch / multi-org orgs that need to slice data their own way.

PRO → ENTERPRISE
What Enterprise adds (over Premium):
  • + Custom report builder (this feature)
  • + Multi-branch rollups
  • + Dedicated account manager
  • + SLA-backed support · negotiated commission
Multi-branch rollups · 7 branchesCONSOLIDATED
BranchInquiriesBookingsRevenue
BKK · Sukhumvit41287$48k
BKK · Silom29854$31k
Phuket · Patong18642$24k
All branches1,420312$184k
🔒
Multi-branch rollups requires Enterprise

Consolidate inquiries · bookings · revenue · ratings across all your branches into one dashboard. Drill down per branch · roll up to org level · export consolidated reports.

PRO → ENTERPRISE
What Enterprise adds (over Premium):
  • + Multi-branch rollups (this feature)
  • + Custom report builder
  • + Dedicated account manager
  • + SLA-backed support · negotiated commission
📊 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.
19Archetype unsupported in jurisdiction · Pharmacy controlled-substance
Wedge J · per-jurisdiction archetype availability varies
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.
20Insurance regulatory-block · product not approved in jurisdiction
Wedge J · per-archetype regulatory states
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:
  1. An A1 compliance specialist contacts you within 24h for a brief identity verification call.
  2. Most flags clear in < 1 business day · purchase resumes from where you stopped.
  3. 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.
21Diagnostic specimen lost in transit · auto-refund + free re-test
Wedge J · per-archetype regulatory states
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.
40Mobile offline · reduced functionality ✓ WEDGE K LIVE
Wedge K · mobile/PWA edge state
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 functionality
Last synced 2h 14m ago · cached data available · live features blocked.
✓ 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.
41PWA install dismissed permanently · re-enable from settings ✓ WEDGE K LIVE
Wedge K · mobile/PWA edge state
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.
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.
42Push notification denied · alternative channels ✓ WEDGE K LIVE
Wedge K · mobile/PWA edge state
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 →
📨 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.
43Biometric auth failed 3 times · password fallback ✓ WEDGE K LIVE
Wedge K · mobile/PWA edge state
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.
Sign in with password
Sign in → Forgot password?
💡 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.
📋 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.
44Live-stream consent denied · alternative offered ✓ WEDGE K LIVE
Wedge K · mobile/PWA edge state
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).
📋 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.
45Mobile network-degraded · lite mode ✓ WEDGE K LIVE
Wedge K · mobile/PWA edge state
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 mode
2G/slow 3G detected (≈80 KB/s). Image quality reduced · video disabled · auto-translate cached only.
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.