Get started
BETA
Browse docs
Account & Billing

Usage and limits

Where to see your current plan, how to tell when you're about to hit a limit, and what each limit error looks like.

This page tells you where to look when you suspect you're about to hit a plan limit, and what each limit error looks like when you trip it.

For the actual numbers per tier, see Plans and limits — that page is generated against the server's enforcer and is canonical.

Where to see what you're using

From the CLI

justtunnel status is the single command that reports your current account state:

justtunnel status

It prints your active plan, your active context, and (when authenticated) high-level account info. It's the fastest way to confirm "what plan am I on right now?" — including any gifted plan that overrides your Stripe plan. See justtunnel status.

From the dashboard

The dashboard shows your plan, current tunnels, and reserved subdomains. The Stripe billing portal (linked from the dashboard) is canonical for invoices, payment methods, and subscription state.

Programmatically

GET /api/plans returns the limits matrix for every tier with no auth required. The landing page renders against this endpoint so the published numbers always match what the server enforces.

What you see when you hit a limit

The server emits three structured limit errors. Each carries a stable code field, a human-readable message, and an upgrade URL. The CLI surfaces the message verbatim.

TUNNEL_LIMIT_REACHED

You tried to open a tunnel beyond your plan's concurrent-tunnel cap. Source: internal/plan/enforcer.go:69.

Free plan limited to 1 tunnel. Upgrade to Starter for 2 or Pro for 5.

The wording adapts to your plan — Starter sees "Upgrade to Pro for 5"; Pro sees "Pro plan limited to 5 tunnels."

Fix: close one of your existing tunnels, or upgrade. justtunnel (with no subcommand) lists your active tunnels; closing the CLI process for a tunnel ends that session.

PLAN_LIMIT_REACHED

You tried to set a password on a tunnel and you're already at your plan's password-protected-tunnel cap. Source: internal/plan/enforcer.go:87.

Your free plan allows 1 password-protected tunnel(s). Upgrade for more.

Fix: drop the --password flag, close one of your existing password-protected tunnels, or upgrade. See Password protection.

RESERVED_SUBDOMAIN_NOT_ALLOWED

You passed --subdomain <name> on a non-Pro plan. Source: internal/plan/enforcer.go:106.

Reserved subdomains require a Pro plan. Upgrade to Pro for reserved subdomains.

Fix: drop --subdomain (you'll get a random name) or upgrade to Pro. Random names are fine for webhooks and demos; reserved names are for staging URLs that need to stay the same. See Subdomains.

Edge-level limits

Two limits are enforced at the edge proxy rather than at tunnel-create:

  • Per-tunnel rate limit. Requests beyond your plan's per-minute budget receive HTTP 429. The limit is applied per-tunnel, not per-account, so two tunnels each get their own bucket.
  • Inactivity reaper (Free only). A tunnel with no traffic for 2h is closed by the edge. Your CLI will reconnect if it's still running. Paid plans have no reaper.

These limits are not surfaced as JustTunnel error codes — they look like a normal 429 or a normal WebSocket close to the client.

When a downgrade hits your limits

If your plan downgrades — voluntary cancellation, payment failure past grace, or a manual admin action — the server enforces the new caps automatically:

  • Excess tunnels are closed oldest-first (internal/billing/downgrade.go:39).
  • Reserved subdomains are released if you're dropping away from Pro (internal/billing/downgrade.go:60).
  • Workers above the new cap are quarantined.

You receive a "plan downgraded" email when this happens. See Upgrade and downgrade → What happens on downgrade.

On this page