Skip to Content
CoursesAI-Powered GTMScoring and gating

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 >= 4

Every 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.

  1. Compute weekly downstream capacity in rows. Two reps sending 40 personalized touches a week is 80.
  2. Score the whole list — free.
  3. Sort descending, find the score at row 80.
  4. That is the threshold.
  5. 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 expensive

Five 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.