# Cancellation instructions — how to cancel via device settings

- **Pattern:** `ab-000415` (`app-store-iap-subscriptions.subscription-lifecycle.cancellation-instructions`)
- **Severity:** medium
- **Lifecycle:** active
- **Last modified:** 2026-04-18
- **Canonical URL:** https://auditbuffet.com/patterns/ab-000415
- **License:** CC-BY-4.0 — attribute to AuditBuffet Pattern Catalog (https://auditbuffet.com/patterns/ab-000415)

## Why it matters

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.

## Severity rationale

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.

## Remediation

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.

```tsx
// 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.

## Detection

- **ID:** `cancellation-instructions`
- **Severity:** `medium`
- **What to look for:** Count all relevant instances and enumerate each. Subscriptions on iOS are cancelled through device Settings → Apple ID → Subscriptions, and on Android through Google Play → Subscriptions. The app itself cannot provide a cancel button that directly cancels the subscription (except via the `StoreKit.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.
- **Pass criteria:** The app communicates where and how to cancel (device settings or a manage-subscription deep link), either on the paywall or in an account/settings screen. At least 1 implementation must be verified.
- **Fail criteria:** No cancellation instructions anywhere in the app — app says "cancel anytime" but provides no mechanism or instructions to do so.
- **Skip (N/A) when:** No subscription IAP in the app.
- **Detail on fail:** `"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"`
- **Remediation:** Both Apple and Google require that users can access their subscription management. Provide a direct path:
  1. For iOS, open the system subscription management sheet:
     ```tsx
     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');
       }
     };
     ```
  2. Add "Manage Subscription" to your Settings or Account screen
  3. Include brief cancellation instructions on the paywall (even just "Cancel anytime in Settings")

## External references

- external apple-guideline-3.1.2 — https://developer.apple.com/app-store/review/guidelines/#subscriptions
- external ftc-negative-option-rule — https://www.ftc.gov/legal-library/browse/rules/negative-option-rule

Taxons: regulatory-conformance, user-experience

HTML version: https://auditbuffet.com/patterns/ab-000415
