ELA · Payments unbundling · P0

App Store Connect session — one sitting

Signed in at appstoreconnect.apple.com as the Account Holder (your individual developer account). Active time ≈ 45–60 min. Two waits are outside your control: bank verification (up to ~48 h) and SBP approval. Status as of 27 Aug 2026.

Would a TestFlight work today? Purchases: no. Everything else: yes.

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:

LayerStateEffect in TestFlight
ASC agreementMISSING Paid Applications Agreement not acceptedStoreKit returns an empty product list — even sandbox purchases on a beta build are blocked until it shows Active
ASC productsMISSING ela.essential.weekly / .monthly / .annual don't exist yetPaywall renders fallback "≈ AED" prices; Subscribe fails with product-not-found
Prod APINOT 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 VPSEven 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.

Two ways to ship a build

  1. Copy-review TestFlight now: build with 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.
  2. Real IAP TestFlight: needs this whole page done (A1–A6), the API deploy decision, the .p8 key on the VPS, then sandbox drills. A1+A2 are the long pole — start them first.

A1 Paid Applications Agreement GATES EVERYTHING

  1. ASC → Business (formerly "Agreements, Tax, and Banking").
  2. Under Agreements find Paid ApplicationsView and Agree to Terms → read, tick, accept.
  3. Status becomes "Pending — add banking and tax info". Expected; A2 clears it.

Nothing IAP works — not even sandbox purchases on the beta app — until this shows Active.

A2 Banking + tax WAIT: UP TO ~48 H

  1. Bank account (same Business section): bank name, IBAN, SWIFT/BIC, account-holder name exactly as the bank has it. UAE accounts are fine.
  2. Tax forms: the U.S. W-8BEN digital questionnaire (all non-U.S. developers). "No U.S. activities" is the normal path. Complete only the country forms ASC marks required.
  3. Contacts: senior / financial / technical / legal — you for all four is fine.
  4. Wait for Business → Paid Applications → Active. Bank verification is the slow part.
Tell engineering the moment it flips to Active — sandbox purchasing unblocks at that instant.

A3 Small Business Program — 15% instead of 30% 5 MIN

  1. developer.apple.com/app-store/small-business-programEnroll (Account Holder only).
  2. Confirm: latest Paid Apps Agreement accepted (A1) · Associated Developer Accounts: none · prior-year proceeds under US$1M (new accounts qualify automatically).

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.

A4 Consumption-data prep NO ASC TOGGLE EXISTS

  1. Server notification URLs: ASC → Apps → ELA → General → App Information → App Store Server Notifications → set Production URL 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.
  2. In-App Purchase API key: ASC → Users and Access → Integrations → In-App Purchase → generate. Download the .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.
  3. Customer consent is product/legal work (counsel list), not an ASC setting.

A5 Sandbox tester 5 MIN

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.

A6 Subscription group + the three products

ASC → Apps → ELA → Monetization → Subscriptions.

Create the group

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".

Create the three products (repeat ×3 — Product IDs are immutable, type exactly)

FieldWeeklyMonthlyAnnual
Reference NameEssential WeeklyEssential MonthlyEssential Annual
Product IDela.essential.weeklyela.essential.monthlyela.essential.annual
Duration1 Week1 Month1 Year
Price (UAE, AED)24.9979.99749.99
Display Name (en)Essential — WeeklyEssential — MonthlyEssential — Annual
Description (en)Emergency legal response membership, billed weekly.Emergency legal response membership, billed monthly.Emergency legal response membership, billed yearly.

Per-product settings

Ranking, grace, hygiene

Copy law for anything you type in ASC: every tier gets the full firm response — never "notification-only", never imply weekly is lesser.

One-sitting checklist

After your session, engineering still owes: API deploy decision (takes the pay-005 migrations + verify/webhook endpoints to prod), ELA_APPSTORE_* env + keys on the VPS, then the sandbox drill list.
Source: 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.