Skip to main content

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, and you can list every contributing entity through the new pooled_balances.list_contributions endpoint.

Scoped multi-plan attach

billing.multi_attach and billing.multi_attach.preview 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 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.
  • License seat assignment is now idempotent — retrying a batch that already contains assigned entities returns success without consuming pool capacity — #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
  • Track events are now batched into a single SQS send per batch, cutting per-event overhead and improving throughput under bursty usage — #2489
  • Async Track processing can be enabled per organization from the admin dashboard, replacing the previous hardcoded allowlist — #2375
  • Auto top-up jobs now retry when they hit a billing lock instead of dropping the run — #2416
  • Stripe imports now recognize product aliases in your catalog mappings, so linked products keep their references across renames — #2500
  • Tiered price hydration is now consistent across attach, update, and preview flows — #2500
  • New .well-known/oauth-protected-resource endpoint improves OAuth discovery for MCP clients — #2500
  • Billing verification now separates identity, shape, and totals mismatches into warn vs error severities so real drift is easier to spot — #2500
  • Dashboard Edge Config admin now shows live per-config status (paused queues, ramp percentages, blocked orgs) at a glance — #2406
  • 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
  • MCP OAuth refresh now stays within the originally granted scopes and no longer forwards a resource parameter that some issuers reject — #2501
  • Unknown .well-known/* requests return 404 instead of the 401 session-auth error — #2499
  • Property-rollup completeness now checks event counts (not net sums), so gate-dropped groups are detected correctly — #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
  • Partial SQS batch-delete failures now retry only the failed entries with bounded backoff, so successful jobs are no longer redelivered — #2415
  • Stripe writes now carry idempotency keys so transient retries can’t accidentally create duplicate sessions or transfers — #2500
  • Batch balance resets warn at 30 minutes and give up at 45 to avoid indefinite stalls behind a wedged message — #2416

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 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 to see downstream impacts before saving.

Overflow tracking on usage

track, track_tokens, and 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 directly through customers.update. 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.
  • License catalog updates preview and apply cleanly across parent-plan versioning and in-place edits, preserving existing customer license definitions — #2288
  • Row-batched license transitions preserve quantities, billing state, and Stripe linkage across immediate and scheduled changes — #2306
  • Child license plan propagation now previews linked parent-plan impacts and supports explicit propagation targets — #2295
  • Auto top-up thresholds can now be negative, so you can trigger top-ups once a balance dips below zero — #2354
  • New Stripe customers imported via stripe_id on customer creation now pull in eligible subscriptions and schedules automatically — #2308
  • Customer dashboard plan filters now resolve in milliseconds instead of tens of seconds on large orgs — #2362
  • Create-schedule previews now show unavoidable immediate charges (initial subscription lines, automatic tax, invoice credits) so previews match the final invoice — #2329
  • Attach form plan-schedule preview now defaults to immediate when unset, matching the UI — #2345
  • Long checkout URLs in the dashboard truncate from the end with a proper ellipsis instead of clipping both sides — #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
  • Same-batch customized license plan previews no longer crash on virtual catalog products (empty prices/entitlements) — #2343
  • Catalog sync tolerates partial product collections, missing entitlements, and missing prices without erroring — #2317, #2319, #2322, #2324
  • Versioned license schedules and matched plan versions are preserved through Stripe sync — #2297, #2284
  • OAuth organization list deduplicates when a user has multiple memberships in the same org — #2346
  • MCP getCurrentOrganization schema now matches the organization/me API response, adding id and tolerating a missing user#2140
  • Rate limits on establish routes now return a standard 429 (no Retry-After); check and track routes still fail open — #2384
  • Concurrent migrations no longer duplicate customer plans — #2282
  • Versioned license pricing renders correctly in the plan dashboard — #2291

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 or billing.multi_attach 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, licenses.release, licenses.list, and licenses.list_assignments — 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); free licenses assign directly.

List invoices endpoint

Fetch a customer’s invoices programmatically with the new invoices.list 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 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.
  • 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
  • Multi-currency plan updates work through preview, save, and migration flows — #2236
  • Multi-currency Stripe sync now imports historical subscriptions in their original currency — #2227
  • Attach schedule now always defaults to immediate, so plans go live on save unless you explicitly schedule them — #2232
  • Analytics dashboard refetches on window focus, so numbers stay fresh when you tab back in — #2241
  • billing.updated webhooks now fire after the Stripe customer ID is persisted, so downstream consumers always see the linked Stripe record — #2267
  • Plan variants now stamp their own previous_price history, so each variant keeps an independent price trail — #2238
  • Consent screen shows the Autumn brand logo in the org selector — #2249
  • Faster reset cron and invoice cron for large workspaces — #2222, #2257
  • Coupon scope updates now apply cleanly to existing subscriptions instead of only new ones — #2260
  • Catalog updates that reference customers across plan versions no longer error — #2244
  • Non-consumable prepaid quantities update correctly on plan changes — #2220
  • Dashboard no longer shows false “unsaved changes” errors when saving plans — #2276
  • Entity creation is serialized per customer, avoiding duplicate rows under concurrent attaches — #2242
  • Pending invoice cleanup cron backs off gracefully instead of retrying tight — #2239

Multi-update billing endpoint

Cancel or uncancel multiple plans for a customer in a single atomic request with the new billing.multi_update 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 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 controlsusage_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 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 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 response. Reach out if you’d like to try it early.

RevenueCat: email and fingerprint identifiers

The RevenueCat integration 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 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 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 webhook, so downstream consumers stay in sync when you re-pull state from Stripe by hand.
  • 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
  • Auto top-up expand path returns purchase_limit for plan-inherited entries too — #2205
  • Refund-last-payment is now exposed on the API — #2179
  • Slack app: additional options for matching a Slack user to an Autumn user — #2100
  • Archived plans now include an archived flag when pulled via the CLI — #2152
  • Webhook tags: customer and entity IDs are sanitized to the Svix charset so deliveries don’t fail on unusual characters — #2150
  • Free first schedule phase is now supported in plan schedules — #2137
  • Refreshed checkout favicon — #2162, #2161
  • Cleaner subscription sheet tooltips, coupon error messages, and plan ID chip in mappings — #2157
  • Renewal edge case that could mis-schedule the next cycle is fixed — #2200
  • Manual tax_rate_id is now applied to one-time and deferred charges, not just recurring items — #2204
  • check with a lock correctly returns allowed: false when the customer has no entitlement — #2174
  • Promo minimum validation is now consistent across all billing flows — #2168
  • ACH processing invoices are handled correctly through the past-due flow — #2167, #2128, #2053
  • Skip overage billing when no overage is due, avoiding empty invoice items — #2190, #2182
  • Cardinality gate no longer false-fires on legitimate usage — #2184
  • Scheduled customer products now resync starts_at when a Stripe schedule is updated — #2177
  • Filter button on the customers page is visible even when a customer only has expired products — #2165
  • Variant Stripe product renames now propagate correctly — #2149
  • Product cron trial expiry now paginates correctly at scale — #2144
  • Schedule phase billing anchors are reset when the phase changes; Stripe anchor reset day is clamped to valid values — #2133, #2115
  • Discount upgrades apply cleanly to the upgraded plan — #1815
  • billing.import correctly updates customer_data and filters one-off / usage-based balances — #2154, #2156
  • Assorted usage-window, coupon, and sync-back fixes — #2159, #2186

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 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 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.

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.
  • Add interval filter to the customers list page — #2038
  • “Create more” mode in the create-entity dialog for bulk entity setup — #1988
  • Plan editor: cleaner update logic and feature-creation flow — #2035
  • Net payment terms UI refreshed inside the invoice settings accordion — #2034
  • Customizable buttons in transactional emails — #1991
  • Customer IDs now accept colons for namespaced identifiers — #1995
  • Mobile dashboard cleanup, including card-style tables on small screens — #2013
  • RevenueCat import: paginated product list and raw-mapping escape hatch for custom field mapping — #2040
  • MCP OAuth now grants Leaf scopes when only OIDC scopes are requested — #2012, #2023
  • Website content negotiation: canonical URLs serve markdown to clients that ask for it — #2004, #2007, #2009
  • Cleaner Stripe connect dialog and improved Stripe-related copy across the dashboard — #2020, #2047
  • Customer portal now has rate limiting to protect against abuse — #2033
  • Auto top-ups now charge the most recently attached plan’s one-off price — #2049
  • Event table filtering corrected so filters apply to the right columns — #2005
  • Long event values no longer overflow the events table — #2048
  • Trialing customers downgrading to Free are correctly anchored to trial end — #2000
  • Sync no longer adds phantom allowance for imported prepaid Stripe items, and carries prepaid usage correctly when expiring a plan — #1978
  • Hourly rollovers now enforce the configured max cap on the reset cron — #2022
  • Rewards: reject duplicate reward IDs and promo codes, and clean up promos on delete — #2031
  • Event ranking window aligned with the chart for accurate top-events lists — #2003
  • Separate billing intervals render correctly in the plan editor — #2001, #2042, #2043
  • Prevent horizontal overscroll on the marketing site — #2019
  • MCP and Leaf auth edge cases resolved — #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 and connecting guide 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.

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 now supports OpenRouter as a provider, so you can meter and bill OpenRouter usage the same way as direct OpenAI, Anthropic, and others.
  • New carry_over_usages option on billing.update to preserve usage across plan changes — #1974
  • New next_reset_at parameter on create balance for scheduling the first reset — #1950
  • Long-lived Stripe checkout sessions so links stay valid for longer — #1976
  • Consolidated customer header actions, entity-scoped views, and direct Stripe Connect links from the customer page — #1964
  • Separate billing intervals per price component — #1961
  • Discounts now support a max-redemptions cap — #1939
  • Past-due cancellations void the open invoice immediately — #1948
  • Option to ignore past-due state and preserve the subscription — #1963
  • Clearer error messages across the dashboard and API — #1943
  • Refreshed reward selectors and coupon update confirmation — #1928
  • Org logos now upload to S3 with reliable hosting — #1225
  • Custom buttons in the dashboard — #1987
  • AI credit systems are now treated as generic credit systems in the plan editor — #1903
  • Patch migrations no longer skip custom products — #1953
  • Multi-entity granted amounts now display correctly in balance sub-rows — #1947
  • Free-trial dedup is now scoped per entity so each entity gets its own trial — #1956
  • billing.updated webhook now fires on trial-to-paid conversion — #1972
  • Tax and discounts now render correctly in attach preview#1944
  • createSchedule phases now snap to the cycle boundary — #1975
  • Checkout page no longer renders blank on certain React versions — #1937
  • Usage limits now respect the AI credit dimension — #1912
  • Onboarding fee no longer double-charges in edge cases — #1946
  • Environment selection and org switching in the dashboard — #1952, #1970
  • Copy entity ID and allow duplicate plans in the sync editor — #1957
  • Sync expire no longer fails on certain customer states — #1967
  • Batch operations are now idempotent — #1981
  • Slack admin and dashboard gate fixes — #1986, #1984
  • CLI auth and Claude OAuth flows — #1926, #1925
  • atmn CLI now exits with a non-zero code on interactive push/pull errors — #1927
  • Copy product API call no longer fires with missing required fields — #1585
  • Keyboard shortcut and scroll fixes in the dashboard — #1915, #1942

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 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.
  • Official Autumn MCP server for Claude Desktop, Cursor, and other MCP clients — #1715, #1740, #1741
  • Org-level usage alerts with shared thresholds across customers — #1707
  • Vercel Marketplace invoice mode, resource logs, and refreshed frontend — #1711
  • Preflight tax-address check before charging customers in taxable regions — #1699
  • Automatically void uncollectible Stripe invoices instead of leaving them open — #1732
  • New plan-version filters for custom-plan migrations#1718
  • Faster customer detail loads and smoother large entity lists — #1712
  • Customer list filter by entity ID — #1688
  • Refreshed dashboard theme and appearance controls — #1679
  • Optimised product counts in the customer table — #1690
  • Mobile fixes for the customer list view — #1689
  • Stripe checkout no longer drops carry-over balances on plan changes — #1708
  • Trial grants are now excluded from reward eligibility — #1730
  • RevenueCat sync no longer fails with “entities not found” — #1729
  • Tax IDs now render correctly in the attach preview — #1728
  • Invalid email addresses are now rejected with a clearer error — #1722
  • Sandbox usage alerts now respect their configured threshold — #1706
  • Proration toggle now shows even when the customer has a past trial — #1704
  • One-off prepaid items upgrade correctly without double carry-over — #1676, #1695
  • Subscription metadata is preserved through checkout — #1719
  • Price dropdown no longer loses its selected value when reopened — #1720
  • Vercel auto top-ups no longer fail to process the resulting invoice — multiple fixes (#1725)

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 — 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 — 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 for the trade-off.

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.

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: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.

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.

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.
  • billing.updated webhook with unified plan_changes payload — #1637
  • API v2.3 with cursor-based pagination — #1596
  • POST /v1/entities.list endpoint — #1505, #1513
  • Paginated POST /v1/events.list endpoint — #1596
  • Manual auto top-up trigger in dashboard — #1532
  • Passkey (WebAuthn) sign-in and settings UI — #1587
  • Vercel resource pre-provisioning with Stripe preauth — #1578
  • plan_id dimension in analytics charts and tables — #1568, #1613
  • Customer API logs workbench panel — #1525
  • “Copy from previous phase” button in the schedule editor — #1556
  • Trial on_end option on billing.attach, with entity-aware behaviour — #1554, #1581
  • Live normalisation of expired auto top-up purchase-limit windows — #1520
  • Command bar favourites for impersonating frequent orgs and users — #1597
  • Settings page redesign with clearer navigation — #1555
  • Dashboard analytics chart and table polish — #1599, #1613
  • Stripe webhook race condition that could double-process events — #1620
  • Checkout session race condition under high concurrency — #1548
  • Attach now respects tax_rate_id overrides — #1641
  • Attach correctly handles no-op billing changes — #1586
  • Schedule sync no longer produces empty phases or duplicate items — #1501, #1574, #1575
  • Schedule customize flow now correctly handles removed base prices on free plans — #1556
  • Entity sync edge cases and item-log alignment fixed — #1607, #1614
  • Custom item delete and ghost item issues in the plan editor — #1517, #1628, #1629
  • Cancel flow now handles plans with a future starts_at#1507
  • Revert trial issue when reversing a recent attach — #1635
  • Vercel: Stripe Tax disabled when org has no tax config; metadata is now optional — #1558
  • Various Vercel marketplace bug fixes — #1579
  • Duplicate Stripe customer ID handling — #1528
  • Cache invalidation correctness on customer and plan edits — #1531, #1612
  • Dashboard customer cache freshness — #1612
  • Plan analytics: per-item parse failures no longer drop valid deductions; $plan_id alias normalised — #1608
  • list events hook returns the correct response type — #1633
  • Shadow flag evaluation fixes — #1632
  • Webhook tag filtering improvements — #1617
  • No-op plan PATCH now exits cleanly without spurious updates — #1628
  • Database pool sizing and connection limits raised for higher throughput — #1625, #1643

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.

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 and the auto top-ups guide.

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.

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.

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.
  • starts_at parameter on billing.attach for scheduled subscription start dates - #1411, #1467, #1476
  • ends_at on one-off products with automatic expiry cron - #1476
  • billing.auto_topup_succeeded webhook - #1429
  • Promo code support in Autumn Checkout - #1446
  • Discount support on subscription updates and coupon display in subscription detail - #1463
  • Tax preview in billing.preview_attach - #1417, #1424
  • Invoice credits preview in billing.preview_attach - #1464
  • balances field returned in /track responses - #1470
  • processors field and processors filter on customer endpoints - #1490
  • billing_controls.auto_topups.purchase_limit expand on customer endpoints - #1423
  • RevenueCat invoice recording on initial purchase, renewal, and refund - #1490
  • OpenAPI spec, SDKs, and dashboard updated with starts_at / ends_at fields - #1485
  • Checkout enable_immediately flow improvements - #1415
  • API key sheet and table UI cleanup
  • Proration settings now visible during cross-entity free-to-paid attach - #1491
  • Dashboard org switcher now lists the full set of organizations - #1475
  • Balance validation no longer rejects valid edits - #1477
  • Schedule sync edge cases fixed - #1443
  • Orphaned customer products cleaned up correctly - #1440
  • Auto-sync paid feature mapping on plan edits - #1448
  • Member toolbar z-index fixed in the dashboard - #1449
  • Prepaid price v2 fixes - #1451
  • Vercel customer filtering when no Stripe is connected - #1455, #1458

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 and spend limits & usage alerts guide for details.

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 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 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:See the setup guide and the autumnHandler reference for full examples.
  • Express adapter for autumnHandler via autumn-js/express - #979
  • Web Standard adapter for autumnHandler via autumn-js/fetch (Elysia, Cloudflare Workers, Deno) - #979
  • Explicit customer creation required for check and track endpoints - #968
  • autumn-js SDK promoted to 1.0.0 stable release - #968
  • New Express, Elysia, and Web Standard adapters for autumnHandler - #985
  • Improved API reference field descriptions for preview endpoints - #985
  • checkout_session_params.subscription_data (including metadata) is now properly deep-merged with Autumn’s internal parameters instead of being overwritten - #996

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 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 and customer endpoints for the updated response format.
  • Balance carry-over on immediate plan upgrades via carry_over_balances - #861
  • Usage carry-over on immediate plan upgrades via carry_over_usages - #875
  • Boolean features returned as flags in customer and entity objects - #950
  • Updated API, SDKs, and frontend with new flag fields - #951
  • Fixed customer retrieval query causing errors in certain configurations - #958, #959
  • Fixed trial upgrade reliability when unsetting trial periods - #958

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
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.

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
  • Volume-based tiered pricing alongside graduated pricing - #765
  • Batch attach: attach multiple plans in one request - #815
  • Lazy entitlement resets for instant balance refreshes - #800, #802
  • Atomic Redis updates for customer data and entities (CRDT-safe) - #812, #813
  • Mobile navigation with sticky top bar and slide-in sidebar - #760
  • 12/24-hour date and time picker for balance reset scheduling - #760
  • Stripe coupon support in attach discount dropdown - #819
  • Metadata on Stripe invoice line items (product ID, price ID, coupon IDs) - #817
  • RPC router for Plans (create/get/update/delete) - #750
  • RPC router for Features (list/get/create/update/delete) - #762
  • Hardened reset cron with bounded batches and timeouts - #808
  • Customer filter and UI cleanups - #755
  • Unit tests GitHub Action - #801
  • Fixed scheduled switches failing when a Stripe coupon was deleted - #759
  • Fixed events table showing empty - #822
  • Fixed customer balance UI - #816
  • Fixed balance subrow to always show /granted - #779, #780
  • Fixed attach dashboard one-off products - #789
  • Fixed create customer body expand - #787
  • Fixed Vercel marketplace status not ready - #778
  • Fixed discounts on upgrades in legacy attach - #772
  • Fixed invoice without payment method - #770
  • Fixed SQS client restart - #767, #768
  • Fixed impersonation - #793
  • Fixed reset for past-due customer entitlements - #805, #806
  • Fixed zero denominator issue - #746
  • Fixed Vercel transfer request blocking - #744
  • Fixed discounts on scheduled subscriptions - #742
  • Fixed invoice cron race condition - #747
  • Fixed custom plan detection in subscription updates - #784
  • Fixed success URL handling for v2 attach checkout - #786
  • Fixed preview attach concurrency lock - #758
  • New POST /billing.multi_attach and POST /billing.preview_multi_attach for batch plan attaches - #815
  • New POST /billing.setup_payment for collecting payment methods before plan attach - #797
  • New attach/update subscription V1 params: plan_id, feature_quantities, customize, free_trial, transition_rules - #749, #752
  • RPC endpoints for Plans: /plans.create, /plans.get, /plans.update, /plans.delete - #750
  • RPC endpoints for Features: /features.list, /features.get, /features.create, /features.update, /features.delete - #762
  • Added PATCH /customers/:customer_id for partial updates - #774
  • Metadata added to Stripe invoice line items - #817
  • V2 API docs with multi-version OpenAPI specs and SDK generation pipeline - #773

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


  • Code cleanup and refactoring in Stripe billing plan evaluation system - #525
  • Added customerId to request context for improved tracking and observability - #520
  • Improved cache verification workflow with free product filtering and Sentry alert tags - #519
  • Major Redis Lua refactor with cache versioning, filtering, and safer updates - #512
  • Fixed multi-region cache deletion to delete from all configured regions - #539
  • Fixed import path casing issue for createProrationinvoice - #537
  • Fixed TypeScript type compatibility in BullMQ worker - #538
  • Fixed type annotations in OpenAPI definitions and RevenueCat mappings - #533, #534
  • Fixed migration logic for product downgrades and cancellations - #529
  • Fixed subscription migration to prevent auto-uncanceling during version updates - #527
  • Fixed included_usage calculation in V1.2 API backward compatibility layer - #526
  • Implemented Redis-first caching for add-to-balance operations - #524
  • Simplified Stripe webhook cache refresh strategy - #523
  • Removed redundant plan_version field from subscription API schema - #522
  • Fixed duplicate features in plan editor when closing edit feature sheet - #508
  • Added entity_id parameter support to legacy balance update endpoint - #532
  • Added /configs/push and /configs/nuke endpoints for managing organization configuration in sandbox environments - #521
  • Implemented idempotency protection for billing endpoints using idempotency-key header - #516
  • Added new POST /customers/list V2 endpoint with plan filtering, subscription status filtering, and search functionality - #518, #517

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.

  • Balance management enhancements with atomic “Add to Balance” feature - #503
  • Product copy workflow streamlined with direct environment selection - #501
  • Plan feature sheet with discard/update actions and change detection - #499
  • Base price display logic centralized into reusable utility - #488
  • Stripe secret key authentication always available, improved UI - #491
  • Console logs removed from production builds for cleaner output - #487
  • Sign-in flow simplified by removing onboarding redirect logic - #484
  • Enter key handler added for email sign-in and cache improvements - #483
  • Plan editor UI enhanced with better pricing configuration - #481
  • Hono dependency pinned to exact version for build consistency - #494
  • UI refinements and number formatting improvements - #500
  • Add-on products no longer carry usage from main products - #502
  • Base price display component type handling fixed - #496
  • Invoice checkout cache invalidation fixed for null customer IDs - #490
  • One-off products properly handled during subscription upgrades - #489
  • Sandbox redirect logic restored for non-deployed organizations - #486
  • Dashboard checkout success URL fixed for production environments - #485
  • Transfer endpoint cache clearing URL pattern corrected - #482
  • Cache race condition in attach flow resolved with timestamp guards - #479
  • RevenueCat payment processor integration added and reverted - #497, #495, #435, #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

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.
This is currently in beta, please reach out to us on Discord or email us at hey@useautumn.com to get access.

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!
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.
Stripe customer portal

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!
Usage columns

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!
US-East region

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.
Dark mode