Credit Notes

    Learn how to adjust or refund finalized invoices with credit notes.

    Credit notes are documents that decrease the amount owed on an invoice. They’re the only way to adjust the amount of a finalized invoice other than voiding and recreating the invoice. Some example scenarios where you might use credit notes include:

    • You accidentally overbilled a customer — You accidentally charged your customer 110 USD instead of 100 USD because of a data entry mistake. Use a credit note to give your customer a 10 USD credit for the overcharge.
    • You’re short on inventory — You billed your customer for 15 items, but when it’s time to ship them you realize you only have 13 items left in stock. Use a credit note to refund your customer for the 2 items they didn’t receive.
    • 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 USD and a credit note of 20 USD is created for that invoice, the invoice’s new amount due will be 80 USD.

    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.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";
    
    var options = new CreditNoteCreateOptions
    {
      Invoice = "in_18jwqyLlRB0eXbMtrUQ97YBw",
      Amount = 500,
    };
    
    var service = new CreditNoteService();
    var creditNote = service.Create(options);
    

    When you create a credit note for a paid invoice, the amount due on the invoice doesn’t change. 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.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";
    
    var options = new CreditNoteCreateOptions
    {
      Invoice = "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.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";
    
    var options = new CreditNoteCreateOptions
    {
      Invoice = "in_18jwqyLlRB0eXbMtrUQ97YBw",
      Amount = 500,
      CreditAmount = 500,
    };
    
    var service = new CreditNoteService();
    var creditNote = service.Create(options);
    

    You can also combine multiple parameters. Funds left over after subtracting the refund and credit amounts from the amount on the invoice results in a credit outside of Stripe, usually with cash or a check.

    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.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";
    
    var options = new CreditNoteCreateOptions
    {
      Invoice = "in_18jwqyLlRB0eXbMtrUQ97YBw",
      Amount = 500,
      CreditAmount = 100,
      RefundAmount = 200,
    };
    
    var service = new CreditNoteService();
    var creditNote = service.Create(options);
    

    Invoices with customer balances or discounts

    Credit notes issued for invoices with a customer balance applied to them sometimes result in funds being credited to the customer’s balance instead of their bank account. For example, if a customer balance of 150 USD is applied to an invoice for 200 USD, then the finalized invoice is for 50 USD. If you issue a credit note for 50 USD or less, the funds are deposited into the customer’s bank account. Anything above 50 USD is added to the customer’s balance and is applied to the next invoice.

    Discounts are applied evenly to all line items on an invoice. For example, applying a 50% discount to an invoice with 10 line items at 10 USD each results in each line item costing 5 USD instead. If you credit back one line item, 5 USD is returned to the customer.

    Discounts with a set amount work in a similar way. Applying a 10 USD discount to an invoice with 10 line items at 10 USD each results in each line item costing 9 USD instead. If you credit back a single item, 9 USD is returned to the customer. However, this means that the original 10 USD discount ends up only being 9 USD. If you want to make sure the customer receives the full 10 USD discount, you can add a custom line item for 1 USD in the credit note to credit back the single item.

    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.ApiKey = "sk_test_4eC39HqLyjWDarjtT1zdp7dc";
    
    var options = new CreditNoteVoidOptions{};
    var service = new CreditNoteService();
    var creditNote = service.VoidCreditNote("cn_w82laPzlw48z", options);
    

    Was this page helpful?

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

    On this page