Free trial terms clear — duration and post-trial price displayed
Why it matters
Apple guideline 3.1.2(b) and the FTC Negative Option Rule both require that free trial terms — duration and post-trial price — are clearly disclosed before the user initiates the trial. A paywall that shows "Start Free Trial" without disclosing what the user will be charged after the trial is one of the most common subscription rejection reasons Apple cites. The FTC Negative Option Rule (effective 2024) extends this obligation to US consumers in digital subscription flows: failure to disclose post-trial pricing is an unfair or deceptive act regardless of where the purchase occurs. The compliance risk applies to the developer directly, not only to the platform relationship.
Severity rationale
High because missing post-trial price disclosure is one of the most cited subscription rejection reasons under Apple guideline 3.1.2(b) and also triggers FTC Negative Option Rule exposure for US users.
Remediation
Display the trial duration and the post-trial price together, near the CTA, before the user taps. Never hardcode these values — fetch them from the SDK so they stay accurate if the offer changes in App Store Connect.
// RevenueCat — fetch trial terms from SDK
const pkg = offering?.monthly;
const introPrice = pkg?.product.introductoryPrice;
const trialPeriod = introPrice?.subscriptionPeriod; // e.g., "P7D"
const regularPrice = pkg?.product.priceString;
// Display near CTA
<Text>7-day free trial</Text>
<Text>Then {regularPrice}/month — cancel anytime in Settings</Text>
<Text>You won't be charged until {formatTrialEndDate(trialPeriod)}</Text>
<SubscribeButton title="Start Free Trial" />
If you hardcode trial duration ("7-day free trial"), a change in App Store Connect without a code update creates a mismatch between the disclosed and actual trial — which is an additional violation.
Detection
- ID:
free-trial-terms - Severity:
high - What to look for: Count all relevant instances and enumerate each. If the app offers a free trial period (introductory offer on iOS, free trial on Android), check that the paywall clearly communicates: (1) the trial duration (e.g., "7-day free trial"); (2) the price AFTER the trial ends (e.g., "then $9.99/month"); (3) when the trial ends and billing begins (e.g., "You won't be charged until [date + trial duration]"). Look for introductory offer display in:
product.introductoryPrice(StoreKit 2Product.SubscriptionInfo.introductoryOffer),Purchases.getOfferings()packages withintroPricefrom RevenueCat,AdaptyPaywallProduct.introductoryOfferEligibility, orSKProductSubscriptionPeriod. Failure patterns: "Start Free Trial" button with no mention of what happens after the trial; trial duration shown but no post-trial price; "Try 7 days free" CTA with the regular subscription price only shown in small text that could be considered obscured; toggling between "Free Trial" and "Subscribe" with confusing price presentation. - Pass criteria: Trial duration and post-trial price are both clearly visible on the paywall when a trial is offered. At least 1 implementation must be verified. The user knows exactly how much they will be charged and when.
- Fail criteria: Trial offered but post-trial price not clearly shown before purchase; trial duration shown but not the post-trial billing date or amount; "Start Free Trial" button with no pricing disclosure at all.
- Skip (N/A) when: No free trial or introductory offer configured for any IAP products.
- Detail on fail:
"PaywallScreen shows '7-Day Free Trial' button but no disclosure of the $9.99/month charge that follows — Apple guideline 3.1.2(b) requires clear post-trial pricing" - Remediation: Apple's review team is specifically trained to look for misleading trial disclosures. This is one of the most common subscription rejection reasons.
- Display trial terms clearly near the CTA:
<Text>7-day free trial</Text> <Text>Then {regularPrice}/month — cancel anytime in Settings</Text> <Text>You won't be charged until {trialEndDate}</Text> <SubscribeButton title="Start Free Trial" /> - Fetch trial information from the SDK — never hardcode trial durations, as they can change:
// RevenueCat const introPrice = pkg.product.introductoryPrice; const trialPeriod = introPrice?.subscriptionPeriod; // e.g., "P7D"
- Display trial terms clearly near the CTA:
External references
- external · apple-guideline-3.1.2b — Apple App Store Review Guidelines § 3.1.2(b) — Free Trial Disclosures
- external · ftc-negative-option-rule — FTC Negative Option Rule — Clear and conspicuous disclosure of free trial terms (16 CFR Part 425)
Taxons
History
- 2026-04-18·v1.0.0·Initial import from app-store-iap-subscriptions·automated