Skip to main content
Native invoices use the same /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. Use 4.99 for 4.99 USD. Sending 499 bills 499 USD.
The native request creates a draft. Send it with 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_address and customer_name are create-only inputs.
  • Issued amounts and items are locked. An update containing only memo and/or recipient_emails is allowed on draft, open, and uncollectible invoices, including a scheduled draft.

Issue, send, and charge

A legacy create chooses collection behavior with collection_method. Native invoices use separate calls after creating the draft:
  1. Issue it with POST /invoices/{id}/issue to calculate final tax and open it for payment without sending the initial invoice email.
  2. Or send it with POST /invoices/{id}/send. This issues the draft. It emails the recipients unless it charges a saved method immediately. Sending an open invoice emails it again. send_at schedules a draft’s send. POST /invoices/{id}/unschedule cancels that schedule.
  3. Charge a saved method by setting payment_method_id on the draft. For a positive total, issue or send charges at a future charge_at, otherwise a future due_at, otherwise immediately. charge_at must be in the future and can’t precede send_at.
Sending a draft that charges immediately skips the initial invoice email. Sending with a later charge emails it now. A failed automatic charge can trigger a payment-link email even when you used Issue Invoice. Charge a saved payment method explains the flow. An 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 their pay_ 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

  1. Check Before you migrate for workflows that need to stay on the legacy API.
  2. Pin native calls to a released version matching their field names, such as 2026-11-02-1 for these examples.
  3. Build items from eligible variants, checking quantities, prices, currency, and product requirements.
  4. 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.
  5. Map due dates, scheduled sends, and buyer fees according to their behavior, not just their field names.
  6. Keep native pay_ and legacy inv_ IDs distinct. Keep legacy reads on the earlier version.
  7. Read amounts from money objects, and open checkout using the signed checkout_link.
  8. Handle overdue and the additional payment statuses.
  9. Fulfill from payment.succeeded for the invoice’s payment ID.
  10. 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.