Annual reminder with renewal date, price, cancel instructions
Why it matters
California Automatic Renewal Law (ARL) Business & Professions Code §17601 specifically requires that for annual subscriptions, customers receive an advance renewal notice before the charge — with sufficient lead time to cancel. A 3-day notice adequate for monthly charges does not satisfy the ARL for a $290 annual charge. EU Consumer Rights Directive 2011/83/EU similarly requires material pre-contractual information be provided for automatic contract extensions. Annual subscribers who receive a $290 charge without a prior reminder represent the highest-dollar, highest-dispute-rate segment of subscription chargebacks.
Severity rationale
Info because non-compliance requires an annual renewal to occur without the mandated notice — but when it does occur, the California ARL civil penalty and chargeback exposure are disproportionate to the severity label.
Remediation
Differentiate annual subscriptions in the invoice.upcoming webhook handler and send a 30-day-advance reminder. In app/api/webhooks/stripe/route.ts:
if (event.type === 'invoice.upcoming') {
const subscription = await stripe.subscriptions.retrieve(invoice.subscription as string)
const isAnnual = subscription.items.data[0]?.plan.interval === 'year'
const daysUntilRenewal = Math.round(
(invoice.period_end - Date.now() / 1000) / (60 * 60 * 24)
)
if (isAnnual && daysUntilRenewal >= 28 && email) {
await sendEmail({
to: email,
subject: `Your annual subscription renews in ${daysUntilRenewal} days`,
template: 'annual-renewal-reminder',
data: {
amount: (invoice.amount_due / 100).toFixed(2),
renewalDate: formatDate(invoice.period_end),
cancelDeadline: formatDate(invoice.period_end - 60 * 60 * 24 * 2),
cancelUrl: `${process.env.NEXT_PUBLIC_APP_URL}/settings/billing`,
},
})
}
}
In Stripe Dashboard → Billing → Customer portal, set upcoming invoice notification to 30 days for annual price IDs. Email must include renewal amount, renewal date, and 'To avoid being charged, cancel before [date] at [direct link].'
DetectionPro
The detection method for this pattern is part of AuditBuffet Pro.
The full method (what to look for, pass and fail conditions, and how results get reported) ships inside the Subscription & Auto-Renewal Compliance Audit. The pattern definition, severity rationale, and remediation remain openly licensed under CC-BY-4.0.
External references
- external · california-arl — California Automatic Renewal Law (Bus. & Prof. Code §17602(d)) — annual renewal reminder ≥30 days advance notice
- external · ftc-negative-option-rule-2025 — FTC Negative Option Marketing Rule (2025) — renewal reminder requirements for annual subscriptions
- external · eu-consumer-rights-directive-2011-83-eu — EU Consumer Rights Directive 2011/83/EU — advance notice before annual contract renewal
Taxons
History
- 2026-04-18·v1.0.0·Initial import from subscription-compliance·automated