App Store Connect — your one-sitting session

Everything happens at appstoreconnect.apple.com, signed in as the Account Holder (only that role can accept agreements and enroll in the Small Business Program). Active time ≈ 45–60 minutes. Two waits are outside your control: bank verification and SBP approval. Ticks save in this browser.

0 / 7 done

A1 — Paid Applications Agreement GATES EVERYTHING

Nothing IAP works — not even sandbox test purchases — until this shows Active. StoreKit returns an empty product list until then.

  1. App Store Connect → Business (older guides call it "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". That is expected; A2 clears it.

A2 — Banking and tax WAIT: hours–48h

  1. Bank account: the account that receives Apple payouts. You need: 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 — a short digital questionnaire inside ASC, not a paper form. "No U.S. activities" is the normal path. Complete only what ASC marks required.
  3. Contacts: senior / financial / technical / legal — you for all of them is fine.
Checkpoint: Business → Paid Applications shows Active. Bank verification is the slow step. Tell me the moment it flips — sandbox purchasing unblocks at that instant. The rest of this session can proceed while it is pending.

A3 — Small Business Program 15% NOT 30%

Free, ~5 minutes, no downside at our scale.

  1. Go to the SBP pageEnroll (as Account Holder).
  2. You 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, before launch, makes that lag irrelevant. ($1M is measured in proceeds ≈ $1.18M gross; crossing it mid-year puts the remainder of that year at 30%.)

Checkpoint: confirmation email / SBP status shows enrolled.

A4 — Server notifications + API key

Correction from research: there is no "Send Consumption Data" toggle in ASC. Answering Apple's refund-time consumption requests needs the three things below — and customer consent we capture ourselves (that part is on my build list + the counsel list, not yours today).
  1. Notifications URL: ASC → Apps → ELA → General → App Information → App Store Server Notifications → set Production URL https://api.ela.now/webhooks/appstore and the staging URL as Sandbox, version 2. (I can do this step if you prefer — say so.)
  2. In-App Purchase API key: ASC → Users and Access → Integrations → In-App Purchase → generate a key. Download the .p8 ONCE (it can never be re-downloaded), note the Key ID and Issuer ID, and hand all three to me over a secure channel — it goes root-only on the VPS like the APNs key.
Checkpoint: .p8 + Key ID + Issuer ID delivered to engineering.

A5 — Sandbox test account 5 MIN

ASC → Users and Access → Sandbox → Test Accounts → +. One tester, 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 into it — it is entered only when a StoreKit sandbox sheet prompts.

A6 — Subscription group + the three products

ASC → Apps → ELA → Monetization → Subscriptions.

Create the group

  • Reference Name (internal): ELA Essential Membership
  • Add an English group 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.

Copy law: every tier gets the full firm response — never write "notification-only" or imply weekly is lesser.

Per-product settings

  • Family Sharing: OFF for all three (entitlement-security law — and Apple never lets you turn it off once on).
  • Tax category: leave the default unless the accountant says otherwise.
  • Availability: all countries and regions — Dubai expats keep UK/US/IN/PH Apple IDs; restricting to UAE refuses real customers. KYC in our onboarding stays the territory gate.
  • Pricing: base storefront United Arab Emirates (AED), enter the price, let ASC auto-generate the other 174 storefronts, then review Saudi / Qatar / UK / US against the matrix below. If the picker doesn't offer the exact value, pick the nearest and tell me the final numbers.
  • Review Information: leave blank today (needed for submission, not sandbox). P5 uploads a real paywall screenshot + review notes.

Ranking

Put all three at the SAME level (level 1). Same service, different durations → interval switches take effect at the next renewal, no proration — exactly your ruling. (Different levels would fire immediate prorated refunds — noise we don't want.)

Billing Grace Period

On the Subscriptions page, Set Up Billing Grace Period: duration 16 days (Apple auto-caps weekly at 6) · All Renewals · Production and Sandbox.

Hygiene: delete any half-created draft product/group if you abandon a step — abandoned drafts are their own rejection class. Creating the products today is correct; nothing goes live before the P5 submission (first subscription must ride a new app version).

Tell engineering

Send me: the agreement's Active date · the final confirmed price points per storefront (if any differed from the tables) · the .p8 key trio (A4). Sandbox drills start the moment the agreement is Active and the products exist.

Reference — the research behind the numbers

Prices: .95 endings don't exist on Apple's AED grid

All three targets are verified live on the UAE storefront today: AED 24.99 (Crunchyroll et al.), AED 79.99 (TOD by beIN et al.), AED 749.99 (Zoho Books yearly). Annualized: weekly ≈ 1,304 AED/yr (your ≈1,297 holds within 1%), monthly ≈ 960, annual 749.99.

IntervalGross/yrNet @15% SBPNet @30%
Weekly1,304 AED≈1,056 AED≈869 AED
Monthly960 AED≈777 AED≈640 AED
Annual749.99 AED≈607 AED≈500 AED

(Apple deducts UAE VAT 5% before commission. Web-Stripe annual 750 nets ≈692 AED — the ≈85 AED/yr delta is the recorded trade for in-app purchase.)

Storefront matrix (net-parity targets, confirm against the picker)

StorefrontCurrencyWeeklyMonthlyAnnual
UAE (base)AED24.9979.99749.99
Saudi ArabiaSAR27.9989.99849.99
QatarQAR24.9979.99749.99
Kuwait / Bahrain / Oman (+RoW)USD6.9921.99199.99
United KingdomGBP5.9917.99169.99
United StatesUSD6.9921.99199.99

Grace + billing retry

ASC offers 3 / 16 / 28 days app-level; weekly is auto-capped at 6. With the 16-day choice: weekly = 6d, monthly/annual = 16d. Billing retry runs up to 60 days regardless. The server stores Apple's own grace-expiry date, never computes it.

Group mechanics

One group = one active subscription per member; interval switches at the same level land at the next renewal with zero proration. Weekly subs draw stricter App Review attention on paywall hygiene — price and period unabbreviated ("AED 24.99 per week"); our paywall does this.

Full citations live in the repo: docs/business/payments-unbundling-2026-08-22/p0-asc-runbook.md (Part B).