Reconciliation applies to Standard Billing (
billingVersion: 1) subscriptions billed on their plan’s line-item schedule. Legacy Billing subscriptions are rejected. See Billing Versions.When to use it
Reach for reconciliation whenever a plan’s feature list drifts from what an existing active subscription actually has:- You added a feature to a plan and want existing subscribers to get it without recreating the subscription.
- You removed a feature from a plan and want to stop billing existing subscribers for it and revoke their entitlement.
- A prior subscription activation partially failed and left the subscription without one of the plan’s features.
- You want to preview either of the above without touching billing — use
dryRun: true.
What reconciliation does
A reconciliation is a single, idempotent operation that:- Adds an entitlement (and, for metered features, its initial grant) for every plan feature the subscription is missing.
- Removes the entitlement and voids the grants of any feature the subscription has but the plan no longer includes.
- Skips features that are already present — they are left unchanged.
- Synchronizes billing by creating future line items for added prices and removing future, uninvoiced line items for removed prices.
Making a reconciliation request
API Reference: See the Reconcile Features API endpoint for the complete request and response schema.
{ "dryRun": false }) to a subscription’s reconciliation endpoint. The subscription must be active.
Previewing with dry run
PassdryRun: true to compute the same diff without creating any entitlement, grant, or line item. The response is shaped identically to a real run and reports exactly what a subsequent real call would do. Use it to confirm the scope of a change before applying it.
Response
The response returns asubscriptionReconciliation object describing the outcome:
Feature groups
added— Features the subscription was missing that were provisioned. Abilled: falseentry means the feature’s price does not produce a recurring line item, so the feature is entitled but not billed by this reconciliation. Examples include an instant price, a credit-denominated price, or an already-elapsed one-time charge.skipped— Features the subscription already had an active entitlement for. Left unchanged.removed— Features no longer on the plan. Their entitlement was canceled and grants voided so the subscription matches the plan’s current features.failed— Features that could not be fully provisioned. Never billed by this call. Each entry has a codedreason:entitlement_failed— the entitlement itself could not be created.grant_mint_failed— the entitlement was created but its initial metered grant could not be minted. Re-running reconciliation retries the mint safely.
Line items
created— Number of features newly billed on the subscription by this reconciliation. A dry-run preview returns the same count as the applied run.removed— Number of features whose billing was removed from the subscription’s upcoming (not-yet-invoiced) invoice because their price is no longer on the plan.syncFailed— Present andtruewhen entitlements were provisioned successfully but the line-item synchronization step failed. Safe to retry.
Status codes
| Status | Meaning |
|---|---|
201 Created | Reconciliation applied. Feature entitlements match the plan and billing was fully synchronized. |
200 OK | The reconciliation did not create a full set of resources. This covers a dryRun preview, a run where one or more features could not be provisioned (billing is withheld until they succeed), or a run whose entitlements provisioned but whose line-item synchronization failed. Safe to retry — the API does not duplicate already-provisioned entitlements or grants. |
400 Bad Request | Request is malformed, or the subscription is not eligible. See error codes below. |
404 Not Found | Subscription does not exist or is not visible to your merchant. |
Error codes
SUBSCRIPTION_NOT_ACTIVE— The subscription is not in theactivestate. Reconciliation is only available for active subscriptions.SUBSCRIPTION_NOT_V1_BILLING— The subscription is on Legacy Billing (billingVersion: 0). Reconciliation only applies to Standard Billing subscriptions.
Idempotency and retries
Reconciliation is safe to retry:- The API detects already-provisioned entitlements and grants and does not duplicate them.
- If a previous run created an entitlement but failed to mint its initial metered grant, re-running reconciliation retries the mint on the same idempotency key. The mint is a no-op when the grant is already present.
- If a run returns
200withlineItems.syncFailed: true, retry to complete billing synchronization.
Rate limits
Reconciliations are limited to 2 requests per second per subscription. Automated retries should include backoff; a429 Too Many Requests response returns the standard rate-limit error message.
Related pages
- Features — Configure features and link them to plan prices
- Editing prices — How other plan edits propagate to existing subscribers
- Billing Versions — Standard vs. Legacy Billing
- Customer Lifecycle — End-to-end subscription flows