The FTC's updated Negative Option Rule (2024) requires that subscription billing amount, frequency, and next charge date be visible before the user provides payment information — not after. A checkout flow that collects the credit card before showing recurring terms has violated the rule at the moment of collection. Trial-to-paid conversions with no advance notice leave consumers with no opportunity to cancel before the charge occurs. These failures generate chargebacks at the highest rate of any billing pattern and trigger payment processor reviews that can result in merchant account termination.
High because hiding recurring billing terms before payment collection violates the FTC Negative Option Rule at the moment of the transaction — a point of no-return for the consumer — creating both regulatory and payment processor liability.
Show subscription amount, frequency, and next charge date in the checkout UI before the payment form, and send a trial-end reminder at least 3 days before the first paid charge.
function CheckoutSummary({ plan }: { plan: Plan }) {
const nextChargeDate = addDays(new Date(), plan.trialDays ?? 0)
return (
<div className="bg-gray-50 rounded p-4 mb-6">
<h3 className="font-semibold mb-2">Order summary</h3>
<p>Plan: {plan.name}</p>
<p>Amount: ${plan.price}/{plan.interval}</p>
{plan.trialDays ? (
<>
<p className="text-green-700">
Free trial: {plan.trialDays} days — $0 today
</p>
<p className="font-medium text-red-700">
First charge of ${plan.price} on{' '}
{nextChargeDate.toLocaleDateString('en-US', {
month: 'long', day: 'numeric', year: 'numeric'
})}
</p>
</>
) : (
<p>Billing begins today. Recurring {plan.interval}ly.</p>
)}
<p className="text-sm text-gray-600 mt-2">
Cancel anytime from account settings before the charge date.
</p>
</div>
)
}
// Trial-to-paid reminder: use Stripe's customer.subscription.trial_will_end
// webhook event — fires 3 days before trial end by default.
ID: ftc-consumer-protection.dark-patterns.no-hidden-subscriptions
Severity: high
What to look for: Count all relevant instances and enumerate each. This check targets the "negative option" pattern — where a user's inaction or failure to cancel triggers a recurring charge. The FTC's Negative Option Rule (updated 2024) requires that subscription services clearly disclose all material terms before obtaining billing information. Examine: (1) the complete checkout flow — at what step are the recurring billing terms (amount, frequency, next charge date) shown? (2) Is "recurring billing" the default with cancellation required, or is it opt-in? (3) Does the checkout confirmation email (if any) reiterate the recurring billing terms and the cancellation method? (4) Are trial-to-paid transitions automated? If so, does the user receive notice before the trial ends and the charge occurs? (5) Is there a mechanism to alert users before each recurring charge (required in some states and best practice universally)?
Pass criteria: Subscription billing amount, billing frequency, and next charge date are visible in the checkout flow before the user provides payment information. An order confirmation is sent that includes the recurring billing terms. Trial-to-paid transitions send advance notice (at minimum 3 days before the first paid charge). Recurring charges are clearly labeled on invoices and receipts.
Fail criteria: Recurring billing terms do not appear until after the user submits payment. The subscription nature is disclosed only in the Terms of Service, not in the checkout UI. No advance notice before the trial-to-paid conversion. Invoices do not clearly state the recurring nature of the charge.
Skip (N/A) when: The application has no subscription or recurring billing model — it is one-time payment or entirely free.
Detail on fail: Example: "Checkout form collects credit card before showing billing frequency. 'Billed monthly' appears only after payment submission on the success page." or "14-day trial converts to $49/month with no advance email notification before the first charge." or "Stripe subscription created but invoice description says 'Payment' not 'Monthly subscription — [Plan Name]'."
Remediation: Follow the FTC's Negative Option Rule requirements for subscription clarity:
// Checkout summary — subscription terms visible BEFORE payment form
function CheckoutSummary({ plan }: { plan: Plan }) {
const nextChargeDate = addDays(new Date(), plan.trialDays ?? 0)
return (
<div className="bg-gray-50 rounded p-4 mb-6">
<h3 className="font-semibold mb-2">Order summary</h3>
<p>Plan: {plan.name}</p>
<p>Amount: ${plan.price}/{plan.interval}</p>
{plan.trialDays ? (
<>
<p className="text-green-700">
Free trial: {plan.trialDays} days — $0 today
</p>
<p className="font-medium text-red-700">
First charge of ${plan.price} on{' '}
{nextChargeDate.toLocaleDateString('en-US', {
month: 'long', day: 'numeric', year: 'numeric'
})}
</p>
</>
) : (
<p>Billing begins today. Recurring {plan.interval}ly.</p>
)}
<p className="text-sm text-gray-600 mt-2">
Cancel anytime from your account settings before the charge date.
</p>
</div>
)
}
// For trial-to-paid: send reminder email 3+ days before first charge
// Schedule via your task queue or Stripe webhooks (customer.subscription.trial_will_end)