> ## Documentation Index
> Fetch the complete documentation index at: https://docs.useautumn.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Some new things we've shipped at Autumn HQ

<Update label="August 14th 2026">
  ## Deduction aggregations on events.aggregate

  [`events.aggregate`](/api-reference/events/aggregateEvents) now accepts `aggregate_on: "deducted"` alongside a `customer_id` and returns a per-balance breakdown of what each tracked feature actually consumed from each balance. Existing usage totals are unchanged, `group_by` and `max_groups` still apply (overflow rolls up as `Other`), and the customer analytics view has a new toggle to chart the breakdown directly.

  ## UTC-anchored usage limits

  Usage limits can now reset on the UTC calendar instead of the customer's billing cycle. Set `anchor: "utc"` on any limit (or flip **Anchor to UTC time** in the plan editor or customer usage-limit sheet) and the window uses calendar bounds, doesn't refill on plan changes, and takes precedence when two same-rate limits tie. Existing limits keep the `billing_cycle` behavior with no migration required.

  ## Expire plans during an attach

  [`billing.attach`](/api-reference/billing/attach) accepts a new `remove_plan_ids` array so you can expire one or more active plans in the same call that adds a new one. Removals respect the attach's entity scope, run in a single reconciliation with Stripe, and can act as the carry-over source for usage and balances when there is no same-group predecessor. The attach sheet in the dashboard has a matching **Remove a product** picker next to **Add another product**, with inline greying for plans already being replaced or queued for removal.

  ## Choose payment methods on Autumn invoices

  Organizations on invoice mode (`send_invoice`) can now pick which payment methods appear on the Stripe invoices Autumn generates. **Settings → Invoices → Payment methods** exposes a multi-select for card, bank transfer, ACH, SEPA, Bacs, Canadian pre-authorized debit, and Link. The selection is applied via `payment_settings.payment_method_types` on every invoice the subscription generates. Leaving the setting untouched preserves your Stripe account defaults exactly as before.

  ## Stripe sync verification in the dashboard

  Customer pages now auto-run `billing.verify` in the background and surface a header warning icon only when drift is detected. Clicking it opens a **Verify Stripe** sheet with an **In sync / Warning / Mismatched** badge per subscription and a compact table of the exact fields that differ. The sheet also flags an account-level warning when more than one Autumn customer points at the same Stripe customer and lists the colliding IDs. You can also now clear a customer's Stripe ID by passing `null` or `""` through [`customers.update`](/api-reference/customers/updateCustomer).

  <AccordionGroup>
    <Accordion title="Improvements">
      * `rollovers[].granted` is now returned on balance responses across check, track, `trackTokens`, import, customer, and entity endpoints so you can see the original rolled-over amount before consumption — [#2671](https://github.com/useautumn/autumn/pull/2671)
      * Customer expand now supports `invoice_previews`, returning preview line items and discounts inline — [#2671](https://github.com/useautumn/autumn/pull/2671)
      * Create-schedule accepts `unscheduled_plans` (`preserve_add_ons` is deprecated and ignored) — [#2671](https://github.com/useautumn/autumn/pull/2671)
      * Feature grants now accept `0` explicitly; only negative amounts are rejected, and boolean features skip allowance entirely — [#2671](https://github.com/useautumn/autumn/pull/2671)
      * [`customers.list`](/api-reference/customers/listCustomers) now accepts `sort_order`, and the dashboard customers table exposes created-at sorting — [#2662](https://github.com/useautumn/autumn/pull/2662)
      * Customer balance sheet adds a **Pooling** criteria filter so you can slice per-entity vs pooled balances — [#2810](https://github.com/useautumn/autumn/pull/2810)
      * Flags now render as a plain section label when a customer has no catalog features, and the Flags/Full Catalog tabs only appear when there is catalog to switch to — [#2690](https://github.com/useautumn/autumn/pull/2690)
      * Customer export menu and the created-date filter chip are re-aligned to shared list-action styling, with a clearer active-range label — [#2693](https://github.com/useautumn/autumn/pull/2693)
      * Check requests are more resilient under load: the fail-open budget now counts middleware time, and slow primary-pool hydrations race a delayed backup read on the general pool so a single slow lookup no longer trips the timeout — [#2800](https://github.com/useautumn/autumn/pull/2800), [#2721](https://github.com/useautumn/autumn/pull/2721)
      * Failed-check fallbacks now log an explicit reason (`route_timeout`, `org_rate_limit`, or `dependency_error`) so you can tell why a check failed open — [#2800](https://github.com/useautumn/autumn/pull/2800)
      * SQS workers wait for Redis warmup and settle in-flight requests before shutdown, eliminating spurious `SQS batch accumulator is shutting down` rejections around deploys and recycles — [#2691](https://github.com/useautumn/autumn/pull/2691), [#2695](https://github.com/useautumn/autumn/pull/2695), [#2702](https://github.com/useautumn/autumn/pull/2702)
    </Accordion>

    <Accordion title="Fixes">
      * Retained entitlements now reset their cycle anchor when a subscription update resets the billing cycle, and reinitialize usage from the final plan when `carry_over_usages.enabled` is `false`; scheduled cancellations are preserved — [#2804](https://github.com/useautumn/autumn/pull/2804)
      * `additional_currencies` is now included on feature price items so multi-currency prices round-trip through types and comparators correctly — [#2799](https://github.com/useautumn/autumn/pull/2799)
      * Customer balance cells no longer render `0 used` for empty entitlements or `+0 overage` for fully spent prepaid packs; only genuinely negative balances enter the used / overage label — [#2719](https://github.com/useautumn/autumn/pull/2719)
      * `atmn` CLI login (1.1.20+) no longer fails with `invalid_scope` when requesting the new `rewards:read` / `rewards:write` scopes — [#2796](https://github.com/useautumn/autumn/pull/2796)
      * Variant base plan links are preserved when copying between environments so pulled catalogs stay linked — [#2640](https://github.com/useautumn/autumn/pull/2640)
      * `atmn pull` now preserves an explicit variant removal filter `intervalCount: 1` so the generated config round-trips cleanly through `atmn push` — [#2689](https://github.com/useautumn/autumn/pull/2689)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="July 31st 2026">
  ## Pooled balances

  A single balance can now be shared across every entity on a customer. Toggle **Pooled balance** on any finite metered plan item and per-entity grants flow into one shared pool that every entity draws down from. Pools reset on the parent subscription's `invoice.created`, on lazy schedules, or never — matching the entitlement lifecycle you already picked — and rollovers carry over cleanly across plan changes and trials. Pooled entitlements show up under `pooled_customer_entitlements` in [`customers.get`](/api-reference/customers/getCustomer), and you can list every contributing entity through the new `pooled_balances.list_contributions` endpoint.

  ## Scoped multi-plan attach

  [`billing.multi_attach`](/api-reference/billing/multiAttach) and [`billing.multi_attach.preview`](/api-reference/billing/previewMultiAttach) now support explicit scopes on each plan you send. Choose `inherited`, `customer`, or `per_entity` per plan to control who a plan attaches to across an entity tree, and Autumn plans the schedule so parent and entity-level plans stay consistent through a single billing action.

  ## Product-scoped license discounts

  Coupons and discounts can now target specific licensed products, and Autumn keeps them applied through every subsequent update. Percent and fixed discounts stack in the same order as your preview, refunds and upgrades pull credits from the stored discounted invoice rows instead of recomputing them, and Stripe subscription updates preserve the original `percent_off` so your dashboard and invoices stay in sync.

  ## Reliable Stripe webhook processing

  Load-bearing Stripe webhooks — `checkout.session.completed`, cycle `invoice.created`, `invoice.paid`, `customer.updated`, and non-Autumn subscription events — now acknowledge Stripe only after processing succeeds, so a failed webhook is automatically retried instead of being silently dropped. Any early-acked failures are also replayed through a durable queue, and Autumn-originated Stripe calls carry an idempotency key so we never process our own writes as inbound events.

  ## Fixed duplicate checkout subscriptions

  A rare race where an attach could produce two active Stripe subscriptions is now closed. Checkout reservations live for the full session lifetime (matching Stripe's `expires_at`), same-parameter [`billing.attach`](/api-reference/billing/attach) retries return the pending Checkout URL instead of creating a new session, and `checkout.session.completed` now serializes with in-flight attaches under a shared billing lock. Repeated attaches with different parameters expire any unpaid session first, then proceed.

  <AccordionGroup>
    <Accordion title="Improvements">
      * License seat assignment is now idempotent — retrying a batch that already contains assigned entities returns success without consuming pool capacity — [#2414](https://github.com/useautumn/autumn/pull/2414)
      * Negative balances now carry over into the new plan when `carry_over_balances` is enabled, so any prior overage reduces the new allowance instead of being dropped — [#2431](https://github.com/useautumn/autumn/pull/2431)
      * Track events are now batched into a single SQS send per batch, cutting per-event overhead and improving throughput under bursty usage — [#2489](https://github.com/useautumn/autumn/pull/2489)
      * Async Track processing can be enabled per organization from the admin dashboard, replacing the previous hardcoded allowlist — [#2375](https://github.com/useautumn/autumn/pull/2375)
      * Auto top-up jobs now retry when they hit a billing lock instead of dropping the run — [#2416](https://github.com/useautumn/autumn/pull/2416)
      * Stripe imports now recognize product aliases in your catalog mappings, so linked products keep their references across renames — [#2500](https://github.com/useautumn/autumn/pull/2500)
      * Tiered price hydration is now consistent across attach, update, and preview flows — [#2500](https://github.com/useautumn/autumn/pull/2500)
      * New `.well-known/oauth-protected-resource` endpoint improves OAuth discovery for MCP clients — [#2500](https://github.com/useautumn/autumn/pull/2500)
      * Billing verification now separates identity, shape, and totals mismatches into `warn` vs `error` severities so real drift is easier to spot — [#2500](https://github.com/useautumn/autumn/pull/2500)
      * Dashboard Edge Config admin now shows live per-config status (paused queues, ramp percentages, blocked orgs) at a glance — [#2406](https://github.com/useautumn/autumn/pull/2406)
    </Accordion>

    <Accordion title="Fixes">
      * Entity usage is no longer double-counted when a customer has overlapping add-ons — entities already covered by an active product are excluded from add-on aggregation — [#2496](https://github.com/useautumn/autumn/pull/2496)
      * MCP OAuth refresh now stays within the originally granted scopes and no longer forwards a `resource` parameter that some issuers reject — [#2501](https://github.com/useautumn/autumn/pull/2501)
      * Unknown `.well-known/*` requests return `404` instead of the 401 session-auth error — [#2499](https://github.com/useautumn/autumn/pull/2499)
      * Property-rollup completeness now checks event counts (not net sums), so gate-dropped groups are detected correctly — [#2491](https://github.com/useautumn/autumn/pull/2491)
      * Stranded checkout reservations after out-of-order `invoice.paid` and `checkout.session.completed` webhooks are now released, ending sporadic 423 lock errors on the next attach — [#2433](https://github.com/useautumn/autumn/pull/2433)
      * Partial SQS batch-delete failures now retry only the failed entries with bounded backoff, so successful jobs are no longer redelivered — [#2415](https://github.com/useautumn/autumn/pull/2415)
      * Stripe writes now carry idempotency keys so transient retries can't accidentally create duplicate sessions or transfers — [#2500](https://github.com/useautumn/autumn/pull/2500)
      * Batch balance resets warn at 30 minutes and give up at 45 to avoid indefinite stalls behind a wedged message — [#2416](https://github.com/useautumn/autumn/pull/2416)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="July 24th 2026">
  ## License plan customization & propagation

  License plans are now fully customizable per parent. You can override items, prices, and included seat counts on individual license plans, and Autumn rebases those overrides automatically when the base license plan changes — Stripe items and subscription lifecycle stay in sync. [`plans.update`](/api-reference/plans/updatePlan) accepts a `licenses[].customize` block per parent, and responses now include the effective `customize` payload on each license link. Pair with the new `include_license_parents` on [`plans.preview_update`](/api-reference/plans/updatePlan) to see downstream impacts before saving.

  ## Overflow tracking on usage

  [`track`](/api-reference/core/track), [`track_tokens`](/api-reference/core/trackTokens), and [`batchTrack`](/api-reference/core/batchTrack) now accept `overage_behavior: "overflow"`, deducting the full amount past zero and letting balances go negative. Usage-window caps are bypassed, but customer and entity spend limits still clamp — useful when you want to record real usage even when a customer has run out of included balance.

  ## Writable auto top-up purchase counter

  You can now reset or set the runtime purchase counter for [auto top-ups](/documentation/modelling-pricing/auto-top-ups) directly through [`customers.update`](/api-reference/customers/updateCustomer). Pass `billing_controls.auto_topups[].purchase_limit.count` to nudge or reset a customer's purchase count without waiting for the interval to roll over. `count > limit` is rejected with a clean 400, and active windows are preserved.

  ## Automatic recovery for failed customer creation

  Customer create and get-or-create requests that hit rate limits or transient database/Redis errors are now automatically queued and replayed in the background, with globally serialized concurrency and deterministic dedupe. Requests come back with their original semantics and Autumn records whether the replay created or fetched the customer — no more one-off failures during traffic spikes.

  ## License transitions & drop handling

  Plan transitions that drop a license pool (e.g. Team → Pro) now release the affected seat assignments and restore pool capacity in a single atomic step, unblocking migrations that previously errored out. The Attach Product preview warns you when a transition will remove licenses and lists the entities that will be released. Assignments carried across matched successor pools stay intact.

  <AccordionGroup>
    <Accordion title="Improvements">
      * License catalog updates preview and apply cleanly across parent-plan versioning and in-place edits, preserving existing customer license definitions — [#2288](https://github.com/useautumn/autumn/pull/2288)
      * Row-batched license transitions preserve quantities, billing state, and Stripe linkage across immediate and scheduled changes — [#2306](https://github.com/useautumn/autumn/pull/2306)
      * Child license plan propagation now previews linked parent-plan impacts and supports explicit propagation targets — [#2295](https://github.com/useautumn/autumn/pull/2295)
      * Auto top-up thresholds can now be negative, so you can trigger top-ups once a balance dips below zero — [#2354](https://github.com/useautumn/autumn/pull/2354)
      * New Stripe customers imported via `stripe_id` on customer creation now pull in eligible subscriptions and schedules automatically — [#2308](https://github.com/useautumn/autumn/pull/2308)
      * Customer dashboard plan filters now resolve in milliseconds instead of tens of seconds on large orgs — [#2362](https://github.com/useautumn/autumn/pull/2362)
    </Accordion>

    <Accordion title="Fixes">
      * Create-schedule previews now show unavoidable immediate charges (initial subscription lines, automatic tax, invoice credits) so previews match the final invoice — [#2329](https://github.com/useautumn/autumn/pull/2329)
      * Attach form plan-schedule preview now defaults to **immediate** when unset, matching the UI — [#2345](https://github.com/useautumn/autumn/pull/2345)
      * Long checkout URLs in the dashboard truncate from the end with a proper ellipsis instead of clipping both sides — [#2344](https://github.com/useautumn/autumn/pull/2344)
      * License assignments are now treated as active only when their pool link has an active parent, so dropped and matched pool transitions behave consistently — [#2353](https://github.com/useautumn/autumn/pull/2353)
      * Same-batch customized license plan previews no longer crash on virtual catalog products (empty prices/entitlements) — [#2343](https://github.com/useautumn/autumn/pull/2343)
      * Catalog sync tolerates partial product collections, missing entitlements, and missing prices without erroring — [#2317](https://github.com/useautumn/autumn/pull/2317), [#2319](https://github.com/useautumn/autumn/pull/2319), [#2322](https://github.com/useautumn/autumn/pull/2322), [#2324](https://github.com/useautumn/autumn/pull/2324)
      * Versioned license schedules and matched plan versions are preserved through Stripe sync — [#2297](https://github.com/useautumn/autumn/pull/2297), [#2284](https://github.com/useautumn/autumn/pull/2284)
      * OAuth organization list deduplicates when a user has multiple memberships in the same org — [#2346](https://github.com/useautumn/autumn/pull/2346)
      * MCP `getCurrentOrganization` schema now matches the `organization/me` API response, adding `id` and tolerating a missing `user` — [#2140](https://github.com/useautumn/autumn/pull/2140)
      * Rate limits on establish routes now return a standard `429` (no `Retry-After`); check and track routes still fail open — [#2384](https://github.com/useautumn/autumn/pull/2384)
      * Concurrent migrations no longer duplicate customer plans — [#2282](https://github.com/useautumn/autumn/pull/2282)
      * Versioned license pricing renders correctly in the plan dashboard — [#2291](https://github.com/useautumn/autumn/pull/2291)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="July 17th 2026">
  ## Multi-currency pricing and billing

  Plans can now be priced in **multiple currencies** end-to-end. Add `base_currency` and `additional_currencies` to any fixed, tiered, or usage-based price, and customers get billed in their resolved currency across checkout, invoices, top-ups, refunds, upgrades, and previews. Customers pick up a `currency` field that locks on their first paid attach — pass `currency` on [`billing.attach`](/api-reference/billing/attach) or [`billing.multi_attach`](/api-reference/billing/multiAttach) to choose, and attaches in a different currency return a clean `currency_mismatch` 400. Reach out to enable the `multi_currency` org flag.

  ## Licenses

  The full **licenses** stack is live: plans can offer other plans as assignable seats with `included` free counts, prepaid seat quantities, and per-customer overrides. New endpoints — [`licenses.attach`](/api-reference/licenses/attachLicense), [`licenses.release`](/api-reference/licenses/releaseLicense), [`licenses.list`](/api-reference/licenses/listLicenses), and [`licenses.list_assignments`](/api-reference/licenses/listLicenseAssignments) — let you provision, release, and inspect seats on entities, with balance tracking and dashboard management for the whole lifecycle. Priced licenses require the license plan to be attached to the customer first (via [`billing.attach`](/api-reference/billing/attach)); free licenses assign directly.

  ## List invoices endpoint

  Fetch a customer's invoices programmatically with the new [`invoices.list`](/api-reference/invoices/listInvoices) endpoint — the same data the dashboard uses, now available on the API for building portals, reconciliation flows, and audit tooling.

  ## Pay down overages on one-off add-ons

  One-off prepaid add-ons now **pay down existing overages** at attach time, so a customer who's already over their included balance immediately settles the outstanding usage on their next invoice instead of waiting for the cycle to close. Behavior is gated by the price's `persist_free_overage` flag for finer control.

  ## Back-sync carry usage on Stripe imports

  When you import an existing Stripe subscription that's mid-cycle on a usage feature, Autumn now **carries the already-consumed usage** into the new customer product so balances line up with what the customer has actually used, instead of resetting on import.

  ## Invoice-mode start for usage-in-arrears

  Subscriptions with usage-in-arrears pricing can now be started directly in **invoice mode** — useful for large customers you're billing outside checkout — without needing a card on file up front.

  ## Attach-time currency selection

  The [`billing.attach`](/api-reference/billing/attach) flow now accepts a `currency` parameter, and dashboard attach/preview sheets show amounts in the customer's currency. Pair with multi-currency plans to sell in EUR, GBP, or any additional currency you configure.

  <AccordionGroup>
    <Accordion title="Improvements">
      * Rollovers now carry to the best-candidate bucket on plan updates, so leftover balance doesn't disappear when you switch a customer between plans — [#2266](https://github.com/useautumn/autumn/pull/2266)
      * Multi-currency plan updates work through preview, save, and migration flows — [#2236](https://github.com/useautumn/autumn/pull/2236)
      * Multi-currency Stripe sync now imports historical subscriptions in their original currency — [#2227](https://github.com/useautumn/autumn/pull/2227)
      * Attach schedule now always defaults to **immediate**, so plans go live on save unless you explicitly schedule them — [#2232](https://github.com/useautumn/autumn/pull/2232)
      * Analytics dashboard refetches on window focus, so numbers stay fresh when you tab back in — [#2241](https://github.com/useautumn/autumn/pull/2241)
      * `billing.updated` webhooks now fire after the Stripe customer ID is persisted, so downstream consumers always see the linked Stripe record — [#2267](https://github.com/useautumn/autumn/pull/2267)
      * Plan **variants** now stamp their own `previous_price` history, so each variant keeps an independent price trail — [#2238](https://github.com/useautumn/autumn/pull/2238)
      * Consent screen shows the Autumn brand logo in the org selector — [#2249](https://github.com/useautumn/autumn/pull/2249)
      * Faster reset cron and invoice cron for large workspaces — [#2222](https://github.com/useautumn/autumn/pull/2222), [#2257](https://github.com/useautumn/autumn/pull/2257)
    </Accordion>

    <Accordion title="Bug fixes">
      * Coupon **scope** updates now apply cleanly to existing subscriptions instead of only new ones — [#2260](https://github.com/useautumn/autumn/pull/2260)
      * Catalog updates that reference customers across plan versions no longer error — [#2244](https://github.com/useautumn/autumn/pull/2244)
      * Non-consumable prepaid quantities update correctly on plan changes — [#2220](https://github.com/useautumn/autumn/pull/2220)
      * Dashboard no longer shows false "unsaved changes" errors when saving plans — [#2276](https://github.com/useautumn/autumn/pull/2276)
      * Entity creation is serialized per customer, avoiding duplicate rows under concurrent attaches — [#2242](https://github.com/useautumn/autumn/pull/2242)
      * Pending invoice cleanup cron backs off gracefully instead of retrying tight — [#2239](https://github.com/useautumn/autumn/pull/2239)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="July 10th 2026">
  ## Multi-update billing endpoint

  Cancel or uncancel multiple plans for a customer in a **single atomic request** with the new [`billing.multi_update`](/api-reference/billing/multiUpdate) endpoint. Updates are grouped per Stripe subscription and executed as one merged plan, so proration and invoicing land as a single combined result. Preview it first with [`billing.preview_multi_update`](/api-reference/billing/previewMultiUpdate) to see per-subscription and combined totals.

  ## Plan-inherited billing controls on customer reads

  API v2.3 customer and entity reads now include **plan-inherited** [billing controls](/documentation/customers/billing-controls) — `usage_limits`, `spend_limits`, `overage_allowed`, `auto_topups`, and `usage_alerts` — alongside customer-level overrides, with each entry tagged `source: "customer" | "plan"`. Inherited usage limits also return the current-window usage. Older clients keep the previous response shape.

  ## Eve: new default AI agent for Slack and dashboard chat

  Eve is now the default agent harness for Slack and the dashboard streaming chat, with in-thread approvals, follow-up questions, richer status updates, and interactive **catalog decision cards** for versioning and variant changes. Rejecting an approval in Slack or the web app now also clears the underlying suspension cleanly.

  ## Auto top-up failure webhook

  Subscribe to the new [`billing.auto_topup.failed`](/api-reference/webhooks/billingAutoTopupFailed) webhook to react to auto top-up charges that don't go through — pause features, notify the customer, or fall back to manual top-up.

  ## Expiring free recurring balances

  Free recurring balances can now carry an **`expires_at`** timestamp, and the [`balances.update`](/api-reference/balances/updateBalance) endpoint accepts `expires_at` so you can extend or shorten grants after the fact. The dashboard has matching controls in the balance sheet.

  ## Licenses (early)

  Foundational support for **licenses** has landed: a new licenses model, API schema, and a `licenses` field on the [`plans.list`](/api-reference/plans/listPlans) response. Reach out if you'd like to try it early.

  ## RevenueCat: email and fingerprint identifiers

  The [RevenueCat integration](/documentation/external-providers/revenuecat) now recognizes `autumn_customer_email` and `autumn_customer_fingerprint` subscriber attributes on incoming webhooks, so you can match RevenueCat purchases to Autumn customers by email or fingerprint instead of only by ID.

  ## Any-shape customer import

  [`billing.import`](/api-reference/billing/import) can now ingest customers from **any billing processor in any shape** — the processor and per-item `billable.processor` are configurable, and identity updates honor `dry_run`. Email-only `customer_data` payloads are validated before import runs.

  ## Property filters on usage limits

  [Usage limits](/documentation/modelling-pricing/spend-limits) now support **property filters**, so a single limit can target a subset of events (for example, only requests to a specific model or region) instead of the whole feature. `balances.limit_reached` also now fires for plan-level and percentage-based spend and usage limits.

  ## Copyable sandboxes

  Spin up a new sandbox as a **copy** of an existing one, so you can branch off staging or QA without rebuilding your catalog from scratch.

  ## billing.updated on manual sync

  Manual sync operations now emit the [`billing.updated`](/api-reference/webhooks/billingUpdated) webhook, so downstream consumers stay in sync when you re-pull state from Stripe by hand.

  <AccordionGroup>
    <Accordion title="Improvements">
      * `set_usage` now composes with usage windows: setting a balance no longer errors when a feature has an active window, and window caps still hold after the reset — [#2205](https://github.com/useautumn/autumn/pull/2205)
      * Auto top-up expand path returns `purchase_limit` for plan-inherited entries too — [#2205](https://github.com/useautumn/autumn/pull/2205)
      * Refund-last-payment is now exposed on the API — [#2179](https://github.com/useautumn/autumn/pull/2179)
      * Slack app: additional options for matching a Slack user to an Autumn user — [#2100](https://github.com/useautumn/autumn/pull/2100)
      * Archived plans now include an `archived` flag when pulled via the CLI — [#2152](https://github.com/useautumn/autumn/pull/2152)
      * Webhook tags: customer and entity IDs are sanitized to the Svix charset so deliveries don't fail on unusual characters — [#2150](https://github.com/useautumn/autumn/pull/2150)
      * Free first schedule phase is now supported in plan schedules — [#2137](https://github.com/useautumn/autumn/pull/2137)
      * Refreshed checkout favicon — [#2162](https://github.com/useautumn/autumn/pull/2162), [#2161](https://github.com/useautumn/autumn/pull/2161)
      * Cleaner subscription sheet tooltips, coupon error messages, and plan ID chip in mappings — [#2157](https://github.com/useautumn/autumn/pull/2157)
    </Accordion>

    <Accordion title="Bug fixes">
      * Renewal edge case that could mis-schedule the next cycle is fixed — [#2200](https://github.com/useautumn/autumn/pull/2200)
      * Manual `tax_rate_id` is now applied to one-time and deferred charges, not just recurring items — [#2204](https://github.com/useautumn/autumn/pull/2204)
      * `check` with a lock correctly returns `allowed: false` when the customer has no entitlement — [#2174](https://github.com/useautumn/autumn/pull/2174)
      * Promo minimum validation is now consistent across all billing flows — [#2168](https://github.com/useautumn/autumn/pull/2168)
      * ACH processing invoices are handled correctly through the past-due flow — [#2167](https://github.com/useautumn/autumn/pull/2167), [#2128](https://github.com/useautumn/autumn/pull/2128), [#2053](https://github.com/useautumn/autumn/pull/2053)
      * Skip overage billing when no overage is due, avoiding empty invoice items — [#2190](https://github.com/useautumn/autumn/pull/2190), [#2182](https://github.com/useautumn/autumn/pull/2182)
      * Cardinality gate no longer false-fires on legitimate usage — [#2184](https://github.com/useautumn/autumn/pull/2184)
      * Scheduled customer products now resync `starts_at` when a Stripe schedule is updated — [#2177](https://github.com/useautumn/autumn/pull/2177)
      * Filter button on the customers page is visible even when a customer only has expired products — [#2165](https://github.com/useautumn/autumn/pull/2165)
      * Variant Stripe product renames now propagate correctly — [#2149](https://github.com/useautumn/autumn/pull/2149)
      * Product cron trial expiry now paginates correctly at scale — [#2144](https://github.com/useautumn/autumn/pull/2144)
      * Schedule phase billing anchors are reset when the phase changes; Stripe anchor reset day is clamped to valid values — [#2133](https://github.com/useautumn/autumn/pull/2133), [#2115](https://github.com/useautumn/autumn/pull/2115)
      * Discount upgrades apply cleanly to the upgraded plan — [#1815](https://github.com/useautumn/autumn/pull/1815)
      * `billing.import` correctly updates `customer_data` and filters one-off / usage-based balances — [#2154](https://github.com/useautumn/autumn/pull/2154), [#2156](https://github.com/useautumn/autumn/pull/2156)
      * Assorted usage-window, coupon, and sync-back fixes — [#2159](https://github.com/useautumn/autumn/pull/2159), [#2186](https://github.com/useautumn/autumn/pull/2186)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="June 26th 2026">
  ## Multiple sandbox environments per org

  Organizations can now spin up **multiple sandboxes** alongside production — each with its own API keys, teams, color, and icon — so you can isolate staging, QA, demo, and per-engineer environments without juggling accounts. Provision, switch, edit, and tear down sandboxes directly from the dashboard.

  ## Per-customer JWT credentials

  Issue and rotate **per-customer JWT credentials** for the frontend SDK. State is now persisted in Postgres, so credentials survive restarts and can be managed cleanly per customer.

  ## Percentage-based spend limits

  [Spend limits](/documentation/modelling-pricing/spend-limits) now support a `usage_percentage` mode, letting you cap overage as a percentage of included usage instead of an absolute number — useful for plans where the included quota changes between tiers.

  ## Plan metadata

  Attach arbitrary **metadata to plans** and read it back through the API. Use it to tag plans with internal flags, feature gates, or marketing copy without forking your pricing model.

  ## List rewards endpoint

  New [rewards endpoint](/api-reference/rewards/redeemRewardCode) returns both coupons and feature grants in a single paginated response, making it easier to render available rewards in your own UI.

  ## Track events with custom timestamps

  The `track` endpoint now accepts an explicit `timestamp` field, so you can backfill events or record usage that happened earlier without losing chronological accuracy.

  ## Plan billing controls

  Custom plans get a refreshed **billing controls** panel — clearer toggles, keyboard-focusable tooltips, simplified auto top-up resolution, and improved copy throughout. See [custom plans](/documentation/customers/custom-plans).

  ## Dual-auth Stripe keys

  You can now connect Stripe using **either** OAuth or a restricted API key, and switch between them per organization. The Stripe Keys UI has been redesigned around the new dual-auth flow, with cleaner copy and a smoother delete experience.

  <AccordionGroup>
    <Accordion title="Improvements">
      * Add interval filter to the customers list page — [#2038](https://github.com/useautumn/autumn/pull/2038)
      * "Create more" mode in the create-entity dialog for bulk entity setup — [#1988](https://github.com/useautumn/autumn/pull/1988)
      * Plan editor: cleaner update logic and feature-creation flow — [#2035](https://github.com/useautumn/autumn/pull/2035)
      * Net payment terms UI refreshed inside the invoice settings accordion — [#2034](https://github.com/useautumn/autumn/pull/2034)
      * Customizable buttons in transactional emails — [#1991](https://github.com/useautumn/autumn/pull/1991)
      * Customer IDs now accept colons for namespaced identifiers — [#1995](https://github.com/useautumn/autumn/pull/1995)
      * Mobile dashboard cleanup, including card-style tables on small screens — [#2013](https://github.com/useautumn/autumn/pull/2013)
      * [RevenueCat import](/documentation/external-providers/revenuecat): paginated product list and raw-mapping escape hatch for custom field mapping — [#2040](https://github.com/useautumn/autumn/pull/2040)
      * MCP OAuth now grants Leaf scopes when only OIDC scopes are requested — [#2012](https://github.com/useautumn/autumn/pull/2012), [#2023](https://github.com/useautumn/autumn/pull/2023)
      * Website content negotiation: canonical URLs serve markdown to clients that ask for it — [#2004](https://github.com/useautumn/autumn/pull/2004), [#2007](https://github.com/useautumn/autumn/pull/2007), [#2009](https://github.com/useautumn/autumn/pull/2009)
      * Cleaner Stripe connect dialog and improved Stripe-related copy across the dashboard — [#2020](https://github.com/useautumn/autumn/pull/2020), [#2047](https://github.com/useautumn/autumn/pull/2047)
      * Customer portal now has rate limiting to protect against abuse — [#2033](https://github.com/useautumn/autumn/pull/2033)
    </Accordion>

    <Accordion title="Bug fixes">
      * Auto top-ups now charge the most recently attached plan's one-off price — [#2049](https://github.com/useautumn/autumn/pull/2049)
      * Event table filtering corrected so filters apply to the right columns — [#2005](https://github.com/useautumn/autumn/pull/2005)
      * Long event values no longer overflow the events table — [#2048](https://github.com/useautumn/autumn/pull/2048)
      * Trialing customers downgrading to Free are correctly anchored to trial end — [#2000](https://github.com/useautumn/autumn/pull/2000)
      * Sync no longer adds phantom allowance for imported prepaid Stripe items, and carries prepaid usage correctly when expiring a plan — [#1978](https://github.com/useautumn/autumn/pull/1978)
      * Hourly rollovers now enforce the configured max cap on the reset cron — [#2022](https://github.com/useautumn/autumn/pull/2022)
      * Rewards: reject duplicate reward IDs and promo codes, and clean up promos on delete — [#2031](https://github.com/useautumn/autumn/pull/2031)
      * Event ranking window aligned with the chart for accurate top-events lists — [#2003](https://github.com/useautumn/autumn/pull/2003)
      * Separate billing intervals render correctly in the plan editor — [#2001](https://github.com/useautumn/autumn/pull/2001), [#2042](https://github.com/useautumn/autumn/pull/2042), [#2043](https://github.com/useautumn/autumn/pull/2043)
      * Prevent horizontal overscroll on the marketing site — [#2019](https://github.com/useautumn/autumn/pull/2019)
      * MCP and Leaf auth edge cases resolved — [#2026](https://github.com/useautumn/autumn/pull/2026)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="June 19th 2026">
  ## Autumn Lakehouse

  Stream every event, balance change, and invoice straight into your own data warehouse via the new **Autumn Lakehouse**. Connect once and query Autumn data with the SQL engine of your choice — Snowflake, BigQuery, DuckDB, Athena, Spark, or anything else that speaks Apache Iceberg.

  See the [Lakehouse overview](/documentation/lakehouse/overview) and [connecting guide](/documentation/lakehouse/connecting) to get started.

  ## Instant customer products table

  The customer detail page now renders its products table immediately, with the rest of the list paginated in the background. Loading a customer with hundreds of products is no longer a wait.

  ## Weekly analytics granularity

  Analytics now supports a **weekly** bin size, and granularity options are tailored per time range (no more greyed-out choices). The granularity picker has moved into the time-period dropdown for fewer clicks.

  ## Plan version migrations: filter compiler & migrate dialog

  Plan version migrations get a new **filter compiler** for targeting exactly the customers you want, a refreshed migrate dialog, and clearer visibility into billing changes before you commit. See [custom plans](/documentation/customers/custom-plans).

  ## Rewards: boolean grants & first-time conditions

  Rewards can now grant **boolean features** (e.g. unlock an add-on as a perk) and can be gated to a customer's **first-time** purchase only. Useful for launch promos and onboarding incentives.

  ## OpenRouter support in the AI gateway

  The Autumn [AI gateway](/documentation/external-providers/openrouter) now supports OpenRouter as a provider, so you can meter and bill OpenRouter usage the same way as direct OpenAI, Anthropic, and others.

  <AccordionGroup>
    <Accordion title="Improvements">
      * New `carry_over_usages` option on [`billing.update`](/api-reference/billing/billingUpdate) to preserve usage across plan changes — [#1974](https://github.com/useautumn/autumn/pull/1974)
      * New `next_reset_at` parameter on [create balance](/api-reference/balances/createBalance) for scheduling the first reset — [#1950](https://github.com/useautumn/autumn/pull/1950)
      * Long-lived Stripe checkout sessions so links stay valid for longer — [#1976](https://github.com/useautumn/autumn/pull/1976)
      * Consolidated customer header actions, entity-scoped views, and direct Stripe Connect links from the customer page — [#1964](https://github.com/useautumn/autumn/pull/1964)
      * Separate billing intervals per price component — [#1961](https://github.com/useautumn/autumn/pull/1961)
      * Discounts now support a max-redemptions cap — [#1939](https://github.com/useautumn/autumn/pull/1939)
      * Past-due cancellations void the open invoice immediately — [#1948](https://github.com/useautumn/autumn/pull/1948)
      * Option to ignore past-due state and preserve the subscription — [#1963](https://github.com/useautumn/autumn/pull/1963)
      * Clearer error messages across the dashboard and API — [#1943](https://github.com/useautumn/autumn/pull/1943)
      * Refreshed reward selectors and coupon update confirmation — [#1928](https://github.com/useautumn/autumn/pull/1928)
      * Org logos now upload to S3 with reliable hosting — [#1225](https://github.com/useautumn/autumn/pull/1225)
      * Custom buttons in the dashboard — [#1987](https://github.com/useautumn/autumn/pull/1987)
      * AI credit systems are now treated as generic credit systems in the plan editor — [#1903](https://github.com/useautumn/autumn/pull/1903)
    </Accordion>

    <Accordion title="Bug fixes">
      * Patch migrations no longer skip custom products — [#1953](https://github.com/useautumn/autumn/pull/1953)
      * Multi-entity granted amounts now display correctly in balance sub-rows — [#1947](https://github.com/useautumn/autumn/pull/1947)
      * Free-trial dedup is now scoped per entity so each entity gets its own trial — [#1956](https://github.com/useautumn/autumn/pull/1956)
      * `billing.updated` webhook now fires on trial-to-paid conversion — [#1972](https://github.com/useautumn/autumn/pull/1972)
      * Tax and discounts now render correctly in [attach preview](/api-reference/billing/previewAttach) — [#1944](https://github.com/useautumn/autumn/pull/1944)
      * [`createSchedule`](/api-reference/billing/createSchedule) phases now snap to the cycle boundary — [#1975](https://github.com/useautumn/autumn/pull/1975)
      * Checkout page no longer renders blank on certain React versions — [#1937](https://github.com/useautumn/autumn/pull/1937)
      * Usage limits now respect the AI credit dimension — [#1912](https://github.com/useautumn/autumn/pull/1912)
      * Onboarding fee no longer double-charges in edge cases — [#1946](https://github.com/useautumn/autumn/pull/1946)
      * Environment selection and org switching in the dashboard — [#1952](https://github.com/useautumn/autumn/pull/1952), [#1970](https://github.com/useautumn/autumn/pull/1970)
      * Copy entity ID and allow duplicate plans in the sync editor — [#1957](https://github.com/useautumn/autumn/pull/1957)
      * Sync expire no longer fails on certain customer states — [#1967](https://github.com/useautumn/autumn/pull/1967)
      * Batch operations are now idempotent — [#1981](https://github.com/useautumn/autumn/pull/1981)
      * Slack admin and dashboard gate fixes — [#1986](https://github.com/useautumn/autumn/pull/1986), [#1984](https://github.com/useautumn/autumn/pull/1984)
      * CLI auth and Claude OAuth flows — [#1926](https://github.com/useautumn/autumn/pull/1926), [#1925](https://github.com/useautumn/autumn/pull/1925)
      * `atmn` CLI now exits with a non-zero code on interactive push/pull errors — [#1927](https://github.com/useautumn/autumn/pull/1927)
      * Copy product API call no longer fires with missing required fields — [#1585](https://github.com/useautumn/autumn/pull/1585)
      * Keyboard shortcut and scroll fixes in the dashboard — [#1915](https://github.com/useautumn/autumn/pull/1915), [#1942](https://github.com/useautumn/autumn/pull/1942)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="May 29th 2026">
  ## Autumn MCP server

  Autumn now ships an official **Model Context Protocol (MCP) server**, so AI assistants like Claude Desktop and Cursor can read and act on your Autumn data directly. The server is generated against the public API and respects your existing API key scopes (`customers:read`, `plans:read`, `billing:read`, `billing:write`) — no new permission model to learn.

  Install it as a Claude Desktop extension or wire it into Cursor with a single deeplink. Use it to look up customers, inspect plans, preview attaches, and run billing updates from your assistant.

  ## Org-level usage alerts

  Usage alerts can now be configured **once at the org level** and applied across every customer, instead of being attached plan by plan. Set a threshold and channel from settings, and Autumn fires alerts whenever any customer crosses the bar. The [`balances.usage_alert.triggered` webhook](/api-reference/webhooks/balancesUsageAlertTriggered) fires for both per-plan and org-level alerts.

  ## Vercel Marketplace: invoice mode and resource logs

  The Vercel integration now supports **invoice-mode billing** end to end and surfaces **per-resource logs** in the dashboard, so you can debug a Vercel customer's provisioning, auto top-ups, and invoice flow without leaving Autumn. The frontend was rebuilt around the new resource model, with fallbacks for identity edge cases.

  See the [Vercel Marketplace guide](/documentation/external-providers/vercel-marketplace).

  <AccordionGroup>
    <Accordion title="Improvements">
      * Official Autumn MCP server for Claude Desktop, Cursor, and other MCP clients — [#1715](https://github.com/useautumn/autumn/pull/1715), [#1740](https://github.com/useautumn/autumn/pull/1740), [#1741](https://github.com/useautumn/autumn/pull/1741)
      * Org-level usage alerts with shared thresholds across customers — [#1707](https://github.com/useautumn/autumn/pull/1707)
      * Vercel Marketplace invoice mode, resource logs, and refreshed frontend — [#1711](https://github.com/useautumn/autumn/pull/1711)
      * Preflight tax-address check before charging customers in taxable regions — [#1699](https://github.com/useautumn/autumn/pull/1699)
      * Automatically void uncollectible Stripe invoices instead of leaving them open — [#1732](https://github.com/useautumn/autumn/pull/1732)
      * New plan-version filters for [custom-plan migrations](/documentation/customers/custom-plans) — [#1718](https://github.com/useautumn/autumn/pull/1718)
      * Faster customer detail loads and smoother large entity lists — [#1712](https://github.com/useautumn/autumn/pull/1712)
      * Customer list filter by entity ID — [#1688](https://github.com/useautumn/autumn/pull/1688)
      * Refreshed dashboard theme and appearance controls — [#1679](https://github.com/useautumn/autumn/pull/1679)
      * Optimised product counts in the customer table — [#1690](https://github.com/useautumn/autumn/pull/1690)
      * Mobile fixes for the customer list view — [#1689](https://github.com/useautumn/autumn/pull/1689)
    </Accordion>

    <Accordion title="Bug fixes">
      * Stripe checkout no longer drops carry-over balances on plan changes — [#1708](https://github.com/useautumn/autumn/pull/1708)
      * Trial grants are now excluded from reward eligibility — [#1730](https://github.com/useautumn/autumn/pull/1730)
      * RevenueCat sync no longer fails with "entities not found" — [#1729](https://github.com/useautumn/autumn/pull/1729)
      * Tax IDs now render correctly in the attach preview — [#1728](https://github.com/useautumn/autumn/pull/1728)
      * Invalid email addresses are now rejected with a clearer error — [#1722](https://github.com/useautumn/autumn/pull/1722)
      * Sandbox usage alerts now respect their configured threshold — [#1706](https://github.com/useautumn/autumn/pull/1706)
      * Proration toggle now shows even when the customer has a past trial — [#1704](https://github.com/useautumn/autumn/pull/1704)
      * One-off prepaid items upgrade correctly without double carry-over — [#1676](https://github.com/useautumn/autumn/pull/1676), [#1695](https://github.com/useautumn/autumn/pull/1695)
      * Subscription metadata is preserved through checkout — [#1719](https://github.com/useautumn/autumn/pull/1719)
      * Price dropdown no longer loses its selected value when reopened — [#1720](https://github.com/useautumn/autumn/pull/1720)
      * Vercel auto top-ups no longer fail to process the resulting invoice — multiple fixes ([#1725](https://github.com/useautumn/autumn/pull/1725))
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="May 28th 2026">
  ## Batch track and async track

  Two new ways to record usage when you don't need an immediate balance read:

  * [`POST /v1/balances.batch_track`](/api-reference/core/batchTrack) — enqueue up to **1000 usage events** in one request. Returns 202 immediately; balances are deducted by background workers.
  * **`async: true`** on the existing [`POST /v1/balances.track`](/api-reference/core/track) — same fire-and-forget shape for single-event callers that want the speed without switching to the batch endpoint.

  Both paths are intended for high-volume metering (event logging, per-action usage counters) where you'd previously be limited by the synchronous deduction's HTTP round-trip. Partial enqueue failures are logged server-side and do NOT surface as errors to the client — see the [batch track reference](/api-reference/core/batchTrack#partial-failure-semantics) for the trade-off.
</Update>

<Update label="May 20th 2026">
  ## `billing.updated` webhook

  A new **`billing.updated`** webhook fires whenever a customer's plans change — attaches, renewals, schedule activations, trial conversions, plan updates, and expirations all flow through a single event. The payload includes the customer, optional entity, and an array of `plan_changes` describing what was activated, scheduled, updated, or expired, with previous-state diffs.

  Use it to drive provisioning, lifecycle emails, CRM sync, and revenue reporting from one webhook instead of stitching together multiple events.

  See the [`billing.updated` webhook reference](/api-reference/webhooks/billingUpdated).

  ## Cursor-based pagination and list endpoints (API v2.3)

  The API is now at **v2.3**, introducing cursor-based pagination across list endpoints. Two new endpoints ship with it:

  * [`POST /v1/entities.list`](/api-reference/entities/listEntities) — list a customer's entities with filters and cursor pagination.
  * [`POST /v1/events.list`](/api-reference/events/listEvents) — paginate raw event history for a customer or feature.

  Cursor pagination replaces offset-based paging on heavy endpoints, giving stable results even while data changes between pages. Pass `start_cursor` to continue from a previous page.

  ## Manual auto top-ups from the dashboard

  You can now trigger an auto top-up for a customer directly from the dashboard, without waiting for the balance to cross the configured threshold. Useful for support flows, manual credit grants, or testing top-up wiring end to end.

  See the [auto top-ups guide](/documentation/modelling-pricing/auto-top-ups).

  ## Passkey sign-in for the dashboard

  Dashboard accounts now support **passkeys (WebAuthn)**. Register a passkey from your account settings to sign in with Face ID, Touch ID, Windows Hello, or a hardware key — no password required. Sign-in autofill is enabled so browsers can prompt for a passkey on the login screen.

  ## Vercel resource pre-provisioning

  For Vercel Marketplace installs, Autumn now provisions the customer product the moment a resource is created, using a Stripe preauth instead of waiting for the first invoice. New Vercel customers land in your dashboard with their plan attached and entitlements ready immediately.

  See the [Vercel Marketplace guide](/documentation/external-providers/vercel-marketplace).

  ## `plan_id` in analytics

  Analytics queries now group and filter by `plan_id`, so revenue, usage, and event charts can be sliced per plan. Plan selection in the dashboard analytics views drives the new dimension end to end.

  ## Customer API logs workbench

  The dashboard's customer detail view now includes a **workbench panel** showing recent API requests for that customer — endpoint, status, latency, and payload — so you can debug integrations without leaving the customer.

  ## Schedule editor: copy from previous phase

  When customizing a scheduled phase, you can now click **Copy from previous phase** to seed the product selector with the prior phase's items, then adjust from there. Faster than rebuilding a multi-item phase from scratch.

  ## Trial `on_end` behaviour for attach

  `billing.attach` accepts a new option to control what happens when a trial ends — convert to the paid plan, expire, or hand off to another product. The setting respects entity scoping so trials on one entity no longer disrupt others on the same customer.

  See the [attach API reference](/api-reference/billing/attach).

  <AccordionGroup>
    <Accordion title="Improvements">
      * `billing.updated` webhook with unified `plan_changes` payload — [#1637](https://github.com/useautumn/autumn/pull/1637)
      * API v2.3 with cursor-based pagination — [#1596](https://github.com/useautumn/autumn/pull/1596)
      * `POST /v1/entities.list` endpoint — [#1505](https://github.com/useautumn/autumn/pull/1505), [#1513](https://github.com/useautumn/autumn/pull/1513)
      * Paginated `POST /v1/events.list` endpoint — [#1596](https://github.com/useautumn/autumn/pull/1596)
      * Manual auto top-up trigger in dashboard — [#1532](https://github.com/useautumn/autumn/pull/1532)
      * Passkey (WebAuthn) sign-in and settings UI — [#1587](https://github.com/useautumn/autumn/pull/1587)
      * Vercel resource pre-provisioning with Stripe preauth — [#1578](https://github.com/useautumn/autumn/pull/1578)
      * `plan_id` dimension in analytics charts and tables — [#1568](https://github.com/useautumn/autumn/pull/1568), [#1613](https://github.com/useautumn/autumn/pull/1613)
      * Customer API logs workbench panel — [#1525](https://github.com/useautumn/autumn/pull/1525)
      * "Copy from previous phase" button in the schedule editor — [#1556](https://github.com/useautumn/autumn/pull/1556)
      * Trial `on_end` option on `billing.attach`, with entity-aware behaviour — [#1554](https://github.com/useautumn/autumn/pull/1554), [#1581](https://github.com/useautumn/autumn/pull/1581)
      * Live normalisation of expired auto top-up purchase-limit windows — [#1520](https://github.com/useautumn/autumn/pull/1520)
      * Command bar favourites for impersonating frequent orgs and users — [#1597](https://github.com/useautumn/autumn/pull/1597)
      * Settings page redesign with clearer navigation — [#1555](https://github.com/useautumn/autumn/pull/1555)
      * Dashboard analytics chart and table polish — [#1599](https://github.com/useautumn/autumn/pull/1599), [#1613](https://github.com/useautumn/autumn/pull/1613)
    </Accordion>

    <Accordion title="Bug fixes">
      * Stripe webhook race condition that could double-process events — [#1620](https://github.com/useautumn/autumn/pull/1620)
      * Checkout session race condition under high concurrency — [#1548](https://github.com/useautumn/autumn/pull/1548)
      * Attach now respects `tax_rate_id` overrides — [#1641](https://github.com/useautumn/autumn/pull/1641)
      * Attach correctly handles no-op billing changes — [#1586](https://github.com/useautumn/autumn/pull/1586)
      * Schedule sync no longer produces empty phases or duplicate items — [#1501](https://github.com/useautumn/autumn/pull/1501), [#1574](https://github.com/useautumn/autumn/pull/1574), [#1575](https://github.com/useautumn/autumn/pull/1575)
      * Schedule customize flow now correctly handles removed base prices on free plans — [#1556](https://github.com/useautumn/autumn/pull/1556)
      * Entity sync edge cases and item-log alignment fixed — [#1607](https://github.com/useautumn/autumn/pull/1607), [#1614](https://github.com/useautumn/autumn/pull/1614)
      * Custom item delete and ghost item issues in the plan editor — [#1517](https://github.com/useautumn/autumn/pull/1517), [#1628](https://github.com/useautumn/autumn/pull/1628), [#1629](https://github.com/useautumn/autumn/pull/1629)
      * Cancel flow now handles plans with a future `starts_at` — [#1507](https://github.com/useautumn/autumn/pull/1507)
      * Revert trial issue when reversing a recent attach — [#1635](https://github.com/useautumn/autumn/pull/1635)
      * Vercel: Stripe Tax disabled when org has no tax config; metadata is now optional — [#1558](https://github.com/useautumn/autumn/pull/1558)
      * Various Vercel marketplace bug fixes — [#1579](https://github.com/useautumn/autumn/pull/1579)
      * Duplicate Stripe customer ID handling — [#1528](https://github.com/useautumn/autumn/pull/1528)
      * Cache invalidation correctness on customer and plan edits — [#1531](https://github.com/useautumn/autumn/pull/1531), [#1612](https://github.com/useautumn/autumn/pull/1612)
      * Dashboard customer cache freshness — [#1612](https://github.com/useautumn/autumn/pull/1612)
      * Plan analytics: per-item parse failures no longer drop valid deductions; `$plan_id` alias normalised — [#1608](https://github.com/useautumn/autumn/pull/1608)
      * `list events` hook returns the correct response type — [#1633](https://github.com/useautumn/autumn/pull/1633)
      * Shadow flag evaluation fixes — [#1632](https://github.com/useautumn/autumn/pull/1632)
      * Webhook tag filtering improvements — [#1617](https://github.com/useautumn/autumn/pull/1617)
      * No-op plan PATCH now exits cleanly without spurious updates — [#1628](https://github.com/useautumn/autumn/pull/1628)
      * Database pool sizing and connection limits raised for higher throughput — [#1625](https://github.com/useautumn/autumn/pull/1625), [#1643](https://github.com/useautumn/autumn/pull/1643)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="May 7th 2026">
  ## Scheduled subscriptions with `starts_at`

  You can now schedule a plan to start at a future date by passing a `starts_at` Unix timestamp (milliseconds) to `billing.attach`. Future-dated attaches create a Stripe subscription schedule that activates on the start date — perfect for delayed onboarding, contract renewals, or sales-led handoffs.

  Pair `starts_at` with `ends_at` to grant access for a fixed window. One-off products now also support `ends_at` and are automatically cleaned up when the window expires.

  See the [attach API reference](/api-reference/billing/attach).

  ## Auto top-up succeeded webhook

  A new **`billing.auto_topup_succeeded`** webhook fires whenever an auto top-up is processed for a customer. The payload includes the customer ID, feature ID, quantity granted, threshold that triggered the top-up, post-top-up balance, and the full Stripe invoice (status, total, currency, hosted URL, and PDF link).

  Useful for sending receipts, syncing top-ups to your own ledger, or alerting customers that their card was charged. Supports both auto-charged and `send_invoice` modes.

  See the [auto top-up webhook reference](/api-reference/webhooks/billingAutoTopupSucceeded) and the [auto top-ups guide](/documentation/modelling-pricing/auto-top-ups).

  ## Promo codes in Autumn Checkout

  Customers can now apply promo codes directly in Autumn Checkout. The order summary surfaces a collapsed promo trigger that expands into an input — applied codes show their discount and expiry inline, and the totals update before confirmation.

  ## Discounts and coupons in subscription updates

  The dashboard's subscription update flow now supports applying discounts. Existing coupons are visible in the subscription detail sheet, and you can attach a discount when changing a plan or quantities.

  ## Tax and invoice credits in attach preview

  `billing.preview_attach` now returns two new optional fields:

  * **`tax`**: Tax breakdown for the immediate charge (total, inclusive/exclusive amounts, currency, calculation status). Powered by Stripe Tax — contact us to enable the tax flag on your organisation.
  * **`invoice_credits`**: The customer's available Stripe invoice credit balance, so you can show "Account credit" line items in custom checkouts.

  See the [preview attach reference](/api-reference/billing/previewAttach).

  ## `balances` field in `track` responses

  The `/track` endpoint now returns the affected feature balances — including a per-plan `breakdown` of grants, prepaid credits, usage, remaining, and rollovers — directly in the response. This removes the need for a follow-up `check` call after recording usage.

  See the [track endpoint](/api-reference/core/track).

  ## `processors` field on customer responses

  Customer endpoints (`get`, `getOrCreate`, `update`, `list`) now return a `processors` object listing every payment processor the customer is connected to: Stripe, Vercel, and RevenueCat. The field is omitted for customers not yet present in any processor.

  You can also filter `customers.list` by processor with the new `processors` query parameter.

  ## Auto top-up purchase limits in customer expand

  Expand `billing_controls.auto_topups.purchase_limit` on customer endpoints to retrieve the configured top-up rate limit, the current count of top-ups in the period, and the next reset timestamp. Useful for showing customers how close they are to their auto top-up cap.

  ## RevenueCat invoice sync

  RevenueCat-billed subscriptions now record full invoices on initial purchase, renewal, and refund events. Invoices appear alongside Stripe invoices in customer responses and the dashboard, giving you a unified view of revenue across processors.

  <AccordionGroup>
    <Accordion title="Improvements">
      * `starts_at` parameter on `billing.attach` for scheduled subscription start dates - [#1411](https://github.com/useautumn/autumn/pull/1411), [#1467](https://github.com/useautumn/autumn/pull/1467), [#1476](https://github.com/useautumn/autumn/pull/1476)
      * `ends_at` on one-off products with automatic expiry cron - [#1476](https://github.com/useautumn/autumn/pull/1476)
      * `billing.auto_topup_succeeded` webhook - [#1429](https://github.com/useautumn/autumn/pull/1429)
      * Promo code support in Autumn Checkout - [#1446](https://github.com/useautumn/autumn/pull/1446)
      * Discount support on subscription updates and coupon display in subscription detail - [#1463](https://github.com/useautumn/autumn/pull/1463)
      * Tax preview in `billing.preview_attach` - [#1417](https://github.com/useautumn/autumn/pull/1417), [#1424](https://github.com/useautumn/autumn/pull/1424)
      * Invoice credits preview in `billing.preview_attach` - [#1464](https://github.com/useautumn/autumn/pull/1464)
      * `balances` field returned in `/track` responses - [#1470](https://github.com/useautumn/autumn/pull/1470)
      * `processors` field and `processors` filter on customer endpoints - [#1490](https://github.com/useautumn/autumn/pull/1490)
      * `billing_controls.auto_topups.purchase_limit` expand on customer endpoints - [#1423](https://github.com/useautumn/autumn/pull/1423)
      * RevenueCat invoice recording on initial purchase, renewal, and refund - [#1490](https://github.com/useautumn/autumn/pull/1490)
      * OpenAPI spec, SDKs, and dashboard updated with `starts_at` / `ends_at` fields - [#1485](https://github.com/useautumn/autumn/pull/1485)
      * Checkout `enable_immediately` flow improvements - [#1415](https://github.com/useautumn/autumn/pull/1415)
      * API key sheet and table UI cleanup
    </Accordion>

    <Accordion title="Bug fixes">
      * Proration settings now visible during cross-entity free-to-paid attach - [#1491](https://github.com/useautumn/autumn/pull/1491)
      * Dashboard org switcher now lists the full set of organizations - [#1475](https://github.com/useautumn/autumn/pull/1475)
      * Balance validation no longer rejects valid edits - [#1477](https://github.com/useautumn/autumn/pull/1477)
      * Schedule sync edge cases fixed - [#1443](https://github.com/useautumn/autumn/pull/1443)
      * Orphaned customer products cleaned up correctly - [#1440](https://github.com/useautumn/autumn/pull/1440)
      * Auto-sync paid feature mapping on plan edits - [#1448](https://github.com/useautumn/autumn/pull/1448)
      * Member toolbar z-index fixed in the dashboard - [#1449](https://github.com/useautumn/autumn/pull/1449)
      * Prepaid price v2 fixes - [#1451](https://github.com/useautumn/autumn/pull/1451)
      * Vercel customer filtering when no Stripe is connected - [#1455](https://github.com/useautumn/autumn/pull/1455), [#1458](https://github.com/useautumn/autumn/pull/1458)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="March 23rd 2026">
  ## Usage alerts and `balances.limit_reached` webhook

  You can now configure **usage alerts** on customers and entities to get notified when usage crosses a threshold. Alerts are set via `billingControls.usageAlerts` and fire a `balances.usage_alert_triggered` webhook. Supports both absolute usage counts and percentage-of-allowance thresholds.

  A new **`balances.limit_reached`** webhook fires when a customer hits a usage limit — whether it's the included allowance, a max purchase cap, or a spend limit. See the [webhooks reference](/documentation/webhooks) and [spend limits & usage alerts guide](/documentation/modelling-pricing/spend-limits) for details.
</Update>

<Update label="March 17th 2026">
  ## Express, Elysia, and Web Standard adapters for `autumn-js`

  The `autumn-js` SDK now ships adapters for Express, Elysia, and any framework that uses the Fetch API `Request`/`Response` objects. You can set up the `autumnHandler` in your backend with a single import — no manual request parsing required.

  * **Express**: Import from `autumn-js/express` and mount with `app.use()`. Requires `express.json()` before the handler
  * **Elysia / Web Standard**: Import from `autumn-js/fetch` and use with Elysia's `.mount()`, Cloudflare Workers, Deno, or any Fetch-based runtime
  * **Existing adapters**: Next.js (`autumn-js/next`) and Hono (`autumn-js/hono`) continue to work as before

  See the [setup guide](/documentation/getting-started/setup) for framework-specific code examples.

  ## Explicit customer creation required for `check` and `track`

  The `/check` and `/track` endpoints no longer auto-create customers. If you call these endpoints with a `customer_id` that doesn't exist, the API now returns a `customer_not_found` error instead of silently creating the customer.

  This change encourages explicit customer lifecycle management and prevents accidental customer creation from typos or stale IDs.

  * **Create customers first**: Call [`customers.getOrCreate`](/documentation/customers/creating-customers) during signup or login before using `check` or `track`
  * **Handle the error**: If a customer doesn't exist, the API returns error code `customer_not_found`

  ## `autumn-js` SDK 1.0.0

  The `autumn-js` SDK has been promoted from beta to stable at version `1.0.0`.

  ## New framework adapters

  The `autumn-js` SDK now includes adapters for Express, Elysia, and any Web Standard compatible runtime (Cloudflare Workers, Deno). Import from the adapter that matches your backend:

  | Framework             | Import path         |
  | --------------------- | ------------------- |
  | Next.js               | `autumn-js/next`    |
  | Hono                  | `autumn-js/hono`    |
  | Elysia / Web Standard | `autumn-js/fetch`   |
  | Express               | `autumn-js/express` |
  | Other                 | `autumn-js/backend` |

  See the [setup guide](/documentation/getting-started/setup) and the [`autumnHandler` reference](/react/hooks/autumn-handler) for full examples.

  <AccordionGroup>
    <Accordion title="Improvements">
      * Express adapter for `autumnHandler` via `autumn-js/express` - [#979](https://github.com/useautumn/autumn/pull/979)
      * Web Standard adapter for `autumnHandler` via `autumn-js/fetch` (Elysia, Cloudflare Workers, Deno) - [#979](https://github.com/useautumn/autumn/pull/979)
      * Explicit customer creation required for `check` and `track` endpoints - [#968](https://github.com/useautumn/autumn/pull/968)
      * `autumn-js` SDK promoted to `1.0.0` stable release - [#968](https://github.com/useautumn/autumn/pull/968)
      * New Express, Elysia, and Web Standard adapters for `autumnHandler` - [#985](https://github.com/useautumn/autumn/pull/985)
      * Improved API reference field descriptions for preview endpoints - [#985](https://github.com/useautumn/autumn/pull/985)
    </Accordion>

    <Accordion title="Bug fixes">
      * `checkout_session_params.subscription_data` (including `metadata`) is now properly deep-merged with Autumn's internal parameters instead of being overwritten - [#996](https://github.com/useautumn/autumn/pull/996)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="March 16th 2026">
  ## Balance and usage carry-over on plan upgrades

  You can now preserve a customer's remaining balances and usage when they upgrade plans. Two new parameters on `billing.attach` give you fine-grained control over what happens to consumable features during an immediate upgrade.

  * **`carry_over_balances`**: Unused credits or balances from the old plan are carried forward to the new one — so customers don't lose what they've already paid for
  * **`carry_over_usages`**: Prior usage is deducted from the new plan's allowance, preventing customers from getting a free reset on upgrade
  * **Per-feature control**: Optionally scope carry-over to specific features using `feature_ids`

  See the [attach API reference](/api-reference/billing/attach) for details.

  ## Feature flags in customer and entity responses

  Boolean features are now returned as a dedicated `flags` object on customer and entity API responses. This makes it easier to check on/off feature access without calling the `check` endpoint separately.

  * **Separate from balances**: Flags live under `flags` in the response, clearly separated from consumable balances
  * **Available everywhere**: Returned on customer get, list, entity get, and entity create endpoints
  * **Includes metadata**: Each flag shows the originating plan, expiration, and feature ID

  See the [check endpoint](/api-reference/core/check) and [customer endpoints](/api-reference/customers/getOrCreateCustomer) for the updated response format.

  <AccordionGroup>
    <Accordion title="Improvements">
      * Balance carry-over on immediate plan upgrades via `carry_over_balances` - [#861](https://github.com/useautumn/autumn/pull/861)
      * Usage carry-over on immediate plan upgrades via `carry_over_usages` - [#875](https://github.com/useautumn/autumn/pull/875)
      * Boolean features returned as `flags` in customer and entity objects - [#950](https://github.com/useautumn/autumn/pull/950)
      * Updated API, SDKs, and frontend with new flag fields - [#951](https://github.com/useautumn/autumn/pull/951)
    </Accordion>

    <Accordion title="Bug Fixes">
      * Fixed customer retrieval query causing errors in certain configurations - [#958](https://github.com/useautumn/autumn/pull/958), [#959](https://github.com/useautumn/autumn/pull/959)
      * Fixed trial upgrade reliability when unsetting trial periods - [#958](https://github.com/useautumn/autumn/pull/958)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="March 13th 2026">
  ## Autumn Checkout

  We've launched Autumn Checkout — a hosted confirm-before-charge flow that gives customers a clear preview before completing their purchase.

  When a customer with a saved payment method subscribes or updates their plan, they're now sent to Autumn Checkout instead of being charged directly. This lets them review exact pricing — including prorations, usage charges, and discounts — before confirming.

  * **Preview before you pay**: Customers see immediate charges and next-cycle estimates before confirming
  * **Works everywhere**: Supports new subscriptions, plan upgrades, and quantity updates
  * **Handles edge cases**: Built-in flows for 3DS authentication, payment failures, and action-required states
  * **No API changes**: Just follow the `paymentUrl` returned by `billing.attach` or `billing.update`

  <AccordionGroup>
    <Accordion title="How it works">
      When you call `billing.attach` or `billing.update`, the returned `paymentUrl` routes customers to:

      * **Stripe Checkout** — if they don't have a saved payment method
      * **Autumn Checkout** — if they do, so they can review and confirm the charge

      After confirmation, customers are redirected to your `successUrl`.
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="February 25th 2026">
  ## Volume-Based Tiered Pricing

  You can now choose between graduated and volume-based tiered pricing for your plans. With volume pricing, the entire usage quantity falls into a single tier instead of splitting across tiers — useful for models where the per-unit price depends on total consumption.

  * **Two tier modes**: Choose graduated (split across tiers) or volume (single tier applies to all units)
  * **Backward compatible**: Existing graduated plans work without changes; volume is opt-in via `tier_behavior`
  * **Full stack**: Supported in the plan editor, attach/checkout previews, Stripe invoices, and the API

  ## Batch Attach

  Attach multiple plans to a customer in a single API request. Each plan can have its own customization, feature quantities, and trial settings — all validated and applied atomically with a distributed lock.

  * **One request, multiple plans**: Attach several plans at once with per-plan customization
  * **Preview support**: Preview the combined batch before committing via `/billing.preview_multi_attach`
  * **Concurrency safe**: Distributed lock prevents conflicting concurrent attaches

  ## Lazy Entitlement Resets

  Entitlement resets now happen lazily on read, so customers see fresh balances instantly without waiting for a cron cycle. An atomic Postgres function and Redis Lua script prevent double-resets under concurrency.

  * **Instant resets**: Stale entitlements are reset the moment they're fetched
  * **Atomic & safe**: Per-row locking in Postgres and atomic Redis Lua patching prevent double-resets
  * **Hardened cron fallback**: Batch reset cron bounded with max iterations and timeouts

  <AccordionGroup>
    <Accordion title="Improvements">
      - Volume-based tiered pricing alongside graduated pricing - [#765](https://github.com/useautumn/autumn/pull/765)
      - Batch attach: attach multiple plans in one request - [#815](https://github.com/useautumn/autumn/pull/815)
      - Lazy entitlement resets for instant balance refreshes - [#800](https://github.com/useautumn/autumn/pull/800), [#802](https://github.com/useautumn/autumn/pull/802)
      - Atomic Redis updates for customer data and entities (CRDT-safe) - [#812](https://github.com/useautumn/autumn/pull/812), [#813](https://github.com/useautumn/autumn/pull/813)
      - Mobile navigation with sticky top bar and slide-in sidebar - [#760](https://github.com/useautumn/autumn/pull/760)
      - 12/24-hour date and time picker for balance reset scheduling - [#760](https://github.com/useautumn/autumn/pull/760)
      - Stripe coupon support in attach discount dropdown - [#819](https://github.com/useautumn/autumn/pull/819)
      - Metadata on Stripe invoice line items (product ID, price ID, coupon IDs) - [#817](https://github.com/useautumn/autumn/pull/817)
      - RPC router for Plans (create/get/update/delete) - [#750](https://github.com/useautumn/autumn/pull/750)
      - RPC router for Features (list/get/create/update/delete) - [#762](https://github.com/useautumn/autumn/pull/762)
      - Hardened reset cron with bounded batches and timeouts - [#808](https://github.com/useautumn/autumn/pull/808)
      - Customer filter and UI cleanups - [#755](https://github.com/useautumn/autumn/pull/755)
      - Unit tests GitHub Action - [#801](https://github.com/useautumn/autumn/pull/801)
    </Accordion>

    <Accordion title="Bug Fixes">
      * Fixed scheduled switches failing when a Stripe coupon was deleted - [#759](https://github.com/useautumn/autumn/pull/759)
      * Fixed events table showing empty - [#822](https://github.com/useautumn/autumn/pull/822)
      * Fixed customer balance UI - [#816](https://github.com/useautumn/autumn/pull/816)
      * Fixed balance subrow to always show /granted - [#779](https://github.com/useautumn/autumn/pull/779), [#780](https://github.com/useautumn/autumn/pull/780)
      * Fixed attach dashboard one-off products - [#789](https://github.com/useautumn/autumn/pull/789)
      * Fixed create customer body expand - [#787](https://github.com/useautumn/autumn/pull/787)
      * Fixed Vercel marketplace status not ready - [#778](https://github.com/useautumn/autumn/pull/778)
      * Fixed discounts on upgrades in legacy attach - [#772](https://github.com/useautumn/autumn/pull/772)
      * Fixed invoice without payment method - [#770](https://github.com/useautumn/autumn/pull/770)
      * Fixed SQS client restart - [#767](https://github.com/useautumn/autumn/pull/767), [#768](https://github.com/useautumn/autumn/pull/768)
      * Fixed impersonation - [#793](https://github.com/useautumn/autumn/pull/793)
      * Fixed reset for past-due customer entitlements - [#805](https://github.com/useautumn/autumn/pull/805), [#806](https://github.com/useautumn/autumn/pull/806)
      * Fixed zero denominator issue - [#746](https://github.com/useautumn/autumn/pull/746)
      * Fixed Vercel transfer request blocking - [#744](https://github.com/useautumn/autumn/pull/744)
      * Fixed discounts on scheduled subscriptions - [#742](https://github.com/useautumn/autumn/pull/742)
      * Fixed invoice cron race condition - [#747](https://github.com/useautumn/autumn/pull/747)
      * Fixed custom plan detection in subscription updates - [#784](https://github.com/useautumn/autumn/pull/784)
      * Fixed success URL handling for v2 attach checkout - [#786](https://github.com/useautumn/autumn/pull/786)
      * Fixed preview attach concurrency lock - [#758](https://github.com/useautumn/autumn/pull/758)
    </Accordion>

    <Accordion title="API">
      * New `POST /billing.multi_attach` and `POST /billing.preview_multi_attach` for batch plan attaches - [#815](https://github.com/useautumn/autumn/pull/815)
      * New `POST /billing.setup_payment` for collecting payment methods before plan attach - [#797](https://github.com/useautumn/autumn/pull/797)
      * New attach/update subscription V1 params: `plan_id`, `feature_quantities`, `customize`, `free_trial`, `transition_rules` - [#749](https://github.com/useautumn/autumn/pull/749), [#752](https://github.com/useautumn/autumn/pull/752)
      * RPC endpoints for Plans: `/plans.create`, `/plans.get`, `/plans.update`, `/plans.delete` - [#750](https://github.com/useautumn/autumn/pull/750)
      * RPC endpoints for Features: `/features.list`, `/features.get`, `/features.create`, `/features.update`, `/features.delete` - [#762](https://github.com/useautumn/autumn/pull/762)
      * Added `PATCH /customers/:customer_id` for partial updates - [#774](https://github.com/useautumn/autumn/pull/774)
      * Metadata added to Stripe invoice line items - [#817](https://github.com/useautumn/autumn/pull/817)
      * V2 API docs with multi-version OpenAPI specs and SDK generation pipeline - [#773](https://github.com/useautumn/autumn/pull/773)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="January 12th 2026">
  ## Dynamic onboarding prompts

  We've added a new in-app onboarding guide to help you get your billing set up in less than 30 minutes.

  * **Docs in app**: Access documentation directly within the dashboard
  * **3 prompts → full billing setup**: Complete your entire billing configuration in just 3 steps
  * **Dynamic code snippets**: Get code snippets and prompts tailored to your specific pricing config
  * **Real-time updates**: See your progress update as you complete each step

  <br />

  <Frame style={{ width: "500px" }}>
    <img src="https://mintcdn.com/autumn-b9b4c0fb/df8oGyhsA_ngL7c4/assets/changelog/onboarding-prompts.png?fit=max&auto=format&n=df8oGyhsA_ngL7c4&q=85&s=937920dd6ebb67b7b3b779acbafc17e5" width="2982" height="1680" data-path="assets/changelog/onboarding-prompts.png" />
  </Frame>

  <br />

  <AccordionGroup>
    <Accordion title="Improvements">
      * Code cleanup and refactoring in Stripe billing plan evaluation system - [#525](https://github.com/useautumn/autumn/pull/525)
      * Added `customerId` to request context for improved tracking and observability - [#520](https://github.com/useautumn/autumn/pull/520)
      * Improved cache verification workflow with free product filtering and Sentry alert tags - [#519](https://github.com/useautumn/autumn/pull/519)
      * Major Redis Lua refactor with cache versioning, filtering, and safer updates - [#512](https://github.com/useautumn/autumn/pull/512)
    </Accordion>

    <Accordion title="Bug Fixes">
      * Fixed multi-region cache deletion to delete from all configured regions - [#539](https://github.com/useautumn/autumn/pull/539)
      * Fixed import path casing issue for createProrationinvoice - [#537](https://github.com/useautumn/autumn/pull/537)
      * Fixed TypeScript type compatibility in BullMQ worker - [#538](https://github.com/useautumn/autumn/pull/538)
      * Fixed type annotations in OpenAPI definitions and RevenueCat mappings - [#533](https://github.com/useautumn/autumn/pull/533), [#534](https://github.com/useautumn/autumn/pull/534)
      * Fixed migration logic for product downgrades and cancellations - [#529](https://github.com/useautumn/autumn/pull/529)
      * Fixed subscription migration to prevent auto-uncanceling during version updates - [#527](https://github.com/useautumn/autumn/pull/527)
      * Fixed `included_usage` calculation in V1.2 API backward compatibility layer - [#526](https://github.com/useautumn/autumn/pull/526)
      * Implemented Redis-first caching for add-to-balance operations - [#524](https://github.com/useautumn/autumn/pull/524)
      * Simplified Stripe webhook cache refresh strategy - [#523](https://github.com/useautumn/autumn/pull/523)
      * Removed redundant `plan_version` field from subscription API schema - [#522](https://github.com/useautumn/autumn/pull/522)
      * Fixed duplicate features in plan editor when closing edit feature sheet - [#508](https://github.com/useautumn/autumn/pull/508)
    </Accordion>

    <Accordion title="API">
      * Added `entity_id` parameter support to legacy balance update endpoint - [#532](https://github.com/useautumn/autumn/pull/532)
      * Added `/configs/push` and `/configs/nuke` endpoints for managing organization configuration in sandbox environments - [#521](https://github.com/useautumn/autumn/pull/521)
      * Implemented idempotency protection for billing endpoints using `idempotency-key` header - [#516](https://github.com/useautumn/autumn/pull/516)
      * Added new `POST /customers/list` V2 endpoint with plan filtering, subscription status filtering, and search functionality - [#518](https://github.com/useautumn/autumn/pull/518), [#517](https://github.com/useautumn/autumn/pull/517)
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="December 26th 2025">
  ## Add to balance in the dashboard

  Merry Christmas! 🎄

  You can now add to a customer's balance directly from the dashboard. This is useful for giving extra credits to a customer.

  You can input a positive or negative value in this field.

  <br />

  <Frame style={{ width: "400px" }}>
    <img src="https://mintcdn.com/autumn-b9b4c0fb/df8oGyhsA_ngL7c4/assets/changelog/add-to-balance.png?fit=max&auto=format&n=df8oGyhsA_ngL7c4&q=85&s=6337aaa69ad5f496bb4de04aa340aaf5" width="950" height="864" data-path="assets/changelog/add-to-balance.png" />
  </Frame>

  <br />

  <AccordionGroup>
    <Accordion title="Improvements">
      * Balance management enhancements with atomic "Add to Balance" feature - [#503](https://github.com/useautumn/autumn/pull/503)
      * Product copy workflow streamlined with direct environment selection - [#501](https://github.com/useautumn/autumn/pull/501)
      * Plan feature sheet with discard/update actions and change detection - [#499](https://github.com/useautumn/autumn/pull/499)
      * Base price display logic centralized into reusable utility - [#488](https://github.com/useautumn/autumn/pull/488)
      * Stripe secret key authentication always available, improved UI - [#491](https://github.com/useautumn/autumn/pull/491)
      * Console logs removed from production builds for cleaner output - [#487](https://github.com/useautumn/autumn/pull/487)
      * Sign-in flow simplified by removing onboarding redirect logic - [#484](https://github.com/useautumn/autumn/pull/484)
      * Enter key handler added for email sign-in and cache improvements - [#483](https://github.com/useautumn/autumn/pull/483)
      * Plan editor UI enhanced with better pricing configuration - [#481](https://github.com/useautumn/autumn/pull/481)
      * Hono dependency pinned to exact version for build consistency - [#494](https://github.com/useautumn/autumn/pull/494)
      * UI refinements and number formatting improvements - [#500](https://github.com/useautumn/autumn/pull/500)
    </Accordion>

    <Accordion title="Bug Fixes">
      * Add-on products no longer carry usage from main products - [#502](https://github.com/useautumn/autumn/pull/502)
      * Base price display component type handling fixed - [#496](https://github.com/useautumn/autumn/pull/496)
      * Invoice checkout cache invalidation fixed for null customer IDs - [#490](https://github.com/useautumn/autumn/pull/490)
      * One-off products properly handled during subscription upgrades - [#489](https://github.com/useautumn/autumn/pull/489)
      * Sandbox redirect logic restored for non-deployed organizations - [#486](https://github.com/useautumn/autumn/pull/486)
      * Dashboard checkout success URL fixed for production environments - [#485](https://github.com/useautumn/autumn/pull/485)
      * Transfer endpoint cache clearing URL pattern corrected - [#482](https://github.com/useautumn/autumn/pull/482)
      * Cache race condition in attach flow resolved with timestamp guards - [#479](https://github.com/useautumn/autumn/pull/479)
    </Accordion>

    <Accordion title="API">
      * RevenueCat payment processor integration added and reverted - [#497](https://github.com/useautumn/autumn/pull/497), [#495](https://github.com/useautumn/autumn/pull/495), [#435](https://github.com/useautumn/autumn/pull/435), [#493](https://github.com/useautumn/autumn/pull/493)
      * Added manual secret key override to Hono `autumnHandler`
      * Added `checkoutSessionParams` to `PricingTable` component from `autumn-js/react`
      * Added `new_billing_subscription` to the `attach` endpoint, allowing you to create a new Stripe subscription instead of combining with an existing one
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="December 24th 2025">
  ## RevenueCat integration

  We just released a new integration with RevenueCat, to let you manage your mobile app subscriptions and billing with Autumn.

  This is especially helpful for users that have a mix of web and mobile users, and want to manage their billing in one place.

  * **RevenueCat integration**: [Documentation](/documentation/external-providers/revenuecat)

  <Note>
    This is currently in beta, please reach out to us on [Discord](https://discord.gg/STqxY92zuS) or email us at [hey@useautumn.com](mailto:hey@useautumn.com) to get access.
  </Note>

  <br />

  <Frame style={{ width: "500px" }}>
    <img src="https://mintcdn.com/autumn-b9b4c0fb/df8oGyhsA_ngL7c4/assets/changelog/revenuecat.png?fit=max&auto=format&n=df8oGyhsA_ngL7c4&q=85&s=c35c3c7f5e30701b7fd6b9a10c0531b0" width="1512" height="966" data-path="assets/changelog/revenuecat.png" />
  </Frame>
</Update>

<Update label="December 18th 2025">
  ## List and aggregate events endpoints

  We just released two new endpoints to retrieve usage data that your customers have sent to Autumn.

  You can use this to display a billing event log, and a timeseries chart of usage data, so you can provide first-class billing observability out of the box!

  * **List Events**: [React hooks](/react/hooks/useListEvents) and [API reference](/api-reference/events/list-events)
  * **Aggregate Events**: [React hooks](/react/hooks/useAggregateEvents) and [API reference](/api-reference/events/aggregate-events)

  <br />

  <Frame style={{ width: "300px" }}>
    <img src="https://mintcdn.com/autumn-b9b4c0fb/df8oGyhsA_ngL7c4/assets/changelog/event-list.png?fit=max&auto=format&n=df8oGyhsA_ngL7c4&q=85&s=43d4214ecc37ac14c6af005ac9044583" width="1156" height="610" data-path="assets/changelog/event-list.png" />
  </Frame>

  <Frame style={{ width: "300px" }}>
    <img src="https://mintcdn.com/autumn-b9b4c0fb/df8oGyhsA_ngL7c4/assets/changelog/event-aggregate.png?fit=max&auto=format&n=df8oGyhsA_ngL7c4&q=85&s=414350e7aa035b6061f065c7b36bbd41" width="1166" height="688" data-path="assets/changelog/event-aggregate.png" />
  </Frame>
</Update>

<Update label="December 16th 2025">
  ## Stripe customer portal link within the customer page

  You can now open a customer's Stripe customer portal directly from the customer page. You can quickly preview this and send to customers that want to manage their payment methods or see past invoices.

  <Frame style={{ width: "300px" }}>
    <img src="https://mintcdn.com/autumn-b9b4c0fb/df8oGyhsA_ngL7c4/assets/changelog/customer-portal.png?fit=max&auto=format&n=df8oGyhsA_ngL7c4&q=85&s=7e33d3a905415695611b9dda455feac8" alt="Stripe customer portal" width="1442" height="1188" data-path="assets/changelog/customer-portal.png" />
  </Frame>

  <br />
</Update>

<Update label="December 10th 2025">
  ## Usage columns in your customer list

  Preview a customer's current credit balances straight from the customer list. Now you can see who's worth peeking into!

  <Frame style={{ width: "400px" }}>
    <img src="https://mintcdn.com/autumn-b9b4c0fb/df8oGyhsA_ngL7c4/assets/changelog/usage-columns.png?fit=max&auto=format&n=df8oGyhsA_ngL7c4&q=85&s=48cbc984e724aec9c790640409e7f4c8" alt="Usage columns" width="2496" height="1736" data-path="assets/changelog/usage-columns.png" />
  </Frame>
</Update>

<Update label="December 5th 2025">
  ## Autumn is live in us-east

  Autumn is live on US-East! Previously all requests were hitting our us-west DB.

  Now, we're reading and writing from multiple Redis caches, so both checking feature balances and tracking usage events are faster and more reliable.

  More regions coming soon!

  <Frame style={{ width: "400px" }}>
    <img src="https://mintcdn.com/autumn-b9b4c0fb/df8oGyhsA_ngL7c4/assets/changelog/us-east.png?fit=max&auto=format&n=df8oGyhsA_ngL7c4&q=85&s=e4baf0bb7aa5734c1e2d53a35611b837" alt="US-East region" width="1138" height="1124" data-path="assets/changelog/us-east.png" />
  </Frame>
</Update>

<Update label="December 1st 2025">
  ## Dark mode

  Dark mode is here. No need to say more. We know you guys are all night owls.

  We also shipped an entirely new design for the plan editor and customer pages, to make managing your plans and customers easier.

  <Frame style={{ width: "400px" }}>
    <img src="https://mintcdn.com/autumn-b9b4c0fb/df8oGyhsA_ngL7c4/assets/changelog/dark-mode.png?fit=max&auto=format&n=df8oGyhsA_ngL7c4&q=85&s=f47ee7f4622cd62c3b525a28de0e0947" alt="Dark mode" width="1034" height="706" data-path="assets/changelog/dark-mode.png" />
  </Frame>
</Update>
