How Project Intent Score works

A 0–100 number we attach to every alert. It answers one question: "of the DAs I'll see this week, which 10 should I call today?"

It is not a conversion probability.  78/100 means "in the top quartile for your territory," not "78% chance to convert." We deliberately rejected ML black boxes here. Customer trust in the ranking is the entire product, and trust comes from being able to read the why.

The five components (sums to 100)

$Project value × category fit

40/100

Why this matters: A DA worth $1.4M that lines up with what you sell is worth ~10× more in revenue than a $50k off-category one. We weight value highest because the cost of being wrong here is the largest.

How we calculate it: A piecewise ramp: $0→0pts, $250k→10, $1M→25, $3M→35, $10M+→40. Then we multiply by 1.0 if the DA category and trade tags both match your saved search, 0.7 if only one matches, 0.4 if neither (the search itself still matched on geography/keywords).

🔑Scope keyword density

20/100

Why this matters: Whether the proposal text actually describes work you sell. A "kitchen renovation" DA scores higher for a kitchen supplier than a "garage extension" DA, even if both match your saved search.

How we calculate it: Each product category has a vocabulary (e.g. for kitchen: kitchen, butler's pantry, scullery, joinery, demolition, renovation). We count how many distinct vocab terms appear in the DA text + extracted scope. The component saturates at 4 distinct matches — beyond that a proposal isn't more relevant, just verbose.

⏱️Recency

15/100

Why this matters: Sales windows matter. A DA lodged today is worth ~2× a DA lodged 4 weeks ago for spec-lock-window customers. We weight this lower than value because the timing of the *first call* is set by the alert itself, not by where it ranks.

How we calculate it: Linear decay over 30 days: lodged today = 15 points, 15 days old = 7.5, 30+ days = 0. Uses the council lodge date, not when we first ingested it — fairer to all customers.

🤝Architect / builder conversion lift

15/100

Why this matters: If you've won deals before with this architect, that architect's next DA is dramatically more likely to convert for you. This is the only component that learns from your outcomes.

How we calculate it: For each architect/builder linked to the DA, we compute your smoothed conversion rate (closed-won + half-weight booked-meetings, divided by total alerts on their DAs, with Laplace smoothing to prevent a 1-of-1 win from dominating). The component maxes out at a 30% rate. We pick the highest-converting of the linked entities.

🏘️Dwellings (multi-unit boost)

10/100

Why this matters: A 12-townhouse DA is 12× the supply opportunity of a single dwelling. Weighted lowest because dwelling count is also captured (partially) inside project value already.

How we calculate it: Coarse buckets: 1 dwelling = 0pts, 2-4 = 3, 5-9 = 6, 10-19 = 8, 20+ = 10. Below the 5-dwelling threshold we don't award the full multi-unit boost.

A worked example

The DA: 12 Smith St, Mosman — $1.4M, lodged today, single dwelling. Proposal mentions "butler's pantry, custom kitchen joinery, demolition of existing dwelling." Architect is Mark Chen Architects (3 prior wins for you, 4 prior alerts).

The customer: Mosman Kitchens Co. with a saved search for residential / kitchen in Mosman.

ComponentPointsWhy
Value × fit28 / 40$1.4M × 1.0 fit
Scope match20 / 20kitchen, butler's, joinery, demolition (4)
Recency15 / 15Lodged today
Conversion lift15 / 15Mark Chen — 3 prior wins for you
Dwellings0 / 10Single dwelling
Total78 / 100"Strong call — call today"

Why these weights, and what we change

The weights are tunable — admins can adjust them in the dashboard, and we'll re-tune globally based on what actually converts as conversion data accumulates. Initial weights are based on our domain understanding of supply-side B2B sales for the Australian building products market.

We bump a version string (v1, v2, v3 …) every time the weights change, and we stamp every score with the version that produced it. That way historical scores are auditable: you can see exactly which weights produced "78/100 on April 14th."

We run a monthly backtest comparing top-decile to bottom-decile conversion rates. If the top 10% of scores aren't converting at least 3× the bottom 10%, that's a signal to retune. The eval is published in INTENT_SCORE_VERIFICATION.md.

When the score is missing data

DAs come in messy. Sometimes the project value isn't extracted yet, or the architect hasn't been resolved. We do not drop the score to 0 in those cases — absence-of-data is different from "we know this is a bad fit." We award a neutral default for missing components and the breakdown shows a "not yet extracted" note so you know what's still pending.

Practically: a brand-new DA with no extraction yet will still typically score 30-50, not 0. The score climbs as extraction completes (usually within an hour of lodgement).

Questions? Email the team.