Skip to content

Seat-based billing, explained

What per-seat pricing means, why vendor seat files are snapshots rather than deltas, and where confirmation and proration actually get complicated.

Sonic AI team

Finance operations

16 Sept 20264 min read

Usage & SeatsTemplates, snapshots, confirmation days, meters, and high-volume ingestion.

Seat-based billing (also called per-seat or per-user pricing) charges a customer based on how many people inside their organisation are using the product — a flat rate multiplied by an active-seat count, billed on the subscription's cadence. Salesforce, Slack, and most B2B collaboration tools price this way because the value scales with headcount, and the pricing story is easy to explain: more people, more cost.

The pricing model is simple. The billing mechanics behind it are where most of the real work is.

The two questions every seat billing system has to answer

  1. How many seats did the customer actually have, on which days?
  2. Which of those seats are actually billable — did an add stick around long enough to count, did a removal cancel out something still pending?

Get either wrong and the invoice disagrees with what the customer's admin console says, which is the fastest way to lose an AR argument.

Seat data is a snapshot, not a delta

Vendor seat exports almost always arrive as absolute daily counts — "Customer A had 42 seats on March 3rd" — not as an increase or decrease from the day before. That distinction matters more than it sounds:

Column type What it claims Why it matters
Daily absolute count The seat count on a specific date Reconciles cleanly at any point
Peak / max-in-period The highest count seen in a window Useful as a sanity check
Increase / delta "+3 since yesterday" Breaks the moment "yesterday" belonged to a different customer in the export

A seat billing system should treat every row as a snapshot — a photograph of the truth on that date — compare it to the balance already on record, and emit a billing event only when the number actually changed. Importing a vendor's delta column directly is how seat counts silently drift at every customer boundary in the file.

Confirmation windows: not every add should bill immediately

Seat counts fluctuate — someone gets added for a trial, removed three days later. Billing every fluctuation the instant it appears in a file produces invoices full of seats that were never really "used." Most serious seat-billing setups support a confirmation window: an add on date D only becomes billable if the higher count still holds N days later. Removals, by contrast, should never wait — a removal is real the moment it's reported.

This creates a specific edge case worth checking in any seat billing tool: what happens when a removal arrives while an add is still pending confirmation? The correct behavior is for the removal to cancel the pending add first (newest addition first), not to let both sit as separate, contradicting facts.

Proration on a mid-cycle seat change

When seats change mid-period, the fair charge for the remaining time is the seat's catalog rate applied to the calendar units remaining in the billing basis — not a blended average, and not a full-period charge for a seat added on day 20. How granular that remaining-time calculation is (daily, half-monthly, monthly) is itself a configuration choice — daily proration for a seat added mid-week looks very different on the invoice than monthly-bucket proration for the same event.

What to check before trusting a seat billing setup

  • Does it import daily snapshots, or does it ask for (and trust) a vendor's increase/decrease column?
  • Is there a confirmation window for adds, and does a removal correctly cancel pending, unconfirmed seats first?
  • Does proration on a mid-cycle seat change walk calendar units of the actual billing period, rather than a flat day-ratio?
  • Can seats, a flat subscription fee, and usage-based charges all land on the same invoice, or does seat billing require a separate tool?
  • Is there a minimum seat count the contract can enforce as a floor, independent of what was actually reported?

Sonic AI imports seat files as absolute snapshots, compares them to the balance on record, supports org- and customer-level confirmation windows with correct pending-add cancellation, and prorates mid-cycle seat changes by calendar units of the billing basis — on the same invoice as any fixed fees or usage lines. See how usage and seats work, or the deeper mechanics on seats are snapshots, not vendor deltas and idempotency as a product feature.

Related terms: seat snapshot, minimum commitment, calendar-unit proration, idempotency.

See it on the platform

Everything above describes how Sonic actually runs it — the product pages show the screens.

Related questions

Still have questions?

Are seats events or snapshots?

Snapshots. Each row is how many they had that day. Sonic compares it to the balance on record and writes an event only when the count changes. Vendor increase/delta columns are not imported — they break at customer boundaries.

What are confirmation days?

An optional hold on seat adds. If you set N days, an increase on date D bills only if the new count still holds through D+N. Removals bill immediately. Incomplete files show as awaiting, not as a guessed invoice line.

How do usage and seats get in?

Templates map vendor files or a Postgres connection. Usage is events. Seats are daily snapshots compared to the balance on record. Large files are a first-class path, not an afterthought.

See the full FAQ →

Next

See it on your contracts

A walkthrough on the agreements and files you actually bill from — not a slide deck.