Skip to main content

Customer portal payments and saved cards

Customers can now pay invoices, top up wallets, and manage saved cards from the customer portal.
  • Payments and top-ups: Pay outstanding invoices through a payment link, top up through checkout or a saved card, and configure auto top-up
  • Saved cards: Add, remove, and choose a default payment method through supported gateways
  • Gateway support: Available actions adapt to connected providers, with checkout and auto charge through Chargebee and Razorpay, and saved-card management through Chargebee
  • Portal updates: The Overview tab brings together wallet balance, payment methods, and subscriptions; payment flows open in a new tab and refresh the portal on completion

Customer portal - Documentation


Gateway refunds

Refund credit notes can now return money through Razorpay or Chargebee, with each refund tracked in a settlement ledger.
  • Refund destination: Set refund_target to BACK_TO_SOURCE to refund the original payment; PREPAID_WALLET remains the default
  • Status tracking: Gateway webhooks update refund status, and duplicate deliveries cannot settle the same refund twice
  • Wallet fallback: Failed gateway refunds can be retried into the wallet, and paid invoice voids use the same refund ledger

Invoice line item editing

Invoice line items can now be added, updated, or removed, with totals recalculated after each edit.
  • Draft editing: Update amounts, quantities, descriptions, and service periods; descriptions and periods also appear on the PDF
  • Finalized invoices: Editing line items or applying discounts voids the original and creates a linked draft replacement
  • Manual edit protection: Edited invoices are marked with is_manually_edited so automated recomputation cannot overwrite them; line item updates create a new item ID

Execute invoice modification - API Reference


Percentage-based wallet alerts

Wallet alerts now support percentage thresholds alongside absolute balances.
  • Percentage thresholds: Set alert_threshold_type: percentage and a threshold from 0 to 100 for ongoing balance alerts
  • Calculation: Evaluates 100 × ongoing balance / sum of completed credit amounts, using credits since the earliest current period start across active or trialing subscriptions. Without those subscriptions, it uses wallet history; a zero base skips evaluation
  • More webhook states: Balance alerts now emit warning and info transitions, plus recovery events when the balance returns to ok

Low balance alerts - Documentation


Mixed-cadence prices on subscription create

You can now select compatible shorter-cadence prices when creating a subscription through the API or dashboard.
  • Price selection: include_price_ids selects specific plan prices. Omit it to include matching-cadence and one-time prices, or pass an empty list to include none
  • Dashboard controls: The “Also available on this plan” section adds shorter-cadence charges with the usual price overrides, commitments, coupons, and quantity controls
  • Addon compatibility: Addon dialogs filter charges by the subscription’s cadence and currency

Chargebee invoice sync improvements

Synced invoices now use the Chargebee invoice number and can serve Chargebee’s own PDF.
  • Invoice matching: The original Flexprice invoice number is preserved in metadata, and payment IDs are recorded in Chargebee notes
  • Pending collections: ACH and SEPA payments stay pending while processing, avoiding premature invoice voids
  • Itemized checkout: Checkout shows individual line items and handles zero-decimal currencies correctly

Chargebee invoice sync - Documentation


Other changes
  • Subscription spend and entitlement grant alerts now default to off; set alert_enabled: true in subscription_alert_config and entitlement_alert_config to continue evaluation
  • Off-session auto top-ups default to a one-hour cooloff when none is configured
  • Team settings now support removing members
  • CSV imports show a sample file and a 5 MB limit; imports continue to use S3 on GCS deployments
  • Wallet top-ups support per-currency minimums through min_topup_amount_per_currency (default USD: 1); end-customer credits always wait for payment
  • Customer search includes archived customers when requested or when no status filter is set
  • Invoice reads bypass stale cached data, and smaller webhook payloads avoid delivery size limits
  • Subscription line item updates lock rows before writing, and clearing commitment buckets removes stale values
  • Mixed-cadence billing aligns charge windows to the billing anchor and removes stray trailing line items
  • Subscription creation includes one-time prices again, and addon filtering respects billing_period_count
  • Portal payments handle missing customer_not_present settings correctly; currency display, saved-card payments, and return URLs were fixed
  • ClickHouse and integration HTTP clients require TLS 1.2 or later
  • Redis certificate verification is configurable: set redis.tls_skip_verify: false and redis.tls_server_name to enable it; skip-verify still defaults to true
  • Containers run as non-root, file permissions were tightened, and published images are signed
  • CI permissions and action pinning were hardened, integer bounds checks were added, and vulnerable dependencies were updated
  • New portal invoice payment, wallet top-up, auto top-up, payment method, and integration discovery endpoints
  • New refund list, get, and retry endpoints; refund webhooks emit refund.created, refund.succeeded, and refund.failed
  • New POST /invoices/{id}/modify/execute endpoint for line item edits
  • Chargebee connections accept gateway_account_id to choose where new cards are stored
  • Portal wallet top-up idempotency_key is optional; checkout configuration replaces customer_present with customer_not_present

Inclusive and exclusive tax

Taxes can now be included in the price or added on top, and customers can be marked tax exempt.
  • Tax behavior: Set tax_behavior to inclusive or exclusive. Subscription defaults are exclusive for USD and CAD, and inclusive for other currencies
  • Exempt customers: Set tax_treatment: exempt to skip tax and remove included tax from the total, starting with the next invoice
  • Invoice breakdown: tax_summary shows inclusive and exclusive totals and explains why no tax was charged
  • Percentage-only rates: percentage_value is now required; fixed_value has been removed

Taxes - Documentation


Price-level usage bucketing

Usage windows can now be configured on individual prices, so the same meter can power charges with different bucket sizes.
  • Price configuration: Set bucket_size on usage prices with MAX or SUM aggregation; existing meter-level buckets remain supported and prevent setting a second bucket on the price
  • Versioned updates: Changing the bucket creates a new price or line item version; use none to clear it
  • Dashboard support: Charge tables and price dialogs now show bucket sizes, with validation for window commitments

Mixed-cadence charges on a subscription

Subscriptions can now include shorter-cadence charges, such as monthly prices on a quarterly subscription.
  • Compatibility: Billing period and count must match exactly, or the price’s effective months must divide the subscription’s. Daily and weekly prices require an exact match; one-time prices remain supported
  • Separate billing windows: A quarterly invoice with monthly charges gets three line items, with usage and pricing tiers reset per month
  • Threshold billing: Auto-invoice threshold checks use the same billing windows

Entitlement grant proration on addon changes

Adding or removing an addon mid-cycle now adjusts its entitlement quota for the time remaining.
  • Proportional grants: Applies to features whose entitlements all use additive, subscription-period grants
  • Quota updates: Adding an addon grants the remaining period’s share; removing it revokes the unused share
  • Proration control: Set proration_behavior: none to add the full quota

Entitlement grants - Documentation


Google Cloud Storage support

Invoice PDFs and exports can now use Google Cloud Storage. CSV Box imports still require S3.
  • Provider selection: Set storage.provider to s3 or gcs, or use cloud auto-detection
  • Cloud credentials: GCS supports Workload Identity and application default credentials; S3 exports support static keys or AWS role credentials
  • GCS exports: Require Flexprice-managed buckets and a signer service account with token creator permissions for signed URLs
  • Configuration change: sync_config.s3 is now sync_config.storage

Self-hosting - Documentation


Versioned database migrations

Postgres schema changes now use versioned SQL migrations through dbmate, replacing Ent auto-migration.
  • Existing databases: Run make migrate-adopt url="postgres://..." before upgrading to chart 1.4.0; add dry=1 to preview adoption
  • Deployment controls: Helm uses migration.steps.dbmate instead of migration.steps.ent; ECS migrations run only with DB_MIGRATIONS_ENABLED=true
  • Migration checks: Unadopted databases and invalid indexes block migration, and checksums protect applied files from edits

Usage syncs report

A new Usage Syncs page under Tools shows which subscription usage records have synced to cloud marketplaces.
  • Provider status: See AWS, GCP, and Azure syncs alongside usage amounts and billing periods
  • Filters: Find records by customer, subscription, or period

Marketplace integrations - Documentation


Remove users from a tenant

Tenant super admins can now remove users through the API.
  • User removal: Removes a human user from the tenant and auth provider; service accounts retain their existing delete endpoint
  • Access protection: Self-removal, cross-tenant removal, and removal of the last human user are blocked

Remove user from tenant - API Reference


Other changes
  • CSV event imports now use a tenant-scoped CSV Box upload_id instead of a caller-supplied URL
  • Free credit top-ups support a per-transaction limit through wallet_topup_config.free_credit_limit_per_transaction (default 0, unlimited)
  • Meter usage records can optionally publish to an analytics Kafka topic
  • Meter lookup caching reduces database load, and Temporal startup retries transient failures
  • Wallet balance alert webhooks include the customer’s external_id
  • Addon dialogs support price overrides and commitments; charge menus support editing and termination, and commitments can run daily
  • Helm supports separate consumer deployments and an optional Bento collector
  • Single-tenant deployments can show SSO login through VITE_SSO_TENANT_ID
  • Credit grant expiry respects the subscription’s timezone
  • Price overrides preserve bucket sizes and validate commitment windows
  • Subscription creation for tax-exempt customers succeeds; their tax associations are skipped instead of rejected
  • Long charge amounts no longer hide row actions, and pagination stays stable while loading
  • Kafka topics default to three partitions when unspecified; Helm migration jobs retain logs
  • Tenant-scoped user administration no longer requires environment selection
  • User removal now enforces tenant boundaries and prevents auth-provider path injection
  • Dashboard prototype-pollution issues were fixed, and CI permissions were tightened
  • Backend and dashboard pull requests now run additional security scans, with grouped weekly dependency updates
  • New POST /users/{id}/remove endpoint
  • POST /tasks requires upload_id and file_provider: csvbox; file_url was removed, and only CSV event imports are supported
  • Addon filters accept addon_statuses (default active) and active_at
  • Meter-level bucket_size is deprecated in favor of price-level configuration

Scheduled plan changes and billing anchor control

Plan change v2 now supports changes at period end and more control over the billing anchor.
  • Scheduled changes: Set change_at: end_of_period to queue a plan change; pending changes can be listed and cancelled
  • Billing anchor: Keep the current anchor or use billing_period_behaviour: anchor_at_effect to start a new period when the change takes effect
  • Conflict handling: Choose whether a new request rejects or supersedes an existing scheduled change
  • Grant updates: Plan grants and entitlements switch at the change instant, preserving addon-sourced grants

Upgrade and downgrade - Documentation


Permission-aware dashboard

Dashboard actions and pages now respect each user’s role.
  • Action permissions: Users without write access see disabled controls with an explanation
  • Page access: Restricted routes show a 403 page, and saving or resetting settings requires Super Admin
  • Immediate access checks: Permissions load at login without needing a page refresh

RBAC - Documentation


Zoho Books invoice sync improvements

Zoho Books sync now supports GST details, custom fields, customer updates, and invoice approval.
  • GST support: Customer tax details and price HSN/SAC codes sync to Zoho, with place of supply determining IGST versus CGST and SGST
  • Custom fields: Map customer and invoice metadata, plus service period dates, to Zoho custom fields
  • Approval flow: Optionally submit invoices for approval before marking them paid; pending or rejected approvals leave payment unrecorded in Zoho
  • Customer updates: Changes to a Flexprice customer update the linked Zoho contact

Zoho Books - Documentation


Recalculate finalized invoices

Finalized subscription invoices can now be recalculated in one step.
  • Automatic replacement: Recalculation validates and voids the original, then creates a replacement linked through recalculated_invoice_id
  • Dashboard action: Recalculate Invoice is available on finalized invoices; drafts and invoices with an existing replacement do not qualify

HubSpot deal line item sync

HubSpot deal line items now stay aligned with subscription changes.
  • Ongoing reconciliation: Creates, updates, and removes deal line items after quantity changes, addon changes, and completed checkouts
  • Billing details: Synced items include billing dates, frequency, discounts, and descriptions

Other changes
  • The dashboard supports Pylon in-app chat with verified user identity
  • Prices can expand feature reporting units, and plans can report unsynced subscription counts
  • Checkout records declined payment attempts without closing the payment; invoices finalize only after successful payment
  • Draft invoice finalization runs every 30 minutes and stops retrying invalid-state failures
  • OpenTelemetry adds optional HTTP metrics, replica identifiers, and cache tracing
  • Helm adds KEDA autoscaling, configurable Kafka topics, and dashboard builds from a pinned ref
  • Helm removes Sentry and Pyroscope integrations in favor of OpenTelemetry exception capture
  • Postgres and ClickHouse schema baselines simplify fresh installations
  • Invoice previews include coupon discounts, and recomputation no longer duplicates coupon applications or PDF discount lines
  • Usage queries respect timezones and stop when the subscription’s customer cannot be resolved
  • Tabs invoice sync matches by billing period start, falling back to issue date for one-off and credit invoices
  • SAML tokens validate correctly, and background role polling failures no longer sign users out
  • User search requires read permission instead of Super Admin
  • Meter aggregation fields trim whitespace, and migration index creation is safe to repeat
  • Account creation requires an email verified by the auth provider
  • Dashboard routes now send security headers to restrict framing, content sniffing, and referrer exposure
  • Plan change v2 accepts scheduling, billing anchor, and conflict options; new schedule list, get, and cancel endpoints
  • expand=features on prices and expand=price_sync_status on plans
  • New POST /users/chat/verify and POST /usage-records/search endpoints
  • Zoho invoice sync settings accept approval and custom field configuration

Role-based access for dashboard users

Tenant super admins can now assign roles from Team settings to control what users can read and change.
  • User roles: Choose super_admin, all_writer, or all_reader; service accounts have a separate role catalog
  • Role management: The Edit roles action replaces a user’s roles, with active API keys listed when they block a change
  • Grant restrictions: Admins can grant only permissions they hold, and invitations require Super Admin

Manage roles - Documentation


SAML single sign-on

Self-managed deployments can now connect a SAML identity provider such as Okta, Azure AD, or Google Workspace.
  • Tenant settings: Super admins configure the identity provider, default role, and SSO enforcement from the dashboard
  • Account provisioning: Users are created on their first SSO login with the configured role
  • Recovery access: Enforced SSO blocks password login for regular users while keeping super admins exempt
  • Deployment setup: Enable auth.saml.enabled with Redis and an auth signing secret; tenant login links show the SSO button

Plan change v2: swap plans in place

Subscriptions can now switch plans while keeping the same subscription ID, billing anchor, and period boundaries.
  • Preview and apply: Preview prorated charges or credits before applying the change
  • Addon handling: Choose which attached addons to carry over or drop
  • Change event: subscription.plan_changed replaces the cancel and create events used by the earlier flow
  • Supported changes: Interval, currency, hierarchy, and phased changes continue to use the existing endpoints

Execute a plan change (v2) - API Reference


Addon changes through subscription modification

Addon attachment and removal now use the subscription modification flow, so you can preview charges or credits first.
  • Preview support: Review proration, affected line items, and invoices before applying a change
  • Checkout support: Responses include checkout details when payment is required
  • Endpoint migration: The existing addon create and delete endpoints are deprecated in favor of modification endpoints

Stripe product sync

Stripe invoices and payment links can now show product-backed, itemized charges.
  • Price sync: Creates a Stripe product for each Flexprice price when outbound price sync is enabled
  • Itemized payments: Invoice and checkout lines use synced products where available
  • Dashboard toggle: Enable Prices in the Stripe connection drawer; outbound price sync is off by default

Stripe invoice sync - Documentation


Exportable usage and credits widgets

The @flexprice/ui package now includes six widgets for embedding usage and credit information in your app.
  • Usage widgets: UsageQuota, MetricCards, UsageTrendChart, and UsageBreakdown
  • Credit widgets: CreditBalance and CreditHistory, with wallet switching and transaction history
  • Bring your own data: Widgets accept props, with adapters for portal responses and built-in loading and empty states
  • Package rename: @flexprice/flexprice-ui is now @flexprice/ui, with the bundle reduced from 17.5 MB to 1.35 MB

Exportable UI - Documentation


Entitlement grant allocation

Entitlement grants can now cover a full subscription period or align usage windows to fixed intervals.
  • Full-period grants: grant_duration_unit: subscription_period opens a grant without waiting for usage; omit duration value and allocation behavior for this unit
  • Window alignment: Choose first_usage (default) or unit_start to anchor windows to usage or intervals within the billing period
  • Multi-unit windows: Supports intervals such as six-hour buckets, calculated in the subscription’s timezone

Entitlement grants - Documentation


Other changes
  • Stripe Checkout promo discounts are reflected on Flexprice invoices, with payments matching the captured amount
  • Child subscription coupons apply to grouped invoices, and line item coupons can target a subscription line item
  • Zoho sync includes discounts before tax and marks already-paid invoices as paid after sync
  • Invoice webhooks include environment_id, and subscription webhooks include the customer
  • Kafka consumers support Kafka 4 offset commits, with configurable retention (default 168h)
  • Onboarding is now a two-step flow, with refreshed login and dark theme styling
  • Dashboard refresh actions preserve filters, and tiered pricing forms allow editing the final tier’s upper bound
  • Usage charges no longer offer one-time billing; legacy one-time values load as monthly
  • Concurrent wallet transactions no longer corrupt balances, and void refunds cannot exceed the amount paid
  • API key issuance and role updates are atomic, and alert transitions stay in order during concurrent evaluations
  • Subscription creation no longer freezes when applying a line item discount
  • Zoho item and invoice sync no longer sends per-line tax IDs
  • Deleting a setting works again after it was deleted and recreated, and archiving a missing setting reports not found
  • Nested dropdowns work inside dialogs, and searchable pickers no longer share unrelated results
  • Helm topology selectors and Kafka broker configuration were corrected
  • Event ingestion enforces request size limits, and outbound requests reject unsafe URLs and destinations
  • Payment validation, OAuth redirects, login responses, tenant isolation, and QuickBooks queries were hardened
  • Payment updates no longer accept client-set amounts; deletion is restricted to initiated, pending, or failed payments
  • Environment selection, API key issuance, portal session creation, and workflow monitoring enforce caller permissions
  • Whop requires a webhook signing secret, webhook verification fails closed, and the portal no longer issues already-expired session tokens
  • Vulnerable dompurify and nanoid dependencies were updated
  • New PUT /users/{id}/roles endpoint; GET /rbac/roles accepts user_type
  • New SAML metadata, login, and assertion endpoints under /auth/saml/{tenant}
  • New plan change v2 preview and execute endpoints under /subscriptions/{id}/change/v2
  • Subscription modification accepts type: "addon"; POST /subscriptions/addon and DELETE /subscriptions/addon are deprecated
  • Payment creation accepts gateway_options.stripe.tax_id_collection_enabled; customer responses include environment_id
  • GET /taxes/rates returns items and pagination

Subscription creation via checkout

Subscriptions can now be created behind a hosted checkout flow, so a subscription only activates once the customer has completed payment.
  • Payment-gated create: Start a subscription through a checkout session and Flexprice defers activation until the checkout is paid
  • Unified checkout actions: Subscription create shares the same checkout session action pipeline used for wallet top-ups and addon attachments
  • Configurable behavior: New checkout configuration fields control payment gating on subscription create requests

Pay-first checkout - Documentation


Addon attachment via checkout

Addons can now be attached to a subscription through a checkout session, matching the payment-first flow used for new subscriptions.
  • Payment-gated attach: Addon activation waits until the checkout session is paid, then the addon is applied to the target subscription
  • Proration preserved: Line-item proration continues to work when the addon lands mid-cycle after checkout completes
  • Checkout DTOs: Addon attach requests accept the same checkout session fields as subscription create

Checkout - Documentation


Draft invoice discount management

Draft invoices now expose a first-class way to apply and recalculate discounts through the standard update endpoint, replacing the earlier dedicated recalculate route.
  • apply_discount flag: Set apply_discount on an UpdateInvoice request to recompute coupon and credit adjustments against the current line items
  • Single locked path: Updates run inside one locked transaction that gates discount recalculation on the new flag, keeping totals consistent
  • Tax reset on removal: Removing a discount association now clears stale tax lines and clamps any negative amount-remaining values
  • Endpoint consolidation: The separate POST /invoices/:id/apply-discount and recalculate-discount endpoints have been removed in favor of UpdateInvoice

Managing invoices - Documentation


Credit note idempotency

Credit note creation now guarantees safe retries with deterministic idempotency keys and database-level uniqueness.
  • Deterministic keys: Idempotency keys are derived from stable request content, so client retries collapse to a single credit note
  • DB-level uniqueness: idempotency_key is enforced by a unique constraint, closing races between concurrent create calls
  • Draft retry coverage: Draft retries and process_credit_note calls now participate in idempotency deduplication
  • Cache-hit safety: Idempotent cache hits no longer re-publish webhooks or re-run finalization

Credit notes - API Reference


Other changes
  • ClickHouse client now supports the HTTP wire protocol — deployments behind TLS-terminating load balancers on port 8443 no longer fail with unexpected packet [72] from server
  • Credit note finalize and void recalculations run inside the same transaction as the state change and propagate their errors instead of being swallowed
  • Credit note finalize now locks the invoice row and re-checks refund capacity before committing, preventing over-refund on concurrent finalizes
  • Export job timeouts have been extended to accommodate larger tenants
  • Coupon redemption limits are now enforced on the subscription modify path, matching the checks already applied on create
  • Coupon max_redemptions is capped at creation time so unbounded values can no longer be persisted
  • On-off invoice generation now respects coupon max redemption counts
  • Credit note recalculation ordering and capacity-check typing have been corrected, and a same-credit-note double-finalize race has been closed
  • Webhook delivery via Svix now uses a stable idempotency key so retried deliveries deduplicate correctly
  • Billing calculations use higher decimal precision, and max-credit adjustments on invoices now clamp correctly
  • Failure response codes returned by validations have been aligned with the documented set
  • HTTP client and file-import paths now reject cross-origin redirects, closing SSRF vectors through retryable and OTel HTTP clients
  • Chargebee webhooks fail closed on signature or decrypt failures, return JSON 401 bodies, and log rejections with request context; the Chargebee connection create endpoint now requires basic auth
  • Payment create uses a deterministic, tenant-scoped idempotency key that includes payment_method_id and intent fields, and idempotency conflicts are distinguished from other constraint errors
  • Credit note create locks the target invoice row before validating amounts, and void refetches state to avoid stale reads
  • Bulk ingest now enforces a per-request cap and API responses include a standard set of security headers
  • The dashboard no longer exposes an API catalog discovery surface

Bulk event ingestion

A new bulk ingestion path lets you submit many events in a single request with batching, deduplication, meter processing, and optional post-insert usage alerts.
  • Batched submission: Multiple events are ingested together and empty batches are handled without error
  • Redis deduplication: New configuration options control deduplication and post-insert processing so retried batches do not double-count
  • Post-insert alerts: Usage alert evaluation can now run immediately after bulk inserts to keep threshold notifications timely

Bulk event ingestion - API Reference


Wallet top-up via checkout with mandate autocharge

Wallets can now be topped up through a hosted checkout flow, and subsequent top-ups can be charged automatically against a saved payment mandate.
  • Checkout top-up: Kick off a wallet top-up from a checkout session instead of only through direct payment APIs
  • Autocharge from mandate: Once a mandate is on file, auto top-ups charge without another manual approval
  • Cooloff on the dashboard: The wallet auto top-up modal now accepts a cooloff duration and unit so repeat charges are spaced out

Wallet auto top-up - Documentation


Customer subscriptions API

A new endpoint returns the full list of subscriptions for a customer in one call, replacing manual filtering on the subscriptions list.
  • Single call: Fetch all subscriptions attached to a customer without paging through the global subscriptions list
  • Consistent shape: Response matches the standard subscription payload used elsewhere in the API

Customers - API Reference


Daily invoice draft and recompute schedule

A new Temporal schedule runs a daily pass that creates draft invoices and recomputes existing drafts so upcoming charges stay current without manual triggers.
  • Draft creation: Draft invoices are opened on schedule for subscriptions that need them
  • Recompute: Existing drafts are recomputed against the latest usage, entitlements, and price sync state
  • Cron consolidation: HTTP cron handlers duplicated by Temporal schedules were removed, so scheduling now lives in one place

Backdating terminated subscription line items

You can now edit the end date of an already-terminated recurring line item on a subscription to correct historical billing without recreating the subscription.
  • Backdated end date: Move a terminated line item’s end date earlier or later within its subscription window
  • Preserves termination: Replacing a backdated line item keeps its existing termination date instead of overwriting it
  • One-time guardrails: Invalid forward-dating or backdating of one-time items is now rejected

Revenue feature toggle

A new platform configuration flag controls whether the Revenue area of the dashboard is available in a deployment.
  • Configurable in platform config: Turn Revenue on or off through platform configuration; it remains enabled by default
  • Dynamic UI: Revenue navigation, command palette entries, and routes appear only when the feature is on

Other changes
  • Subscription overage minimum is now 1, so a single unit of overage is billable
  • Cost sheet requests now accept property filters, matching the filtering available elsewhere in analytics
  • Addon prices and quantities can be overridden per subscription, and the override is applied inside the persistence transaction
  • Grouped invoicing now honors per-subscription price and quantity overrides
  • Coupon associations with zero duration are excluded, so no-op coupons no longer appear on invoices
  • Price sync indexes were tuned to reduce the time spent syncing plan prices
  • Bulk event publish uses a batched producer path to cut Kafka publish overhead on the hot ingest path
  • ClickHouse max_open_conns now applies as configured, replacing the silent no-op that pinned the pool at defaults
  • Temporal client SDK metrics are exported for monitoring worker and workflow health
  • Signup can be disabled through platform configuration, redirecting new sign-up attempts to login with a localized message
  • AWS Marketplace connection setup now generates a deterministic External ID and shows clearer error messaging
  • formatPayableAmount preserves precision on sub-cent amounts across invoice and payment displays
  • Node.js 22 is now the runtime for the dashboard build and application
  • Coupon add and remove now honor the requested start and end dates, falling back to the current UTC time only when unspecified
  • Wallet balance calculations fall back to the most recently cached balance when real-time computation is canceled or times out
  • Wallet balance calculations now respect the shorter of the request deadline and the configured service timeout
  • Currency selection in the detailed cost analytics response was returning the wrong currency in some cases
  • Service-account requests without sufficient permissions now stop with HTTP 403 and a clearer error message
  • API key authentication now identifies the correct account owner
  • Whop webhook events are verified against the signature header before processing
  • Addon idempotency is preserved when the same addon request is retried
  • Cache reads treat unmarshal errors as a miss instead of surfacing a corrupt entry
  • Billing usage calculations now consistently use subscription entitlement data
  • Invoice and subscription screens refresh related information more consistently after updates
  • Billing-period date formatting is correct across time zones
  • Portaled comboboxes are clickable inside modal sheets, so selects inside drawers register clicks again
  • Modal sheets no longer close when focus returns to their trigger
  • The “Add Customer” drawer no longer closes on clicks inside it, and the customer form starts fresh when creating a new customer
  • Date pickers hard-refresh their internal state and enforce min and max limits more consistently
  • Event debugger passes the event ID as a URL-safe query parameter
  • cel-go bumped to v0.29.0 to address GHSA-gcjh-h69q-9w9g
  • New POST /v1/events/bulk path for bulk event ingestion with deduplication and optional post-insert alerting
  • New endpoint to fetch all subscriptions for a customer in a single call
  • Subscription line item edit now accepts an updated end date for already-terminated recurring items
  • Supabase auth tokens now include an environment_id claim
  • New clickhouse.tls_skip_verify option skips TLS certificate and hostname verification for self-signed development ClickHouse; defaults false

GCP Marketplace integration

Marketplace usage reporting now extends to Google Cloud — connect a GCP Marketplace producer project and Flexprice reports computed usage against your listed offer the same way it already does for AWS.
  • Agreement registration: Register agreements and report usage against a GCP Marketplace metered offer
  • Shared usage pipeline: Backed by a refactored UsageRecord schema and cron workflow shared across all three marketplace providers

Connect to GCP Marketplace from the Flexprice dashboard

GCP Marketplace - Documentation


Azure Marketplace integration

Marketplace usage reporting now also extends to Microsoft Azure — connect an Azure Marketplace transactable SaaS offer using Microsoft Entra app credentials and Flexprice reports computed usage the same way it already does for AWS and GCP.
  • Entra app credentials: Authenticate with a dedicated Azure Marketplace client using a Microsoft Entra tenant ID, client ID, and client secret registered in your own tenant
  • Secret redaction: A shared RedactSecrets utility sanitizes error messages from AWS, GCP, and Azure integrations so failure reasons stay visible without leaking credentials

Connect to Azure Marketplace from the Flexprice dashboard

Azure Marketplace - Documentation


Entitlement grant overage and alerting

Entitlement grants now handle usage beyond the quota and notify you as windows fill up, completing the rolling-quota model introduced for metered features.
  • Overage billing: Usage beyond a grant’s quota is billed as overage on the invoice instead of being silently dropped
  • Grant window coverage: New grants are clipped to the current cycle end and opened ahead of time so a window is always active to absorb incoming usage
  • Exhaustion alerting: Alert evaluation now tracks grant consumption and fires when a window’s quota is used up
  • Quota comparison fix: Corrected a comparison that could misclassify a grant as exhausted before its quota was actually consumed

Entitlement grants - Documentation


Custom onboarding workflows

Customer onboarding now supports multiple named workflows instead of a single fixed sequence — pass a workflow name at customer creation to run a specific onboarding path.
  • onboarding_workflow_name: New optional field on customer create resolves to a named entry in custom_workflows; unrecognized names fall back to the default onboarding actions
  • Default tenant name: Onboarding configuration now accepts a default tenant name, used when provisioning a tenant during onboarding
  • Dashboard editor: A new workflow card and action-set editor let you build and manage custom onboarding workflows from the settings area

One-time charges on subscriptions

Subscription plans can now include one-time, non-recurring charges alongside their regular recurring line items.
  • Plan price resolution: Subscription creation now fetches both the subscription’s billing-period prices and any ONETIME billing-period prices configured on the plan
  • Entity type validation: Subscription pricing now validates that only supported price entity types are used, rejecting unsupported combinations up front

Zoho Books invoice mark-paid sync

Flexprice invoices synced to Zoho Books are now marked paid in Zoho automatically once payment succeeds, closing the loop on the existing Zoho invoice sync.
  • Automatic dispatch: When a Zoho-synced invoice’s payment status becomes succeeded, a Temporal workflow marks the corresponding invoice as paid in Zoho Books
  • New Zoho client methods: GetInvoice and CreateCustomerPayment support fetching invoice state and recording the payment directly against the Zoho customer
  • Non-syncable line items skipped: Line items that Zoho can’t represent are excluded from the outbound sync instead of failing the whole invoice

Zoho Books - Documentation


Redis Sentinel support

Self-hosted deployments can now run Redis behind Sentinel for high availability and automatic failover, as an alternative to cluster mode.
  • Sentinel mode: Setting FLEXPRICE_REDIS_SENTINEL_MASTER_NAME and FLEXPRICE_REDIS_SENTINEL_ADDRS switches the client to Sentinel mode, taking precedence over cluster and standalone
  • Replica read routing: FLEXPRICE_REDIS_ROUTE_READS_TO_REPLICAS spreads reads across the master and replicas while keeping writes on the master
  • Fail-fast validation: Sentinel master name and addresses must be configured together — a partial config now returns a clear startup error instead of silently falling back to standalone or losing HA

Other changes
  • Webhook delivery to Svix now filters events to only those an endpoint is actually subscribed to, instead of delivering every event type
  • Webhooks dashboard adds an activity overview with delivery stats and Svix Play support for testing endpoints end-to-end
  • subscription.updated webhook event propagation refined for more accurate change tracking
  • Billing now supports multiple charges against the same line item in meter usage calculation
  • Wallet auto-topup gains a configurable cooloff period, with a matching provider control in the topup modal
  • Temporal client SDK metrics added for monitoring workflow and activity execution
  • Cost sheets now accept property filters in usage requests
  • Supabase auth tokens now include environment_id in their claims
  • Helm chart supports an optional dedicated namespace for in-cluster ClickHouse
  • Customer onboarding pins reads to the writer to avoid replication-lag races right after signup
  • AWS Marketplace connections now generate their external ID deterministically from account details instead of leaving it free-form
  • Whop webhook handler now verifies the webhook signature before processing events
  • Commitment math is now applied once per line item instead of once per split charge, preventing overcounting
  • Fixed a nil-pointer panic when a line item referenced a meter that no longer existed
  • Azure Marketplace usage records with zero quantity are now handled correctly instead of being rejected
  • GCP Marketplace usage report rejections now log a clearer error reason
  • Paddle invoice payment updates now skip only the transaction linked to subscription activation, not all transactions
  • Event debugger URLs now use a URL-safe event ID
  • Subscription overage is now allowed to be exactly 1 instead of being rejected as invalid
  • cel-go and grpc dependencies bumped to patch known CVEs (GHSA-gcjh-h69q-9w9g, GHSA-hrxh-6v49-42gf)
  • Plans and customers now load correctly on subscription and invoice pages with no existing records (frontend)
  • Subscription form no longer loops indefinitely fetching prices when a plan has no published charges (frontend)
  • Connection API accepts marketplace provider: gcp and provider: azure alongside the existing aws value
  • Customer create request accepts an onboarding_workflow_name field to select a named onboarding workflow

AWS Marketplace integration

Flexprice can now report usage directly to a seller’s AWS Marketplace listing, joining the existing GCP integration — connect an AWS account, register each buyer’s agreement, and let Flexprice-computed usage flow through to AWS billing.
  • Marketplace client & connection verification: A new AWS Marketplace client assumes a tenant’s IAM role via STS to verify and report usage; connection creation is now bounded by a timeout so a misconfigured or unreachable AWS credential chain fails fast instead of hanging the request
  • Agreement registration: Link a buyer’s AWS Marketplace agreement to a Flexprice subscription so usage is attributed to the right AWS account and reported through BatchMeterUsage
  • Dashboard connection management: A new AWS Marketplace connection drawer lets you configure and manage the connection directly from the dashboard, with improved UI and localization

AWS Bills page showing a Marketplace charge reported by Flexprice

AWS Marketplace - Documentation


Grouped-invoicing children created inline with the parent

Parent subscriptions can now create their grouped-invoicing children in the same request instead of a separate step, with each child’s first-period charges folded into the parent’s opening invoice.
  • grouped_invoicing_children_to_create: New field on subscription creation accepts child seat specs (plan, external customer, start date) to create alongside the parent; mutually exclusive with converting existing standalone subscriptions into the group
  • Unified opening invoice: Each inline child’s period-1 charges are folded into the parent’s single opening invoice rather than generating a separate invoice per child
  • Aligned billing start: Grouped-invoicing children created this way always start on the parent’s billing date, keeping the group’s billing periods in sync

Grouped invoicing - Documentation


Zero-quantity subscription line items

Subscription line items now accept an explicit quantity of 0 — useful for provisioning a seat-based or fixed charge at zero scale and ramping it up later — instead of silently defaulting to the price’s minimum quantity.
  • Pointer-based quantity: CreateSubscriptionLineItemRequest.Quantity and LineItemQuantityChange.Quantity are now pointers, distinguishing an explicit 0 from an omitted field (which still defaults to min_quantity)
  • Dashboard support: The subscription quantity-modify dialog and price table now accept and display a typed 0 instead of coercing it back to the minimum quantity

Razorpay card auto-charge and payment status sync

Razorpay auto-charge mandates now support card in addition to UPI, and payment status is actively reconciled against the gateway instead of relying on webhooks alone.
  • Card mandate registration: Razorpay mandate registration accepts card as a method alongside upi, chosen by a new token-selection helper that tries UPI first and falls back to card
  • Gateway status sync on read: GetPayment now performs a best-effort status sync against Stripe or Razorpay for any payment still PENDING or PROCESSING, reconciling stuck statuses without waiting on a webhook
  • Payment link tracking: Razorpay payment links can now be polled by tracking ID to resolve their current status

Wallet bonus credits and payment sync

Wallet top-ups and onboarding-created wallets gain a dedicated expiry for bonus and initial credits, and purchased-credit invoices can be force-synced to Moyasar with connection-configured redirect URLs.
  • bonus_credits_expiry_date_utc: Top-up requests can set an expiry for bonus credits that’s independent of the purchase credits’ own expiry
  • Onboarding wallet initial credits: The onboarding workflow’s wallet-creation action can now apply an optional expiration duration to the initial credits it loads
  • Moyasar redirect URLs: force_sync_invoice on wallet top-ups now forwards the connection-configured success/cancel URLs to Moyasar, mirroring the existing Paddle pattern, and is configurable from the Moyasar connection drawer

Other changes
  • Meter usage queries now support group_by on commitments for exports, and parent-child subscription usage is handled correctly when computing meter usage
  • Customer analytics requests can now include child customer costs alongside the parent’s own
  • formatPayableAmount gives precise monetary formatting on the subscription addon table, replacing lossy rounding (frontend)
  • Storage-span sampling and app-level DB metrics added for tracing, giving SigNoz trace-cost control (FLE-1003)
  • Tax is now correctly applied when creating a subscription through checkout
  • Coupon redemption race condition closed with an atomic DB-level guard — concurrent requests could previously all pass validation and push total_redemptions past max_redemptions
  • Razorpay: mandate limit capping is now scoped to UPI only, short_url/id are validated on mandate registration responses, and RefundLateCapturedPayment failures now surface to the caller instead of being swallowed
  • MandateLimit.Currency is now validated as a 3-letter currency code
  • Inherited subscription revenue calculation corrected in meter usage computation
  • EnvironmentSelector button opacity behavior fixed in the dashboard (frontend)
  • svix browser bundle polyfill issue fixed in the self-hosted webhook dashboard (frontend)
  • New wallet.transaction.updated and wallet.ongoing_balance.updated webhook events; wallet transaction payloads now include the associated customer object
  • Subscription search now supports expanding entitlements
  • Customer entity gains a contact field, used for Razorpay customer sync
  • PaymentResponse now includes tenant_id and environment_id

Spend alert settings

Subscriptions and line items now support configurable, threshold-based spend alerts backed by a dedicated alert-settings entity and a real-time alert-log pipeline that evaluates billed spend as usage events arrive.
  • AlertSettings API: New endpoints let you create and update spend-alert thresholds for a subscription or line item, with info, warning, and critical levels
  • Alert log pipeline: Alert logs now track the originating alert_setting_id and flow through a dedicated consumer pipeline, driven by config rather than hardcoded thresholds
  • Dashboard support: A new alert settings dialog lets you configure and save spend-alert thresholds for a subscription or line item directly from the dashboard

Spend alerts - Documentation


Razorpay UPI Autopay and auto-charge

Razorpay checkout sessions now support mandate-based recurring payments — a customer authorizes a UPI Autopay or card mandate once, and every invoice after that is auto-charged with no further action needed.
  • Mandate registration at checkout: Set payment_provider_config.collection_method to charge_automatically to register a UPI or card mandate instead of a one-time payment link
  • Automatic invoice charging: Finalizing an invoice now triggers a best-effort AutoChargeInvoice call against any usable saved token, guarded by per-invoice and per-token-cycle idempotency claims to guarantee at-most-once charging
  • Mandate ceiling: A configurable max_mandate_limit caps the size of any single auto-charge; invoices above it fall back automatically to a normal payment link
  • Reconciliation and webhook handling: A reconciliation sweep recovers stuck charge claims, and the Razorpay webhook handler now processes token.confirmed, token.rejected, and token.cancelled events

Autopay & Mandates - Documentation


Tabs integration

Flexprice now connects to Tabs, syncing finalized invoices to its revenue recognition platform through a dedicated background workflow.
  • Connection setup: Register and configure a Tabs connection from the dashboard’s integrations catalog, alongside existing providers like Stripe and Razorpay
  • Invoice sync workflow: A new Temporal workflow pushes finalized invoices to Tabs for revenue recognition as they’re generated

Credit grants on addons

Addons can now carry their own credit grants, matching the behavior already available on plans.
  • Addon credit grants: Attach credit grants directly to an addon — applying the addon to a subscription grants credits the same way a plan-level credit grant does
  • Dashboard parity: Addon detail pages now surface credit grants alongside other addon configuration, matching the plan detail experience

Wallet bonus credit grants

Wallet top-ups now support slab-based bonus credits — an extra credit grant calculated automatically from the size of a purchased top-up.
  • Slab-based resolution: A configurable slab table matches the top-up amount to a threshold and computes the bonus as either a flat amount or a percentage of the purchase
  • Linked bonus transaction: The bonus is recorded as its own wallet transaction, linked back to the originating purchase via a new parent_transaction_id field, and shares its completion state with the purchase

Other changes
  • Table row dropdown menus across the dashboard (addons, cost sheets, coupons, credit grants, customers, entitlement overrides) now include a copy ID action
  • Environment creation UI now supports platform-specific configuration, improving the setup flow for self-hosted deployments
  • ManualBalanceDebit requests now accept a metadata field for recording debit context
  • Scheduled subscription cancellations now correctly terminate line items, addons, and credit grants when the cancellation takes effect — previously only the subscription-level status was updated
  • Reverting a scheduled cancellation on a parent subscription now cascades the reverted state to inherited child subscriptions — previously children kept stale CancelAtPeriodEnd/CancelAt/CancelledAt values
  • Fixed a credit-grant application cancellation ordering bug, and cancellation failures are now propagated instead of silently swallowed
  • GET /v1/tenants/{id} now rejects cross-tenant reads
  • Meter usage charge calculations now include SubscriptionLineItemID, fixing incorrect spend-breach checks
  • New event.unmatched webhook (opt-in, throttled per tenant/environment/event name) fires when an ingested event produces no meter usage — either no meter is registered, or filters excluded it — replacing a previously silent drop
  • ManualBalanceDebit requests now accept a metadata field

Self-hosted webhooks portal

The webhooks dashboard now ships a full self-hosted management portal instead of a docs stub — manage endpoints, inspect message logs, and debug delivery attempts directly from Flexprice.
  • Endpoint and message detail views: New endpoint overview, advanced, and testing tabs, plus a message detail view with per-attempt status and response bodies
  • Auto-switching portal: The dashboard automatically renders the self-hosted Svix portal or the hosted Svix iframe depending on which URL your environment is configured with
  • Event type picker: Endpoint filters now page through the full event catalog instead of stopping at the first 250 event types
  • Paddle event coverage: Paddle connections can now subscribe to the full set of Paddle webhook event types, including transaction.completed

Webhooks - Documentation


Settings redesign

The settings area is now a single tabbed dashboard, replacing the previous set of standalone pages for billing, team, and alerts.
  • Tabbed navigation: Billing, Team, Alerts, and Customer Portal are now tabs on one settings page with shared routing and i18n
  • Billing tab: Invoice numbering and subscription configuration moved into a dedicated tab with live invoice preview
  • Team tab: Organization info and member management consolidated with filtering and invite flows
  • Alerts tab: Wallet balance alert thresholds configurable with ordering validation to prevent conflicting rules
  • Customer Portal tab: Toggle which sections and visibility options are exposed on the customer-facing portal

Settings - Documentation


Customer onboarding automation

You can now configure a default onboarding workflow that runs automatically whenever a new customer is created — provisioning a wallet, subscription, or custom action set without manual setup.
  • Action sets: Define default actions (create wallet with an initial credit load, create subscription against a published plan) that fire on customer creation
  • Custom workflows: Add named custom workflows alongside the default action set for different onboarding paths
  • Validation: Wallet credit expiration and workflow name conflicts are validated before saving

Usage analytics discounts

Usage analytics now account for active percentage coupons — the detailed analytics endpoint reports gross cost, discount, and net cost per line item and per time-series point instead of just gross cost.
  • Discount-aware response: UsageAnalyticItem and UsageAnalyticPoint now include subtotal, total_discount/discount, and a discount-adjusted total_cost/cost
  • Subscription and line-item coupons: Percentage coupons with forever or repeated cadence are resolved and applied across the requested time range, including ranges that straddle a coupon’s active window

Customer entitlements by external ID

A new endpoint resolves a customer’s entitlements using your own external customer ID, making it easier to check feature access at the edge without an internal Flexprice lookup first.
  • New endpoint: GET /customers/external/{external_id}/entitlements returns a customer’s entitlements, with optional feature_ids and subscription_ids filters

Other changes
  • Meter creation now supports a + Custom Expression toggle that swaps the aggregation field for a CEL formula input, with inline help for supported functions
  • Meters gain a monthly bucket size option alongside existing bucket granularities
  • Meter usage analytics support expand: "source" to return distinct event sources per bucketed meter
  • Cost Sheet details support filtering and sorting
  • Entitlement config-value editing now uses a dedicated JSON editor with validation, and overridden config values show a tooltip in the entitlements table
  • Repository-layer DB calls for Postgres and ClickHouse are now traced as proper DB client spans, and high-volume info logs were downgraded to debug to cut log volume
  • Entity caching gains ID-only keys, hit/miss/set observability, and tuned TTLs (2m in-memory, 30m Redis)
  • Kafka consumer groups now each have a dedicated DLQ topic for events ingestion
  • Credit grants support updating end_date after creation
  • Settings pages adopt a shared info-icon and tooltip pattern across wallet alerts, subscription, portal, and onboarding fields
  • Fixed a wallet balance alert double-firing bug by removing a redundant Kafka publish path
  • Stripe invoice line items now preserve and display the original quantity in the line item description instead of losing it when only an amount is synced
  • Paddle transaction.completed webhooks are now correctly handled against subscription activation
  • UpdateEntitlement now rejects requests that try to enable a config-type feature or corrupt its config_value
  • Fixed several /users/me session sync bugs — stale cached user data could overwrite newer state across tabs, and tenant updates weren’t consistently reflected in the session
  • Team members list now shows correct singular/plural counts and auto-refreshes
  • Invoice configuration settings now save and reset to defaults correctly
  • Webhook endpoint advanced settings no longer lose disabled status or duplicate custom headers on save
  • New GET /customers/external/{external_id}/entitlements endpoint for looking up entitlements by external customer ID
  • UsageAnalyticItem/UsageAnalyticPoint response fields renamed: net_cost is now total_cost/cost (post-discount), with gross cost moved to a new subtotal field
  • UpdateCreditGrantRequest accepts an end_date field
  • OverrideEntitlementRequest accepts a config_value field for config-type feature overrides
  • /webhooks/dashboard returns token and app_id for the self-hosted Svix portal in addition to the existing hosted URL

Checkout Sessions

Flexprice now offers a hosted checkout flow that creates a subscription and finalizes payment end-to-end, without you building any payment UI. The initial release supports Razorpay, behind a pluggable provider architecture designed to add more gateways later.
  • Session lifecycle: Create a session via POST /v1/checkout/sessions and redirect the customer to the returned payment URL; sessions move through initiated, pending, completed, failed, and expired states
  • Automatic cleanup: If a session fails or expires, Flexprice automatically cleans up the draft payment, invoice, and subscription it created
  • Automatic expiry: A Temporal workflow sweeps and expires stale sessions every 30 minutes so abandoned checkouts don’t linger

Checkout Sessions API - Documentation


Per-subscription timezones

Timezone-aware billing now extends below the customer level — subscriptions carry their own timezone field (renamed from customer_timezone), and it threads through every date calculation that touches the subscription.
  • Timezone validation: Customer and subscription timezone fields are validated as IANA timezone names (e.g. Asia/Kolkata) on create and update, instead of accepting arbitrary strings
  • Timezone-aware billing math: Credit grant periods, proration, and ClickHouse usage aggregation now consistently use the subscription’s timezone for period boundaries
  • Timezone-aware analytics: Detailed usage analytics now bucket time-series data in the customer’s timezone instead of hardcoded UTC
  • Dashboard: Subscription and customer timezone are now visible in the Customer Information and Subscription Details views

Customer Timezones - Documentation


Custom expressions for meters

Metered features can now compute their per-event quantity from a CEL formula instead of a single event property — useful when the billable quantity is derived from multiple fields, needs a unit conversion, or needs to be rounded or clamped.
  • CEL math helpers: Expressions support max, min, abs, ceil, floor, round, pow, sqrt, and log alongside standard arithmetic and comparison operators
  • Validation: Expressions are only accepted on SUM, AVG, MAX, and LATEST aggregations, and a meter can’t set both a field and an expression at the same time
  • Dashboard: A ”+ Custom Expression” toggle on feature creation swaps the aggregation field input for a CEL formula input, with inline help text and examples

Aggregation section with the Custom expression toggle highlighted

Custom Expression - Documentation


Config feature type for entitlements

Entitlements can now carry an arbitrary JSON config_value, so you can deliver feature flags, rate limits, or tenant settings to customers through the standard entitlements pipeline instead of a boolean or numeric limit.
  • Config feature type: A new config feature type accepts a JSON object as its config_value when the feature is attached to a plan’s entitlements
  • Dashboard JSON editor: A JSON editor with syntax highlighting validates the config payload on entry, and a side sheet displays the full stored value from the plan’s Entitlements tab
  • Customer entitlements: Config values are returned on the customer’s entitlements as soon as they subscribe to a plan that includes the feature

Add Entitlement with Config feature JSON editor

Creating a Feature - Documentation


Redesigned settings dashboard

Settings are now organized into a single tabbed dashboard instead of scattered pages, covering team, billing, alerts, and customer portal configuration.
  • Team tab: Manage tenant members and pending invites in one place, with an option to show pending invites alongside published members
  • Billing tab: Configure invoice and subscription settings — auto-cancellation and invoice numbering — directly from the dashboard
  • Alerts tab: Configure wallet balance alert thresholds from Settings instead of a separate page
  • Customer portal tab: New tab for configuring customer-facing portal settings

Settings - Documentation


Other changes
  • Customer Analytics tab now surfaces COGS and margin metrics alongside usage and cost data
  • Subscription, payment, and customer-information list views now default to filtering on PUBLISHED status, hiding draft and pending records
  • Wallet balance endpoint now falls back to the last cached balance — flagged with a new is_cached_fallback field — when real-time computation fails or exceeds a 30s timeout; a 5xx is only returned when no cached balance is available either
  • Price entity limit increased from 3,000 to 5,000
  • Customer entitlements response no longer includes subscription line items, reducing payload size for entitlement checks
  • Service account archive action now shows the correct delete label and icon
  • Moyasar webhook handler no longer errors when the referenced payment record can’t be found — logs and returns gracefully instead
  • Moyasar payments now sync their status into the linked invoice’s moyasar_invoice_status metadata field on completion
  • Credit note and tax association creation now return an ErrAlreadyExists error instead of a generic database error when the record already exists
  • CEL expressions now reject non-finite property values (NaN, ±Inf) and no longer leak raw property values in boundary error messages
  • Svix webhook auth token environment variable is now bound correctly — webhooks were previously failing with 401s in production
  • JsonEditor now uses a proper typed value for config editing and fixes text-selection handling
  • Customer entitlements response now includes a subscriptions field listing which subscriptions grant each entitlement
  • Subscription’s customer_timezone field renamed to timezone
  • Coupon and line-item responses now support expand for richer nested data
  • includeAllStatuses param added to the tenant members endpoint, returning pending invites alongside published members

Customer timezone-aware billing

Customers can now be assigned a timezone, which Flexprice uses to align billing periods, usage windows, entitlement resets, and credit/coupon expirations to their local calendar instead of UTC.
  • Timezone field on customers: Set timezone (any IANA name) when creating or updating a customer — subscriptions inherit it at creation time
  • Timezone-aware billing periods: Daily, weekly, monthly, quarterly, half-yearly, and annual periods now start and end at local midnight rather than UTC midnight
  • Timezone-aware usage and resets: Usage aggregation windows, entitlement resets, credit grant expirations, and coupon end dates now compute from the customer’s local time

Customer timezones - Documentation


Moyasar autopay

Flexprice can now save a customer’s card through Moyasar and charge it automatically on future invoices, with a hosted checkout page, 3DS verification, and lifecycle handling for reconciliation, voids, and refunds.
  • Checkout page: New Flexprice-hosted checkout page tokenizes the customer’s card and redirects through 3DS verification when the issuer requires it
  • Automatic invoice charging: Once a card is saved, new invoices are charged directly against it without any customer action
  • Cron reconciliation and void/refund lifecycle: A scheduled workflow reconciles pending card-verification charges — voiding the verification charge automatically, or issuing a refund if the void fails

Setup Autopay button on the customer page

Moyasar autopay - Documentation


Coupon and tax associations on subscriptions

The subscription details page now has a dedicated dashboard flow for applying and removing coupons and tax rates on individual line items, mid-cycle, without needing to call the API directly.
  • Apply/Remove dialogs: New ApplyCouponDialog, RemoveCouponDialog, ApplyTaxDialog, and RemoveTaxDialog walk through a preview step showing affected resources before executing the change
  • Association tables: New CouponAssociationTable and TaxAssociationTable components list active associations with valid-from/to ranges, filtered to active, published associations only
  • Line item actions: Apply and remove coupon/tax actions are now available directly from each line item’s dropdown menu
  • Coupon codes: Coupons now require a human-readable coupon_code on creation, shown as a monospace badge on the coupon details page

Apply coupons to subscriptions - Documentation

Apply taxes - Documentation


Other changes
  • Addons can now be added to draft subscriptions, and addon line item dates shift to match the new start date when a draft is activated
  • Subscription entitlement overrides can now be edited directly from the subscription page via a new edit drawer
  • Webhook requests arriving at inbound integration endpoints are now logged and persisted for auditing, with oversized bodies skipped from persistence
  • Tenant auth middleware reworked to support tenant-scoped access checks across permission and API key validation
  • Service account name is now included in the list API keys response
  • Zoho invoice sync no longer sends the Flexprice invoice number to Zoho, and instead updates the Flexprice invoice with the Zoho-generated number
  • Recurring charges form now synchronizes billing model and tier mapping automatically when switching pricing configurations
  • Service account role selection now prioritizes super_admin in the drawer’s role list
  • Meter usage queries now correctly handle meters with no active subscription and group by properties on bucketed meters
  • Billing period calculation now enforces an exact match between subscription and plan price billing periods
  • Analytics event count and bucket line-item queries corrected
  • DeleteUser now correctly enforces tenant-scoped checks on the caller’s API key
  • Arabic characters are now accepted by input sanitization on form fields (previously rejected as invalid)
  • Broken documentation links fixed across onboarding and integration guides
  • New GET /coupons/associations endpoint to list coupon associations
  • subscription_coupons/CreateCouponRequest/CouponAssociation payloads now accept coupon_code
  • Subscription details endpoint accepts an expand query parameter to include tax rate data
  • AssociationID renamed to CouponAssociationID/TaxAssociationID on subscription line item associations

Service accounts

Service accounts are now first-class users — create them, give them a display name, update them, and archive them through dedicated endpoints, with API keys scoped to the owning service account for clean audit trails.
  • Update endpoint: New PUT /v1/users/{id} lets you rename a service account without touching its API keys
  • Soft-delete endpoint: New DELETE /v1/users/{id} archives a service account — blocked while it still has active API keys to prevent orphaned credentials
  • User association on secrets: API keys now record the user_id of the service account that owns them and can be filtered by user and expiry
  • super_admin role: New built-in RBAC role with wildcard permissions for tenant-wide administrative access
  • Dashboard support: Manage service accounts end-to-end from the dashboard — create, edit, and revoke from the settings area

Service accounts - Documentation


Customer hierarchy safeguards

Subscription inheritance now enforces a strict one-parent-per-child rule across both create and modify flows — preventing the same customer from being inherited under two different parents.
  • Standalone child rejected: Attempting to inherit a customer that already has a standalone subscription returns a validation error instead of silently creating conflicting hierarchies
  • Different-parent inheritance blocked: A child already inherited under one parent cannot be re-inherited under a different parent
  • Same-parent re-inheritance allowed: Re-running inheritance for an existing parent–child pair continues to work for adding new subscriptions to the relationship

Customer hierarchy - Documentation


Signup metadata

User signup now accepts a metadata object — attach attribution, referral source, or any custom signup context at account creation time and access it later through the user profile.
  • Signup form: The dashboard signup flow captures structured metadata and forwards it to the auth API
  • API field: The signup request accepts a metadata map alongside the existing identity fields

Other changes
  • Event debugger now surfaces an attributed-to-customer step in the meter_usage pipeline view — making it easier to see which customer an event was attributed to and why
  • Commitment time bucket editor adds validation and refined configuration controls for setting up multi-window commitments from the dashboard
  • Subscription status filter expanded to include DRAFT and TRIALING states alongside published and active filters
  • Optional display name field added to users — set it on create, edit it later, and see it returned in user responses
  • Wallet credit operations now return 409 Conflict on duplicate idempotency keys instead of 500 Internal Server Error
  • Subscription inheritance no longer admits child customers with parent-type subscriptions, preventing nested parent relationships
  • New PUT /v1/users/{id} endpoint to update a service account’s name
  • New DELETE /v1/users/{id} endpoint to soft-delete a service account; blocked while active API keys exist
  • metadata field accepted on the user signup request
  • breakdown_bucket flag added to the meter usage detailed analytics request to opt into per-bucket breakdowns in the response
  • Secret list filters now support user_id and not_expired_at for scoping API key queries to a specific service account or expiry window
  • name field added to the user create, update, and response payloads

Commitment time buckets

Windowed commitments can now specify time-of-day billing windows — define multiple time buckets with start and end times to apply different commitment rates during peak and off-peak hours.
  • Time bucket editor: CommitmentTimeBucketsEditor component lets you add, configure, and reorder time buckets directly from the CommitmentConfigDialog
  • Hour and minute precision: Bucket granularity adapts to the meter’s bucket size — hour-only for coarse meters, hour+minute for fine-grained meters
  • Validation and normalization: Buckets are validated for completeness and overlap before saving; normalization strips the minute component when the meter doesn’t support it
  • Price override storage: Time bucket configuration is stored on the price override, not as separate line items

Wallet enhancements

Wallets gain two new capabilities: prepaid wallets can be converted to postpaid mode via API, and debit transactions now record which credit transactions were consumed.
  • Wallet modification: New POST /v1/wallets/{id}/modify endpoint accepts modification_type: "prepaid_to_postpaid" to convert a prepaid wallet to postpaid — original and new wallet state are returned in the response
  • Consumed credits tracking: Debit transactions now store the IDs of all credit transactions consumed during the debit in metadata.consumed_credit_tx_ids — enabling full credit audit trails
  • Conversion rate applied: Wallet debit operations now apply the configured conversion rate when calculating the credit amount

Backdated subscription cancellation

Immediate cancellations now accept a cancel_at timestamp in the past to record a backdated effective date — useful for correcting cancellation records after the fact.
  • Past cancel_at on immediate cancellation: Pass a past timestamp with cancellation_type: immediate to set a backdated effective cancellation date
  • Future timestamps rejected: Passing a future cancel_at with immediate cancellation returns a validation error directing you to use scheduled_date cancellation instead
  • Scheduled date unchanged: Forward-dated cancellations continue to require cancellation_type: scheduled_date and reject past timestamps

subscription.cancelled event

The subscription.cancelled system event is now published whenever a subscription ends — covering immediate cancellation, scheduled-date cancellation, and period-end termination.
  • Cascade propagation: When a parent subscription is cancelled, the event is also published for each inherited child subscription
  • Temporal activity support: PublishSubscriptionEvent is exposed on the subscription service interface so Temporal billing-period activities can fire lifecycle events

Paddle inbound invoice sync

Paddle webhook processing now handles inbound invoice state changes — invoice updates arriving from Paddle are reflected back into Flexprice without waiting for the next outbound sync cycle.
  • Inbound update handling: PullAndUpdateInvoice is wired as the inbound path in Paddle’s sync service; the sync type toggle enables or disables inbound processing per connection
  • Child subscription guard: Paddle subscription sync workflow no longer fires on child subscriptions to prevent duplicate checkout URL generation

Other changes
  • Go runtime upgraded to 1.25.0
  • Meter usage consumer is now lazy — initialized on first use rather than at startup, reducing cold-start pressure
  • Subscription billing scheduler interval reduced from 15 minutes to 2 minutes; stale webhook scheduler avoids system events older than 48 hours and prioritizes newly scheduled events
  • Environment management: new add-environment script creates an environment for an existing tenant and wires in-memory cache
  • Invoice pull sync cron configured; $0 invoices are skipped from outbound sync
  • Meter usage queries now support group_by on properties
  • Helm chart: onboarding_events config block now rendered so the Kafka topic value is non-empty
  • Paddle webhook handler now returns an error response on processing failure so Paddle retries the delivery
  • Tax rate filter in subscription creation now excludes archived rates — only published rates are shown (frontend)
  • Cancelled subscription meter usage benchmark fixed to exclude post-cancellation usage windows
  • Meter usage group_by feature_id aggregation corrected
  • POST /v1/wallets/{id}/modify endpoint added — accepts modification_type for wallet mode conversion
  • Swagger documentation updated with new integration sync endpoints

OTel tracing migration

Tracing is now OpenTelemetry-native across the entire backend — all span helpers (StartDBSpan, StartClickHouseSpan, StartRepositorySpan, StartMonitoringSpan) keep their call-site API but are backed by go.opentelemetry.io/otel. Traces route to SigNoz or any OTLP backend; Sentry is retained only for error capture.
  • OTel spans: All existing span helpers now emit OTel spans — no call-site changes required
  • SigNoz routing: The unified otel: config block exposes per-signal endpoints and headers so traces and logs can target different backends independently
  • Trace-log correlation: logger.WithContext injects trace_id and span_id into every log line for cross-signal correlation
  • Temporal interceptor: Rewritten to use the OTel tracer for activity spans; Sentry scope binding preserved for error attribution
  • Config migration: Legacy logging.otel_* keys remain valid with a deprecation warning; the new otel: block is the canonical path

White-label SDK pipeline

A new CI pipeline automates generation and publication of white-label SDKs for partner deployments — covering Go, TypeScript, Python, and MCP with per-partner branding applied at build time.
  • generate-wl-sdks.yml: GitHub Actions workflow triggers on sdk-v* tags and manual dispatch; builds all four SDK flavors and publishes to partner repositories
  • Config templates: Per-partner gen-config files parameterized with WL_* environment variables for name, module path, and author metadata
  • Branding scripts: apply-wl-custom-branding.sh replaces all Flexprice identifiers in source and docs; verify-sdk-builds.sh confirms each SDK compiles after substitution
  • Template drift detection: check-wl-templates Makefile target and a CI check fail if the canonical SDK drifts from the white-label template baseline

GCP Managed Kafka

Kafka now supports SASL/OAUTHBEARER authentication for GCP Managed Kafka — no username or password required. Workload Identity handles token acquisition on GKE; Application Default Credentials are used locally.
  • OAUTHBEARER mechanism: Set saslMechanism: OAUTHBEARER in the Kafka config; tokens are sourced via google.DefaultTokenSource and cached with oauth2.ReuseTokenSource to avoid metadata server round-trips on each broker connect
  • Existing SCRAM/PLAIN unchanged: Sarama config output is byte-identical for existing configurations — no migration required

Invoice pull sync

Integrations now support a pull sync method — trigger a sync with method: "pull" to fetch and update an invoice’s current status directly from the payment provider.
  • PullAndUpdateInvoice: Paddle fetches the latest invoice state and applies it back to Flexprice; all other integrations return a clear unsupported error
  • Factory wiring: IntegrationFactory.SetServices injects PaymentService and InvoiceService post-construction to break the service dependency cycle

Other changes
  • Meter usage pipeline: wallet balance, cost analytics, and usage export now query the meter usage store — reducing direct ClickHouse event queries in these paths
  • User model gains a JSONB metadata field with full CRUD support via the user update API
  • Subscription metadata is now persisted on subscription create and update
  • JWT middleware now extracts environment_id from JWT claims before falling back to the request header
  • Trial subscription end dates can now be modified, and trialing subscriptions can be cancelled with a backdated cancel_at effective date
  • Revenue dashboard now shows a currency filter populated from available invoice summaries (frontend)
  • Price sync: parent price ID now sends empty string instead of nil, preventing null dereference during plan-change price linking
  • White-label branding scripts hardened — sed substitutions properly quoted; standard builds guarded against accidental branding replacement
  • New integration sync service exposes method: "pull" and method: "push" for on-demand provider sync
  • Subscription create and response DTOs now include the metadata field
  • User update API now accepts and returns metadata key-value pairs

Whop integration

Flexprice invoices can now be synced to Whop — creating hosted invoices or automatically charging customers with a saved payment method, with two-way reconciliation via Whop webhooks.
  • Invoice sync: Finalized Flexprice invoices are pushed to Whop as one-time invoices, with checkout URLs stored back on the invoice metadata for customer-facing payment links
  • Automatic charge collection: When a customer has a saved Whop payment method, invoices are charged automatically instead of sending a hosted checkout link
  • Two-way payment reconciliation: The invoice.paid webhook marks the corresponding Flexprice invoice as paid; the payment.succeeded webhook creates a customer→member mapping that enables automatic charging on future invoices
  • Product auto-provisioning: A Whop product is created automatically if one isn’t already configured on the connection, with the product ID persisted back to the connection config
  • Dashboard UI: Connect and configure Whop from the integrations page — set API key, company ID, and enable invoice sync; copy your unique webhook URL directly from the drawer

Paddle subscription sync

Paddle-connected subscriptions now trigger a Temporal sync workflow that bootstraps a Paddle subscription for card capture — enabling the checkout URL flow without requiring a paid transaction.
  • Bootstrap workflow: PaddleSubscriptionSyncWorkflow creates a $0 Paddle transaction at subscription creation, stores the checkout URL in subscription metadata, and syncs all line item prices to Paddle catalog products
  • subscription.activated webhook: Paddle’s activation webhook is now handled — Flexprice activates subscriptions in an incomplete state when Paddle signals the subscription as active
  • Customer metadata sync: paddle_customer_id is written to the Flexprice customer metadata record on first sync, enabling lookup without an additional API call
  • Pending invoice resync: After a subscription.activated event, any pending Flexprice invoices are resynced via PaddleInvoiceSyncWorkflow to ensure payment status is up to date

Wallet auto-topup invoice deduplication

Auto-topup now guards against duplicate invoices — a pending unpaid topup invoice blocks a new topup from being triggered, and the alert re-fires automatically once the existing invoice is resolved.
  • WALLET_AUTO_TOPUP billing reason: Invoices created by auto-topup are now tagged with a dedicated billing reason, enabling accurate filtering and deduplication
  • Pending invoice guard: Before triggering a new topup in invoiced mode, hasPendingAutoTopupInvoice checks for an existing finalized, unpaid auto-topup invoice — and skips if one is found
  • Re-trigger on payment: When a purchased credit payment completes, the wallet balance alert is re-published so triggerAutoTopup can fire a fresh invoice for the next topup cycle

Subscription plan price out-of-sync flag

The subscription v2 API response now includes a plan_prices_out_of_sync flag indicating whether the subscription’s line items are behind the plan’s current price configuration.
  • Out-of-sync detection: Compares the subscription’s synced_price_sequence against the plan’s current max sequence — returns true when plan-price changes have not yet been reconciled into the subscription’s line items

Other changes
  • Zoho line item descriptions now include the child customer name for clearer invoice attribution in multi-tenant setups
  • Zoho customer fetch logic moved from billing service to Zoho service for better separation of concerns
  • Zoho customer lookup now filters by PUBLISHED status to exclude inactive records
  • Price sync creates new subscriptions using the latest price sequence, avoiding stale sequence issues after plan updates
  • Paddle webhook signature verification hardened to handle both snake_case and camelCase event payload formats
  • Paddle invoice resync after subscription.activated replaced goroutine+sleep with PaddleInvoiceSyncWorkflow for reliable, retryable execution
  • Paddle checkout URL now falls back to connection config when Paddle omits it from the transaction response
  • Paddle ListTransactions filtered by origin=subscription_charge to exclude unrelated transactions
  • Entity integration mapping update now merges metadata instead of replacing it, preserving existing fields on update
  • Wallet auto-topup invoice guard payment status filter corrected to include failed and initiated statuses alongside processing
  • Meter usage window size points aggregation corrected
  • Meter usage zero-events line item commitment now handled correctly without producing incorrect charges
  • New POST /webhooks/whop/{tenant_id}/{env_id} endpoint for inbound Whop webhook events — handles invoice.paid and payment.succeeded event types
  • plan_prices_out_of_sync boolean field added to the subscription v2 response

Auto invoice threshold billing

Set auto_invoice_threshold on any usage-based subscription and Flexprice will automatically generate a mid-period invoice whenever accumulated usage charges cross that amount — no manual intervention required.
  • auto_invoice_threshold field: Currency-denominated decimal on subscription creation and modification; must be zero or greater; rejected for inherited subscriptions
  • Threshold billing workflow: AutoInvoiceThresholdBillingWorkflow runs on a 5-minute Temporal schedule, scans qualifying subscriptions, and fires mid-period invoices tagged with the THRESHOLD_BILLING billing reason
  • Validation guards: Only valid for standalone subscriptions attached to usage-based plans; the API rejects threshold configuration on inherited or delegated-invoicing subscriptions
  • Dashboard support: Set auto_invoice_threshold during subscription creation; the current threshold value is shown on the subscription detail page

White-label dashboard & localization

The Flexprice dashboard now supports full white-label customization and RTL localization — deploy it under your own brand with your logo, colors, and language without code changes.
  • White-label branding: Configure logo, tagline, landing page colors, and auth page layout per deployment via config — no frontend code changes required
  • RTL layout: The entire dashboard adapts to right-to-left locales — sidebar, drawers, breadcrumbs, tables, and all directional elements reorient automatically
  • Locale switching: Users can switch their display language at runtime; the selection persists across sessions and the layout direction updates immediately

Zoho Books item price sync

Flexprice prices are now synced to Zoho Books as catalog items and item prices before invoice sync, ensuring Zoho always reflects the correct pricing for every line item.
  • ItemSyncService: Normalizes and upserts item prices in Zoho Books’ format before attaching them to invoice lines — eliminates mismatches between Flexprice prices and Zoho catalog entries
  • TaxService: Dedicated Zoho tax service injected into the invoice sync pipeline for structured tax handling
  • OAuth scopes: Zoho OAuth scopes expanded with ZohoBooks.settings.READ and item management permissions for full catalog access

Helm chart v1.0.0 GA

The Flexprice Kubernetes Helm chart reaches v1.0.0 GA with production defaults for high availability, data protection, and frontend scalability, and is now published to GHCR.
  • Frontend as first-class workload: HPA and PDB added for the frontend deployment; multi-AZ topology spread constraints enabled by default for all workloads
  • Data protection: In-cluster Postgres, Redis, Kafka, and ClickHouse StatefulSets ship with keep annotations on by default — data survives chart uninstall
  • Redis authentication: Readiness probe now authenticates via REDISCLI_AUTH for clusters with password auth enabled
  • GHCR publishing: Chart published to GitHub Container Registry on chart-v* tags and manual workflow dispatch

Other changes
  • Redis client updated to use ClusterClient for improved connection management and topology awareness
  • Price sync now initializes with the latest price sequence to prevent stale sequence issues after plan updates
  • Invoice issue_date now takes priority over finalized_at when computing the PDF issuance date
  • Error codes throughout the codebase replaced with typed ErrorCode constants for improved type safety
  • Commitment true-up: new GetDistinctCustomerIDsWithCommitmentTrueUp query for targeted true-up processing
  • monthsBetween now correctly handles end-of-month boundary dates (e.g., Jan 31 → Feb 28)
  • Nil check added for ExportMetadataFields in scheduled task validation to prevent panics
  • Voided and deleted invoices excluded from invoice idempotency checks
  • auto_invoice_threshold field added to subscription create and modify DTOs
  • issue_date field added to invoice create and update requests — overrides the user-facing invoice date

Grouped invoicing

A new grouped_invoicing subscription type lets a parent subscription collect usage from multiple child subscriptions and consolidate them into a single clubbed invoice on the parent’s billing cycle.
  • grouped_invoicing type: New subscription type alongside STANDALONE, PARENT, INHERITED, and DELEGATED_INVOICING — the parent owns billing and the children contribute usage
  • Bulk conversion at creation: Pass subscriptions_ids_for_grouped_invoicing in SubscriptionInheritanceConfig to convert existing standalone subscriptions to grouped_invoicing children under a new parent in a single API call
  • Runtime membership management: Add or remove grouped invoicing members via the subscription modification API using grouped_invoicing_add and grouped_invoicing_remove change types
  • Clubbed invoice preview: The parent subscription invoice preview endpoint returns a merged view of all child line items, letting you inspect consolidated charges before finalization
  • Standalone promotion: An existing standalone subscription can be promoted to a grouped invoicing parent without data loss

Trial start invoice

When a subscription activates into a trial, Flexprice now automatically creates a $0 invoice — enabling card capture via the payment processor’s checkout flow without charging the customer.
  • SUBSCRIPTION_TRIAL_START billing reason: New billing reason triggers a $0 invoice at trial activation; billing period spans trial_starttrial_end
  • ZeroOutAmounts(): Zeros all monetary amounts on the invoice request while preserving line item structure — used exclusively for trial-start invoices
  • Collection-method-aware payment status: Manual collection marks the trial invoice as PAID immediately; automatic collection generates a checkout URL for card capture
  • SKIPPED invoice status: Zero-dollar invoices that require no payment action are marked SKIPPED — no invoice number assigned, no finalization, no vendor sync

Other changes
  • Usage analytics export now includes customer name alongside external customer ID in report output
  • AppPrefetcher component prefetches queries on active environment load; WebhookDashboard now lazy-loaded for faster initial render
  • Export drawer supports dynamic metadata field columns with per-field validation
  • Environment display name can now be updated from the dashboard settings
  • Invoice line item table: null amounts handled gracefully; filtered data sorted correctly
  • mergeAnalyticsData: fixed nil-check base selection and PriceResponses merge from child accounts
  • Sum-with-multiplier precision corrected for event values with more than 6 decimal digits
  • Inherited subscription guard restored on nil-inheritance create path to prevent invalid subscription states
  • grouped_invoicing_add and grouped_invoicing_remove change types added to the subscription modification API
  • subscriptions_ids_for_grouped_invoicing added to subscription creation DTO under SubscriptionInheritanceConfig
  • SUBSCRIPTION_TRIAL_START billing reason added to the invoice billing reason taxonomy

Scheduled subscription cancellation

Subscriptions can now be cancelled at a specific future date — set cancel_at on the cancel request and the subscription stays active until that date, then terminates automatically.
  • cancel_at parameter: Pass a future timestamp to the cancel endpoint to schedule termination at a precise point in time
  • Validation: The API enforces that cancel_at must be strictly in the future, returning a clear error if the date has already passed
  • Existing modes preserved: Immediate and end-of-period cancellation continue to work unchanged alongside scheduled cancellation

Metadata filtering

Customers and plans can now be filtered by arbitrary metadata key-value pairs — useful for multi-tenant setups, account segmentation, and custom tagging.
  • JSONB GIN indexes: Metadata columns are now indexed with PostgreSQL GIN indexes for performant key-value lookups at scale
  • Customer and plan APIs: Both the customer list and plan list endpoints accept metadata key-value filters via a shared MetadataFilter struct
  • Dashboard query builder: The filter popover now supports metadata key-value pair inputs with a dedicated UI component

A new search endpoint lets you query subscription line items across subscriptions with full filtering and pagination support.
  • Search endpoint: POST /v1/subscriptions/lineitems/search accepts a SubscriptionLineItemFilter body with status, price, and date filters
  • Pagination: Results are paginated and sortable — no need to fetch the entire subscription to inspect individual line items
  • Dashboard UI: The subscription edit charges section now uses this endpoint for filtering and browsing line items directly

Usage analytics export

Usage analytics data can now be exported to CSV from both the API and the dashboard — covering per-customer, per-meter breakdowns for any billing period.
  • Export API: New endpoint returns a CSV of usage analytics including external customer IDs, meter breakdowns, and metadata fields
  • Metadata columns: Credit usage reports now include additional metadata fields configured on the export, with nil-safe handling for missing external IDs
  • Dashboard UI: Usage analytics pages now expose a download button for CSV exports

Webhook retry job configuration

The Temporal-based stale webhook retry job is now fully configurable via server config — enabling per-deployment tuning without code changes.
  • Kill switch: Set enabled: false to disable the retry job entirely for a deployment
  • Rate limiting: rate_limit (default: 5/s) caps delivery throughput within each cron run using a token-bucket limiter
  • Tenant exclusions: excluded_tenants skips specific tenant IDs from retry processing
  • Event-type allowlist: allowed_event_types restricts retries to specific webhook event names — empty list retries all types
  • Max attempts: max_attempts (default: 5) replaces the hardcoded failure-count threshold in the retry query

Other changes
  • Inherited subscription usage now includes child account events in the usage pipeline — parent subscriptions aggregate usage from all attached child customers
  • Billing service methods refactored to accept structured DTO inputs with validation, replacing positional argument chains
  • Subscription billing schedule decommissioned and replaced with the unified SubscriptionBilling Temporal schedule
  • Environment name can now be updated from the settings page
  • System event domain repository added for structured event querying in the webhook pipeline
  • Analytics merge now correctly aggregates PriceResponses from child accounts when computing parent subscription usage
  • Metadata filter nil-check corrected in in-memory store to use map lookup instead of index-0 access
  • Customer ID filtering optimized in GetUsage and matchesBaseFilters for the in-memory event store
  • Subscription future date restriction removed — subscriptions can now be created with a start_date in the future without a validation error
  • New POST /v1/subscriptions/lineitems/search endpoint for filtering and paginating subscription line items
  • cancel_at parameter added to CancelSubscriptionRequest for scheduled future cancellation
  • Customer list API now accepts metadata key-value filters via MetadataFilter in the request body
  • Usage analytics export endpoint added with support for external customer ID resolution and partial-count logging

Subscription trial periods

Subscriptions can now be created with a trial period — pass trial_period_days on creation and Flexprice automatically sets the trial window, then transitions to paid billing when the trial ends.
  • trial_period_days on create: Pass a non-negative integer to set the trial length; if omitted, the value is inherited from the plan’s recurring fixed prices (must be uniform across prices)
  • SUBSCRIPTION_TRIAL_START: When a trialing subscription is finalized on create (non-draft), Flexprice emits a $0 invoice with SUBSCRIPTION_TRIAL_START — preview line items for the trial window; real charges still begin with SUBSCRIPTION_TRIAL_END
  • Temporal trial end workflow: A Temporal workflow handles trial expiry — updates subscription status, computes the first invoice, and activates billing at the correct period boundary
  • Inherited subscription cascading: Trial end processing propagates to child subscriptions when the parent trial expires
  • Validation: trial_period_days and explicit trial_start/trial_end are mutually exclusive — the API returns a clear error if both are provided

Temporal-native scheduling

Cron jobs are now managed as Temporal schedules — replacing the legacy cron HTTP endpoints with durable, observable, and pauseable Temporal workflows.
  • Temporal schedules: All recurring billing jobs are now registered as Temporal schedules at worker startup
  • Legacy endpoints removed: The deprecated cron trigger HTTP endpoints have been removed from the API surface
  • Subscription billing schedule: The SubscriptionBillingPeriods legacy schedule is replaced by the unified SubscriptionBilling Temporal schedule

Add-on lifecycle controls

Add-on subscriptions now support fine-grained lifecycle configuration — set a custom billing cadence, proration behavior, and effective end date when attaching an add-on to a subscription.
  • Billing cadence: Choose the billing frequency for the add-on independently of the base subscription cadence
  • Proration behavior: Select whether mid-cycle add-on changes are prorated or charged at full price
  • Effective end date: Set an explicit termination date for the add-on without cancelling the base subscription
  • Dashboard UI: The add-on dialog now exposes these controls under an advanced options section

Other changes
  • Future subscription start dates are now allowed — the restriction requiring start_date to be in the past or present has been removed
  • Invoice pagination added to the customer invoice tab — large invoice lists no longer load all at once
  • Add-on subscription query cache is invalidated on add or cancel, keeping the subscription detail page in sync
  • Event names are now trimmed of leading/trailing whitespace at ingestion and query time for consistent matching
  • Subscription pause and resume endpoints removed — use cancellation or trial periods instead
  • Billing anchor adjusted for anniversary-cycle subscriptions to prevent unintended prorated charges on the first invoice
  • Date handling corrected for add-on line items when the subscription entity type resolves effective dates
  • Inherited subscription invoicing customer logic corrected — child subscriptions now invoice to the correct parent customer
  • trial_period_days parameter added to POST /v1/subscriptions — sets the trial window at subscription creation
  • proration_behavior field added to subscription line item create and modify requests
  • Pause and resume subscription endpoints removed from the API

Billing anchor

Anniversary-cycle subscriptions now support a custom billing anchor date — override the default subscription start date to align billing renewals to a specific day of the month.
  • billing_anchor parameter: Pass a timestamp on subscription creation when billing_cycle is anniversary to pin the billing renewal date to that day
  • Validation: The API enforces that billing_anchor is only accepted for anniversary billing cycles — passing it with other cycle types returns a validation error
  • Next billing date: The first billing period end is computed from the anchor date, so proration on the initial period reflects the actual anchor offset

Backdated credit grant catch-up

Credit grants now retroactively apply to subscriptions created after the grant’s start date — a catch-up loop issues the missed credit grant applications for all elapsed billing periods.
  • Catch-up loop: When a subscription is created and a credit grant already has elapsed periods, the system issues one CreditGrantApplication per missed period in sequence
  • Inherited subscriptions: The catch-up logic mirrors across inherited child subscriptions, keeping credit entitlements consistent across the parent-child billing hierarchy
  • EE parity: The enterprise edition credit grant service runs the same catch-up path, ensuring consistent behavior across deployment tiers

Invoice downloads

Invoices can now be downloaded as CSV or PDF directly from the customer portal and the customer invoice tab in the dashboard.
  • Format picker: A dialog lets users choose between PDF and CSV before initiating the download
  • Customer portal: The invoice download button in the customer-facing portal now surfaces both formats with distinct icons
  • Sorting: Customer invoices can be sorted by billing period start date, making it easier to locate invoices for a specific period

Webhook manual retry

Failed webhook deliveries can now be retried manually via a new retry endpoint — useful for re-sending events after a destination outage without waiting for the automatic retry job.
  • Retry endpoint: POST /v1/webhooks/{id}/retry re-queues a failed webhook event for immediate redelivery
  • Svix and native support: The retry logic works across both the Svix-managed and native webhook delivery backends

Other changes
  • OTel trace attributes now include a region field for region-aware observability in multi-region deployments
  • Environment list API now returns only PUBLISHED environments by default
  • Stale branch and stale PR GitHub Actions added to automate repository hygiene — branches older than 2 months and PRs idle for 15 days are flagged automatically
  • Wallet top-up conversion rate display improved — conversion rates are now shown clearly in the wallet UI
  • Credit grant tab on the plan detail page now filters to PUBLISHED grants only
  • Stripe invoice due_date is now always set when using send_invoice collection mode — previously missing in some flows
  • Webhook publisher nil-guard added for systemEventRepo to prevent panics on deployments without the system event store wired
  • Coupon percentage type now correctly excludes currency from the payload — fixing validation errors on currency-agnostic percentage coupons
  • Invoice nil pointer dereference in IsFinalizationDue resolved
  • POST /v1/webhooks/{id}/retry endpoint added for manual webhook redelivery
  • billing_anchor parameter added to POST /v1/subscriptions for anniversary billing cycle anchor date override

Environment cloning

Duplicate an entire environment — all published features and plans are cloned into a new target environment via a Temporal workflow, preserving entitlement relationships and configuration.
  • Temporal workflow: EnvironmentCloneWorkflow runs two sequential activities — features are cloned first (so plan entitlements resolve correctly), then plans are cloned with ID remapping
  • Cross-env ID mapping: Source entity IDs are mapped to their cloned counterparts in the target environment, keeping references intact
  • Dashboard support: Environment cloning is accessible from the environment management UI — select a source and target environment to kick off the clone

One-time charges

Prices can now be configured as one-time charges using billing_period: ONETIME — a cleaner model that separates cadence from charge type and integrates directly into the subscription billing pipeline.
  • BILLING_PERIOD_ONETIME: One-time charges are now identified by billing_period rather than billing_cadence, with the cadence defaulting to RECURRING — a data migration normalizes existing records
  • Auto-inclusion: Subscriptions automatically include ONETIME prices during billing cycle evaluation — no explicit line item attachment required
  • Period ordering: The period comparison utilities now handle ONETIME correctly for sorting and validation alongside standard billing periods
  • Validation: The minimum billing period count check no longer applies to one-time prices

AI-assisted pricing setup - Prompt to Plan

Prompt to Plan introduces a new way to set up billing in Flexprice. Instead of manually configuring plans, prices, meters, and entitlements, you can describe your pricing model in plain English and generate a working configuration.
  • Chat-based setup: Describe subscription, usage-based, or hybrid pricing models conversationally and get a complete configuration back
  • Full model support: The workflow covers metered features with overages and limits, credit-based pricing with grants and expiration, add-ons, and entitlements
  • Preview before publishing: Review the generated setup before pushing it live — nothing is saved until you confirm
  • Templates: Pre-built templates based on real-world pricing models are available as starting points and can be customized and deployed directly

Zoho Books integration

Connect Flexprice to Zoho Books for automated invoice synchronization — invoices finalized in Flexprice are pushed to Zoho Books via a Temporal workflow with OAuth-backed authentication.
  • OAuth connection: Authenticate with Zoho Books via the integrations page — the OAuth flow stores connection metadata and tokens for the tenant
  • Invoice sync workflow: ZohoBooksInvoiceSyncWorkflow runs on invoice finalization and pushes the invoice payload to Zoho Books
  • Connection management: The integrations UI shows connection status and supports re-authentication

Mid-cycle subscription modification

Subscriptions can now be modified mid-cycle — change line item quantities with a full proration preview before committing.
  • Proration preview: Call the modification preview endpoint to see the prorated credit and debit line items before applying the change
  • Quantity change dialog: The dashboard surfaces a quantity modification dialog on subscription line items with a summary of the expected invoice impact
  • Proration moved outside transaction: The proration calculation is now performed outside the database transaction to avoid long-held locks during wallet lookups

Other changes
  • Meter usage pipeline added — a dedicated pipeline processes feature usage events and maps them to meter usage records for downstream billing
  • Feature lookup keys can now be auto-generated from the feature name — reducing manual input when creating features
  • Customer invoice summary now includes invoices billed to parent customers, giving a complete view of charges for child accounts
  • Invoice table in the customer view now shows a Billing Entity column and a Subscription Customer column for parent-child billing scenarios
  • Usage benchmark service added with ClickHouse-backed storage for tracking event processing latency
  • Subscription BillingCadence now defaults to RECURRING in CreateSubscriptionRequest validation — prevents misconfigured subscriptions when cadence is omitted
  • Meter usage list lookup now cached in-process per event name — reduces ClickHouse round-trips for high-volume ingestion
  • Unique hash generation in meter usage fixed to correctly deduplicate cache entries
  • New POST /v1/ai/pricing/parse endpoint powers the Prompt to Plan chat workflow — accepts pricing descriptions and returns structured plan, price, meter, and entitlement configurations
  • New POST /v1/subscriptions/{id}/modify/preview endpoint returns a prorated invoice preview before applying a subscription modification
  • Environment clone endpoint added to trigger the EnvironmentCloneWorkflow for a source/target environment pair

Inherited subscriptions

Subscriptions now support an inheritance model — a parent subscription can propagate charges, cancellations, and billing configuration to child subscriptions attached to the same customer.
  • Subscription types: Subscriptions are now typed as STANDALONE, PARENT, or INHERITED — controlling how billing is routed and how cancellations cascade
  • Inherited subscription creation: Create subscriptions that inherit from a parent, with automatic customer resolution and unified code paths for create and modify operations
  • Cascade cancellation: Cancelling a parent subscription automatically propagates cancellation to all inherited child subscriptions
  • Validation guards: The API prevents creating standalone or parent subscriptions on customers that already have an inherited subscription, avoiding conflicting billing hierarchies
  • Dashboard support: The subscription edit page now shows an inherited subscriptions section for managing child subscriptions from the parent view

SDK v2.1

The Flexprice Go, Python, and TypeScript SDKs have been updated to v2.1, with major developer experience improvements across error handling, idempotency, and pagination.
  • Error utilities: New errorutils package provides typed helpers — IsNotFound, IsValidation, IsConflict — for clean error handling without string matching
  • Per-request idempotency: WithIdempotencyKey option lets you attach an idempotency key to any mutating request without modifying global config
  • Auto-pagination: List endpoints now support automatic pagination — iterate over all results without managing page tokens manually
  • Retry configuration: Read-only POST operations (like usage queries and previews) now retry automatically; retry settings are configurable globally or per-request
  • SDK examples: Comprehensive end-to-end examples added for Go, TypeScript, and Python covering the full subscription and billing lifecycle

API Reference


Invoice internal preview

Preview invoice charges before finalization with a new internal preview endpoint — useful for validating billing logic before committing to an invoice.
  • Preview endpoint: New POST /v1/invoices/internal/preview computes a draft invoice view without persisting any state — returns line items, totals, and applied discounts
  • PDF force regeneration: The invoice PDF URL endpoint now accepts a force_generate parameter to regenerate PDFs on demand, bypassing the cached version

Usage charge arrear constraint

Usage-based charges are now constrained to arrear billing — the API enforces that usage charges cannot be configured for advance billing.
  • Arrear-only enforcement: Prices with usage charge models are validated at creation and update time to ensure they are always billed in arrear, preventing misconfigured advance billing setups

Entitlement usage reset period

Plan entitlements can now be configured with a usage reset period directly from the plan builder.
  • Reset period UX: The plan creation and edit flow now includes a reset period selector for entitlements — configure how frequently usage limits reset (daily, weekly, monthly, etc.) without leaving the dashboard

Other changes
  • Customer list now defaults to filtering by PUBLISHED status — inactive customers are hidden by default with the ability to clear the filter
  • Invoice finalization delay reduced from 5 days to 2 hours — integrations and async workflows have a shorter window before invoices are sealed
  • Temporal invoice workflows now start with a configurable delay, giving downstream systems time to react before processing begins
  • System events enhanced with entity type and entity ID fields, and a new event_name column for structured audit log queries
  • OTel log level filtering now respected in the pipeline — debug-level noise no longer propagates to exporters configured for higher levels
  • Temporal worker concurrency defaults reduced to prevent out-of-memory kills under high load
  • API error messages extracted and displayed more accurately throughout the dashboard — network and validation errors now surface actionable text instead of raw response objects
  • Revenue dashboard date range filter now includes UTC-inclusive period boundaries — data at period edges was previously excluded
  • ClickHouse aggregator queries no longer use the FINAL keyword — removes read inconsistencies on tables with frequent merges
  • Invoice computation now correctly identifies inherited subscriptions and skips re-computation when appropriate
  • Credit purchased invoice payment status flow corrected — status transitions now follow the expected finalization sequence
  • Subscription invoice draft idempotency key now includes billing_reason — prevents duplicate drafts across different billing triggers within the same period
  • Duplicate draft event publishing removed from CreateInvoice — downstream consumers no longer receive redundant invoice.drafted events
  • Invoice PDF generation now handles nil line items without panicking
  • New POST /v1/invoices/internal/preview endpoint for computing a preview invoice without persisting state
  • Subscription type field (STANDALONE, PARENT, INHERITED) added to the subscriptions API with filtering support
  • New endpoint for modifying subscription inheritance — add or remove inherited subscriptions from a parent
  • force_generate parameter added to the invoice PDF URL endpoint for on-demand PDF regeneration
  • Go SDK v2.1.0 and v2.1.1 released with error utilities, idempotency key support, auto-pagination, and configurable retry strategy
  • TypeScript SDK updated to use CustomerFromLookup type for customer resolution responses

Revenue dashboard

Visualize revenue across your customer base with a new analytics dashboard — filterable by time period with per-customer breakdowns.
  • Time-series graphs: View total revenue and usage trends over configurable date ranges (this month, this quarter, this year, and prior-period comparisons)
  • Per-customer breakdown: Each customer row shows total revenue, usage-based revenue, and fixed revenue with drill-down links to customer details
  • Flexible filtering: Filter by custom date ranges or preset periods — results are sorted by total revenue descending for quick identification of top accounts

Invoice compute workflow

Trigger invoice computation on demand via API — synchronously for immediate results or asynchronously via Temporal for large invoices.
  • Sync and async modes: Call POST /v1/invoices/:id/compute with ?sync=true for blocking execution, or default async mode that returns a workflow ID for polling
  • Temporal-backed processing: Async compute runs as a durable Temporal workflow with automatic retries, 10-minute timeout, and exponential backoff
  • Deferred credits and taxes: Subscription invoice computation now applies only coupons during draft — credit deductions and tax calculations are deferred to finalization, preventing premature wallet debits

Invoices - Documentation


Scheduled subscription cancellation

Cancel subscriptions on a specific future date instead of only immediately or at period end.
  • Scheduled date cancellation: New scheduled_date cancellation type accepts a cancel_at timestamp for precise future cancellation scheduling
  • Guard validations: The scheduled date must be in the future — the API rejects past dates with a clear validation error
  • Dashboard support: The subscription cancellation dialog in the dashboard now includes the scheduled cancellation option with a date picker

Subscriptions - Documentation


Integration events system

Integrations now react to system events in real time — invoice finalization and customer creation automatically trigger vendor sync workflows.
  • Event-driven dispatch: A dedicated Kafka consumer group listens to system_events and routes invoice.finalized and customer.created events to the appropriate provider sync workflows
  • Integration mapping link: New POST /v1/integrations/link endpoint manually links Flexprice entities to external provider records with provider-specific side effects (e.g., Razorpay customer metadata sync)
  • Configurable rate limits: Integration event processing supports per-tenant consumer group isolation and configurable rate limits via integration_events settings

Other changes
  • OpenTelemetry observability expanded with a generic exporter, configurable protocol, health-check filtering, and structured OTel log fields
  • PostgreSQL → ClickHouse sync added for prices, subscriptions, and subscription line items for analytics workloads
  • Wallet balance calculation now excludes future-period draft invoices from pending balance to avoid overstating committed spend
  • Default invoice finalization delay increased to 10 minutes — gives integrations and async workflows time to complete before sealing
  • Skipped invoices are now hidden from search results and restricted to subscription invoice types only
  • Razorpay payment links now enforce a minimum expiration buffer to prevent premature link expiry
  • Commitment bucket fill logic capped with now() for period end to prevent future-dated empty bucket entries
  • Temporal workflow configuration now supports max concurrent workflow limits
  • SDK READMEs updated with webhook handling documentation for all supported languages
  • Fixed credit deduction timing — credits and taxes on subscription invoices are now deferred to finalization instead of being applied during draft computation
  • Fixed silent zero-usage bug — GetDistinctEventNames failures now return errors instead of silently zeroing meter usage
  • Fixed calendar billing period end calculation for quarterly and half-yearly subscriptions
  • Fixed invoice compute API to correctly handle recomputation of skipped and draft invoices
  • Removed final keyword from ClickHouse event queries to avoid read inconsistencies
  • Deprecated parent customer hierarchy removed from the frontend customer views
  • New POST /v1/invoices/:id/compute endpoint with sync and async modes for on-demand invoice computation
  • New POST /v1/integrations/link endpoint to manually map Flexprice entities to external provider records
  • New POST /v1/dashboard/revenue-dashboard endpoint for per-customer revenue analytics with time-series data
  • Subscription cancellation API now accepts scheduled_date cancellation type with a cancel_at field

Paddle payment integration

Accept payments through Paddle with full checkout, customer sync, and webhook support — no custom code required.
  • Checkout overlay: Customers complete payments via Paddle’s hosted checkout, embedded directly in your billing flow with JWT-signed checkout URLs
  • Bidirectional customer sync: Customers are automatically synced between Flexprice and Paddle, with deduplication and address management
  • Webhook processing: Transaction completions, customer creation, and address updates from Paddle are processed automatically with built-in idempotency
  • Enhanced error handling: Multi-layer idempotency checks on invoice sync prevent duplicate Paddle transactions on retries

Paddle connection setup

Paddle connection setup - Documentation


Multi-cadence billing

A single subscription can now contain line items with different billing periods — monthly, quarterly, and annual charges all on one subscription.
  • Mixed billing periods: Assign different billing cadences (monthly, quarterly, annual) to individual line items within the same subscription
  • Smart invoice inclusion: Line items are automatically included on the correct invoices based on their cadence and invoice timing (advance or arrear)
  • Flexible cancellation strategies: Choose between immediate, minimum-period-end, or maximum-period-end cancellation to honor varying commitment lengths

Creating a plan - Documentation


Bulk event ingestion

Ingest raw events in bulk for backfills, testing, and high-throughput pipelines with a new dedicated API endpoint.
  • Bulk raw event API: New POST /v1/events/raw/bulk endpoint accepts up to 1,000 raw events per request for async processing via Kafka
  • Ingestion filter: Allowlist specific external customer IDs for live billing while preserving all raw events — ideal for controlled pilot rollouts
  • Sequential usage fetch: New GetUsageBulkSync method provides reliable, sequential meter usage lookups with per-meter timeout protection for billing accuracy

Sending events - Documentation


Draft subscriptions

Create subscriptions in a draft state before activating them, allowing configuration and invoice preview before going live.
  • Draft lifecycle: Create subscriptions with DRAFT status that skip invoice generation and payment processing until explicitly activated
  • Invoice preview: Preview estimated charges for draft subscriptions before activation
  • Dashboard support: Draft subscriptions now appear in customer subscription lists and support activation with configurable start dates

Invoice overpaid tracking

Track and display overpaid amounts when customers pay more than the invoice total.
  • Overpaid amount display: Invoices now show an overpaid_amount field when the payment exceeds the amount due
  • Status visibility: A new “Overpaid” payment status is displayed in invoice tables and detail views

Other changes
  • Webhook delivery now uses Kafka for reliable, distributed event processing — in-memory PubSub support has been removed
  • Sentry logging enhanced with log-level filtering, unique per-request trace IDs, and health endpoint noise reduction
  • Multi-addon entitlement fetching improved to support multiple instances of the same add-on per subscription
  • Onboarding experience refreshed with welcome banners, embedded video tutorials, and quick-start guide cards
  • MCP scope annotations added to Swagger documentation for better AI-agent interoperability
  • Webhook event types now documented in the OpenAPI spec
  • Go Docker image bumped to golang:1.24-alpine
  • Fixed inactive line item handling for previous billing period calculations
  • Invoice idempotency key generation scoped to minute-level precision to prevent duplicate invoices within the same billing cycle
  • Add-on line item termination now correctly handled during subscription cancellation
  • Webhook secrets are now obscured in API responses for improved security
  • Reverted overly strict settings validation that blocked certain configuration reads
  • New POST /v1/events/raw/bulk endpoint for bulk raw event ingestion
  • Subscriptions API now supports listing and filtering by DRAFT status
  • Event ingestion filter setting added for customer-level allowlisting
  • GitHub release step added for Go SDK CI pipeline

Organization members & dashboard access

Invite teammates to your organization and manage dashboard access from the Flexprice UI.
  • Invite and manage team members within your organization directly from the dashboard.

Feature grouping

Organize features into logical groups for cleaner plan configuration and customer-facing entitlement display.
  • Logical feature groups: Group related features together for better organization and clarity

Create feature with group

Feature grouping - Documentation


Other changes
  • General UI optimizations for improved performance and consistency
  • Enhanced navigation and visual polish across the dashboard

Settings overhaul

Settings have been restructured for faster navigation and a clearer separation of tenant, billing, and integration configurations.
  • Revamped settings: Improved organization and discoverability of configuration options

Settings - Documentation


Custom dashboard theming

Personalize the Flexprice dashboard with your brand colors and visual preferences.
  • Theme customization: Apply custom colors and branding to match your organization’s identity

Other changes
  • Sentry spans now include user ID for more actionable error attribution and debugging

Plan cloning

Duplicate an existing plan with all its prices and configuration as a starting point for a new plan.
  • Clone plans: Quickly create new plans based on existing configurations

Clone plan from plan menu

Cloning a plan - Documentation


Multiple billing periods

A single plan can now support multiple billing cadences (monthly, annual, etc.) simultaneously.
  • Flexible billing cadences: Offer customers different billing period options within the same plan


Creating a plan - Documentation


Price grouping

Added support for grouping in prices for better organization and display.
  • Group prices: Organize related prices into logical groups

Assign group to plan charges

Charges grouping - Documentation


Wallet alerts

Real-time wallet balance monitoring with configurable alert thresholds.
  • Real-time balance event processing: Wallet alert triggers now process all balance events with improved cache handling for accuracy
  • Ongoing balance notifications: Low-balance alerts are sent continuously as the wallet balance stays below threshold, not just on first breach
  • Alert cache expiration: Alert cache entries now expire after a configurable max-alive window to prevent stale suppression of alerts

Wallet alert settings

Low balance alert - Documentation


API cleanup

Simplified the onboarding surface by removing deprecated APIs.
  • Deprecated tenant APIs removed: Removed deprecated tenant creation APIs to streamline onboarding

API Reference


Other changes
  • Plan-level price sync lock implemented with a configurable TTL (default 2 hours) to prevent conflicting concurrent updates

Parent subscriptions

Group related subscriptions under a parent for consolidated billing and hierarchy management.
  • Subscription hierarchy: Organize subscriptions with parent-child relationships

Update subscription - API Reference


Commitment duration

Define minimum commitment periods on subscriptions to enforce contract terms.
  • Backend support: Define commitment periods programmatically via API
  • Dashboard configuration: Configure and view commitment durations directly from the subscription management dashboard

Commitment - Documentation


Multiple instance add-ons

Attach the same add-on multiple times to a single subscription with independent quantities and pricing.
  • Flexible add-on instances: Support for multiple instances of the same add-on per subscription

Create add-ons - API Reference


Custom analytics

Build and view custom usage and revenue breakdowns tailored to your business metrics.
  • Custom dashboards: Create analytics views specific to your business needs
  • Overridden price tracking: Analytics now reflect overridden prices accurately

Usage breakdown by group in analytics

Other changes
  • Temporal workflow history and filters for better observability into background job execution
  • VAPI pricing units added to support voice API consumption-based billing
  • Edit subscription UI improvements
  • Charges search API now supports filtering for more precise query results

Credit grant editing

Modify the amount, expiry, or metadata of existing credit grants without needing to void and recreate them.
  • Edit existing grants: Update credit grant details directly without voiding

Update credit grant - API Reference


Prepaid and postpaid wallets

Choose between prepaid balance top-ups or postpaid usage-based wallet modes per customer.
  • Wallet modes: Configure wallets as prepaid or postpaid based on customer needs

Prepaid & promotional credits - Documentation


Backdated pricing

Create and update prices with past effective dates to accurately reflect historical billing arrangements.
  • Backdated price creation: Create prices with a past effective date
  • Retroactive price updates: Update existing prices retroactively to correct or adjust past pricing configurations

Sentry and observability improvements

We’ve reduced noise and improved traceability for background workflows.
  • Repository-level span reduction: Disabled repository-level Sentry span creation to reduce quota usage
  • Temporal integration: Integrated Sentry into Temporal workflows via a dedicated worker interceptor, improving traceability for background tasks

Wallet & credit accuracy

Enhanced wallet logic to correctly compute and expose credits available breakdown when retrieving real-time balance.
  • Transaction status verifiction: Wallet eligibility logic now verifies transaction status is completed before applying credits
  • Workflow optimizations: Overall wallet workflow optimizations for performance and correctness

Subscription API enhancements

Added a new API to fetch a subscription by ID with a minimal response and optional expand parameters.

Get Subscription - API Reference


Pricing & revenue analytics

Pricing validation and analytics capabilities have been extended.
  • Maximum active prices: Added validation for the maximum number of active prices to prevent configuration errors
  • Currency-segregated revenue trends: Revenue analytics extended to support currency-segregated revenue trends, recent subscriptions, and invoice payment status reporting

Add-ons & usage pricing

Add-on line item commitment support added to better model commitment/overage patterns.
  • Usage-based prices within add-ons: Support for usage-based prices within add-ons was introduced, enabling richer usage billing models
  • Add-on line item commitment: Support for add-on line item commitment was added

Other changes
  • Logging cleanup: enhanced content and removed unnecessary entity logs
  • Internal workflow changes to improve consistency and reduce noise in observability
  • Subscription start date precision normalized to milliseconds for consistency
  • The new subscription retrieval API with minimal response and expand parameters provides a leaner query option for clients

Bulk import and export in the dashboard

You can now import features and prices and run managed S3 exports from the UI. Billing and credit usage reports are available for download.
  • Import features and prices: Added UI support for importing features and prices, matching backend bulk-import capabilities.

Bulk import interface

  • S3 exports: Managed exports and downloadable reports for billing and credit usage

S3 Export - Documentation


Dashboard analytics improvements

Revenue trends and customer usage are clearer and more accurate in the dashboard.
  • Currency-segregated revenue: Revenue trends and invoice payment status now reflect the correct metrics in the UI
  • Customer usage: Improved visibility into usage at the customer level

Currency-segregated revenue trends

Region and routing stability

The frontend region selector now correctly handles US-region routing, including us.flexprice.io.
Other changes
  • Improved filtering, sorting, and usability across pricing, feature, and subscription lists
  • Enhanced subscription views with clearer overrides and metadata
  • Add-on configuration UI improved, supporting commitments and usage-based context
  • Query builder supports multi-select “Select All”
  • UI polish across revenue charts and subscription tables
  • Fixed onboarding issues for organization name and tenant persistence
  • Improved loading and error states in analytics views
  • Fixed revenue tooltip inconsistencies from partial invoice data
  • Improved frontend integration with updated analytics and usage APIs
  • Customer usage views backed by existing usage endpoints

Wallet and credit balance correctness

Wallet balances are now more accurate and transparent. Credits available reflect what customers can actually use, and wallet operations are safe under concurrency.
  • Wallet balances: Clear credits available breakdown, improving transparency and accuracy
  • Top-ups: Purchased credit top-ups now correctly contribute to usable credit balances
  • Eligibility: Credit eligibility now strictly applies only to completed transactions
  • Advisory locking: Wallet operations are protected with advisory locking to reduce race conditions under concurrency

Get Wallet Balance - API Reference


Add-on pricing flexibility

Add-ons now support usage-based pricing and commit-and-overage billing.
  • Usage-based pricing: Add usage-based prices to add-ons
  • Add-on line-item commitments: Introduced to support commit-and-overage billing models

Caching and performance groundwork

Introduced a Redis cache layer with environment-specific key prefixes to support multi-environment deployments safely.
Other changes
  • Added validation to prevent exceeding the maximum number of active prices
  • Extended feature filters to support not-contains queries
  • Improved wallet balance performance using the updated balance API path
  • Logging noise reduced by removing unnecessary debug and print statements
  • Subscription start dates normalized to millisecond precision
  • Reduced unnecessary observability overhead by removing redundant spans from data layers
  • Added a lightweight subscription fetch-by-ID API with optional expand parameters
  • Removed support for fetching inactive prices via lookup keys
  • Analytics APIs now expose recent subscriptions and invoice payment status

Import, export, and workflow foundations

Backend support for bulk import and S3 exports is in place. Invoice processing and workflow reliability are improved.
  • Bulk import: Added backend support for bulk importing prices and features
  • S3 exports: Added managed S3 export support for reports such as credit usage
  • Invoice and usage: Improved invoice processing alignment with feature usage tracking
  • Workflows: Strengthened workflow reliability with improved Temporal identity handling and timeout tuning

S3 Export - Documentation


Subscription and credit grant controls

You can cancel future subscription grants and set end dates on credit grants.
  • Cancel future grants: Added support for cancelling future subscription grants
  • Credit grant end-date: Added end-date support for credit grants

Other changes
  • Reintroduced price lookup keys in a controlled and validated manner
  • Improved tenant and environment isolation for exports
  • General workflow stability and timeout tuning
  • Fixed wallet balance discrepancies affecting “credits available”
  • Improved reliability of scheduled background workflows
  • Import and export endpoints for prices and features made available
For release history before these updates, see our GitHub releases.