Skip to Content
Account & TeamsBilling & Plans

Billing & Plans

Manage your subscription, payment method, and invoices from Account → Billing & Plans.

Plans

PlanForAccount type
DEVLocal sandbox & personal experiments (free)personal
PROProfessional developers, cloud hosting, productionpersonal
ULTRAPower users: scalability, compliance, infra planningpersonal
TEAMSShared workspaces with Ultra accounts for every memberteams

Switching plans is instant via the plan selector. The response re-issues your session token so the new plan and entitlements take effect immediately.

Pricing (env-configurable)

Plan amounts are not hardcoded. The plan catalog (PLAN_CATALOG) is built at runtime from NANOKIT_PRICE_* environment variables, expressed as integer cents. This lets a deployment set its own currency/amounts without code changes; the values below are the documented defaults, not fixed prices.

PlanDefault pricePrice env var(s) (cents)Stripe price id env
DEVFree (€0)
PRO€19 / moNANOKIT_PRICE_PRO_MONTH, NANOKIT_PRICE_PRO_YEARSTRIPE_PRICE_PRO_MONTH / _YEAR
ULTRA€39 / moNANOKIT_PRICE_ULTRA_MONTH, NANOKIT_PRICE_ULTRA_YEARSTRIPE_PRICE_ULTRA_MONTH / _YEAR
TEAMS€49 / mo base + €39 / userNANOKIT_PRICE_TEAMS_MONTH, NANOKIT_PRICE_TEAMS_YEAR, NANOKIT_PRICE_TEAMS_SEATSTRIPE_PRICE_TEAMS_MONTH / _YEAR

[!NOTE] Prices are integer cents — e.g. NANOKIT_PRICE_PRO_MONTH=1900 is €19.00. Yearly amounts are independent env vars (commonly discounted vs. 12× monthly).

Teams per-seat tiering

A Teams bill is base + per-seat, with an optional volume tier for large teams. The monthly total for n active seats is:

base + min(n, threshold) × perSeat + max(0, n − threshold) × volumeSeat
Env var (cents)DefaultMeaning
NANOKIT_PRICE_TEAMS_MONTHBase subscription, before seats.
NANOKIT_PRICE_TEAMS_SEATPer-seat price up to the volume threshold (€39 documented).
NANOKIT_PRICE_TEAMS_SEAT_VOLUMECheaper per-seat price above the threshold.
NANOKIT_PRICE_TEAMS_VOLUME_THRESHOLD20Seat count at which the volume rate kicks in.

Choosing TEAMS unlocks team creation. The plan and the account type are kept in sync: moving to the Teams plan sets your account to teams; moving to any other plan sets it back to personal. Existing accounts that were on the Teams plan are reconciled automatically on next load. See Account types.

Seats (Teams plan)

A Teams subscription includes a number of seats. Active members count against seats; inviting beyond your seat count prompts you to add seats. Only the Owner manages billing and seats (see the roles matrix).

Payment method

Add or update a credit card from the Billing view. Card details are handled through a certified payment gateway — Nanokit never stores raw card numbers.

Invoices

The Invoice and Payment History table lists each invoice with its issue date, payment method, amount, and status (Paid / Pending). Download any invoice as a record for your accounting.

Billing modes (mock / sandbox / live)

Billing (the api-billing service) runs in one of three modes, selected per environment — never hardcoded. The Account UI shows the active mode so you always know whether charges are real.

ModeWhenBehaviour
mockLocal dev (no Stripe key)Fully in-process — plan changes activate instantly with a fake card. No network, no Stripe account needed.
sandboxNANOKIT_STRIPE_SANDBOX=1 (e.g. staging/test)Stripe test mode: real Checkout/webhooks with test cards, no real charges. If no test key is configured, falls back to the in-process simulation (still fake cards).
liveProduction (sk_live_ key)Real Stripe, real charges.

Safety: while NANOKIT_STRIPE_SANDBOX is on, a live Stripe key is refused — a sandbox/test environment can never charge a real card. A test key (sk_test_…) without the flag automatically runs in sandbox.

Configuration

VariablePurpose
NANOKIT_STRIPE_SANDBOX1/true → force sandbox (test) mode for that environment.
STRIPE_SECRET_KEYStripe secret key. sk_live_… for live; sk_test_… for sandbox.
STRIPE_SECRET_KEY_TESTOptional dedicated test key, preferred in sandbox.
STRIPE_WEBHOOK_SECRETVerifies incoming Stripe webhooks.

Test cards (sandbox)

In sandbox mode use Stripe’s test cards — they never move real money:

Card numberResult
4242 4242 4242 4242Payment succeeds
4000 0025 0000 3155Requires 3D Secure authentication
4000 0000 0000 9995Declined (insufficient funds)

Use any future expiry date, any 3-digit CVC, and any postal code. More test numbers are in the Stripe testing docs .

Nanokit’s hosted environments use sandbox outside production, so you can try upgrades, downgrades, and team seats end-to-end with the test cards above — nothing is charged. Production runs in live mode.