The app itself builds and runs fine — the copy pass and price points are client-side. The purchase path is dead three times over, and each block is independent:
| Layer | State | Effect in TestFlight |
|---|---|---|
| ASC agreement | MISSING Paid Applications Agreement not accepted | StoreKit returns an empty product list — even sandbox purchases on a beta build are blocked until it shows Active |
| ASC products | MISSING ela.essential.weekly / .monthly / .annual don't exist yet | Paywall renders fallback "≈ AED" prices; Subscribe fails with product-not-found |
| Prod API | NOT DEPLOYED prod is at 43e874a1 (24 Aug); POST /v1/subscription/apple/verify and /v1/webhooks/appstore return 404 (verified live today); pay-005 migrations are staging-only; no .p8 / root-cert env on the VPS | Even a successful purchase could never be verified — nobody gets entitled |
One more nuance for a copy-review build: server-authored strings come from the live API, so the plan-interstitial proof line still says "CBUAE-licensed insurance partner" in TestFlight until the API is deployed. Everything scrubbed client-side (welcome, how-it-works, steps 3/4/5/10, 999) shows correctly.
EXPO_PUBLIC_ELA_IAP_DISABLED=1 in the testflight-internal profile — the paywall falls back to the existing Stripe checkout path that current builds use. No ASC work needed..p8 key on the VPS, then sandbox drills. A1+A2 are the long pole — start them first.Nothing IAP works — not even sandbox purchases on the beta app — until this shows Active.
The 15% rate starts 15 days after the end of the Apple fiscal month in which approval lands — enrolling now, pre-launch, makes the lag irrelevant. That's why it's P0.
https://api.ela.now/v1/webhooks/appstore (note the /v1 — corrected 27 Aug; the old runbook line missed it) + the staging URL engineering gives you, version 2. Engineering can do this step..p8 once (it can never be re-downloaded), note Key ID + Issuer ID, hand all three to engineering over a secure channel. Goes root-only on the VPS like the APNs key.ASC → Users and Access → Sandbox → Test Accounts → +. Fresh email alias (e.g. stevan+elasandbox1@…), region United Arab Emirates so sandbox prices render in AED. Never sign a real device's main Apple ID in with it — enter it only when a StoreKit sandbox sheet prompts.
ASC → Apps → ELA → Monetization → Subscriptions.
Reference Name ELA Essential Membership → open it → add an English localization: Display Name ELA Membership (what members see in iOS Settings → Subscriptions) · App Name Display Option "Use App Name".
| Field | Weekly | Monthly | Annual |
|---|---|---|---|
| Reference Name | Essential Weekly | Essential Monthly | Essential Annual |
| Product ID | ela.essential.weekly | ela.essential.monthly | ela.essential.annual |
| Duration | 1 Week | 1 Month | 1 Year |
| Price (UAE, AED) | 24.99 | 79.99 | 749.99 |
| Display Name (en) | Essential — Weekly | Essential — Monthly | Essential — Annual |
| Description (en) | Emergency legal response membership, billed weekly. | Emergency legal response membership, billed monthly. | Emergency legal response membership, billed yearly. |
.p8 key generated + handed to engineeringELA_APPSTORE_* env + keys on the VPS, then the sandbox drill list.docs/business/payments-unbundling-2026-08-22/p0-asc-runbook.md (Part A; Part B holds the pricing research + citations) · go-live sequence in plans/2026-08-06-master-todo.md §9d · unlisted URL, obscurity not auth.