# Billing periods versus rollout periods — a decision, raised 16 September 2026

**Not closed. Brief 6 cannot be written without an answer**, because the module's whole output is a
month-by-month series and this decides what the months mean.

Raised from the ten-deal validation, Deal 3 (Thai Watsadu). Evidence in
`M3-briefs/00-ten-deal-results.md`.

## The question

`com_opportunity_rollout_periods` is **(month, number of new locations)** — a **go-live schedule**.
Brief 6 projects revenue from it: a location arrives in a period, activates, serves its free months,
then bills.

Thai Watsadu does not work that way. Its quotes are **one per month, each billing the installed
base**:

| Quote | Month billed | Locations billed |
|---|---|---|
| `20260720-022846869` | **August 2026** | **23** at ฿1,650 |
| `20260819-045611144` | **September 2026** | **90** — 20 at ฿1,350, 70 at ฿1,050 |

**The 90 are not 90 new locations.** They are the base, which grew. And the price changed for the
whole base, not only for what was added: August is ฿1,650 flat; September is two tiers, neither of
them ฿1,650.

**So: is a period a month in which locations arrive, or a month in which the book is billed?** The
model currently has one axis and it means the first.

## Why it cannot be deferred past Brief 6

Brief 6 returns a month-by-month revenue series and a month-by-month cash series. **Both are indexed
by month, and this decides what a month is.** A module built on go-live periods, tested against a
deal whose periods are billing months, will pass its tests and be wrong — or fail them and be
blamed for the model's error.

Deal 3 is also the **only corpus entry testing recurring revenue at scale**. Building Brief 6
without resolving this means building it against a corpus it cannot reproduce.

## Option A — billing derives from go-live; the model keeps one axis

A location goes live in month X, activates by its `activation_mode`, serves `free_months`, then
bills every month until `term_months` runs out. **The billing series is computed, never stored.**
Thai Watsadu is modelled by its go-live schedule — August +23, September +67 — and the monthly
quotes become **M5 artefacts** (documents generated from a subscription) rather than M3 inputs.

- **Pros:** one axis, which is what Brief 5 built and Brief 6 assumes. The forecast stays a
  forecast. Monthly quotes are correctly M5/M6's concern. **This is the smaller change by far.**
- **Cons:** cannot express **a repricing of the existing base** — September's ฿1,350/฿1,050 applied
  to locations that were already billing at ฿1,650. Under Option A that is a new contract or a
  change order, not a forecast input.
- **Risk:** the largest deal in the book is modelled as something the sales team does not recognise,
  and a rep checking the forecast against the September quote finds numbers that do not match.

## Option B — billing periods are a second axis

The opportunity carries both a go-live schedule **and** a billing schedule, and the multiplication
reads whichever the deal actually has.

- **Pros:** expresses Thai Watsadu exactly as the business writes it, repricing included.
- **Cons:** **two axes to keep consistent**, and most deals have only one. It doubles the surface
  Brief 6 must handle and doubles what can silently disagree.
- **Risk:** the same revenue counted on both axes. This is the failure mode that has no obvious
  symptom.

## Option C — it is not an opportunity at all

A monthly-billed subscription book is **M6's subscription lifecycle**, not M3's pipeline forecast.
M3 forecasts deals that roll out; renewals of an existing base belong to `sub_`.

- **Pros:** keeps M3's model honest and small. **Five of thirty-four won deals are renewals** — this
  is a real category, not an edge case, and DR-09 already put subscriptions in their own domain.
- **Cons:** Thai Watsadu **is** a won opportunity in HubSpot, with a value, an owner and a close
  date. Excluding it from the pipeline forecast means the forecast no longer sums to the business.
- **Risk:** the largest deal in the book falls between two milestones and is forecast by neither.

## What is not in doubt

Whatever is decided, these are established from the documents and do not change:

- **Two prices for the same product in one month** — settled, and `05R-override-location-split.md`
  handles it under any option.
- **The annual term restarts between quotes** — August says 1 Jun 2026 – 31 May 2027; September and
  the Lisa Box manifest say 1 Sep 2026 – 31 Aug 2027. **Three windows on one opportunity.**
- **68 Lisa boxes against 90 billed licences.** Deployment and billing disagree by 22 and nothing
  reconciles them.
- **Hardware is ฿0** on the music line. The Lisa Box manifest totals ฿0.00 across 68 named sites.

## Recommendation

**Option A, unless the team says otherwise** — and the team is who should say.

Whether Thai Watsadu is *"a rollout that bills"* or *"a subscription book that grows"* is a business
question, not a modelling one. Option A is the smaller, cleaner model and it is probably right; but
it is the option that most changes how the deal looks to the person who sold it, and **nobody in the
documents can tell us whether that matters.**

**Ask the person who owns Thai Watsadu before closing this.** It is one conversation, and it decides
the shape of every forecast in the application.
