Billing & plans¶
Dezycro is sold per-seat with a monthly AI token allowance that scales with your seat count. All paid tiers ship with the full product surface — what differs is the price model, seat structure, monthly token budget, and a few high-touch features (SSO, BYOK, priority queue).
Plans¶
| Free | Pro | Team | Enterprise | |
|---|---|---|---|---|
| Price | $0 / month | $20 / month (1 billable user) | $39 / user / month (min 3) | Custom (target $150–300 / user) |
| AI tokens / billable user / month | 2M | 15M | 40M | Unlimited or BYOK |
| Daily token cap | 200K | — | — | — |
| Workspaces | 1 | 5 | Unlimited | Unlimited |
| Projects per workspace | 1 | Unlimited | Unlimited | Unlimited |
| Features per project | 3 | Unlimited | Unlimited | Unlimited |
| Billable users | 1 | 1 (Owner only) | Unlimited, subject to cap | Unlimited, subject to cap |
| Viewers | — | Unlimited, free | Unlimited, free | Unlimited, free |
| SSO | — | — | — | ✓ |
| BYOK (your own LLM keys) | — | — | — | ✓ |
| Audit log retention | — | 30 days | 90 days | 1 year (or custom) |
Public pricing: dezycro.ai/pricing.
Tokens reset monthly. Your tenant's monthly budget is paidSeats × monthlyTokensPerSeat — e.g. a Team plan with 4 seats has a 160M token allowance pooled across the tenant. The 200K daily cap is a Free-tier anti-abuse measure only.
Roles, seats, and what counts¶
Dezycro has two role hierarchies and one billing concept that ties them together.
Tenant role¶
Organization-wide — applies across every workspace.
| Tenant role | Billable? | What they can do |
|---|---|---|
| Owner | ✓ | Everything, including billing & cap management |
| Admin | ✓ | Everything except billing |
| Member | ✓ | Create + edit content in any workspace they belong to |
| Viewer | ✕ | Read-only across the tenant. Does not consume a seat. |
Workspace role¶
Per-workspace — Admin / Editor / Viewer. Workspace roles are a finer-grained permission set inside a single workspace; they don't affect billing on their own.
A user with tenant role Viewer is constrained to workspace role Viewer in every workspace — you can't promote them to workspace Editor without first promoting them to tenant Member.
Billable user¶
A user whose stored tenant role is Owner, Admin, or Member. Stored — not effective. (See Pro role facade for why that distinction matters.) Viewers are not billable.
Your Stripe subscription quantity is kept in sync with the billable count automatically (see Auto-seat below) — there is no manual "add seat" / "remove seat" flow.
Pro role facade¶
The Pro plan supports one billable user — the Owner — but doesn't force you to delete or demote other members. The way this works at runtime:
- Stored roles are never mutated by plan changes. When you upgrade Team → Pro, every existing member keeps their stored
Member/Admin/ workspace role in the database. - At request time, when
tenant.tier == PRO, every non-Owner user is treated asViewer— both tenant role and workspace role — regardless of what's stored. The transformation runs at the central auth layer (every service sees the same view) and on the user's/meendpoint (so the UI shows what they can actually do).
This makes Pro fully reversible:
- Upgrade Team → Pro → other members go view-only, no data lost.
- Downgrade Pro → Team → every member's stored role becomes their effective role again, instantly. No migration step.
On the billing page, Pro tenants with more than 1 stored billable user see:
"N members are stored as Member/Admin but are view-only on Pro. Upgrade to Team to restore their roles."
Auto-seat (Team only)¶
Pro is a flat plan: quantity is always 1, regardless of how many users exist. Auto-seat applies to Team:
- Adding a billable user (invite a new Member, or promote a Viewer to Member/Admin):
- If
billableUserCount > 3→ Stripe quantity is incremented by 1, prorated immediately. - If
billableUserCount ≤ 3→ no Stripe change. You're already paying the 3-seat floor.
- If
- Removing a billable user (delete, or demote to Viewer):
- If
billableUserCount (after) ≥ 3→ Stripe quantity is decremented by 1, effective at the end of the current period (no immediate refund). - If
billableUserCount (after) < 3→ no Stripe change. Quantity stays at the 3-seat floor.
- If
In short: Team always pays for at least 3 seats. Below that, you have paid-for headroom you can use any time without changing your bill.
Stripe quantity sync is atomic per-tenant (Postgres row lock + Temporal workflow), so rapid invites are coalesced into a single Stripe call and concurrent role changes can't race past the cap.
Billable-user cap (Team & Enterprise)¶
To protect against an over-eager admin doubling your monthly bill, the Owner can set a maxBillableUsers cap — a hard upper bound on the billable user count. Independent of Stripe quantity: the cap controls consumption, not payment.
- Owner-only. Only users with
BILLING_MANAGEpermission can set or change it — by default, just the tenant Owner. - Applies on Team and Enterprise only. Setting a cap on Free or Pro returns
CAP_NOT_SUPPORTED(Pro is structurally capped at 1 by the facade; Free is single-user). - Lower bound =
max(currentBillableUserCount, tier.seatFloor). We never auto-demote — you can't shrink the cap below what's already used. (CAP_BELOW_USAGEif you try.) - Upper bound = none. Set to
nullfor unlimited. - Stripe quantity is unaffected by cap changes.
What happens when the cap is reached?
| Path | Behavior |
|---|---|
Admin invite / role promotion (POST /api/manage/users, PUT /api/manage/users/{id}/role) |
Hard block — HTTP 400 BILLABLE_CAP_REACHED. Admin must re-invite with Viewer role. |
| User self-join (OAuth callback, invitation acceptance, domain auto-join) | Soft fallback — user is shown a dialog explaining the cap is reached and offered to join as a Viewer instead. Requires explicit consent. |
Cap state is read and mutated under a Postgres SELECT ... FOR UPDATE lock on the tenant row, so concurrent self-joins can't squeeze past it.
Setting the cap¶
Organization Settings → Billing → Billable user cap.
UI shows current cap (or "Unlimited") with a hint like "You're using N of M cap". Admins (non-owner) see the value but can't edit. Members and Viewers don't see this section.
Upgrade & downgrade¶
Free → Pro¶
Billing page shows: "$20/mo for 1 billable user. Unlimited free Viewers." If you already have more than 1 billable user, you also see a warning that the others will become view-only via the Pro facade until you upgrade to Team.
Free / Pro → Team¶
Billing page shows a per-seat cost preview computed at checkout:
billableUserCount ≥ 3→ "You have N billable members. Starts at N × $39/seat/mo = $(N × 39)/mo."billableUserCount < 3→ "Team requires a minimum of 3 seats. You have N billable members. Starts at 3 × $39 = $117/mo. You can invite up to (3 − N) more members without increasing your bill."
You must acknowledge the line item before checkout.
Team → Pro¶
Stored roles are not touched. Other members go view-only at runtime via the facade. Stripe quantity drops to 1.
Paid → Free (cancellation, payment failure)¶
- Tenant tier flips to FREE; subscription stops.
- Free's limits apply: 1 workspace, 1 project per workspace, 3 features per project, 1 user total, 2M tokens / mo, 200K daily cap.
- Existing resources above those limits are preserved but read-only. You can't create more or invite new users until you upgrade.
- Any
maxBillableUserscap is cleared (it doesn't apply on Free). - The admin sees a warning summarizing what's now past the limit and prompting an upgrade.
Stripe portal¶
Organization Settings → Billing → Manage subscription opens the Stripe customer portal: update payment method, download invoices, change plan (upgrades prorate immediately; downgrades apply at next renewal), or cancel.
The "Manage subscription" link is gated by BILLING_MANAGE permission — Owner-only by default.
What counts toward your AI token allowance¶
Your monthly budget is paidSeats × monthlyTokensPerSeat, pooled across the tenant — anyone in the tenant draws from the same bucket.
| Operation | Typical tokens / call |
|---|---|
| Test case generation (from TRD) | 20,000–50,000 |
| AI chat messages (PRD editing) | 1,000–5,000 |
| AI autocomplete (in-editor) | 500–2,000 |
/dezycro:author PRD/TRD authoring |
5,000–30,000 |
| Workbook sweeps (Companion) | 2,000–8,000 |
What does NOT count¶
- Document upload + ingestion (embeddings run on shared infra)
- Vector search retrievals
- Reading the workbook, listing features, navigating the UI
- Verifier binary execution (runs locally; no LLM)
Hitting the cap¶
- The in-flight LLM call is allowed to complete.
- Subsequent LLM-gated actions return: "Monthly AI token allowance exhausted. Upgrade to continue."
- Non-LLM features (workbook editing, test runs, verifier, document upload, navigation) keep working.
Upgrade or add seats at any time from the Stripe portal — the new allowance applies immediately.
Subscription status API¶
For programmatic access, GET /api/billing/subscription-status returns:
| Field | Meaning |
|---|---|
tier |
FREE / PRO / TEAM / ENTERPRISE |
paidSeats |
Stripe quantity (Pro=1, Team=max(billableMembers, 3), Free=0) |
billableMembers |
Stored Owner + Admin + Member count |
viewerCount |
Stored Viewer count |
pricePerSeatCents |
2000 (Pro), 3900 (Team), custom (Ent), null (Free) |
seatFloor |
1 (Pro), 3 (Team), null (Free) |
monthlyTokensPerSeat |
2_000_000 / 15_000_000 / 40_000_000 / null (Ent BYOK) |
dailyTokenCap |
200_000 (Free), null otherwise |
maxBillableUsers |
The Owner-set cap, or null if uncapped |
currentPeriodEnd |
ISO timestamp for the renewal date |
Audit trail¶
Every billing-affecting action lands in the audit log:
| Action | When it fires | Key metadata |
|---|---|---|
SEAT_ADDED |
Billable user created or promoted into a billable role | user, new quantity, prorated amount, floorHeadroomUsed |
SEAT_REMOVED |
Billable user deleted or demoted to Viewer | user, new quantity, flooredAtMinimum |
PLAN_UPGRADED |
checkout.session.completed webhook |
old tier, new tier, billable count, starting quantity, users affected by facade |
PLAN_DOWNGRADED |
Subscription cancelled or payment failure | old tier, new tier, reason |
BILLING_CAP_CHANGED |
Owner edits maxBillableUsers |
oldCap, newCap, current billable count, paidSeats |
Enterprise / BYOK¶
Enterprise tenants can avoid Dezycro's token meter entirely by configuring BYOK — all AI calls go to your own provider account and are billed there. Your Dezycro invoice becomes just the seat fee.
Enterprise contracts are set up by sales: Stripe subscription quantity and price are negotiated upfront. Auto-seat still runs (role changes adjust quantity within the negotiated bounds), but pricing is not enforced by the application.
Contact sales for Enterprise pricing.