Skip to content

Billing & Tiers

SessionFS uses a five-tier model. The free tier is permanent — capture, resume, and local search work without an account.

TierPriceKey features
Free$0Capture, resume, local search, local MCP
Starter$4.99/moCloud sync, dashboard, bookmarks, manual judge, deterministic summaries
Pro$14.99/moAutosync, remote MCP, handoff, PR/MR comments, project context, narrative summaries, DLP secrets (coming soon), auto-audit
Team$14.99/user/moEverything in Pro + org management, shared storage pool, org settings
EnterpriseContact salesEverything in Team + HIPAA DLP (planned), SAML SSO (planned), compliance exports (planned), security dashboard (planned), policy engine (planned), 6-year audit retention
TierCloud storage
Free50 MB sync limit
Starter500 MB
Pro500 MB
Team1 GB per seat (pooled)
EnterpriseUnlimited

Storage is checked on every sync upload. If you exceed your limit, the server rejects the upload with a clear error and your current tier’s limit.

When Stripe is not fully configured (missing secret key or price IDs), the server runs in beta mode. In beta mode, all features are available regardless of tier. The GET /api/v1/billing/status response includes is_beta: true so the dashboard can display a beta badge.

Beta mode is the default for self-hosted deployments that have not connected Stripe.

Billing is handled entirely through Stripe. SessionFS uses three integration points:

POST /api/v1/billing/checkout
{
"tier": "pro",
"seats": 1
}

Creates a Stripe Checkout session and returns a checkout_url. The seats field only applies to the Team tier. After successful payment, Stripe fires a checkout.session.completed webhook that updates the user’s tier.

Valid tiers for checkout: starter, pro, team.

POST /api/v1/billing/portal

Returns a portal_url for the Stripe Customer Portal where users manage payment methods, view invoices, upgrade, downgrade, or cancel.

The scope field controls which subscription the portal opens:

  • "auto" (default) — org portal for admins, personal portal for individuals
  • "org" — explicitly open the org subscription portal (admin only)
  • "personal" — open a personal subscription portal (if one exists alongside an org membership)

The server listens at POST /webhooks/stripe for these events:

EventAction
checkout.session.completedActivate subscription, set tier
customer.subscription.updatedHandle upgrades, downgrades, renewals
customer.subscription.deletedDowngrade to free
invoice.payment_failedLog warning (Stripe handles retry)

All webhook events are idempotently recorded. Duplicate deliveries are ignored.

GET /api/v1/billing/status

Returns current tier, storage usage, Stripe customer info, and whether the user is in an org. Org members see org-level billing state. The response also flags has_personal_subscription if a member had a personal plan before joining an org.

Org billing is separate from personal billing. When an org is created, the creator’s Stripe customer transfers to the org. From that point:

  • The org has its own Stripe customer ID and subscription
  • Only admins can create checkout sessions for team/enterprise plans
  • Members cannot purchase individual plans — their tier comes from the org
  • Subscription changes (upgrades, cancellations) via webhooks update the org directly

See Organizations for full details.

There are no billing commands in the CLI. All subscription management happens through the web dashboard at Settings > Billing, which redirects to Stripe for payment operations.

Tier gating applies to self-hosted instances. The Helm chart requires a license key that determines the available tier. Without a license, the instance runs in free-tier mode. Licenses are validated at startup and periodically thereafter.

To connect Stripe to a self-hosted instance, set these environment variables:

  • SFS_STRIPE_SECRET_KEY — Stripe secret key
  • SFS_STRIPE_WEBHOOK_SECRET — Webhook signing secret
  • SFS_STRIPE_PRICE_STARTER — Price ID for Starter tier
  • SFS_STRIPE_PRICE_PRO — Price ID for Pro tier
  • SFS_STRIPE_PRICE_TEAM — Price ID for Team tier

Without all five variables, the instance runs in beta mode with all features unlocked.