Invoicing Workflow

    Understand Stripe Billing’s invoicing workflow

    Invoices created with Stripe move through a familiar automatic collection workflow.

    You can configure whether an invoice should go through automatic collection by toggling the auto_advance property on the invoice. When automatic collection is turned off, you or your integration will be responsible for transitioning the invoice between statuses.

    Overview

    Invoices can take on the following statuses:

    Status Description Possible Actions
    draft Starting status for all invoices; at this point, the invoice can still be edited. Finalize it to open, or delete it.
    open The invoice has been finalized, and is now awaiting payment from the customer. It can no longer be edited. Send, void, mark uncollectible, or pay the invoice.
    paid This invoice was paid.
    void This invoice was a mistake, and should be canceled.
    uncollectible It’s unlikely that this invoice will be paid, and it should be treated as bad debt in reports. Void or pay the invoice.

    These statuses allow for invoices to be drafted and revised multiple times before finalizing them, sending them to customers, and attempting payment.

    Restrictions on finalized invoices

    Once an invoice is finalized (no longer a draft), it is no longer editable. This is to satisfy the common tax-compliance requirement that finalized invoices be retained—as they were finalized—for a legally required minimum time period.

    Voiding invoices

    Because you must retain invoices for some time period, you cannot delete an invoice once it is finalized. As an alternative, you may void an invoice. Unlike deletion, this will maintain the invoice, but mark it as voided—effectively zeroing out its amounts from any reporting. Invoices with a void status are not payable.

    Uncollectible invoices

    Sometimes customers cannot pay your invoice—for example, perhaps they declare bankruptcy and cannot pay their debts. In this case, an uncollectible invoice allows you to track debts where you doubt payment will occur.

    Finally, the paid status is simply used for invoices that are paid.

    Workflow transitions

    Here are some common transitions that invoices could take among statuses.

    Invoice status transition endpoints and webhooks

    The following table outlines the status transitions and their endpoints—along with the webhooks emitted by the endpoint, and the resulting status for each.

    Status API Endpoint Emitted Webhook End Status
    draft DELETE /v1/invoices/:id invoice.deleted (Deleted)
    draft POST /v1/:id/finalize invoice.finalized open
    open POST /v1/:id/pay invoice.payment_succeeded paid
    open POST /v1/:id/pay invoice.payment_failed open
    open POST /v1/:id/send invoice.sent open
    open POST /v1/:id/void invoice.voided void
    open POST /v1/:id/mark_uncollectible invoice.marked_uncollectible uncollectible
    uncollectible POST /v1/:id/pay invoice.payment_succeeded paid
    uncollectible POST /v1/:id/pay invoice.payment_failed uncollectible
    uncollectible POST /v1/:id/void invoice.voided void

    Finalizing draft invoices into open

    An invoice is always created as a draft. This reflects its ability to be edited.

    Invoices drafted on a one-off basis should be finalized. You can do so by explicitly finalizing the invoice, sending it, or attempting to collect payment for it.

    Subscriptions automatically create draft invoices during each billing cycle; these invoices are then automatically finalized approximately an hour later. This delay provides an opportunity to add ad-hoc line items to the invoice.

    You can promptly finalize a one-off or subscription invoice via the API:

    curl https://api.stripe.com/v1/invoices/:id/finalize \
       -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
       -X POST
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    invoice = Stripe::Invoice.retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw")
    invoice = invoice.finalize_invoice
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    invoice = stripe.Invoice.retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw")
    invoice.finalize_invoice()
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    $invoice = \Stripe\Invoice::retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw");
    $invoice->finalizeInvoice();
    
    // Set your secret key: remember to change this 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_18jwqyLlRB0eXbMtrUQ97YBw");
    invoice.finalizeInvoice();
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    var stripe = require("stripe")("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    stripe.invoices.finalizeInvoice("in_18jwqyLlRB0eXbMtrUQ97YBw", function(err, invoice) {
      // asynchronously called
    });
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    params := &stripe.InvoiceFinalizeParams{}
    i, err := invoice.FinalizeInvoice("in_18jwqyLlRB0eXbMtrUQ97YBw", params)
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    StripeConfiguration.SetApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    var finalizeOptions = new InvoiceFinalizeOptions{};
    var service = new InvoiceService();
    Invoice invoice = service.FinalizeInvoice("in_18jwqyLlRB0eXbMtrUQ97YBw", finalizeOptions);
    

    If you have configured webhook endpoints, you will receive a invoice.finalized event when an invoice is finalized.

    Upon finalization

    Finalizing an invoice does the following things:

    • It allows the invoice to be paid
    • It ensures that an invoice number is present
    • It makes certain properties immutable on the invoice
    • It generates a unique URL where someone can pay the invoice, as well as a link to download a PDF of the invoice

    Emails after finalization

    By default, Stripe automatically sends invoices when for invoices with billing=send_invoice. Stripe will not email invoices charged automatically, or when:

    You can manually cause invoices to be sent by using the dashboard or using the send invoice method.

    Deleting draft invoices

    You can delete a draft invoice at any time.

    curl https://api.stripe.com/v1/invoices/:id \
       -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
       -X DELETE
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    invoice = Stripe::Invoice.retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw")
    invoice = invoice.delete
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    invoice = stripe.Invoice.retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw")
    invoice.delete()
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    $invoice = \Stripe\Invoice::retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw");
    $invoice->delete();
    
    // Set your secret key: remember to change this 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_18jwqyLlRB0eXbMtrUQ97YBw");
    invoice.delete();
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    var stripe = require("stripe")("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    stripe.invoices.del("in_18jwqyLlRB0eXbMtrUQ97YBw");
    
    // Set your secret key: remember to change this 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{}
    i, err := invoice.Del("in_18jwqyLlRB0eXbMtrUQ97YBw", params)
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    StripeConfiguration.SetApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    var service = new InvoiceService();
    Invoice invoice = service.Delete("in_18jwqyLlRB0eXbMtrUQ97YBw");
    

    If you have configured webhook endpoints, you will receive a invoice.deleted event when the invoice is deleted.

    Marking as uncollectible

    Accounts Receivable departments sometimes have customers who cannot pay their outstanding bills. For example, assume that you supply $1,000 worth of services to your customer, but the customer informs you that they have since declared bankruptcy, and (even after liquidating assets) will not be able to pay the outstanding invoice balance.

    With this information, you decide to write off the invoice as unlikely to be paid. You could then update the invoice’s status to be uncollectible. This allows you to track the amount owed for reporting purposes, as part of your bad-debt accounting process.

    You can mark an invoice as uncollectible either through the Dashboard (from the invoice’s detail page), or with an API integration, as shown in the following example:

    curl https://api.stripe.com/v1/invoices/:id/mark_uncollectible \
       -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
       -X POST
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    invoice = Stripe::Invoice.retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw")
    invoice = invoice.mark_uncollectible
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    invoice = stripe.Invoice.retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw")
    invoice.mark_uncollectible()
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    $invoice = \Stripe\Invoice::retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw");
    $invoice->markUncollectible();
    
    // Set your secret key: remember to change this 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_18jwqyLlRB0eXbMtrUQ97YBw");
    invoice.markUncollectible();
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    var stripe = require("stripe")("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    stripe.invoices.markUncollectible("in_18jwqyLlRB0eXbMtrUQ97YBw", function(err, invoice) {
      // asynchronously called
    });
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    params := &stripe.InvoiceMarkUncollectibleParams{}
    i, err := invoice.MarkUncollectible("in_18jwqyLlRB0eXbMtrUQ97YBw", params)
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    StripeConfiguration.SetApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    var markUncollectibleOptions = new InvoiceMarkUncollectibleOptions{};
    var service = new InvoiceService();
    Invoice invoice = service.MarkUncollectible("in_18jwqyLlRB0eXbMtrUQ97YBw", markUncollectibleOptions);
    

    If you have configured webhook endpoints, you will receive a invoice.marked_uncollectible event when an invoice moves into the uncollectible status.

    Voiding invoices

    Voiding an invoice is conceptually similar to deleting it. Voiding an invoice maintains a paper trail, allowing the invoice to be looked up by number. Once voided, invoices are treated as zero-value for reporting purposes.

    You can void invoices only when they are in either the open or the uncollectible status. You can do so either through the Dashboard (from the invoice’s detail page), or with an API integration, as shown in the following example:

    curl https://api.stripe.com/v1/invoices/:id/void \
       -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
       -X POST
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    invoice = Stripe::Invoice.retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw")
    invoice = invoice.void_invoice
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    invoice = stripe.Invoice.retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw")
    invoice.void_invoice()
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    $invoice = \Stripe\Invoice::retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw");
    $invoice->voidInvoice();
    
    // Set your secret key: remember to change this 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_18jwqyLlRB0eXbMtrUQ97YBw");
    invoice.voidInvoice();
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    var stripe = require("stripe")("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    stripe.invoices.voidInvoice("in_18jwqyLlRB0eXbMtrUQ97YBw", function(err, invoice) {
      // asynchronously called
    });
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    params := &stripe.InvoiceVoidParams{}
    i, err := invoice.VoidInvoice("in_18jwqyLlRB0eXbMtrUQ97YBw", params)
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    StripeConfiguration.SetApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    var voidOptions = new InvoiceVoidOptions{};
    var service = new InvoiceService();
    Invoice invoice = service.VoidInvoice("in_18jwqyLlRB0eXbMtrUQ97YBw", voidOptions);
    

    If you have configured webhook endpoints, you will receive a invoice.voided event when an invoice moves into the void status.

    When payment occurs through Stripe for an invoice, the invoice is moved into the paid status. This status is terminal, which means that paid invoices can never take on another status.

    To attempt a payment through the Dashboard, open the invoice’s detail page and click the Charge customer button.

    If an invoice was paid out of band (outside Stripe), you can manually mark the invoice as paid in the Dashboard. From the invoice’s detail page, use the context menu to select Change invoice status. In the resulting modal, select the Paid option.

    If you are using the API, the following example shows how to transition an invoice into a paid state using the Pay an invoice API endpoint.

    curl https://api.stripe.com/v1/invoices/:id/pay \
       -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
       -X POST
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    invoice = Stripe::Invoice.retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw")
    invoice.pay
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    invoice = stripe.Invoice.retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw")
    invoice.pay()
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    $invoice = \Stripe\Invoice::retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw");
    $invoice->pay();
    
    // Set your secret key: remember to change this 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_18jwqyLlRB0eXbMtrUQ97YBw");
    invoice.pay();
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    var stripe = require("stripe")("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    stripe.invoices.pay("in_18jwqyLlRB0eXbMtrUQ97YBw", function(err, invoice) {
      // asynchronously called
    });
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.Key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    params := &stripe.InvoicePayParams{}
    i, err := invoice.Pay("in_18jwqyLlRB0eXbMtrUQ97YBw", params)
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    StripeConfiguration.SetApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    var payOptions = new InvoicePayOptions{};
    var service = new InvoiceService();
    Invoice invoice = service.Pay("in_18jwqyLlRB0eXbMtrUQ97YBw", payOptions);
    

    If you have configured webhook endpoints, you will receive a invoice.payment_failed or invoice.payment_succeeded event, depending on the outcome of the payment attempt.

    Limits on editing finalized invoices

    As outlined above, finalized invoices are no longer editable. In some jurisdictions, editing fields that modify an invoice’s total amount due renders the invoice invalid. These are typically fields associated with your account, customer, line items, or taxes.

    Enabling/disabling automatic advancement and collection

    By default, Stripe automatically advances your invoices toward collection. This behavior includes:

    • Automatically finalizing invoices
    • Automatically attempting to collect payments
    • Emailing invoices and receipts
    • Using Smart Retries to automatically retry payment collection

    Pausing automatic collection

    There are cases where you might want to stop Stripe from automatically advancing your invoices toward collection. For example:

    • You want to use your own business logic to manage an invoice’s lifecycle.
    • You want to decide, on a per-invoice basis, whether and when to send invoice emails.

    In these cases, you can use the auto_advance property to disable or enable (pause or unpause) the automatic collection behavior.

    Updating the auto_advance property

    You can toggle the auto_advance property on draft and open invoices. Automatic collection will never occur on invoices in uncollectible, void, or paid statuses, so for invoices in these statuses, auto_advance will always be set to false.

    curl https://api.stripe.com/v1/invoices/:id \
       -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
       -X PUT \
       -d auto_advance=false
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    Stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    invoice = Stripe::Invoice.retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw")
    invoice.auto_advance = false
    invoice.save
    
    # Set your secret key: remember to change this to your live secret key in production
    # See your keys here: https://dashboard.stripe.com/account/apikeys
    stripe.api_key = "sk_test_4eC39HqLyjWDarjtT1zdp7dc"
    
    invoice = stripe.Invoice.retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw")
    invoice.auto_advance = false
    invoice.save()
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    \Stripe\Stripe::setApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    $invoice = \Stripe\Invoice::retrieve("in_18jwqyLlRB0eXbMtrUQ97YBw");
    $invoice->auto_advance = false;
    $invoice->save();
    
    // Set your secret key: remember to change this 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_18jwqyLlRB0eXbMtrUQ97YBw");
    Map<String, Object> updateParams = new HashMap<String, Object>();
    updateParams.put("auto_advance", false);
    invoice.update(updateParams);
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    var stripe = require("stripe")("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    stripe.invoices.update(
      "in_18jwqyLlRB0eXbMtrUQ97YBw",
      {
        auto_advance: false
      },
      function(err, invoice) {
        // asynchronously called
      }
    )
    
    // Set your secret key: remember to change this 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(false),
    }
    i, err := invoice.Update("in_18jwqyLlRB0eXbMtrUQ97YBw", params)
    
    // Set your secret key: remember to change this to your live secret key in production
    // See your keys here: https://dashboard.stripe.com/account/apikeys
    StripeConfiguration.SetApiKey("sk_test_4eC39HqLyjWDarjtT1zdp7dc");
    
    var options = new InvoiceUpdateOptions {
      AutoAdvance = false
    };
    var service = new InvoiceService();
    Invoice invoice = service.Update("in_18jwqyLlRB0eXbMtrUQ97YBw", options);
    

    Effects of toggling auto_advance

    When auto_advance is set to false (disabling automatic collection), most of Stripe Billing’s automatic features are disabled—leaving collection up to you.

    The following table outlines some key changes in automatic collection’s behavior, depending on whether auto_advance is set to true or false:

    Feature auto_advance=true auto_advance=false
    Finalize drafts to open ✅ after approximately 1-hour
    Emailing invoices ✅ ⚙️
    Attempting payments
    Retries (email and charge) ✅ ⚙️
    Invoice reminder emails ✅ ⚙️
    Email receipts ✅ ⚙️ *email settings ✅ ⚙️ *email settings

    Legend

    • ✅ = Can be enabled (depending on the settings ⚙️)
    • ⚙️ = Configurable in settings
    • ⛔ = Not enabled—the invoice is not automatically transitioned

    Questions?

    We're always happy to help with code or other questions you might have! Search our documentation, contact support, or connect with our sales team. You can also chat live with other developers in #stripe on freenode.

    Was this page helpful? Yes No

    Send

    Thank you for helping improve Stripe's documentation. If you need help or have any questions, please consider contacting support.