Skip to main content

Plans & Billing

DriftWise offers three plan tiers. Billing runs through Stripe — upgrade, downgrade, and payment management happen on Stripe-hosted pages the app redirects you to. For the underlying HTTP endpoints, see the billing tag of the API reference.

Plan comparison​

LimitFreeTeamEnterprise
Cloud accounts110Unlimited
State sources150Unlimited
Scheduled scans120Unlimited
API keys210Unlimited
Seats110Unlimited
AI analyses (platform LLM)5 / weekUnlimited (20/hr rate limit)Unlimited (contract rate limit)
AI analyses (BYOK)UnlimitedUnlimitedUnlimited
History retention24 hours30 daysUnlimited
Concurrent scans120Unlimited

The platform weekly quota resets at 00:00 UTC each Monday (ISO week). The hourly rate limit is a fixed bucket (not sliding) — a burst of 20 calls at 12:59 followed by 20 more at 13:00 is intentional for runaway protection and does not degrade to a lower effective cap. BYOK requests bypass both the weekly quota and the hourly rate limit entirely. See LLM providers to configure a persisted BYOK credential.

Feature flags​

FeatureFreeTeamEnterprise
Slack notifications-YesYes
SSO / SAML (coming soon)-YesYes
Compliance Pack (SOC 2 evidence export)-Yes (30-day window)Yes (unlimited window)
Auto-discover state sources (glob over a bucket)-YesYes

Usage​

The usage endpoint returns current seat counts and subscription status. seats.included of -1 means unlimited. The legacy monthly analysis count was removed in migration 00037 — platform-LLM throttling now lives on a weekly quota + hourly rate-limit pair, exposed separately at GET /orgs/:id/llm-usage. See Platform LLM Quotas for the quota mechanics.

Upgrading​

Via the UI​

Go to Settings > Billing and click Upgrade. This is the path 99% of users take.

Via the API​

The checkout endpoint creates a Stripe Checkout session and returns a hosted URL you redirect the user into. Accepts month or year as the billing interval. The route is OIDC-only — API keys are rejected outright because billing changes must map to a specific human in the audit log.

Managing your subscription​

The Stripe-hosted Customer Portal is where subscription changes, payment method updates, invoices, and cancellations live. DriftWise doesn't replicate that UI — we generate a one-time portal URL and redirect you to it.

Enforcement​

Plan limits are enforced at the handler layer, not at billing time. Every block returns the canonical PaymentRequiredResponse shape (code, message, required_plan, plan, plus code-specific details); the code field is the stable discriminator callers should switch on. The full code set:

codeHTTPEmitted whenExtra fields
plan_limit_exceeded402Resource-count limits: cloud accounts, state sources, scheduled-scan count, API keys, seatsresource, limit, used
plan_concurrent_limit402Bulk or scheduled scan would push concurrent scans over caplimit, current
plan_schedule_frequency402Cron expression fires more often than the plan's minimum intervalmin_interval, interval
plan_feature_unavailable402Feature gate: Slack, SSO, Compliance Packfeature
plan_weekly_quota_exhausted402Platform-LLM weekly quota reachedused, cap, week_resets_at, byok_config_url
plan_hourly_rate_limit*429Platform-LLM hourly rate limit reached; response carries Retry-Afterused, cap, hour_resets_at, byok_config_url
plan_hard_off402Plan has the platform-LLM gate explicitly disabled (cap=0)bucket

* The 429 is not a PaymentRequiredResponse — its body carries the discriminator in the error field ("error": "plan_hourly_rate_limit"), not in a code field. Dispatch on error for the hourly limit; code for the 402s.

See Platform LLM Quotas for the weekly / hourly / BYOK interaction.

What gets enforced​

LimitEnforcement
Cloud accounts402 plan_limit_exceeded on account creation
State sources402 plan_limit_exceeded on state source creation
Scheduled scans402 plan_limit_exceeded on schedule creation
API keys402 plan_limit_exceeded on key creation
Seats402 plan_limit_exceeded on member invitation
Concurrent scans402 plan_concurrent_limit on bulk/scheduled scan
Schedule interval402 plan_schedule_frequency if cron fires more often than plan allows
Feature gates (Slack, SSO, Compliance Pack)402 plan_feature_unavailable on feature access
Platform-LLM weekly quota402 plan_weekly_quota_exhausted on analyze / fix; quota-exhausted drift narratives terminalize as skipped on the snapshot (no HTTP error — narratives run in the worker)
Platform-LLM hourly rate limit429 plan_hourly_rate_limit with Retry-After

Legacy count/cost caps (max_analyses_per_month, daily_token_limit) were replaced by the weekly/hourly gate pair in migration 00037 — those columns still exist for analytics back-compat but are all -1 (unlimited) and no longer enforced.

BYOK bypasses both the weekly quota and the hourly rate limit — you pay your LLM provider directly, and platform counters are never touched.

Seat overage​

Team plans include 10 seats. Additional seats are $12/month each, billed automatically through Stripe. Seat overage is best-effort: membership creation is never blocked by a failed Stripe seat-sync call. The Stripe call runs synchronously after the membership row commits and before the HTTP response is written; failures are logged and never block the membership, so a transient Stripe outage leaves the member added but under-billed until the next sync.

Endpoint reference​

All billing endpoints are documented in the billing tag of the API reference.