Decision · SHOT mobile · Apple resubmit

Three ways to keep B2B grant codes after Apple 3.1.1

The situation Apple rejected v1.0.155 under 3.1.1 because SHOT lets users redeem membership codes in-app to unlock paid features. The B2B model — clubs sign real-world contracts, SHOT mints codes, clubs distribute them — is non-negotiable. What are the actual options, and which one preserves the contract economics?
Rejection guideline 3.1.1 — in-app promo codes unlock paid features outside Apple's billing
B2C path today Apple IAP, Google IAP, Stripe web — kept as-is
B2B path today Club signs contract → SHOT mints code → club distributes → member redeems
What Apple really wants No iOS UI that grants paid access outside their billing — not "kill your codes"

01Apple Offer Codes (100% off)

Generate Apple-issued codes tied to a free-tier IAP. User redeems through Apple's system sheet.

Flow: Apple Offer Codes — SHOT generates codes in ASC, exports CSV, club distributes per-user codes, member redeems through Apple's native sheet, RC webhook fires, premium unlocks.
Pro
Con
Apple-sanctioned — zero 3.1.1 risk
150k codes per app per quarter (hard cap)
Apple takes 0% on 100%-off redemptions
Code format is Apple-generated 16-char alphanumeric — ugly to share
Native iOS redemption UX
One code = one user. No multi-use "CLUB-XYZ-2026" model
No web detour for iOS users
Tied to a subscription IAP — renewal semantics, not durable grants
Works without any code on your backend
iOS-only. Android + web users need a different path anyway
Designed for marketing promos, not B2B contracts. No bulk-revoke for churned partner
Apple risk: zero B2B fit: poor Cap: 150k/quarter Cross-platform: iOS only Code lifecycle: Apple-owned

02Web-only redemption (your own codes)

Keep SHOT's membership_codes. Redeem on web. iOS just reads the entitlement.

Flow: Web-only redemption — Club signs B2B contract, SHOT admin mints code, club distributes via own channel, member redeems on shotclubhouse.com/redeem, user_memberships row written, iOS app reads entitlement and unlocks premium. No iOS redeem UI.
Pro
Con
Already built — schema, admin UI, RPC, redemption logic all exist
User makes one web trip to redeem
Multi-use codes match B2B reality (1 code, N seats)
No iOS-native "enter code" UX
SHOT controls full lifecycle — mint, revoke, extend, audit
Codes are SHOT-format strings, not Apple-blessed
Same flow works on web / iOS / Android — one truth source
B2B economics intact: bill club out-of-band, no Apple cut
Fix ships as a one-PR iOS-surface gate (1 day)
Apple risk: zero B2B fit: strong Cap: none Cross-platform: web + iOS + Android Code lifecycle: SHOT-owned

03Apple Volume Purchase (VPP)

Enterprise channel via Apple Business Manager. Clubs buy IAP seats at scale, distribute through MDM.

Flow: Apple Volume Purchase Program — SHOT enrolls in Apple Business Manager, club also enrolls, club buys 50 memberships through Apple, Apple bills the club directly (blocker), Apple issues redemption codes or MDM tokens, club distributes, member redeems on iOS. Apple owns the transaction.
Pro
Con
Apple-sanctioned enterprise channel
Wrong shape — VPP is for "company buys app for employees", not "club hands free passes to members"
Volume discount on bulk purchases
Club must pay Apple via Business Manager — kills your "bill outside Apple" B2B economics
Centralized seat management for the buyer
Apple still takes their cut on the bulk purchase
Apple owns invoicing for the buyer
Members may need Business-Manager-enrolled Apple IDs (or accept friction)
iOS-only. Android/web users still need a different B2B path
Heavy onboarding: DUNS, Business Manager enrollment, VPP agreement, payment instrument per club
Apple risk: zero B2B fit: enterprise-shaped Cap: none Cross-platform: iOS only Setup cost: high (weeks)
Dimension 01 · Apple Offer Codes 02 · Web-only redemption 03 · VPP
Solves Apple 3.1.1 Yes Yes Yes
Keep B2B contract economics
(bill club outside Apple)
Partial — Apple controls codes but no rev cut on free Yes — full control, no Apple involvement No — Apple owns the transaction
Multi-use bulk codes
(one CLUB-XYZ for 50 members)
No — one code per user Yes — max_redemptions=N No — one license per member
Cross-platform parity
(web / iOS / Android)
iOS only All three iOS only (+ Android via separate VPP-equivalent)
Code lifecycle control
(extend, revoke, audit)
Apple-mediated SHOT-owned, in your DB Apple Business Manager
Quarterly issuance cap 150,000 Unlimited Unlimited
Eng cost to ship ~1 week (offer code IAP, RC mapping, UI) ~1 day (iOS gate + /redeem route) Weeks (DUNS, Business Manager, payment routing)
Fits "UN grant / charity partnership" use case Awkward — feels like marketing promo Native — durable, club-named codes No — VPP is enterprise procurement