App Store Subscription Compliance Guide
Subscriptions are the most scrutinized monetization model on the App Store. From dark patterns to cancellation flows, here's everything you need to know to get your subscription app approved—and keep it approved.
⚠️ Why Subscription Apps Face Extra Scrutiny
Apple has significantly increased enforcement of subscription guidelines. In 2025-2026, subscription-related rejections have risen by 40%, primarily due to dark pattern enforcement and free trial disclosure requirements. Apps that previously passed review are being rejected on updates for practices Apple now considers deceptive.
Understanding Apple's Subscription Philosophy
Apple's subscription guidelines (primarily 3.1.2) are designed around one principle: users must always understand exactly what they're signing up for. This means:
Price Clarity
Users must see the exact price they'll pay before any purchase
Duration Clarity
Billing frequency and trial length must be prominently displayed
Easy Exit
Cancellation must be as easy as sign-up—no hidden hoops
The "Grandmother Test"
Apple reviewers often apply what's informally called the "grandmother test": if your grandmother couldn't understand exactly what she's buying and how to cancel it, your subscription UI probably won't pass review.
Dark Patterns Apple Will Reject
Apple has explicitly banned several subscription dark patterns. Here are the most common ones that cause immediate rejection:
Confirm Shaming
Using guilt-inducing language on decline buttons like "No, I don't want to save money" or "I prefer the boring version."
Rejected: "No thanks, I hate saving time" / Approved: "Not now" or "Skip"
Hidden Close Buttons
Making the dismiss/close button hard to find, small, low contrast, or delayed in appearing.
Rule: Close/dismiss button must be visible immediately and meet accessibility contrast requirements
Forced Action / Roach Motel
Requiring a subscription to use basic features, or making it easy to subscribe but hard to cancel.
Rule: If your app works without subscription, users must be able to use it. Cancellation info must be accessible.
Bait and Switch
Advertising one price/duration then charging differently, or changing prices immediately after trial ends.
Rule: Price shown before purchase must match what's charged. Introductory offers must clearly state what happens after.
Misleading Free Trial Language
Emphasizing "FREE" while hiding the fact that payment begins automatically after the trial.
Rule: "Free trial" must always be accompanied by clear indication of what happens when it ends
Pre-Selected Premium Options
Auto-selecting the most expensive plan or longest commitment by default.
Rule: Don't pre-select any option, or if you must, default to the least expensive/shortest commitment
🔍 Apple's Review Process for Subscriptions
Apple reviewers specifically test subscription flows by: (1) checking if they can dismiss paywalls, (2) verifying price clarity, (3) testing free trial understanding, and (4) confirming cancellation instructions are accessible. They often record the entire flow as evidence for rejections.
Free Trial Requirements
Free trials are one of the most common sources of subscription rejections. Apple requires complete transparency about what happens when a trial ends.
Mandatory Free Trial Disclosures
Your free trial UI must clearly display all of the following:
Trial Duration
"7-day free trial" - not just "free trial"
Post-Trial Price
"Then $9.99/month" - the exact amount they'll be charged
Auto-Renewal Notice
"Subscription automatically renews unless cancelled"
Cancellation Deadline
"Cancel at least 24 hours before trial ends to avoid charge"
❌ Will Be Rejected
START FREE TRIAL
Try Premium for free
- • No trial duration
- • No price after trial
- • No cancellation info
✓ Compliant Design
Start 7-Day Free Trial
Then $9.99/month
Cancel anytime. You'll be charged unless you cancel at least 24 hours before trial ends.
- • Clear duration (7 days)
- • Price shown ($9.99/month)
- • Cancellation info included
💡 StoreKit Free Trial Best Practice
Use Product.SubscriptionInfo.RenewalInfo in StoreKit 2 to dynamically display trial information. This ensures your UI always matches what the App Store shows, avoiding discrepancies that cause rejection.
Cancellation Flow Requirements
Apple requires that cancellation be as easy as subscription. You can't require users to contact support, call a phone number, or navigate through multiple screens to cancel.
What You Must Provide
In-App Cancellation Path
Provide clear instructions on how to cancel, accessible from your app's settings or account section.
Direct Link to Subscription Management
Use the system-provided deep link to take users directly to their subscription:
// StoreKit 2 - Open subscription management
try await AppStore.showManageSubscriptions(in: windowScene)
No Obstacles to Cancellation
Don't require login, surveys, support chat, or any other friction before showing cancellation option.
⚠️ Retention Flows: What's Allowed
You can offer retention deals when users try to cancel, but only if:
- • The "cancel anyway" option is equally prominent as the retention offer
- • You don't show multiple retention screens (one is the maximum)
- • Users can still cancel with a single additional tap
- • You don't use guilt-inducing language
❌ Rejection-Causing Practices
- • Requiring users to email support to cancel
- • Showing multiple retention offers before cancel
- • Hiding cancellation in a FAQ or help article
- • Requiring a "reason" before allowing cancellation
- • Making users type "CANCEL" to confirm
✓ Compliant Practices
- • "Manage Subscription" button in settings
- • One optional retention offer with equal "cancel" button
- • Direct deep link to iOS subscription management
- • Clear instructions if cancellation is through Settings app
- • Optional (skippable) feedback survey after cancellation
Pricing Transparency Requirements
Every subscription price shown in your app must match exactly what Apple will charge. This includes handling currency, regional pricing, and introductory offers.
1 Use StoreKit for Pricing Display
Never hardcode prices. Always fetch and display pricing from StoreKit:
// StoreKit 2 - Get localized price
let product = try await Product.products(for: ["premium_monthly"]).first
let priceString = product?.displayPrice // "$9.99" localized
2 Display Billing Period Clearly
Don't just show the price—show the complete billing context:
Wrong: "$9.99" or "Only $9.99!"
Correct: "$9.99/month" or "$99.99/year"
3 Introductory Offer Disclosures
When offering discounted intro prices, you must show both:
- The introductory price and duration
- The regular price that will apply afterward
Example: "First month $0.99, then $9.99/month"
💰 Per-Unit Pricing Claims
If you advertise savings like "only $0.82/month when billed annually," you must also prominently show the actual charge: "$99.99/year billed as one payment."
StoreKit Implementation Requirements
Proper StoreKit implementation is crucial for subscription compliance. Here are the key requirements:
Restore Purchases (Required)
Your app must include a "Restore Purchases" button that is:
- Visible on the subscription/paywall screen
- Also accessible from Settings/Account
- Functional—actually restores purchases when tapped
// StoreKit 2 - Restore purchases
try await AppStore.sync()
Transaction Handling
Your app must properly handle all transaction states:
| State | Your App Must |
|---|---|
| Purchased | Unlock content immediately |
| Pending | Show "pending" state, don't unlock yet |
| Failed | Show error, allow retry |
| Expired | Gracefully revoke access |
| In Billing Retry | Maintain access (Apple recommends) |
Family Sharing (If Enabled)
If you enable Family Sharing for subscriptions:
-
Check
Transaction.ownershipTypeto identify family members - Grant the same access to family members as the subscriber
- Handle family sharing revocation gracefully
Common Subscription Rejections
Subscription Information
"Your app doesn't clearly describe the subscription terms, including price, duration, and auto-renewal information."
Fix: Add all required disclosures (price, duration, renewal terms) next to the subscribe button, not buried in ToS.
Free Trial Not Clear
"Users may not understand that they will be charged after the free trial ends."
Fix: Show post-trial price and duration directly on the free trial button. Add "Cancel anytime before [date] to avoid charge."
No Restore Purchases
"Your app doesn't include a mechanism for users to restore their previously purchased in-app purchases."
Fix: Add a visible "Restore Purchases" button on paywall and in Settings. Ensure it actually works.
Dark Pattern / Deceptive UI
"Your app uses interface elements or language that may deceive or mislead users about subscription terms."
Fix: Remove confirm-shaming language, make close buttons visible, don't pre-select expensive options, use neutral button text.
Subscription Not Functional
"We were unable to complete the subscription purchase due to a technical issue."
Fix: Test purchases in sandbox and TestFlight. Handle all transaction states properly. Check StoreKit configuration files.
Subscription Compliance Checklist
Pricing & Transparency
- All prices fetched from StoreKit (not hardcoded)
- Billing period shown with every price
- Auto-renewal clearly stated
- Introductory offers show regular price
Free Trials
- Trial duration clearly displayed
- Post-trial price shown on trial button
- Cancellation deadline mentioned
- No misleading "FREE" emphasis
User Experience
- No confirm-shaming language
- Close/dismiss button visible immediately
- No pre-selected premium options
- Paywall can be dismissed without subscribing
Technical Requirements
- Restore Purchases button present & functional
- Cancellation instructions accessible
- All transaction states handled
- Tested in sandbox environment
Related Guides
Audit Your Subscription Flow Before Submission
Our AI Review Toolkit includes subscription-specific prompts that analyze your paywall screenshots and code for compliance issues—catching dark patterns before Apple does.
Get the AI Toolkit