●GPT6.1 — GPT-6.1 Sol joined Rork's model menu on Sep 29. It costs the same as GPT-6 Sol and reads a 1M-token context●10/12 — 11 days until the planned React Native 0.88.x release. Expo SDK 58 stable comes after it, and the Expo Go update drops SDK 57 support●REVIEW — A Zenn write-up describes two App Store review blocks from automated checks, and opening the .ipa to verify before rebuilding●NEW — Rebuilding an expo-router app that flashes the sign-in screen on every launch, with a three-state model●SEARCH — In GSC the only click was rorkmax; impressions cluster on bgtaskscheduler.shared.submit and migrateFromAsyncStorage. Concrete API names are the front door●SDK58 — expo.dev's changelog still tops out at the Sep 15 SDK 58 Beta. No stable date yet●GPT6.1 — GPT-6.1 Sol joined Rork's model menu on Sep 29. It costs the same as GPT-6 Sol and reads a 1M-token context●10/12 — 11 days until the planned React Native 0.88.x release. Expo SDK 58 stable comes after it, and the Expo Go update drops SDK 57 support●REVIEW — A Zenn write-up describes two App Store review blocks from automated checks, and opening the .ipa to verify before rebuilding●NEW — Rebuilding an expo-router app that flashes the sign-in screen on every launch, with a three-state model●SEARCH — In GSC the only click was rorkmax; impressions cluster on bgtaskscheduler.shared.submit and migrateFromAsyncStorage. Concrete API names are the front door●SDK58 — expo.dev's changelog still tops out at the Sep 15 SDK 58 Beta. No stable date yet
Multiseat Purchases Are Already On: Decide Whether to Keep Them Before October 22
Multiseat purchases for subscriptions have been on by default in App Store Connect since September 16. Before Volume Purchasing starts on October 22, here is how an indie developer can decide, in four questions, whether to keep them.
I was reading Apple Developer News, "Get your subscriptions ready for iOS 27," when one line stopped me. Multiseat purchases for subscriptions are already enabled by default in App Store Connect.
I hadn't clicked anything. Yet the setting had changed, and once Volume Purchasing begins on October 22, it becomes the shape in which my subscriptions can be sold. Here is how I'm deciding between keeping and turning it off. It works the same whether the app came out of Rork Max or was built on the Expo side.
What changed was a default, not a feature
Here is what I can confirm from Apple's wording, laid out by date. Please check the details in App Store Connect with your own eyes as well.
Date
What happens
What you do
September 16
Multiseat purchases for subscriptions are on by default; you can disable them or control them by sales channel
Look at the current state of each subscription
October 22
Volume Purchasing starts; StoreKit 2 is the prerequisite
Decide keep or off by this date
This winter
Group Purchases are planned
Make sure this decision record can be reused
Later this year
Bundles and Suites, by application form
Watch for now
What I noticed is that doing nothing is also a decision. Because the default is on, leaving it alone gives the same result as choosing to keep it.
Treat doing nothing as a decision you've actually made. This whole exercise is just that sentence put into practice.
Four questions for keep or off
For each subscription, I ask these in order. None of them lives in the App Store Connect screen. They all live in the app.
Is the value of this subscription contained on one person's device? An ad-free experience in a wallpaper app is personal. It's hard to picture an organization buying that for several people. Something that carries shared output or settings could genuinely attract bulk buyers.
Does the price still make sense per seat? A monthly price designed for individuals wasn't priced with bulk buying in mind. Leave room for discounts and admin overhead that grow with it.
Do you have the capacity to answer questions? Organizational purchases bring questions individuals never asked, such as who an invoice is addressed to or what happens when a contact person changes. For a solo developer, this is where it bites hardest.
Does your entitlement code assume that the buyer is the user? We'll check that in the next section.
If three or more answers are "no" or "I don't know," I lean toward turning it off for now. Re-enabling later is easy. Pulling back something that has started selling means explaining yourself to buyers.
✦
Thank you for reading this far.
Continue Reading
What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.
WHAT YOU'LL LEARN
✦You can decide, subscription by subscription, whether to keep or turn off multiseat purchases using four questions
✦You can check today whether your entitlement code quietly assumes the buyer is the only user, before purchases start arriving on October 22
✦You can leave a one-page decision record so that, months from now, you won't have to guess why a setting is the way it is
Secure payment via Stripe · Cancel anytime
✦
Unlock This Article
Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.
When I moved from the old SKPayment API to StoreKit 2, I realized my "may this user use the paid feature?" logic was scattered across screens. Since Volume Purchasing is stated to require StoreKit 2, this is a good moment to gather that logic in one spot.
The code below is a minimal form that returns only the currently valid entitlement, without depending on who bought it.
import StoreKitenum Access: Equatable { case none case active(productID: String, ownership: Transaction.OwnershipType, expires: Date?)}struct EntitlementResolver { let proProductIDs: Set<String> func current() async -> Access { var best: Access = .none for await result in Transaction.currentEntitlements { // Never base paid features on a transaction that fails verification guard case .verified(let tx) = result else { continue } guard proProductIDs.contains(tx.productID) else { continue } // Skip refunded/revoked and expired transactions guard tx.revocationDate == nil else { continue } if let exp = tx.expirationDate, exp < Date.now { continue } best = .active(productID: tx.productID, ownership: tx.ownershipType, expires: tx.expirationDate) } return best }}
Why write it this way: when the single source of truth is Transaction.currentEntitlements, details about who bought it can't leak into your view code. I read ownershipType and keep it, but never branch on it. If I later decide that family-shared access should be treated differently, there's exactly one place to change.
The listener side belongs in one place too.
func startListening(onChange: @escaping @Sendable () async -> Void) -> Task<Void, Never> { Task.detached { for await update in Transaction.updates { if case .verified(let tx) = update { await tx.finish() await onChange() } } }}
Transaction.updates also delivers purchases and expirations that happened while the app was closed. Without it, a change made on another device won't show up until the next time the screen opens.
Check both settings with StoreKit Test
Once you've decided, verify behavior on your own machine. Load a StoreKit configuration file into a test, and you can reproduce a purchase and an expiry.
What this checks is only the promise that holds no matter who buys: active right after purchase, inactive after expiry. Please don't expect it to reproduce behavior specific to bulk purchases. Parts of Apple's new purchase types stay invisible, even in the sandbox, until they actually go live. I don't fill that gap with guesses. I plan to revise my decision after looking at real transactions following October 22.
Running the four questions on two typical shapes
Abstract rules are hard to apply, so here are two shapes that come up often in indie apps. Look only at the direction of each answer.
Question
Ad-free type (value stays personal)
Shares output or settings
1. Value contained on one device?
Yes
No
2. Price works per seat?
Don't know
Don't know
3. Capacity for questions?
No
No
4. Entitlement code consolidated?
Yes
Yes
My provisional direction
Turn off
Keep, and watch
The right-hand column was the counterintuitive one. It's tempting to keep it because bulk demand seems plausible, but if question 3 stays at "no," every sale only adds to your inbox. So I keep it on and set the review date early. Capacity to absorb the demand matters before demand itself does.
Turning things off has a trap too. It feels safe, but if entitlement checks are still scattered, flipping the setting back later produces screen-by-screen inconsistencies. Consolidate the checks first, then decide. Getting that order right was the shortest path through this work.
Leave the decision on one page
A few months from now, you won't remember why a setting is what it is. So I keep one record per subscription.
# decisions/multiseat-2026-10.yamldecided_on: 2026-10-01review_on: 2026-11-15 # the day I look at real transactions againproducts: - id: pro.monthly multiseat: off # on / off reasons: q1_value_is_personal: true q2_price_works_per_seat: unknown q3_support_capacity: false q4_entitlement_code_ready: true # consolidated in EntitlementResolver note: "Q2 is unknown, so I leaned toward off. Re-decide on the review date."
Allowing unknown is the most important part of this record. If you write a doubt down as "no," the thing you need to verify on the review date disappears.
The trap is stating more than you've confirmed
Last, three things I keep in mind.
Don't stretch Apple's wording into your own claims. "On by default," "can be disabled or controlled by channel," "StoreKit 2 as the prerequisite." That's the extent of what I could confirm. Billing and refund details I'll add once Apple's documentation grows.
Even if you turn it off, keep the app-side path intact. If entitlement logic lives in one place, changing the setting needs no app update. Being able to change your mind later makes it easier to decide now.
If your app came from Rork, check which layer handles billing. A native Swift app generated by Rork Max uses StoreKit 2 directly. If you route purchases through a third-party billing service, check that service's readiness as well.
One next step
Today, open just one subscription in App Store Connect and look at what the multiseat field says. Then answer the four questions with yes, no, or I don't know. That alone turns October 22 from a day you scramble into a day you review.
As an indie developer, I'll start writing this record with the smallest of my subscriptions first.
Share
Thank You for Reading
Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.