/invoices paths as legacy invoices, but have a different request format and lifecycle. This guide maps the fields and actions you need to change when migrating an integration.
The shared paths route to native invoices from
Api-Version-Date: 2026-10-24.
The native examples below use Api-Version-Date: 2026-11-02-1, with the
current variant field names and customer-locking rules. Send that header on
each native request. Keep legacy calls on an earlier released version, such as
2026-10-15-1. API versions explains how headers
override credential pins.What changes
The native API doesn’t list or retrieve legacy
inv_ invoices. Keep reading existing legacy invoices with the earlier API version. Creating a native invoice creates a separate bill. It doesn’t convert or settle a legacy invoice.
Before you migrate
Check these differences before moving a flow. Keep it on the legacy API if it needs a feature the native API doesn’t provide.Map the create request
A legacy create sends one plan and, optionally, labels that split its price. A native create sends an item for each billed variant. These examples set a combined item price of 19.99 USD. The existing native variant represents the 15 USD setup charge. The 4.99 USD service fee is a custom one-time charge without a product. Both APIs accept prices in currency units. Use4.99 for 4.99 USD. Sending 499 bills 499 USD.
POST /invoices/{id}/send to issue and email it. member_id identifies a customer (mber_), not a subscription (mem_).
For native versions before
2026-10-27-2, use plan_id, plan, and plan_type instead of variant_id, variant, and billing_type. The response’s line items use plan_id on those older versions too.
Keep issued amounts locked
PATCH /invoices/{id} edits a draft’s items and billing details. Sending items replaces the entire list using the variants’ current prices. Omitting it keeps the saved items and prices.
- Cancel a scheduled send before editing items or billing details.
- From
2026-11-02-1, you can’t replace or clear a draft’s assigned customer. A draft without a customer can still take one. Void the draft before creating a new invoice for someone else. email_addressandcustomer_nameare create-only inputs.- Issued amounts and items are locked. An update containing only
memoand/orrecipient_emailsis allowed ondraft,open, anduncollectibleinvoices, including a scheduled draft.
Issue, send, and charge
A legacy create chooses collection behavior withcollection_method. Native invoices use separate calls after creating the draft:
- Issue it with
POST /invoices/{id}/issueto calculate final tax and open it for payment without sending the initial invoice email. - Or send it with
POST /invoices/{id}/send. This issues the draft. It emails the recipients unless it charges a saved method immediately. Sending anopeninvoice emails it again.send_atschedules a draft’s send.POST /invoices/{id}/unschedulecancels that schedule. - Charge a saved method by setting
payment_method_idon the draft. For a positive total, issue or send charges at a futurecharge_at, otherwise a futuredue_at, otherwise immediately.charge_atmust be in the future and can’t precedesend_at.
open response doesn’t confirm payment. Wait for payment.succeeded before fulfilling. To charge or retry an open invoice, use Charge Invoice. Issuing or sending it again doesn’t start another charge.
For a recurring variant, collection_method on Issue Invoice or Send Invoice controls renewals. charge_automatically collects future payments automatically. send_invoice creates and emails a new invoice each period. It doesn’t replace payment_method_id for collecting the first invoice. See Invoice a subscription.
Map the response
To download a PDF, call
POST /invoices/{id}/generate_pdf for a short-lived link.
Open the invoice checkout
checkout_link contains the invoice ID and a signed token separated by a .. Pass the entire value as link to POST /checkout_sessions to open a session for this invoice. For a customer-facing URL, follow Build the hosted checkout URL.
The field is present only while checkout is available: the invoice must be open. Business buyers and canceled memberships can’t use this checkout. Your key needs payment:charge, or invoice:create/invoice:update when the invoice has no saved payment method. It’s null on a draft, paid, void, or uncollectible invoice, and for business buyers.
Map statuses
Native invoices can also return
authorized, pending, or unresolved. Don’t treat every status outside the legacy enum as paid or failed. Statuses and lifecycle explains them.
Map endpoints
Map webhooks
Native invoices send payment events for theirpay_ ID. The invoice.* events describe legacy invoices.
Payment events also cover payments unrelated to invoices. Match the event’s payment ID to the native invoice IDs you store. Webhooks shows how to fulfill from
payment.succeeded.
Permissions
member:basic:read exposes customer names and member/membership IDs. member:email:read exposes email_address and recipient_emails. Payment method and address fields require payment:basic:read.
Migration checklist
- Check Before you migrate for workflows that need to stay on the legacy API.
- Pin native calls to a released version matching their field names, such as
2026-11-02-1for these examples. - Build
itemsfrom eligible variants, checking quantities, prices, currency, and product requirements. - Replace the legacy one-call create with create, then issue or send. Choose saved-method charges for the first invoice and a collection method for renewals.
- Map due dates, scheduled sends, and buyer fees according to their behavior, not just their field names.
- Keep native
pay_and legacyinv_IDs distinct. Keep legacy reads on the earlier version. - Read amounts from money objects, and open checkout using the signed
checkout_link. - Handle
overdueand the additional payment statuses. - Fulfill from
payment.succeededfor the invoice’s payment ID. - Grant the permissions your flow uses, including inline variant/product and customer-read permissions.
Next steps
Invoices guide
Create, issue, send, and collect native invoices.
Invoices API reference
Every native invoice endpoint and field.
Legacy invoice API
The endpoints your current integration calls.
API versions
How
Api-Version-Date and version pins work.
