How it computes

Integers, one floor, and every contribution returned with its name on it.

Three rules decide what this system tells you: how expected revenue is derived, when a quiet deal is allowed to be called quiet, and what a lead score is actually reading. All three are pure functions in one file, imported by the route and by both repositories, which is why they can be described exactly rather than approximately.

The last of them you can work yourself, further down, over the same weights the engine publishes.

The arithmetic

Integer cents. Integer basis points. One floor, at the end.

Every money value in this model is an exact integer number of cents, and every probability is an integer number of basis points — ten thousand of them to the whole. Not a decimal type, not a float, not a percentage with two places. The reason is not fastidiousness. A forecast is a sum of thousands of small products, and a rounding rule applied at each step produces a total that is wrong by an amount nobody can locate afterwards, because every individual line looks fine.

The effective probability of a deal is the per-deal override when one is set, and otherwise the stage default. A deal with no stage at all has no probability basis, and rather than guessing one the engine reports zero and the forecast excludes the deal entirely. Expected revenue is then the amount times that probability, divided by ten thousand, floored once, at the end.

Expected revenue on one deal, worked in integersValue
Deal amount, in integer cents12,345.00 dollars, held as an integer1234500
Per-deal probability overrideNot set on this deal — so the stage default is usednone
Stage default probability, in basis points33.33 percent, held as an integer3333
Effective probabilityThe override when set, else the stage default3333
Amount × effective probabilityAn integer product, no float anywhere4114588500
Divided by 10000 and floored ONCE411458.85 becomes 411458 — the dropped fraction is dropped deliberately, at the end, once411458

The engine’s own arithmetic on one worked example. Note what is not here: no decimal type, no floating-point multiply, and no stored expected-revenue column. The weighted value is recomputed from the amount and the probability every time it is read, which is why it cannot fall out of step with either of them. The example is chosen so the fraction is visible: the true product divides to a value ending in point eight five, and the engine floors it once, at the end, rather than rounding at each step.

The consequence that matters commercially is the one in the last row of that figure: expected revenue is never stored. It is derived on read, every time, from the amount and the probability. There is no column holding a weighted value that somebody edited the amount under six weeks ago. The single most common way a pipeline report goes wrong is a denormalised number that stopped agreeing with its inputs, and the only reliable fix for that is not to have the column.

The same discipline runs into the line items on a deal. A line that references a real plan or a real catalog item is server-priced: any price the client sent is discarded and nulled, because the catalog is the only authority on what something costs. A custom line — no plan, no catalog reference — must carry a non-negative integer anchor, and a line with a missing or malformed one is refused by name rather than defaulted to zero. On the advertising side, a package discount is held in basis points and the subtotal is computed server-side, with the module’s own comment stating flatly that a client-supplied total is never trusted.

And the forecast’s exclusions are as deliberate as its inclusions. Won and lost deals are out, because a forecast is probable future revenue and a closed deal is neither probable nor future. A deal whose stage identifier does not resolve is skipped rather than counted with a default probability — a dangling reference is a data problem, and quietly assigning it a fifty-fifty chance is how a data problem becomes a revenue projection.

When a deal goes quiet

The neglected deal gets no free pass.

Each stage on a board can carry a rot threshold in days. A deal sitting in that stage whose last activity is older than the threshold is flagged as rotting, and the count of rotting deals rolls up alongside the money in every forecast bucket — so the question “how much of this quarter is real?” has a second number beside it.

Three rules make the flag worth reading. A won or lost deal never rots: it is finished, and nagging about it trains people to ignore the signal. A stage with no threshold never rots, because a studio that leaves a stage’s threshold unset has said, explicitly, that time is not meaningful in that stage — a long legal review is not neglect.

And the third one is the one most systems get backwards. A deal that has never been touched at all is rotting the moment a threshold exists. It has no last-activity date, so a naive implementation treats it as having infinite time remaining and it disappears from the report. The never-touched deal is the most neglected object in any pipeline, and the engine’s own comment on this line says it plainly: never a free pass.

The clock that feeds this is written for you rather than by you. Moving a deal between stages logs the move to the deal’s timeline and stamps the last-activity time in the same operation. A rep who does the work updates the clock by doing the work.

What the score actually reads

Five bands, all school facts, every point visible.

A general CRM scores a lead on how big the company is and what industry code it filed under, because for most business-to-business selling those are the available facts. For a school they are the wrong facts. Enrollment matters, certainly — but so does whether the school is Title-I, because that changes which conversation about cost is even possible; and so does who the incumbent publisher is and how sticky that relationship tends to be; and so does whether the existing contract is anywhere near its end, because a school two years into a four-year deal is not a lead this season no matter how well it fits.

So the score is five additive bands over facts a school actually has. It comes back as a total and as a list of named factors with their points, which means the answer to “why is this a 56?” is something a rep can read and disagree with. That is the whole design goal: not a better prediction, a legible one.

Up to +28 Title-I fit Schoolwide scores 28, targeted 18, not-Title-I 4. “Unknown” contributes NOTHING — the engine will not guess a subsidy story it was not told.
Up to +25 Enrollment band Banded, not linear: 2000 and up scores 25, then 20, 14, 8, and 4 under 200. A missing enrollment adds no factor at all.
Up to +22 Incumbent switchability No known incumbent scores highest at 22; a sticky national publisher scores 8. The axis is market stickiness, not quality, and an unlisted incumbent reads as the generic case rather than as a zero.
Up to +15 Contract-end proximity A renewal window that reads as near-term scores 15; a contract merely noted scores 6. A blank field adds nothing.
Up to +10 In territory A BONUS only. A rep with no declared territory is never penalised, and an out-of-territory school simply misses the bonus rather than being marked down.
Why this school is a 56Points
Title-I targetedPartial subsidy fit — schoolwide would have scored 28+18
Enrollment 500–999Banded, not linear+14
Incumbent: a sticky national publisherSwitchability, not quality — no known incumbent would have scored 22+8
Incumbent contract notedMerely noted; a near-term renewal window would have scored 15+6
In territoryA bonus only. Out of territory is not penalised, it just misses this+10
Lead scoreAdditive, clamped to 0–100, every factor returned by name56

An illustration: the school is invented, and every point value in it is the engine’s own. The thing to notice is that the answer to “why 56” is a list of five named factors a rep can argue with, not a number a model produced. And notice the two absences: a school with no Title-I status on file contributes nothing at all rather than a neutral guess, and a school outside the territory is not marked down — it simply does not collect the bonus. This score has zero production callers today, which is stated again in the honest board on the what-you-can-reach page rather than only here.

Two things this score refuses to do

It will not guess a subsidy story. A school whose Title-I status is unknown contributes no factor at all — not a neutral middle value, not an average. An unknown is carried as an unknown, so a score built on thin data is visibly built on thin data instead of looking like a confident 40.

It will not penalise a rep for geography. Being in territory is a bonus and nothing else. A rep with no declared territory is not marked down, and a school outside the territory simply does not collect the ten points rather than being pushed to the bottom of a list where somebody might have had a real reason to work it.

And the honest bound, stated where the capability is

The incumbent weighting deserves one careful sentence, because it is the part most easily misread. It is a coarse table of stickiness weights, and the module’s own docblock says outright that it is not a claim about any vendor’s quality. The axis is how hard a relationship tends to be to displace, the weight is visible in the factor breakdown rather than buried, and an incumbent the table does not know reads as the generic case instead of silently scoring zero.

Nothing in the product calls this score. A browser client method for it exists and no screen invokes it. The arithmetic is real, the factors are real, and the number is not currently on anyone’s screen. It is in the honest board below, by name.

The same five bands, as weights

Where the 100 points can come from, and how much each band can move a score.

The chips above say what each band reads. This says how much each one is allowed to matter, which is the question a sales manager actually asks before trusting a number. Every figure below is the engine’s own published maximum for that band, summed into the ceiling beside it — the page computes the total from the list rather than writing it next to the list.

Two readings this is not offering. It is not a claim that a school scoring 100 closes, or that a low score should be dropped — the bands are a legibility device, not a prediction, and nothing in the product currently calls the scorer at all. And a band that scores nothing because the fact is unknown is not the same as one that scores nothing because the fact is bad; the factor breakdown distinguishes those two, which is the entire reason the score is returned as a list of named factors instead of one number.

Work the score yourself

Five bands, all school facts. Change one and watch which factor moved.

The scoring rule is additive and every contribution comes back as a named factor with its own points, which is the part that matters: a lead score that arrives as a single number is a number you have to trust, and a lead score that arrives as five labelled contributions is one you can argue with. Change a chip below and the breakdown re-computes.

100out of 100, clamped to that range by the engine. This is the sum of the five factors beside it — nothing else feeds it.

The bound on what you just did

This is arithmetic, run in this website’s own process, over the five weights the engine publishes. It is not a call to the scoring endpoint. That endpoint is written, registered, and has a browser client with zero callers anywhere in the web application — it is the first row of the built-not-switched-on table on the what you can reach page. Nothing you change here is stored, sent, or counted; the whole state of this control is in the address bar.

Two weights are deliberately missing chips rather than given invented ones. The middle enrollment bands are labelled by band because this page publishes their points and not their enrollment cutoffs, and the incumbent control offers only the two tiers with a published number — an unlisted publisher reads as the generic case, and we are not going to print a threshold we would have had to make up on a page whose entire argument is that we cite the line.