# Adds support for multiple (partial) payments on invoices ## What’s new We’re introducing support for multiple (partial) payments on [invoices](https://docs.stripe.com/api/invoices.md?api-version=2025-03-31.basil) and [credit notes](https://docs.stripe.com/api/credit_notes.md?api-version=2025-03-31.basil). Invoices also track over-payments and can track out of band payments now. In addition, we’re adding a `confirmation_secret` field on the Invoice object to enhance support for using the Payment Element. ## Why is this a breaking change? - Removed the `payment_intent`, `charge`, `paid`, and `paid_out_of_band` fields from the `Invoice` object. - Removed the `invoice` field from the [PaymentIntent](https://docs.stripe.com/api/payment_intents.md?api-version=2025-03-31.basil) and [Charge](https://docs.stripe.com/api/charges.md?api-version=2025-03-31.basil) objects. - Removed the `application_fee_amount` and `transfer_data` fields from the `Invoice` object. For payments made on Stripe, these fields are now accessible through the underlying PaymentIntent by expanding `payments.data.payment.payment_intent` on the `Invoice` object. - Deprecated the `refund` field on the [Credit Note](https://docs.stripe.com/api/credit_notes.md?api-version=2025-03-31.basil) object and replaced it with a [`refunds`](https://docs.stripe.com/api/credit_notes/create.md?api-version=2025-03-31.basil#create_credit_note-refunds) array. - The `amount_paid` field on the `Invoice` object now reflects out of band payments. ## Impact We introduced the [Invoice Payment](https://docs.stripe.com/api/invoice-payment.md?api-version=2025-03-31.basil) object to represent the connection between payments and invoices and removed previous invoice and payment pointers on relevant objects. Make sure that you update your integration to no longer assume that a single invoice must be paid by a single payment, and use the new Invoice Payment object to understand the connection between payments and invoices. ### Inspect the [`invoice.payments`](https://docs.stripe.com/api/invoices/object.md?api-version=2025-03-31.basil#invoice_object-payments) array for payment information You can inspect [`invoice.payments`](https://docs.stripe.com/api/invoices/object.md?api-version=2025-03-31.basil#invoice_object-payments) when interacting with the [Invoice](https://docs.stripe.com/api/invoices.md?api-version=2025-03-31.basil) object by expanding the `payments` property: ```curl curl -G https://api.stripe.com/v1/invoices/{INVOICE_ID} \ -u "<>:" \ -d "expand[]=payments" ``` The `invoice.payments` array provides a list of all the payments associated with the invoice and their respective allocation and payment status. ### Use the new [Invoice Payment endpoints](https://docs.stripe.com/api/invoice-payment.md?api-version=2025-03-31.basil) for payments and invoice connection To understand the connection between a [Payment Intent](https://docs.stripe.com/api/payment_intents.md?api-version=2025-03-31.basil) and Invoice object, you can use the [List Invoice Payment endpoint](https://docs.stripe.com/api/invoice-payment/list.md?api-version=2025-03-31.basil): ```curl curl -G https://api.stripe.com/v1/invoice_payments \ -u "<>:" \ -d "payment[type]=payment_intent" \ -d "payment[payment_intent]={PAYMENT_INTENT_ID}" ``` ### Use [confirmation_secret](https://docs.stripe.com/api/invoices/object.md?api-version=2025-03-31.basil#invoice_object-confirmation_secret) for Payment Element integrations For Payment Element integrations, especially Subscription integrations, that previously relied on expanding `invoice.payment_intent.client_secret` or `latest_invoice.payments.data.payment.payment_intent.client_secret`, you can now use the new `invoice.confirmation_secret.client_secret` field on the Invoice object by expanding `confirmation_secret`: ```curl curl -G https://api.stripe.com/v1/invoices/{INVOICE_ID} \ -u "<>:" \ -d "expand[]=confirmation_secret" ``` ### Access application_fee_amount and transfer_data through PaymentIntents With the removal of the `application_fee_amount` and `transfer_data` fields from the `Invoice` object, you can now access these fields for payments made on Stripe through the underlying PaymentIntent. Expand `payments.data.payment.payment_intent` when retrieving the invoice: ```curl curl -G https://api.stripe.com/v1/invoices/{INVOICE_ID} \ -u "<>:" \ -d "expand[]=payments.data.payment.payment_intent" ``` You can then access `invoice.payments.data[i].payment.payment_intent.application_fee_amount` and `invoice.payments.data[i].payment.payment_intent.transfer_data` from the expanded PaymentIntent object. These fields are only available for payments made on Stripe when the payment type is `payment_intent`. ### Identify invoices with out-of-band payments With the removal of the `paid_out_of_band` field, you can now identify invoices with out-of-band payments using the [invoice.payments](https://docs.stripe.com/api/invoices/object.md?api-version=2025-03-31.basil#invoice_object-payments) property. To check if an invoice is fully paid out of band, verify the invoice [status](https://docs.stripe.com/api/invoices/object.md?api-version=2025-03-31.basil#invoice_object-status) is `paid`, the [amount_due](https://docs.stripe.com/api/invoices/object.md?api-version=2025-03-31.basil#invoice_object-amount_due) is greater than 0, and the sum of payments of [type](https://docs.stripe.com/api/invoices/object.md?api-version=2025-03-31.basil#invoice_object-payments-data-payment-type) [PaymentIntent](https://docs.stripe.com/api/payment_intents.md?api-version=2025-03-31.basil) in the [invoice.payments](https://docs.stripe.com/api/invoices/object.md?api-version=2025-03-31.basil#invoice_object-payments) array equals 0. To check if an invoice is partially paid out of band, verify the `amount_due` is greater than 0, and the sum of payments of type PaymentIntent in the `invoice.payments` array is less than [amount_paid](https://docs.stripe.com/api/invoices/object.md?api-version=2025-03-31.basil#invoice_object-amount_paid). ## Changes #### REST API #### Ruby #### Python #### PHP #### Java #### Node.js #### Go #### .NET ## Upgrade #### REST API 1. [View your current API version](https://docs.stripe.com/upgrades.md#view-your-api-version-and-the-latest-available-upgrade-in-workbench) in Workbench. 1. If you use an SDK, upgrade to the corresponding SDK version for this API version. - If you don’t use an SDK, update your [API requests](https://docs.stripe.com/api/versioning.md) to include `Stripe-Version: 2025-03-31.basil` 1. Upgrade the API version used for [webhook endpoints](https://docs.stripe.com/webhooks/versioning.md). 1. [Test your integration](https://docs.stripe.com/testing.md) against the new version. 1. If you use Connect, [test your Connect integration](https://docs.stripe.com/connect/testing.md). 1. In Workbench, [perform the upgrade](https://docs.stripe.com/upgrades.md#perform-the-upgrade). You can [roll back the version](https://docs.stripe.com/upgrades.md#roll-back-your-api-version) for 72 hours. Learn more about [Stripe API upgrades](https://docs.stripe.com/upgrades.md). #### Ruby 1. [View your current API version](https://docs.stripe.com/upgrades.md#view-your-api-version-and-the-latest-available-upgrade-in-workbench) in Workbench. 1. Upgrade your Ruby SDK to [v15.0.0](https://github.com/stripe/stripe-ruby/releases/tag/v15.0.0) 1. Upgrade the API version used for [webhook endpoints](https://docs.stripe.com/webhooks/versioning.md). 1. [Test your integration](https://docs.stripe.com/testing.md) against the new version. 1. If you use Connect, [test your Connect integration](https://docs.stripe.com/connect/testing.md). 1. In Workbench, [perform the upgrade](https://docs.stripe.com/upgrades.md#perform-the-upgrade). You can [roll back the version](https://docs.stripe.com/upgrades.md#roll-back-your-api-version) for 72 hours. Learn more about [Stripe API upgrades](https://docs.stripe.com/upgrades.md). #### Python 1. [View your current API version](https://docs.stripe.com/upgrades.md#view-your-api-version-and-the-latest-available-upgrade-in-workbench) in Workbench. 1. Upgrade your Python SDK to [v12.0.0](https://github.com/stripe/stripe-python/releases/tag/v12.0.0) 1. Upgrade the API version used for [webhook endpoints](https://docs.stripe.com/webhooks/versioning.md). 1. [Test your integration](https://docs.stripe.com/testing.md) against the new version. 1. If you use Connect, [test your Connect integration](https://docs.stripe.com/connect/testing.md). 1. In Workbench, [perform the upgrade](https://docs.stripe.com/upgrades.md#perform-the-upgrade). You can [roll back the version](https://docs.stripe.com/upgrades.md#roll-back-your-api-version) for 72 hours. Learn more about [Stripe API upgrades](https://docs.stripe.com/upgrades.md). #### PHP 1. [View your current API version](https://docs.stripe.com/upgrades.md#view-your-api-version-and-the-latest-available-upgrade-in-workbench) in Workbench. 1. Upgrade your PHP SDK to [v17.0.0](https://github.com/stripe/stripe-php/releases/tag/v17.0.0) 1. Upgrade the API version used for [webhook endpoints](https://docs.stripe.com/webhooks/versioning.md). 1. [Test your integration](https://docs.stripe.com/testing.md) against the new version. 1. If you use Connect, [test your Connect integration](https://docs.stripe.com/connect/testing.md). 1. In Workbench, [perform the upgrade](https://docs.stripe.com/upgrades.md#perform-the-upgrade). You can [roll back the version](https://docs.stripe.com/upgrades.md#roll-back-your-api-version) for 72 hours. Learn more about [Stripe API upgrades](https://docs.stripe.com/upgrades.md). #### Java 1. [View your current API version](https://docs.stripe.com/upgrades.md#view-your-api-version-and-the-latest-available-upgrade-in-workbench) in Workbench. 1. Upgrade your Java SDK to [v29.0.0](https://github.com/stripe/stripe-java/releases/tag/v29.0.0) 1. Upgrade the API version used for [webhook endpoints](https://docs.stripe.com/webhooks/versioning.md). 1. [Test your integration](https://docs.stripe.com/testing.md) against the new version. 1. If you use Connect, [test your Connect integration](https://docs.stripe.com/connect/testing.md). 1. In Workbench, [perform the upgrade](https://docs.stripe.com/upgrades.md#perform-the-upgrade). You can [roll back the version](https://docs.stripe.com/upgrades.md#roll-back-your-api-version) for 72 hours. Learn more about [Stripe API upgrades](https://docs.stripe.com/upgrades.md). #### Node.js 1. [View your current API version](https://docs.stripe.com/upgrades.md#view-your-api-version-and-the-latest-available-upgrade-in-workbench) in Workbench. 1. Upgrade your Node SDK to [v18.0.0](https://github.com/stripe/stripe-node/releases/tag/v18.0.0) 1. Upgrade the API version used for [webhook endpoints](https://docs.stripe.com/webhooks/versioning.md). 1. [Test your integration](https://docs.stripe.com/testing.md) against the new version. 1. If you use Connect, [test your Connect integration](https://docs.stripe.com/connect/testing.md). 1. In Workbench, [perform the upgrade](https://docs.stripe.com/upgrades.md#perform-the-upgrade). You can [roll back the version](https://docs.stripe.com/upgrades.md#roll-back-your-api-version) for 72 hours. Learn more about [Stripe API upgrades](https://docs.stripe.com/upgrades.md). #### Go 1. [View your current API version](https://docs.stripe.com/upgrades.md#view-your-api-version-and-the-latest-available-upgrade-in-workbench) in Workbench. 1. Upgrade your Go SDK to [v82.0.0](https://github.com/stripe/stripe-go/releases/tag/v82.0.0) 1. Upgrade the API version used for [webhook endpoints](https://docs.stripe.com/webhooks/versioning.md). 1. [Test your integration](https://docs.stripe.com/testing.md) against the new version. 1. If you use Connect, [test your Connect integration](https://docs.stripe.com/connect/testing.md). 1. In Workbench, [perform the upgrade](https://docs.stripe.com/upgrades.md#perform-the-upgrade). You can [roll back the version](https://docs.stripe.com/upgrades.md#roll-back-your-api-version) for 72 hours. Learn more about [Stripe API upgrades](https://docs.stripe.com/upgrades.md). #### .NET 1. [View your current API version](https://docs.stripe.com/upgrades.md#view-your-api-version-and-the-latest-available-upgrade-in-workbench) in Workbench. 1. Upgrade your .NET SDK to [v48.0.0](https://github.com/stripe/stripe-dotnet/releases/tag/v48.0.0) 1. Upgrade the API version used for [webhook endpoints](https://docs.stripe.com/webhooks/versioning.md). 1. [Test your integration](https://docs.stripe.com/testing.md) against the new version. 1. If you use Connect, [test your Connect integration](https://docs.stripe.com/connect/testing.md). 1. In Workbench, [perform the upgrade](https://docs.stripe.com/upgrades.md#perform-the-upgrade). You can [roll back the version](https://docs.stripe.com/upgrades.md#roll-back-your-api-version) for 72 hours. Learn more about [Stripe API upgrades](https://docs.stripe.com/upgrades.md). ## Related changes - [Replaces top-level price fields with improved price modeling on Invoice Items and Invoice Line Items](https://docs.stripe.com/changelog/basil/2025-03-31/invoice-pricing-configurations.md) - [Replaces top-level tax-related properties with improved tax modeling on Invoices, Invoice Line Items, and Credit Note Line Items](https://docs.stripe.com/changelog/basil/2025-03-31/invoice-tax-configurations.md) - [Adds jurisdiction level and taxability reason to manual tax amounts on invoices](https://docs.stripe.com/changelog/basil/2025-03-31/invoice-manual-tax-amount-fields.md)