Plan & usage
Open Settings → Plan in Thermal →
What it's for
Plan & usage is Thermal's own subscription meter for this company — counted jobs in the current service period, the estimated earned charges for that period, and the statement behind those numbers. There are no plan tiers and no seat count on this page. Every released module is commercially included; module on/off lives on Settings → Capabilities.
Reach it from Settings → This company → Plan in the sidebar, at /settings/plan. The
page title is Plan & usage.
This is Thermal billing you, not customer invoicing. Invoice numbering, payment terms, and tax defaults stay on Settings → This company → Invoicing. Contractor card payments (taking money from customers) stay on Payments. The card that pays Thermal lives in the Billing section on this page.
Tabs
This screen has no tabs. Organization owners and delegated billing administrators (org-wide session) see a status band, an estimate, usage by branch and by week, a statement, bill-warning settings, and the Billing section (payment method, Thermal invoices, contacts, and — owners only — who holds the billing-administrator grant). A branch-scoped session sees that branch's counts and statement only — never money amounts, another branch's rows, or Billing. Office staff without a billing grant see sync and pause status only.
Panels and controls
This period
A summary card with Billing status, Service dates, and Period progress. Statuses include Alpha · no charge, Paid conversion notice given, Active, Past due, Canceling at period end, and Canceled. The dates are the subscription window, never a rolling 30 days labelled "this month".
If this company has no org_subscriptions row yet, the card shows Not
configured. Nothing is guessed and nothing is charged.
A stepper tracks the period: Period open → Closing → Finalized. The estimate stays labelled estimated until the period is finalized.
Estimate
Shown only to organization owners and delegated billing administrators on an org-wide session. It is estimated earned charges for this period, not an invoice total — the next invoice is next period's base fee plus this period's usage. The tile footer says so.
The math is B + p × max(0, Q − I): base fee, plus unit rate times counted
jobs above the included quantity, minus credits, then any discount,
then a Beta ceiling if the terms carry one. A ceiling only ever waives
charges; it never adds one. Alpha terms show a zero-charge statement.
Counted jobs is the chain-netted counted total for the period. A later credit still nets against the original recognition, so a counted-then-credited job shows once as Credited, not twice.
Usage
Counted, excluded, credited, and pending-verification totals, split by branch and by week. Weeks are 7-day buckets cut from the period start. The week a unit was recognized in does not move when a later correction changes its disposition.
Pending verification means a counted row has not been confirmed with the billing provider yet — the estimate can still move. It is not a cap.
Statement
One row per job billing identity, newest recognition first: job, date, branch, counted / excluded / credited (or pending verification), reason, charge reference, how the job was created, who completed it, and which channel. Reasons include internal work, rental staging or delivery, demo data, completed before billing began, no billing terms at completion, and Alpha preview.
Export CSV downloads the same rows the screen would show for this session — a branch-scoped export is that branch only — capped at 5,000 rows. Office staff without a billing grant are redirected rather than handed an empty file that would read as "no usage".
Bill warnings
Owners set a bill warning amount. Delegated billing administrators can too. Alerts fire at 50%, 80%, and 100% of that amount, once per crossing per period. The warning alerts you; it does not cap the bill. Extra recipient emails can be added; required notices still go to the organization owner. Channel toggles on this page are explanatory only — in-app history plus email are the channels for bill notices; text messaging is live, but texting US numbers waits on carrier registration, which is in progress, and it is not a self-serve switch here.
A timeline lists customer-facing notices for the period (or the last 30 days when there is no subscription), with delivery state: Delivered, Retrying, Undeliverable, or Waiting to send. Thermal-operations rows never appear here.
Billing
Org-tier only (owner or delegated billing administrator, org-wide session). This is Thermal billing you — the card, invoices, and contacts for the subscription. Contractor invoicing stays on Settings → This company → Invoicing.
Payment method. Card on file, or No payment method on file. Add
card / Replace card loads Stripe.js on demand and mounts Stripe's
Payment Element. The card number, CVC, and expiry never reach Thermal — the
browser posts them to Stripe against a SetupIntent client secret, and the
server stores only the resulting pm_… handle. The tile says so: "Your
Thermal subscription invoices only — not your own customers' invoices."
If this deployment has no subscription-billing Stripe key, the section says Card payments aren't set up on this deployment yet rather than pretending the form works. A missing Stripe customer, or a failed provider call, each get their own sentence — a provider outage is never rendered as "no invoices."
Invoice history. Thermal's invoices for this organization, once a
billing period is finalized, matched against billing_periods. A period
Thermal recorded but the provider did not return shows as Not readable /
under review, not as a blank history.
Billing contacts. Name, email, optional phone, and a contact role (Billing / Accounts payable / Owner — a job title, not a permission). One contact is primary ("receives every invoice and notice"). Promoting a new primary and clearing the previous one happen in the same transaction.
Billing administrators (org-wide owners only). Toggles
users.billing_administrator on live office staff in this org.
Technicians are not listed: the grant cannot reach them. A delegated
administrator manages contacts, the payment method, warning thresholds, and
statements; they cannot grant the role to anyone else.
What it accepts
This screen does not change the subscription, the unit rate, or Auto authority. Org-tier sessions can save a bill-warning amount, add or remove alert recipients, manage billing contacts, and save a payment-method id. Only an org-wide owner can grant or revoke billing administrators. Everything else is read-only.
How to configure it
- Module on/off is Settings → Capabilities. Packs (HVAC, Fire & Life Safety, Commercial Plumbing, Commercial Electrical, Elevators & Escalators) activate there too; they are not listed on this page.
- Automation Auto mode is included for every company. Each module's own Off/Suggest/Auto setting on the Automations screen controls whether it runs unattended, and only an owner can turn Auto on.
- A monthly automation run limit that has been hit shows as a pause on this page. Manual work continues; the subscription rate does not change.
Who can see it
- Owners (org-wide session) see subscription figures, the estimate, the full statement, Billing, and can edit bill-warning settings and who administers billing.
- Delegated billing administrators (org-wide session, no owner role)
see the same finance and Billing as an owner. They cannot change who else
holds the grant. The grant is a property of
(org, staff row)— it never authorizes a session in a different org. - Owners or office users scoped to a branch — including a staff row that holds the grant — see that branch's usage and statement counts only. No money amounts, no other branch, no alert settings, no Billing. The grant never lifts a branch session to org-wide private finance.
- Office staff without a billing grant see sync and pause status only.
- Dispatchers and technicians cannot reach Settings. A technician hitting the direct URL is denied; their pause state lives in the field app. The grant cannot be given to a technician.
The full role matrix is on Roles & permissions.