How to Cancel Stripe Subscriptions: A Complete Guide for Businesses
Learn how to properly cancel, pause, or modify Stripe subscriptions for your business. Includes API examples and best practices.
Michael Chen
Technical writer and SaaS consultant

Managing Stripe subscriptions effectively is crucial for any business using the platform. Whether you're handling customer cancellations, modifying plans, or cleaning up test subscriptions, this guide covers everything you need to know.
Understanding Stripe Subscription Lifecycle
Before diving into cancellation, it's important to understand how Stripe handles subscription states:
- Active: Customer is being billed regularly
- Trialing: Customer is in a free trial period
- Past Due: Payment failed but subscription is still active
- Canceled: Subscription has been terminated
- Unpaid: Multiple payment attempts have failed
Methods to Cancel Stripe Subscriptions
Method 1: Using the Stripe Dashboard
The simplest way for non-technical users:
- Log into your Stripe Dashboard
- Navigate to Customers
- Select the customer
- Click on their subscription
- Click Cancel subscription
- Choose immediate or end-of-period cancellation
Method 2: Using the Stripe API
For programmatic cancellation:
const stripe = require('stripe')('your-secret-key');
// Cancel immediately
const subscription = await stripe.subscriptions.del(
'sub_1234567890'
);
// Cancel at period end
const subscription = await stripe.subscriptions.update(
'sub_1234567890',
{cancel_at_period_end: true}
);
Method 3: Customer Portal
Enable self-service cancellation:
- Set up the Customer Portal in Stripe
- Generate a portal session link
- Allow customers to manage their own subscriptions
Cancellation Best Practices
1. Offer Alternatives Before Cancellation
- Pause Instead of Cancel: Offer to pause the subscription temporarily
- Downgrade Options: Suggest a lower-tier plan
- Discounts: Provide a retention discount
2. Handle Proration Correctly
Stripe automatically handles proration, but you should understand:
- Immediate cancellation may trigger refunds
- End-of-period cancellation avoids proration complexity
- Custom proration rules can be implemented
3. Communicate Clearly
Send automated emails for:
- Cancellation confirmation
- Final invoice
- Data retention policy
- Win-back campaigns (after 30 days)
Common Cancellation Scenarios
Scenario 1: Customer Requests Immediate Cancellation
async function immediateCancel(subscriptionId) {
try {
const subscription = await stripe.subscriptions.del(subscriptionId);
// Send confirmation email
await sendCancellationEmail(subscription.customer);
// Log for analytics
await logCancellation(subscription, 'immediate');
return subscription;
} catch (error) {
console.error('Cancellation failed:', error);
throw error;
}
}
Scenario 2: Scheduled Cancellation
async function scheduleCancel(subscriptionId) {
const subscription = await stripe.subscriptions.update(
subscriptionId,
{
cancel_at_period_end: true,
metadata: {
cancellation_reason: 'customer_request',
cancellation_date: new Date().toISOString()
}
}
);
return subscription;
}
Scenario 3: Cancellation with Refund
async function cancelWithRefund(subscriptionId, refundAmount) {
// Cancel the subscription
const subscription = await stripe.subscriptions.del(subscriptionId);
// Issue partial refund
const refund = await stripe.refunds.create({
charge: subscription.latest_invoice.charge,
amount: refundAmount, // in cents
reason: 'requested_by_customer'
});
return { subscription, refund };
}
Preventing Unwanted Cancellations
1. Payment Retry Logic
Configure smart retry rules:
- First retry: 3 days after failure
- Second retry: 5 days after first retry
- Third retry: 7 days after second retry
2. Dunning Emails
Set up automated payment failure emails:
- Immediate notification of payment failure
- Reminder 24 hours before retry
- Final warning before cancellation
3. Grace Periods
Implement grace periods for failed payments:
await stripe.subscriptions.update(subscriptionId, {
pause_collection: {
behavior: 'mark_uncollectible',
resumes_at: Math.floor(Date.now() / 1000) + (7 * 24 * 60 * 60) // 7 days
}
});
Handling Edge Cases
Multiple Subscriptions
When a customer has multiple subscriptions:
- List all active subscriptions
- Allow selective cancellation
- Consider bundle discounts
Regulatory Compliance
Ensure compliance with:
- GDPR: Right to deletion
- California law: Easy cancellation requirements
- FTC guidelines: Clear cancellation process
Webhook Implementation
Listen for cancellation events:
app.post('/webhook', async (req, res) => {
const event = req.body;
switch (event.type) {
case 'customer.subscription.deleted':
await handleCancellation(event.data.object);
break;
case 'customer.subscription.updated':
if (event.data.object.cancel_at_period_end) {
await handleScheduledCancellation(event.data.object);
}
break;
}
res.json({received: true});
});
Post-Cancellation Strategy
1. Data Retention
- Keep subscription history for analytics
- Maintain customer data per privacy policy
- Archive transaction records
2. Win-Back Campaigns
- Send feedback survey immediately
- Offer special pricing after 30 days
- Share product updates quarterly
3. Analytics and Insights
Track cancellation metrics:
- Cancellation rate by plan
- Average customer lifetime
- Cancellation reasons
- Win-back success rate
Conclusion
Properly managing Stripe subscription cancellations is essential for maintaining good customer relationships and clean financial records. By implementing the practices outlined in this guide, you'll handle cancellations professionally while maximizing retention opportunities.
Remember: make cancellation easy, but give customers reasons to stay. A smooth cancellation process often leads to future reactivations.
Need help automating your subscription management? Try KillSub for intelligent subscription tracking and optimization.
Ready to kill unnecessary subscriptions?
Join thousands saving money with KillSub
Get subscription management tips
Join our newsletter for weekly tips on managing subscriptions and saving money
No spam. Unsubscribe anytime.