Scoring and Gating
Outcome: a fit and timing score built as formulas over your classified columns, a threshold derived from capacity, and gates placed above every expensive step.
- Surface
- App and MCP server
- Level
- Intermediate
- Uses
- Formula columns · filters
- Credits
- 0 to build; saves most of the run
- Prerequisite
- Lesson 11
Do not use AI for the score
The instinct in an AI course is to ask a model for a score out of 100. Resist it, for four reasons:
- It is not reproducible. The same row can score differently on different runs.
- It is not explainable. Nobody can tell you why this account got 73.
- It costs money to compute something a formula does for free.
- The precision is fake. A model’s 73 and 68 do not represent a real difference.
A formula over columns you already have is free, deterministic, auditable, and a rep can read it. The AI in an AI-powered workflow belongs in the inputs to the score — the classifications and research verdicts — not in the arithmetic.
Fit and timing, separately
Fit — from attributes and classifications
Size band, segment, stack, research verdicts. Slow-moving. Recomputed when the underlying data refreshes.
Timing — from signals, with decay
Funding, hiring, job change, launch, engagement. Recomputed every run, penalized as the window ages.
Combine with a floor, not an average
fit >= 6 AND timing > 0, ordered by timing. Averaging lets a hot signal at an unsellable account outrank a good one, which is exactly the failure the split prevents.
A worked model
fit_score (max 10)
size_band in ["51-200","201-1000"] +3
segment = "Mid-market" +2
sells_to = "B2B" +2
uses_competitor = "Yes" +3
sells_to = "Unknown" -1
timing_score (max 10)
2+ relevant roles posted in last 30d +5
1 relevant role posted in last 30d +3
new exec in function, started <90d +4
funding round <90d +3
signal is 60-90d old rather than <30d -2
gate: fit_score >= 6 AND timing_score >= 4Every input is a column you built in lessons 06–11. The score itself costs nothing.
Note the -1 for Unknown. An unqualified row is not neutral — you failed to qualify it, and it should not consume the expensive columns ahead of a row you did qualify.
The threshold comes from capacity
Not from intuition, and not from what looks like a natural break in the distribution.
- Compute weekly downstream capacity in rows. Two reps sending 40 personalized touches a week is 80.
- Score the whole list — free.
- Sort descending, find the score at row 80.
- That is the threshold.
- Read ten rows just above and ten just below. If you cannot tell them apart, the model lacks resolution — add a discriminating criterion, usually a signal.
When capacity changes, the threshold moves. The model does not.
Gate placement
Every expensive step gets a gate above it.
source companies cheap
enrich company cheap
classify segment cheap-ish
▸ GATE fit >= 6
research agent expensive
▸ GATE research verdict qualifies
find people cheap
▸ GATE role in buying centre
find + verify email expensive
▸ GATE valid email AND evidence present
generate copy expensiveFive gates. Four of them are free formula filters, and together they typically remove 70–80% of the run cost.
Test every gate on a 20-row sample and count survivors by hand before running it wide. A gate reading a column that has not populated yet will either pass everything or fail everything depending on how the comparison was written — and both look like a working pipeline until you check the count.
The one place AI scoring is justified
When the criterion is genuinely qualitative and has no column behind it: “how closely does this company’s stated problem match what we solve?”
Even then:
- Return one of five levels, not a number.
- Require a one-sentence justification alongside, so it is auditable.
- Feed the level into the formula as points, like any other input.
The model contributes a judgement; the arithmetic stays in the formula.
Do this now
List your scoring inputs
Every column that should contribute, split into fit and timing.
Assign whole-number points
Cap each at 10. Include a penalty for Unknown.
Build both as formula columns
Free, so build before anything expensive runs.
Compute weekly capacity
An actual row count.
Score everything and read the threshold
At your capacity row.
Read twenty rows around the line
Adjust criteria if they are indistinguishable.
Place the gates
Above every expensive step. Test each on 20 rows.
Recompute the run cost
Before and after gating. Write both numbers down.
Check your work
- The score is a formula, not a model call
- Fit and timing are separate, combined with a floor
- The threshold came from a capacity number
- Every expensive step has a gate above it
- Each gate was tested on a sample with survivors counted
Where this breaks
A score nobody can explain gets ignored. If a rep asks why an account scored 8 and the answer is “the model decided”, the score stops influencing behaviour and the whole gate becomes decorative — while still costing you the rows it excluded. Keep the formula short enough to read aloud, and show the contributing factors alongside the number.
Further automation
Re-score on a schedule so rows cross the threshold on their own as signals fire. New qualifying rows routed automatically to a queue turns the table from a list you rebuild into a pipeline that maintains itself — the pattern Signals & ABM builds in full.
Next lesson
13 — Normalizing and deduping, keeping the inputs to that score consistent across runs.
Reference for this lesson: Tables, Actions, Credits, GTM Engineering — scoring and gating.