Overage Billing Explained

15 minutes

Tutorial 20.8: Overage Billing Explained

Introduction

In Full mode, a finalised colour formula that uses more grams than the service's Colour grams included threshold automatically stages a Colour overage line on the appointment's transaction. This tutorial walks through every stage of that line's life — from the formula finalising to the transaction completing — and what happens when edits, reverts, or refunds hit.

Who this is for: Owner, Admin, Manager — anyone responsible for how colour revenue reaches the till What you'll learn:

  • What makes a formula produce an overage line
  • How the line reaches the draft transaction
  • How edits and Revert ripple through
  • How completion locks everything
  • How refund / modify reopens the flow

Time to complete: 15 minutes


Prerequisites

  • Salon colour formula mode set to Full (Tutorial 20.2)
  • At least one default Colour Charge Rule configured (Tutorial 20.2)
  • Services have Colour grams included set where overage should apply (Tutorial 7.1)
  • Read Tutorial 20.6 for the formula dialog

Step-by-Step Instructions

Step 1: Understand when a line is staged

An overage line is staged automatically when all of these are true:

  1. Salon mode is Full
  2. Service on the appointment is flagged as a colour service and has Colour grams included set
  3. A colour formula on the appointment is finalised (not draft, not plan)
  4. An applicable charge rule is active — either the formula's chosen rule, or the salon's default
  5. The calculated charge is non-zero — qualifying grams are at or above the rule's Minimum overage grams, AND the calculated amount is at or above the rule's Minimum charge

If any condition fails, no line is staged and no charge appears.

Three rule types — how the threshold applies

Conditions 4–5 hide a subtlety. Only the Overage only rule type uses Colour grams included as a deductible. Full usage and Per gram rules ignore the threshold entirely and qualify every gram. See Tutorial 20.2 for the rule type comparison.

Step 2: The lifecycle — where the charge lives

Every finalised formula has a projection_status — a label for where its overage charge lives right now:

Status Meaning
unfinalised Formula hasn't been finalised; no charge yet
pending Finalised, but the appointment has no draft transaction yet. The charge will "land" on the next draft created for this appointment
in_draft Charge is an emerald line item on the appointment's current draft
committed Charge is on a non-draft (pending / completed / refunded) transaction. Formula becomes read-only

The status appears on the formula's detail page and informs whether Revert is available.

Step 3: Watch the status change as you work

A typical flow:

Formula created, plan saved     → unfinalised
Mixed and finalised             → pending (no draft yet) OR in_draft (draft exists)
Customer reaches the till       → receptionist creates draft → formula transitions to in_draft
Receptionist hits Complete      → formula transitions to committed

The receptionist sees the emerald line in the cart while the transaction is in_draft; it locks once completed.

Step 4: Edit the formula while the draft is open

While in_draft:

  • Stylist can open the formula and click Revert → stock returns, overage line disappears, formula reopens in mixing mode
  • Stylist can re-finalise with different actuals → line rebuilds with the new amount and a fresh rule snapshot
  • Receptionist can edit the unit price on the POS line — the edit survives unless the formula is re-finalised (which rebuilds the line fresh)
  • Receptionist can delete the line from the draft — doesn't delete the formula, just removes the charge from this draft. Re-finalising the formula, or abandoning and recreating the draft, will re-stage it.

Revert vs delete the line — what's different

Action Stock Overage line Formula state
Revert the formula Returned in full Removed Reopens for mixing — actuals editable again
Delete the line in POS Untouched (still decremented) Removed from this draft Stays finalised; charge will re-stage if you re-finalise or abandon-and-recreate the draft

Use Revert when the actuals were wrong. Use delete the line only if you've decided not to charge for the overage on this transaction.

Step 5: Completion locks everything

When the transaction is completed:

  • Formula projection_status becomes committed
  • Formula can_edit becomes false
  • Revert disappears
  • The overage line's rule_snapshot is frozen — future changes to charge rules do NOT change historical charges
  • Stock decrements are now permanent

Step 6: Refund or modify to change a committed charge

Need to change a committed formula? Use the transaction. Both paths require Owner or Admin permissions.

  • Edit (modify) — only available the same day a transaction was completed. Edit the colour overage line's unit price directly on the transaction and save. The transaction stays completed (this is an in-place edit, not a return-to-draft) and the new price is what the customer pays. Use this for small price corrections.
  • Refund — reverses the transaction. The formula stays committed against the refunded transaction (the audit record persists). To then re-bill the customer, create a fresh transaction; if the formula needs different actuals first, see the note below.

Re-pricing a committed formula completely

The cleanest path when a finalised formula itself needs to change after the bill is paid is: refund the original transaction → create a new draft for the appointment → unfinalise and re-finalise the formula on the new draft. The original transaction stays in the audit log as refunded, and the new charge lands cleanly. Bulk re-pricing is intentionally not supported — see "Can I bulk re-price old formulas?" below.

See Tutorial 8.2 for the full refund / modify flow.


Worked example: edit a formula after finalise

Assumes a default rule: Overage only, Per-gram rate at ÂŖ0.20/g, no minimum charge or minimum overage.

  1. Formula finalised: actuals 75g, threshold 60g → 15g overage → ÂŖ3.00 charge → pending (no draft yet)
  2. Receptionist creates the draft transaction → formula moves to in_draft, emerald ÂŖ3.00 line appears
  3. Colourist realises they miscounted one bowl → clicks Revert, corrects actuals to 68g, re-finalises
  4. Line rebuilds: 8g overage → ÂŖ1.60 → in_draft
  5. Receptionist completes the transaction → formula moves to committed, line locks at ÂŖ1.60

Worked example: customer pushes back after completion

Same-day, transaction was just completed. Owner permission required.

  1. Transaction completed earlier today with a ÂŖ6.00 overage line
  2. Customer pushes back: "I only agreed to a ÂŖ4.00 add-on"
  3. Owner opens the transaction and clicks Edit — the colour overage line is editable in POS (the transaction stays in Completed state)
  4. Owner changes the overage line's unit price to ÂŖ4.00 and saves — totals recalculate, the ÂŖ2.00 difference is owed back to the customer via the standard refund/credit flow
  5. Done — no formula re-finalise needed for a simple price adjustment

If instead the formula itself was wrong (different products, very different grams), refund the transaction outright, recreate a draft for the appointment, then Revert and re-finalise the formula. The new charge stages cleanly onto the new draft.


Common Pitfalls

"No overage line appeared"

Walk through the five conditions in Step 1 in order. Nine times out of ten it's condition 2 (missing Colour grams included) or condition 5 (the calculated charge is below the rule's minimum overage grams or minimum charge).

"The overage line has a beaker icon and emerald colour — is that deliberate?"

Yes. Colour overage lines use a distinctive emerald row + beaker icon so receptionists and customers can tell them apart from regular services and products.

"A stylist changed the formula after the customer paid"

They shouldn't be able to — a committed formula is read-only. If it happened somehow, the state machine has a bug; report it to support. The audit log will still show what changed.

"Our rule changed but old charges are different"

Correct — each formula snapshots the rule at the moment it was finalised. Historical charges are frozen on purpose so your audit trail is accurate.

"Can I bulk re-price old formulas?"

No. Modifying each transaction to re-price individually is the only path. This is deliberate — automatic bulk re-pricing would rewrite customer receipts.


Tips and Best Practices

  1. Train receptionists on the four statuses — unfinalised / pending / in_draft / committed are the mental model, not implementation detail.
  2. Complete transactions same-day where possible — leaving formulas pending too long creates gaps in stock visibility.
  3. Use Revert, not line deletion — Revert rebuilds cleanly; line deletion can leave stylists confused about why their formula didn't produce a charge.
  4. Audit quarterly — spot-check a handful of committed formulas against the POS lines to confirm the numbers tie out.
  5. Price rules conservatively — a higher minimum charge and minimum overage reduces ticket disputes for tiny amounts.

Related Tutorials

  • Tutorial 2.4: Processing Transactions — the receptionist's view of the overage line in POS
  • Tutorial 7.1: Creating and Managing Your Service Menu — set Colour grams included
  • Tutorial 8.1: Understanding Transactions and Payment Status — the colour_overage polymorphic item type
  • Tutorial 8.2: Handling Refunds and Cancellations — how modify / refund unlocks committed formulas
  • Tutorial 20.2: Configuring Colour Settings & Charge Rules — the rule engine behind the charge
  • Tutorial 20.6: Creating a Colour Formula — where finalise happens

Frequently Asked Questions

What if the rule's Minimum charge is higher than the calculated overage?

No charge is staged. Minimum charge acts as a floor for whether to bill at all, not a guaranteed minimum bill — if the calculated amount comes in below it, the system skips the line entirely. Set this low (or to zero) if you'd rather always bill the calculated amount, however small.

What if the customer exceeds the threshold but the rule's minimum overage isn't met?

No charge is staged. A 2g overage with a 5g minimum overage rule simply doesn't trigger.

Can I pause overage billing without leaving Full mode?

Yes — deactivate every charge rule (via Is active). Without an active rule, no charge can be staged. Or create a rule with 0% markup and 0 minimum charge to produce ÂŖ0 lines if you want the audit trail without the cost.

Does the overage line count toward commission?

That's determined by your commission configuration (Tutorial 4.4), not by this system. Check how commission is configured against the colour_overage item type.

Are overage charges VATable?

By default yes — they inherit the salon's tax rate. Confirm with your accountant that this suits your jurisdiction.


Last Updated: April 2026