Scoring Accounts Across Signals
Outcome: a single timing score combining several signals with decay, weights derived from your own conversion data, and a threshold that routes accounts into action.
- Surface
- App
- Level
- Intermediate
- Uses
- Formula columns
- Credits
- 0
- Prerequisite
- Lessons 02–06
Keep fit and timing apart
Fit says can we sell to them. Timing says should we act now. Combining them into one number destroys the distinction that makes signals useful.
priority = fit_score >= fit_floor
AND timing_score >= timing_floor
ordered by timing_score DESCA hot signal at an unsellable account must not outrank a strong-fit account. A floor on fit is what guarantees it cannot.
Decay is the whole point
A signal’s value falls as its window closes. Without decay, a four-month-old funding round scores the same as one from last week, and your queue fills with stale triggers.
A workable decay, applied per signal:
signal_points = base_points × decay_factor
decay_factor:
age <= 30% of window 1.0
age <= 60% of window 0.7
age <= 100% of window 0.4
age > window 0Decay is why you must store the signal date rather than a boolean. A true/false flag makes decay impossible to compute and turns every signal into a permanent attribute — which is the single most common design error in signal pipelines.
Weight by evidence, not intuition
Take accounts that became opportunities
The last two quarters, if you have them.
Look back at what was true 30–60 days before
Which signals were present?
Compare against accounts that did not convert
Same period, same market.
Weight by the gap
A signal present in 60% of converters and 15% of non-converters earns a high weight. One present in 40% of both earns zero — it is background noise in your market.
Most teams discover that one or two signals do almost all the predictive work, and several others they were tracking do none.
Stacking
Signals combine non-linearly. Two together are usually worth more than the sum of their individual weights, because they corroborate each other.
| Combination | Reading |
|---|---|
| Funding + hiring in your function | Money and a place it is going |
| New exec + hiring in their function | A mandate being staffed |
| Stack change + hiring | A migration underway |
| Job change + the new company fits | Warm relationship at a qualified account |
Add a modest bonus for a corroborated pair — a couple of points, not a doubling. The bonus should reward corroboration without letting a stack of weak signals outrank a strong single one.
Do not double-count
The same underlying event often surfaces through several signals, and counting each separately inflates the score.
| Looks like several signals | Is really one event |
|---|---|
| Funding + headcount growth + hiring, all in the same month | The round |
| New exec + leadership change + job change for the same person | One person moving |
| Multiple job posts for the same role reposted | One vacancy |
Group signals by underlying event and take the strongest, plus a small corroboration bonus. Otherwise a single funding round scores three times.
The threshold
Same derivation as everywhere else in this library: capacity, not intuition.
- Compute how many accounts your team can work per week.
- Score everything — free.
- Sort by timing within the fit floor.
- The score at your capacity row is the threshold.
- Read ten accounts above and ten below. If they are indistinguishable, add a discriminating signal.
Do this now
List your signals with base points
Whole numbers, and a window for each.
Add the decay function
Per signal, based on its window.
Group signals by underlying event
Prevent double-counting.
Add a small corroboration bonus
For genuinely independent pairs.
Run the converter-versus-non-converter comparison
Adjust weights to match the gaps.
Set the threshold from capacity
Sanity-check the top 20
With someone who knows the accounts.
Check your work
- Fit and timing are separate, with a floor on fit
- Every signal decays against its own window
- Signals from one event are grouped, not summed
- Weights trace to a measured conversion gap
- The threshold came from capacity
Where this breaks
A score without decay turns into an all-time signal count, and the accounts at the top become the ones with the longest history rather than the most current activity. It looks like a working prioritization for about a quarter, and then the queue is full of events from last year. Decay is not a refinement — it is what makes the score mean “now”.
Further automation
Re-score on every signal run so accounts cross the threshold on their own. Route newly-crossed accounts to a queue or Slack with the signal that pushed them over — the trigger is the reason the message will need, so passing it along saves the rep from looking it up.
Next lesson
08 — Running an ABM play end to end, putting the tiers, signals and score together.
Reference for this lesson: Signals, Tables, GTM Engineering — attributes versus signals, TAM Sourcing.