Appearance
Billing & Plans
Manage your subscription, payment method, and invoices from Account → Billing & Plans.
Plans
Every plan, quota and price shown in the Account, the sign-up flow and the website comes from one catalog (@nkapp/shared, pricing v2). The quotas are exactly these four, plus Teams seats:
| Plan | VPS hosts (SSH) | Remote environments | Cloud providers | API keys | Account type |
|---|---|---|---|---|---|
| DEV | — (local only) | — | — | 2 | personal |
| HOST | 2 | 3 | — | 5 | personal |
| PRO | 5 | 10 | 2 | 20 | personal |
| ULTRA | Unlimited | Unlimited | All | Unlimited | personal |
| TEAMS | Unlimited | Unlimited | All | Unlimited | teams (min. 2 seats) |
Host, Pro, Ultra and Teams include the agent control plane (nkapp mcp) within the plan's quotas. Host is offered only on deployments that enable pricing v2 (NANOKIT_PRICING_V2 server-side, VITE_PRICING_V2 / NEXT_PUBLIC_PRICING_V2 in the UIs); a new Host account can start with a 30-day trial, no card, and the Billing view shows the days left.
Changing plan
Pick Monthly or Yearly in the plan selector (yearly is 10× monthly — 2 months free). Moving from a free plan to a paid one opens a secure checkout. Moving between paid plans happens in place: you first see a preview of what is charged now, the new recurring amount and any boost the new plan does not offer, and nothing changes until you confirm. A downgrade's unused time is credited to your account and applied to future invoices — it is not refunded as cash. If your bank asks for extra confirmation (3-D Secure), the change stays pending — and grants nothing — until you complete the payment from the link shown.
Usage
Billing → Usage lists each quota as used / limit with the hosts and environments that count. Release a VPS host or a remote environment you no longer use: an environment frees its slot at once; a released VPS host keeps counting for 30 days after its last deploy ("Released — counts until …").
Boosts
On Host and Pro you can raise a quota without changing plan: +1 VPS host, +1 remote environment and, on Pro only, +1 cloud provider (at most +2). Boosts bill on your plan's interval, are prorated, and go through the same preview → confirm step. Ultra and Teams need none (everything is unlimited); an upgrade to them removes your boosts and credits the unused time. The Boosts section appears where the deployment enables it (VITE_BOOSTS).
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.
| Plan | Default price | Price env var(s) (cents) | Stripe price id env |
|---|---|---|---|
| DEV | Free (€0) | — | — |
| HOST | €9 / mo | NANOKIT_PRICE_HOST_MONTH, NANOKIT_PRICE_HOST_YEAR | STRIPE_PRICE_HOST_MONTH / _YEAR |
| PRO | €19 / mo | NANOKIT_PRICE_PRO_MONTH, NANOKIT_PRICE_PRO_YEAR | STRIPE_PRICE_PRO_MONTH / _YEAR |
| ULTRA | €39 / mo | NANOKIT_PRICE_ULTRA_MONTH, NANOKIT_PRICE_ULTRA_YEAR | STRIPE_PRICE_ULTRA_MONTH / _YEAR |
| TEAMS | €49 / mo base + €39 / user | NANOKIT_PRICE_TEAMS_MONTH, NANOKIT_PRICE_TEAMS_YEAR, NANOKIT_PRICE_TEAMS_SEAT | STRIPE_PRICE_TEAMS_MONTH / _YEAR |
Note. Prices are integer cents — e.g.
NANOKIT_PRICE_PRO_MONTH=1900is €19.00. Yearly amounts are independent env vars; the catalog convention is 10× monthly ("2 months free"). Boost prices useNANOKIT_PRICE_BOOST_<VPS_HOST|REMOTE_ENV|CLOUD_PROVIDER>_<MONTH|YEAR>.
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) | Default | Meaning |
|---|---|---|
NANOKIT_PRICE_TEAMS_MONTH | — | Base subscription, before seats. |
NANOKIT_PRICE_TEAMS_SEAT | — | Per-seat price up to the volume threshold (€39 documented). |
NANOKIT_PRICE_TEAMS_SEAT_VOLUME | — | Cheaper per-seat price above the threshold. |
NANOKIT_PRICE_TEAMS_VOLUME_THRESHOLD | 20 | Seat count at which the volume rate kicks in. |
Note.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 topersonal. 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.
| Mode | When | Behaviour |
|---|---|---|
| mock | Local dev (no Stripe key) | Fully in-process — plan changes activate instantly with a fake card. No network, no Stripe account needed. |
| sandbox | NANOKIT_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). |
| live | Production (sk_live_ key) | Real Stripe, real charges. |
Warning.Safety: while
NANOKIT_STRIPE_SANDBOXis 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
| Variable | Purpose |
|---|---|
NANOKIT_STRIPE_SANDBOX | 1/true → force sandbox (test) mode for that environment. |
STRIPE_SECRET_KEY | Stripe secret key. sk_live_… for live; sk_test_… for sandbox. |
STRIPE_SECRET_KEY_TEST | Optional dedicated test key, preferred in sandbox. |
STRIPE_WEBHOOK_SECRET | Verifies incoming Stripe webhooks. |
Test cards (sandbox)
In sandbox mode use Stripe's test cards — they never move real money:
| Card number | Result |
|---|---|
4242 4242 4242 4242 | Payment succeeds |
4000 0025 0000 3155 | Requires 3D Secure authentication |
4000 0000 0000 9995 | Declined (insufficient funds) |
Use any future expiry date, any 3-digit CVC, and any postal code. More test numbers are in the Stripe testing docs.
Note. 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.