Billed by segments and minutes, not by rows

A long text is several segments, an inbound text costs money too, and a call is minutes — all recorded at send time with the price that applied.

What it is

Each send records a billable quantity, a rate-card key, a direction and a snapshotted per-unit price. That means SMS is counted by segment (including the drop to shorter segments when a message contains an emoji or curly quote), inbound texts are counted at all, and calls are counted by minute.

Also called: long text costs more · emoji in a text · sms segments · call minutes · under-billing

See it
Billed by segments and minutes, not by rows
CustomerBuildingAmountStatus
Gideon AltRiding Arena$11,080Sent
Marlin HooverRiding Arena$1,200Approved
Ivy Brubaker30×40 Garage$10,510Draft
Marlin HooverHobby Shop$10,700Sent
Ronan Petsch30×40 Garage$15,640Sent
A usage detail table: message body, segment count, direction, unit price at send time. src/lib/commsBilling.ts backing the usage screen. Sample data — no customer information appears here.
How it works
  1. 1units, unit_kind, direction, retail_usd and billed_at live on every send row.
  2. 2retail_usd snapshots the tenant's rate at the moment of sending.
  3. 3Existing email rows were backfilled to one unit against the email rate so they price identically to before.
  4. 4Rows that predate snapshotting keep a null price and continue to be priced from the rate card.
Why we built it

Every metering error ran in the same direction. A 300-character text costs two segments and was billed as one; a 200-character text with a single emoji in it costs three; inbound texts cost money and were never recorded at all; calls are billed by the minute and no duration was being stored. Usage now records what the carrier actually counts — segments, direction, call duration — and the rate is stamped onto each record as it is written, because re-pricing old usage at today's rates would rewrite an invoice that has already been paid and make an ordinary rate change look like fraud on the next statement.

The problem
  • Long or emoji-containing texts counted as one unit.
  • Inbound texts not metered at all.
  • Historical usage re-priced by a later rate change.
Sound familiar?
What you get
The bill reflects what the carrier actually charged.
A rate change never rewrites an invoice already paid.
Backfilled history prices exactly as it did before.

See it on your own jobs

Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.

or keep browsing features →