Deployment mode

A single environment variable switches Tether between three modes that control billing, asset limits, and the availability of the demo reset endpoint.

Modes

ModeAsset limitsBilling UIDemo reset endpointUse when
selfhostedNoneNot shownNot availableYou run Tether on your own infrastructure. This is the default.
saasEnforced by tierShown in sidebarNot availableYou run a hosted SaaS service (like atechsolutions.org) where customers pay per tier.
demoNoneNot shownAvailable at /api/admin/demo-resetA shared demo instance that resets automatically. Never use on a production install.
bash
# In .env: DEPLOYMENT_MODE=selfhosted # default DEPLOYMENT_MODE=saas DEPLOYMENT_MODE=demo

selfhosted (default)

No asset limits, no billing page, no upgrade prompts. All features are fully available. The Plan page (accessible from the MSP sidebar) shows a message explaining that this is a self-hosted installation with no limits.

This is the correct mode for the vast majority of users — anyone running Tether on their own VPS, bare-metal server, or internal infrastructure.

saas

Enables the full billing and tier system. When this mode is active:

Tiers

Tier keyAsset limitPrice (CAD/mo)
trial250Free (30 days)
starter250$49
growth1,000$129
scale5,000$349
enterpriseUnlimitedCustom
selfhostedUnlimited$0 — self-managed

Clients and users are unlimited on every tier. Only managed assets (total across all tenants) count toward the limit.

Managing tiers

Tier changes are applied via the API after a customer pays. Tether does not include built-in payment processing — integrate Stripe or your preferred payment provider and call this endpoint on successful payment:

http
PUT /api/billing/tier Authorization: Bearer {msp-admin-token} Content-Type: application/json {{ "tier": "growth", "billing_email": "billing@theirclient.com", "notes": "Stripe customer ID: cus_abc123" }}

What happens when the limit is reached

When a tenant reaches or exceeds their asset limit:

demo

Same as selfhosted but also mounts the reset endpoint:

http
POST /api/admin/demo-reset X-Reset-Secret: your-reset-secret

This endpoint wipes the entire database and reseeds it with 4 tenants, 40 assets, checkout history, and open requests. It is called by a Cloudflare Worker cron every hour. The RESET_SECRET environment variable protects it from unauthorised calls.

Never use demo mode on a production install

The /api/admin/demo-reset endpoint deletes ALL data in the database with no confirmation. If this is called on your production instance — even accidentally — you will lose everything.

Last updated: May 2026