Credit Notes

    Adjusting or refunding finalized invoices with credit notes.

    Credit notes are documents that decrease the amount owed on a specified invoice. Credit notes are the only way to adjust the amount of a finalized invoice (other than voiding and recreating the invoice from scratch).

    Example credit note scenarios:

    • You accidentally overbilled a customer — You accidentally charged your customer $110 instead of $100 due to a data entry mistake. Use a credit note to give your customer a $10 credit for the overcharge amount.
    • You’re short on inventory — Although you billed your customer for 10 items, when it’s time to ship them you realize you only have 8 items left in stock. Use a credit note to refund your customer for the shortfall.
    • Discounts — Rather than voiding and reissuing a new invoice, you can use a credit note to adjust the amount owed on the existing invoice by a negotiated discount amount.

    Issuing Credit Notes

    A credit note can be issued for open and paid invoices. When issued for an open invoice, a credit note decreases the invoice’s amount due. When issued for a paid invoice, it is commonly used to refund or credit a specified amount to the customer.

    The sum of all credit notes issued for an invoice cannot exceed the invoice’s total amount.

    Issuing Credit Notes within the Dashboard

    You can create a credit note from the invoice detail page for any open or paid invoice:

    • Navigate to the invoice detail page.
    • Locate the page header’s button row.
    • Click the overflow menu (identified by the ellipsis “…” button).
    • The overflow menu displays an option to Issue a credit note.

    Clicking the Issue a credit note menu item will display the Issue credit note modal, where you can set the credit note’s amount and details.

    The Dashboard modal for issuing a credit note

    Issuing Credit Notes via the API

    You can use the API to generate credit notes programmatically, as shown in the following examples…

    Open Invoices

    When a credit note is created for an open invoice, the invoice’s amount_due is decreased by the credit note’s amount. For example, if the amount due of an open invoice is $100 and a credit note of $20 is created for that invoice, the invoice’s new amount due will be $80.

    On an invoice, credit notes are represented as items below the applications of discounts and taxes—they’re actually a post-tax adjusted amount.

    The invoice amount due is calculated using the following order:

    1. Sum of invoice line items
    2. Discounts
    3. Pre-tax invoice total
    4. Taxes
    5. Customer balance
    6. Credit notes applied (to gross amount due)
    7. New amount due

    If applying a credit note to an invoice changes the invoice amount due to zero, the invoice automatically transitions into the paid state.

    Create a credit note via the API, passing in the invoice ID and the adjustment amount, as shown in the following example:

    curl https://api.stripe.com/v1/credit_notes \
      -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
      -d invoice=in_18jwqyLlRB0eXbMtrUQ97YBw \
      -d amount=500
    
    # 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'
    
    Stripe::CreditNote.create({
      invoice: 'in_18jwqyLlRB0eXbMtrUQ97YBw',
      amount: 500,
    })
    
    # 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'
    
    stripe.CreditNote.create(
      invoice='in_18jwqyLlRB0eXbMtrUQ97YBw',
      amount=500,
    )
    
    // 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');
    
    \Stripe\CreditNote::create([
      'invoice' => 'in_18jwqyLlRB0eXbMtrUQ97YBw',
      'amount' => 500,
    ]);
    
    // 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";
    
    Map<String, Object> creditNoteParams = new HashMap<String, Object>();
    creditNoteParams.put("invoice", "in_18jwqyLlRB0eXbMtrUQ97YBw");
    creditNoteParams.put("amount", 500);
    
    CreditNote.create(creditNoteParams);
    
    // 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
    const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');
    
    stripe.creditNotes.create({
      invoice: 'in_18jwqyLlRB0eXbMtrUQ97YBw',
      amount: 500,
    }, function(err, creditNote) {
      // 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.CreditNoteParams{
      Invoice: stripe.String("in_18jwqyLlRB0eXbMtrUQ97YBw"),
      Amount: stripe.Int64(500),
    }
    cn, err := creditnote.New(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 CreditNoteCreateOptions
    {
      InvoiceId = "in_18jwqyLlRB0eXbMtrUQ97YBw",
      Amount = 500,
    };
    
    var service = new CreditNoteService();
    var creditNote = service.Create(options);
    

    When a credit note is created for an already-paid invoice, the amount due of the invoice is not adjusted. Instead, the user can choose one or more of the following options:

    Action Description
    Create a refund Refund the invoice’s charge back to the customer’s payment method.
    Link a refund Link an existing refund for the invoice’s charge.
    Credit the customer balance Credit the customer balance, which is automatically applied to their future invoices.
    Credit outside of Stripe Credit the invoice for an amount made in an adjustment outside of Stripe.

    In this example, the credit note creates a refund.

    curl https://api.stripe.com/v1/credit_notes \
      -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
      -d invoice=in_18jwqyLlRB0eXbMtrUQ97YBw \
      -d amount=500 \
      -d refund_amount=500
    
    # 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'
    
    Stripe::CreditNote.create({
      invoice: 'in_18jwqyLlRB0eXbMtrUQ97YBw',
      amount: 500,
      refund_amount: 500,
    })
    
    # 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'
    
    stripe.CreditNote.create(
      invoice='in_18jwqyLlRB0eXbMtrUQ97YBw',
      amount=500,
      refund_amount=500,
    )
    
    // 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');
    
    \Stripe\CreditNote::create([
      'invoice' => 'in_18jwqyLlRB0eXbMtrUQ97YBw',
      'amount' => 500,
      'refund_amount' => 500,
    ]);
    
    // 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";
    
    Map<String, Object> creditNoteParams = new HashMap<String, Object>();
    creditNoteParams.put("invoice", "in_18jwqyLlRB0eXbMtrUQ97YBw");
    creditNoteParams.put("amount", 500);
    creditNoteParams.put("refund_amount", 500);
    
    CreditNote.create(creditNoteParams);
    
    // 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
    const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');
    
    stripe.creditNotes.create({
      invoice: 'in_18jwqyLlRB0eXbMtrUQ97YBw',
      amount: 500,
      refund_amount: 500,
    }, function(err, creditNote) {
      // 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.CreditNoteParams{
      Invoice: stripe.String("in_18jwqyLlRB0eXbMtrUQ97YBw"),
      Amount: stripe.Int64(500),
      RefundAmount: stripe.Int64(500),
    }
    cn, err := creditnote.New(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 CreditNoteCreateOptions
    {
      InvoiceId = "in_18jwqyLlRB0eXbMtrUQ97YBw",
      Amount = 500,
      RefundAmount = 500,
    };
    
    var service = new CreditNoteService();
    var creditNote = service.Create(options);
    

    Here, the credit note creates a credit to the customer balance.

    curl https://api.stripe.com/v1/credit_notes \
      -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
      -d invoice=in_18jwqyLlRB0eXbMtrUQ97YBw \
      -d amount=500 \
      -d credit_amount=500
    
    # 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'
    
    Stripe::CreditNote.create({
      invoice: 'in_18jwqyLlRB0eXbMtrUQ97YBw',
      amount: 500,
      credit_amount: 500,
    })
    
    # 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'
    
    stripe.CreditNote.create(
      invoice='in_18jwqyLlRB0eXbMtrUQ97YBw',
      amount=500,
      credit_amount=500,
    )
    
    // 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');
    
    \Stripe\CreditNote::create([
      'invoice' => 'in_18jwqyLlRB0eXbMtrUQ97YBw',
      'amount' => 500,
      'credit_amount' => 500,
    ]);
    
    // 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";
    
    Map<String, Object> creditNoteParams = new HashMap<String, Object>();
    creditNoteParams.put("invoice", "in_18jwqyLlRB0eXbMtrUQ97YBw");
    creditNoteParams.put("amount", 500);
    creditNoteParams.put("credit_amount", 500);
    
    CreditNote.create(creditNoteParams);
    
    // 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
    const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');
    
    stripe.creditNotes.create({
      invoice: 'in_18jwqyLlRB0eXbMtrUQ97YBw',
      amount: 500,
      credit_amount: 500,
    }, function(err, creditNote) {
      // 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.CreditNoteParams{
      Invoice: stripe.String("in_18jwqyLlRB0eXbMtrUQ97YBw"),
      Amount: stripe.Int64(500),
      CreditAmount: stripe.Int64(500),
    }
    cn, err := creditnote.New(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 CreditNoteCreateOptions
    {
      InvoiceId = "in_18jwqyLlRB0eXbMtrUQ97YBw",
      Amount = 500,
      CreditAmount = 500,
    };
    
    var service = new CreditNoteService();
    var creditNote = service.Create(options);
    

    You can also combine multiple parameters. Any remaining value from amount - refund_amount - credit_amount is represented as an “outside of Stripe” credit.

    curl https://api.stripe.com/v1/credit_notes \
      -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
      -d invoice=in_18jwqyLlRB0eXbMtrUQ97YBw \
      -d amount=500 \
      -d credit_amount=100 \
      -d refund_amount=200
    
    # 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'
    
    Stripe::CreditNote.create({
      invoice: 'in_18jwqyLlRB0eXbMtrUQ97YBw',
      amount: 500,
      credit_amount: 100,
      refund_amount: 200,
    })
    
    # 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'
    
    stripe.CreditNote.create(
      invoice='in_18jwqyLlRB0eXbMtrUQ97YBw',
      amount=500,
      credit_amount=100,
      refund_amount=200,
    )
    
    // 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');
    
    \Stripe\CreditNote::create([
      'invoice' => 'in_18jwqyLlRB0eXbMtrUQ97YBw',
      'amount' => 500,
      'credit_amount' => 100,
      'refund_amount' => 200,
    ]);
    
    // 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";
    
    Map<String, Object> creditNoteParams = new HashMap<String, Object>();
    creditNoteParams.put("invoice", "in_18jwqyLlRB0eXbMtrUQ97YBw");
    creditNoteParams.put("amount", 500);
    creditNoteParams.put("credit_amount", 100);
    creditNoteParams.put("refund_amount", 200);
    
    CreditNote.create(creditNoteParams);
    
    // 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
    const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');
    
    stripe.creditNotes.create({
      invoice: 'in_18jwqyLlRB0eXbMtrUQ97YBw',
      amount: 500,
      credit_amount: 100,
      refund_amount: 200,
    }, function(err, creditNote) {
      // 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.CreditNoteParams{
      Invoice: stripe.String("in_18jwqyLlRB0eXbMtrUQ97YBw"),
      Amount: stripe.Int64(500),
      CreditAmount: stripe.Int64(100),
      RefundAmount: stripe.Int64(200),
    }
    cn, err := creditnote.New(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 CreditNoteCreateOptions
    {
      InvoiceId = "in_18jwqyLlRB0eXbMtrUQ97YBw",
      Amount = 500,
      CreditAmount = 100,
      RefundAmount = 200,
    };
    
    var service = new CreditNoteService();
    var creditNote = service.Create(options);
    

    Voiding Credit Notes

    You can only void a credit note on open invoices. Voiding a credit note reverses its adjustment, effectively restoring the amount due on the invoice to its pre-credit-note amount.

    curl https://api.stripe.com/v1/credit_notes/cn_w82laPzlw48z/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'
    
    Stripe::CreditNote.void_credit_note('cn_w82laPzlw48z')
    
    # 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'
    
    credit_note = stripe.CreditNote.void_credit_note('cn_w82laPzlw48z')
    
    // 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');
    
    $credit_note = \Stripe\CreditNote::retrieve('cn_w82laPzlw48z');
    $credit_note->voidCreditNote();
    
    // 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";
    
    CreditNote creditNote = CreditNote.retrieve("cn_w82laPzlw48z");
    creditNote.voidCreditNote();
    
    // 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
    const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc');
    
    stripe.creditNotes.voidCreditNote('cn_w82laPzlw48z', function(err, creditNote) {
      // 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.CreditNoteVoidParams{}
    cn, err := creditNote.VoidCreditNote("cn_w82laPzlw48z", 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 CreditNoteVoidOptions{};
    var service = new CreditNoteService();
    var creditNote = service.VoidCreditNote("cn_w82laPzlw48z", options);
    

    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.

    On this page