Cascadia Portfolio · Revenue Assurance

What a customer is contracted for and what they are billable for are different numbers

A subscription-licensing book with three timing rules: adding licences takes effect at once, reducing them waits for the next term boundary, and cancelling rides out the term. The order register records what each customer asked for. The billable quantity is derived from the event stream and the rules, and the two sit apart for up to a year on an annual term with nothing erroring and no register showing it.

Synthetic data from a seeded generator (seed 20260911). Simulated: not a real company, customer, partner, product or book of business. Every figure on this page is stated as of 2026-06-30 and computed at build time from certified artifacts that two independently written derivation paths agree on cell for cell. No figure may be read as a claim about any real book of business.

The decision this page serves

Whether to keep invoicing from the register's current quantity, or to derive the billable quantity from the event stream and the rules and reconcile the invoice to it.

The reader is the finance or revenue-operations owner who signs the monthly invoice run and is accountable for the number on it. The benchmark is the register's own quantity, the naive answer. Invoices are computed from the effective quantity; the register is what the customer and the partner see. The gap between them is money correctly billed that the register does not show. Billed from the register instead, June 2026 would under-bill by $59,264. Every chart below shows where the two quantities part ways, and by how much.

Effective licences at 2026-06-30

102,554

Billable under the rules, summed across every subscription effective that day (M-01).

Register licences at 2026-06-30

96,679

What the register shows: the last quantity each customer asked for (M-02).

Entitlement gap

5,875 licences

$59,264 per month at the term rates, 5.5% of the month's billable (M-03). The register never exceeds the effective quantity, so the gap is never negative.

Subscription-months carrying a gap

8.9%

4,467 of 50,110 subscription-months across the 24-month window.

How long a reduction waits depends on the term, not on the customer

Chart 1 data table
Chart 1 data — deferred orders by days pending, 30-day bins
Days pendingMonthly term (orders)Annual term (orders)
0–2958032
30–593553
60–89044
90–119050
120–149067
150–179058
180–209065
210–239080
240–269067
270–299064
300–3290100
330–3590116
360–389049
Chart 1 detail — by the order's label
Chart 1 detail — by term type and the order's label (M-05a)
Term typeOrder labelOrdersMedian days90th pct daysMinMax
AnnualREDUCE5262353532365
AnnualCANCEL2792263531364
AnnualADD4015227518352
MonthlyREDUCE4031628131
MonthlyCANCEL2121729131
The wait is the rule's, not the customer's. A reduction or a cancellation is refused mid-term and lands at the next boundary, so on a monthly term it waits at most 31 days and on an annual term up to 365. Of the 845 annual deferrals, 452 had reached their boundary by 2026-06-30 and 376 took effect unchanged; the rest were superseded by a later order or are still waiting. The right tail is partly the window's edge: half the annual book is still in its first term at the as-of date, so an order placed late in a term, with a short wait, is under-observed. The distribution is shown as measured, not trimmed to move the median.

Where the gap sits at the as-of date

63% of annual gap licences are cancellations still billing

Chart 2 data table
Chart 2 data — June 2026 gap by term type and cause (M-03a)
Term type and causeLicencesDollars per monthSubscription-months
Annual — cancellations riding out the term3,556$35,560127
Annual — deferred reductions2,062$20,620221
Monthly — deferred reductions136$1,63212
Monthly — cancellations riding out the term121$1,45215
Cancellations are the larger share of the gap; deferred reductions are the larger count of subscription-months. On annual terms, 3,556 licences ($35,560 a month) sit on 127 subscription-months whose customer has cancelled and is still billable to term end, against 2,062 licences ($20,620 a month) on 221 subscription-months waiting for a reduction to land. A register that goes to zero on the cancel date while billing continues for up to a year is the module's single largest source of gap, and it is a consequence of the rules rather than of any error. A subscription with both a pending reduction and a pending cancellation is counted with the cancellations, because the cancellation is what decides that no next term opens.

Nothing on this page is shown per partner or per customer, by decision. The book is synthetic, and a per-partner cut would invite reading it as a real one; the module refuses that reading. The question a revenue-operations reader will ask next, which partner, is answerable from the conformed tables in the repository and is deliberately not answered here.

The register against the effective quantity, month by month

Chart 3 data table
Chart 3 data — effective and register licences at each month end (M-01, M-02)
MonthEffective licencesRegister licencesGap (licences)Gap share of effective
Jul 20243,7523,723290.8%
Aug 20246,6946,611831.2%
Sep 202413,13912,9441951.5%
Oct 202415,77415,5512231.4%
Nov 202420,69519,6851,0104.9%
Dec 202423,39622,8465502.4%
Jan 202526,30225,5097933.0%
Feb 202529,44328,2651,1784.0%
Mar 202533,16331,9411,2223.7%
Apr 202538,86437,0901,7744.6%
May 202543,92541,8312,0944.8%
Jun 202549,36847,1412,2274.5%
Jul 202552,59449,7682,8265.4%
Aug 202557,26353,2164,0477.1%
Sep 202561,69157,3074,3847.1%
Oct 202566,07261,4324,6407.0%
Nov 202571,21065,9025,3087.5%
Dec 202573,98868,1475,8417.9%
Jan 202678,24471,2806,9648.9%
Feb 202681,59675,0336,5638.0%
Mar 202687,97081,4336,5377.4%
Apr 202691,85286,0215,8316.3%
May 202696,96990,8316,1386.3%
Jun 2026102,55496,6795,8755.7%
A query that reads the register's current quantity is wrong about the invoice in every month a deferral is outstanding. The book grows through the whole window because subscriptions open throughout it, so the gap in licences grows with the book; the share of effective licences the register does not show, drawn beneath the lines, is the figure to read, and it ends at 5.7%. The gap peaked at 6,964 licences in Jan 2026. Rows in later months increasingly sit in auto-renewed terms no order opened, which the next chart counts.

The renewals nobody sent

Chart 4 data table
Chart 4 data — derived row share by term type (M-06a)
Term typeDerived shareDerived rowsAll rows
Monthly term83.1%16,64120,024
Annual term18.6%5,60730,086
No transaction marks a renewal; a renewal is implied by the absence of a cancellation. That is the rule, not a data gap. The state machine opens the next term under that stated rule and flags every billing row that rests on one: 44.4% of all subscription-month rows, carrying 48.2% of billed dollars. That is derivation under a written rule, declared on the row, and it is not the filling of a gap. The blended figure hides two books: monthly terms are 83.1% derived because every month after the first is an auto-renewed term, and annual terms are 18.6% derived because at most one renewal fits inside the window.

What was checked and found to be nothing

Every partner invoice line and every Direct customer invoice line is a roll-up of subscription-months, re-derived through a second join. 2,398 invoice lines (72 partner-by-month, 2,326 customer-by-month), 0 with a non-zero tie-out (M-08). Published because the value of a reconciliation is the discipline of checking, not the size of what it finds. Separately, 259 of 7,493 transactions received were refused under a fixed vocabulary of reasons and kept in the register rather than dropped (M-07); a refusal is a fact about the sender and says nothing about the engine.

How it stays right

Two derivation paths, written to be different. A record-at-a-time state machine in Python derives every term, every subscription-month and every measure from the event stream and a normative rules document. A set-based SQL path in DuckDB, written from the same rules document and not from the first path's code, re-derives every published cell and must agree before anything is published. On this build it did, on every cell.

A hand-specified golden fixture written before either engine. Fifteen worked cases, including a boundary-day order, a monthly term opened on the 31st, and a Direct-channel subscription, with expected values computed by hand. Both paths pass it.

Derived rows are declared, never hidden. Every term and every billing row that rests on a manufactured renewal carries a derived flag, and Chart 4 counts them.

No accuracy, error-rate or correctness percentage exists in this module, and none may be added. Its only correctness claim is that an independent re-derivation agrees and that the golden fixture passes. That is a statement about method.

The layer the author cannot self-verify. Whether a reader who does not know the finding takes it away from these charts is not something the author can test alone. A blind reading panel of four seats, three domain readers and one visualization reader, read static renders of this page at 320 and 1,040 pixels before it shipped. It returned 26 findings; 20 changed the charts, 3 were accepted with a reason and 3 were rejected with one, and every finding is recorded with the reviewer's own words in the repository's chart review. The charts here are the ones rebuilt after that read.

Disclosure

An independent portfolio project by Aaron Robbins. Synthetic data from a seeded generator (seed 20260911). Simulated: not a real company, customer, partner, product or book of business. Every customer, partner, subscription and transaction was invented by a seeded generator; the partner names are invented and resemble no real reseller, carrier or company. Nothing here is a claim about how any real company operates, and nothing is financial or legal advice.

Source, governance documents, the rules the engines implement, and the build scripts: github.com/RobbinsAnalytics/cascadia-revenue-assurance. Every figure on this page is computed at build time from data/conformed/measures_manifest.json and data/conformed/measures_stage2.json; the independent re-derivation that gates publication is src/validate_measures.py.

As of 2026-06-30 · seed 20260911 · billable across the window $12,621,679.44