iOS subscriptions are cancelled through device Settings → Apple ID → Subscriptions; Android subscriptions through Google Play. The app cannot provide a direct cancel button, but it must communicate the cancellation path — users who cannot figure out how to cancel file chargebacks, which cost the developer $15–$25 per dispute plus chargeback ratio penalties. Apple guideline 3.1.2 requires that users are informed of how to cancel, and the FTC Negative Option Rule requires that cancellation be "simple." A paywall that says "Cancel anytime" without providing any actual cancellation instructions is deceptive under this standard.
Medium because absent cancellation instructions generate chargebacks and FTC Negative Option Rule exposure, even though the omission alone is not always an immediate rejection trigger.
Add a "Manage Subscription" button to your settings or account screen that opens the platform's subscription management. Include brief cancellation text on the paywall as well.
// SettingsScreen.tsx
import { Platform, Linking } from 'react-native';
const manageSubscription = async () => {
const url = Platform.OS === 'ios'
? 'https://apps.apple.com/account/subscriptions'
: 'https://play.google.com/store/account/subscriptions';
await Linking.openURL(url);
};
<TouchableOpacity onPress={manageSubscription}>
<Text>Manage Subscription</Text>
</TouchableOpacity>
On the paywall, include at minimum: "Cancel anytime in device Settings." This text satisfies Apple's disclosure requirement and, combined with the manage-subscription deep link in settings, gives users a complete cancellation path.
app-store-iap-subscriptions.subscription-lifecycle.cancellation-instructionsmediumStoreKit.showManageSubscriptions() API on iOS 15+ which opens the system sheet). Check that the app communicates cancellation instructions somewhere accessible to the user. Look for: (1) Text on the paywall such as "Cancel anytime in device Settings" or "Manage subscription in Settings". (2) A settings/account screen with a "Manage Subscription" button that calls StoreKit.showManageSubscriptions() (iOS) or opens https://play.google.com/store/account/subscriptions (Android) via Linking.openURL(). (3) ManageSubscriptionsSheet usage in SwiftUI. Failure pattern: the app implies users can "cancel anytime" but provides no path or instructions to actually do so."Paywall says 'Cancel anytime' but no cancellation path or instructions exist in the app — no 'Manage Subscription' button in Settings and no link to device subscription management" or "App provides no mechanism for users to manage or cancel their subscription"import { Platform, Linking } from 'react-native';
const manageSubscription = async () => {
if (Platform.OS === 'ios') {
await Linking.openURL('https://apps.apple.com/account/subscriptions');
} else {
await Linking.openURL('https://play.google.com/store/account/subscriptions');
}
};