Billing
Change subscriptions
Pause payment collection

Pause payment collection

Learn how to pause payment collection on subscriptions.

Pausing payment collection is often used to temporarily offer your services for free or to stop payments if you can’t provide your services. While collection is paused, subscriptions still generate invoices but you have a few options for handling these invoices.

You can pause or resume collection in the Stripe Dashboard or the API. To use the API, review the following use cases to determine the best approach for you.

Use case API configuration
Offer services for free Use behavior=mark_uncollectible
Temporarily offer services for free and collect payment later Use behavior=keep_as_draft
Unable to provide services Use behavior=void

If these options don’t fit your use case, you might want to consider canceling subscriptions instead.

Offer services for free

If you want to offer your services for free, update the subscription’s pause_collection[behavior] to mark_uncollectible. If you know when you want to resume collection, pass a timestamp for resumes_at as well.

curl https://api.stripe.com/v1/subscriptions/sub_GTbTiykEwMRog0 \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d "pause_collection[behavior]"=mark_uncollectible
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' Stripe::Subscription.update( 'sub_GTbTiykEwMRog0', { pause_collection: { behavior: 'mark_uncollectible', }, } )
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' stripe.Subscription.modify( 'sub_GTbTiykEwMRog0', pause_collection={ 'behavior': 'mark_uncollectible', }, )
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); \Stripe\Subscription::update( 'sub_GTbTiykEwMRog0', [ 'pause_collection' => [ 'behavior' => 'mark_uncollectible', ], ] );
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; Subscription subscription = Subscription.retrieve("sub_GTbTiykEwMRog0"); SubscriptionUpdateParams params = SubscriptionUpdateParams.builder() .setPauseCollection( SubscriptionUpdateParams.PauseCollection.builder() .setBehavior(SubscriptionUpdateParams.PauseCollection.Behavior.MARK_UNCOLLECTIBLE) .build()) .build(); subscription = subscription.update(params);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const subscription = await stripe.subscriptions.update( 'sub_GTbTiykEwMRog0', { pause_collection: { behavior: 'mark_uncollectible', }, } );
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.SubscriptionParams{ PauseCollection: &stripe.SubscriptionPauseCollectionParams{ Behavior: stripe.String(string(stripe.SubscriptionPauseCollectionBehaviorMarkUncollectible)), }, } s, _ := sub.Update("sub_GTbTiykEwMRog0", params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new SubscriptionUpdateOptions { PauseCollection = new SubscriptionPauseCollectionOptions { Behavior = "mark_uncollectible", }, }; var service = new SubscriptionService(); service.Update("sub_GTbTiykEwMRog0", options);

All invoices generated before the resumes_at date are immediately marked as uncollectible. Stripe won’t send any upcoming invoice emails or webhooks for these invoices and the subscription’s status remains unchanged.

If you don’t set a resumes_at date, the subscription remains paused until you unset pause_collection.

Temporarily offer services for free and collect payment later

If you want to temporarily offer your services for free and collect payments later, set pause_collection[behavior]=keep_as_draft. If you know when you want to resume collection, pass a timestamp for resumes_at as well.

curl https://api.stripe.com/v1/subscriptions/sub_GTbTiykEwMRog0 \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d "pause_collection[behavior]"=keep_as_draft
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' Stripe::Subscription.update( 'sub_GTbTiykEwMRog0', { pause_collection: { behavior: 'keep_as_draft', }, } )
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' stripe.Subscription.modify( 'sub_GTbTiykEwMRog0', pause_collection={ 'behavior': 'keep_as_draft', }, )
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); \Stripe\Subscription::update( 'sub_GTbTiykEwMRog0', [ 'pause_collection' => [ 'behavior' => 'keep_as_draft', ], ] );
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; Subscription subscription = Subscription.retrieve("sub_GTbTiykEwMRog0"); SubscriptionUpdateParams params = SubscriptionUpdateParams.builder() .setPauseCollection( SubscriptionUpdateParams.PauseCollection.builder() .setBehavior(SubscriptionUpdateParams.PauseCollection.Behavior.KEEP_AS_DRAFT) .build()) .build(); subscription = subscription.update(params);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const subscription = await stripe.subscriptions.update( 'sub_GTbTiykEwMRog0', { pause_collection: { behavior: 'keep_as_draft', }, } );
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.SubscriptionParams{ PauseCollection: &stripe.SubscriptionPauseCollectionParams{ Behavior: stripe.String(string(stripe.SubscriptionPauseCollectionBehaviorKeepAsDraft)), }, } s, _ := sub.Update("sub_GTbTiykEwMRog0", params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new SubscriptionUpdateOptions { PauseCollection = new SubscriptionPauseCollectionOptions { Behavior = "keep_as_draft", }, }; var service = new SubscriptionService(); service.Update("sub_GTbTiykEwMRog0", options);

All invoices created before the resumes_at date remain in draft state and auto_advance is set to false. During this time, Stripe won’t send any upcoming invoice emails or webhooks for these invoices and the subscription’s status remains unchanged.

If you don’t set a resumes_at date, the subscription remains paused until you unset pause_collection.

When you’re ready to collect payment for these invoices, set auto_advance back to true. If you don’t have the invoice IDs, you can use subscription IDs to check for invoices with status=draft. Using the invoice ID, you can then update auto_advance=true:

curl https://api.stripe.com/v1/invoices/in_1EcesDCZ6qsJgndJnyYCH9KG \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d auto_advance=true
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' Stripe::Invoice.update( 'in_1EcesDCZ6qsJgndJnyYCH9KG', {auto_advance: true} )
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' stripe.Invoice.modify( "in_1EcesDCZ6qsJgndJnyYCH9KG", auto_advance=True, )
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); \Stripe\Invoice::update( 'in_1EcesDCZ6qsJgndJnyYCH9KG', ['auto_advance' => true] );
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; Invoice invoice = Invoice.retrieve("in_1EcesDCZ6qsJgndJnyYCH9KG"); InvoiceUpdateParams params = InvoiceUpdateParams.builder() .setAutoAdvance(true) .build(); Invoice updatedInvoice = invoice.update(params);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const invoice = await stripe.invoices.update( 'in_1EcesDCZ6qsJgndJnyYCH9KG', {auto_advance: true}, );
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.InvoiceParams{ AutoAdvance: stripe.Bool(true), } i, _ := invoice.Update("in_1EcesDCZ6qsJgndJnyYCH9KG", params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new InvoiceUpdateOptions { AutoAdvance = true, }; var service = new InvoiceService(); service.Update("in_1EcesDCZ6qsJgndJnyYCH9KG", options);

Unable to provide services

If you can’t provide your services for a certain period of time, you can void invoices that are created by your subscriptions so that your customers aren’t charged. Use the subscription ID to update pause_collection[behavior] to void and pause_collection[behavior][resumes_at] to the date you want to start collecting payments again.

curl https://api.stripe.com/v1/subscriptions/sub_GTbTiykEwMRog0 \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d "pause_collection[behavior]"=void
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' Stripe::Subscription.update( 'sub_GTbTiykEwMRog0', { pause_collection: { behavior: 'void', }, } )
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' stripe.Subscription.modify( 'sub_GTbTiykEwMRog0', pause_collection={ 'behavior': 'void' }, )
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); \Stripe\Subscription::update( 'sub_GTbTiykEwMRog0', [ 'pause_collection' => [ 'behavior' => 'void', ], ] );
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; Subscription subscription = Subscription.retrieve("sub_GTbTiykEwMRog0"); SubscriptionUpdateParams params = SubscriptionUpdateParams.builder() .setPauseCollection( SubscriptionUpdateParams.PauseCollection.builder() .setBehavior(SubscriptionUpdateParams.PauseCollection.Behavior.VOID) .build()) .build(); subscription = subscription.update(params);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const subscription = await stripe.subscriptions.update( 'sub_GTbTiykEwMRog0', { pause_collection: { behavior: 'void', }, } );
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.SubscriptionParams{ PauseCollection: &stripe.SubscriptionPauseCollectionParams{ Behavior: stripe.String(string(stripe.SubscriptionPauseCollectionBehaviorVoid)), }, } s, _ := sub.Update("sub_GTbTiykEwMRog0", params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new SubscriptionUpdateOptions { PauseCollection = new SubscriptionPauseCollectionOptions { Behavior = "void", }, }; var service = new SubscriptionService(); service.Update("sub_GTbTiykEwMRog0", options);

All invoices created before the resumes_at date are immediately voided. Stripe won’t send any upcoming invoice emails or webhooks and the subscription’s status remains unchanged.

If you don’t set a resumes_at date, the subscription remains paused until you unset pause_collection.

Manually unpausing

To resume collecting payments at any time, you can update the subscription and unset pause_collection:

curl https://api.stripe.com/v1/subscriptions/sub_GTbTiykEwMRog0 \ -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \ -d pause_collection=
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' Stripe::Subscription.update( 'sub_GTbTiykEwMRog0', { pause_collection: '' } )
# Set your secret key. Remember to switch to your live secret key in production! # See your keys here: https://dashboard.stripe.com/account/apikeys stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc' stripe.Subscription.modify( 'sub_GTbTiykEwMRog0', pause_collection='', )
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); \Stripe\Subscription::update( 'sub_GTbTiykEwMRog0', [ 'pause_collection' => '', ] );
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys Stripe.apiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; Subscription subscription = Subscription.retrieve("sub_GTbTiykEwMRog0"); SubscriptionUpdateParams params = SubscriptionUpdateParams.builder() .setPauseCollection(EmptyParam.EMPTY) .build(); subscription = subscription.update(params);
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); const subscription = await stripe.subscriptions.update( 'sub_GTbTiykEwMRog0', { pause_collection: '', } );
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc" params := &stripe.SubscriptionParams{} params.AddExtra("pause_collection", "") s, _ := sub.Update("sub_GTbTiykEwMRog0", params)
// Set your secret key. Remember to switch to your live secret key in production! // See your keys here: https://dashboard.stripe.com/account/apikeys StripeConfiguration.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"; var options = new SubscriptionUpdateOptions(); options.AddExtraParam("pause_collection", ""); var service = new SubscriptionService(); service.Update("sub_GTbTiykEwMRog0", options);

Resuming collection this way only affects future invoices.

Pausing and subscription schedules

If you pause a subscription on a subscription schedule, the scheduled updates still take effect. However, payment is not collected while the subscription is paused. When you want to collect payment again, you need to manually unpause the subscription. You also need to update auto_advance to true on any invoices with status=draft that you want to collect payment on.

Was this page helpful?
Questions? Contact us.
Developer tutorials on YouTube.