Signal Pipeline
Turn events into timed actions. A signal without a decay window and a routing destination is a notification, and notifications get ignored.
When to use
- Setting up trigger-based outreach
- Signals fire and nothing happens, or everything happens
- Evaluating or renewing an intent data contract
- Reps say the alerts are noise
Inputs
- Reads:
workspace/data/object-model.md,workspace/data/scoring-model.md - Needs from user: current signal sources and cost, what happens today when a signal fires, and last year's closed-won and closed-lost lists for the backfill test
Workflow
1. Build the taxonomy with four properties per signal
A signal is not usable until all four are filled in. Use templates/signal-taxonomy.csv.
| Property | Why |
|---|---|
| Decay window | How long it stays actionable. A signal with no window is permanent, which means meaningless |
| Severity | How strongly it predicts a conversation. Drives the threshold |
| Play | Exactly what happens. Not "notify the rep" |
| Owner | Who acts, by name or by role |
Reference windows, adjust to your motion:
| Signal | Decay window | Severity |
|---|---|---|
| Champion changed jobs to a target account | 30 to 60 days | High |
| New executive hired in the buying function | 90 days | High |
| Funding round announced | 90 days | Medium |
| Hiring for roles that imply your problem | 60 days | Medium |
| Competitor mentioned in a public posting | 45 days | Medium |
| Pricing page or high-intent content visit | 7 to 14 days | High |
| Technology added or removed from their stack | 90 days | Medium |
| Leadership change outside the buying function | 60 days | Low |
| Generic third-party intent surge | 14 to 30 days | Low until tested |
A job-change signal actioned at day 45 is a cold call with extra steps. The window is the value.
2. Dedup before routing
The same underlying event arrives from three sources with three timestamps. Without dedup, one event becomes three alerts and the rep learns to ignore all of them.
Dedup key: account + signal type + rolling window
Rule: first occurrence wins, later duplicates suppressed and counted
Count the suppressions. A high suppression rate against one source means you are paying twice for the same event.
3. Set the severity threshold
Not every signal deserves an action. If everything fires, nothing does.
High severity → immediate play, same day
Medium → enters the weekly queue
Low → increments the intent score only, no alert
Below threshold → logged, not surfaced
The tell that the threshold is too low: signal-to-action rate under 30%. Reps are triaging on your behalf, badly, and silently.
4. Write the routing table
The step that makes the difference between a signal system and a notification system.
Signal type + severity + account tier → specific play, specific owner, specific timeframe
"Notify the rep in Slack" is not a play. "Send the champion-move sequence, three touches over five days, owner is the account owner" is a play.
5. Run the backfill discrimination test before any renewal
For every paid signal source, sixty days before renewal.
Take last year's closed-won accounts → was the signal flagged?
Take last year's closed-lost accounts → was the signal flagged?
Compare the flag rates
If flagged accounts converted at roughly the same rate as unflagged ones, the source has no discriminating power and you are paying for noise. This test has killed real contracts. Run it while there is still time to act, not the week of renewal.
6. Instrument the pipeline
Four numbers weekly: volume, signal-to-action rate, precision (actioned signals that became a real conversation), and decay compliance. A sudden volume change means a source broke or a filter changed, and that is worth knowing the same week rather than the next quarter.
Output
- Writes:
workspace/data/signal-taxonomy.csv,workspace/data/signal-routing.md - Uses:
templates/signal-taxonomy.csv - Prints: the taxonomy with all four properties filled, dedup and suppression counts, the threshold, the routing table, and any backfill test results
Rules & quality bar
- Every signal has a decay window. No exceptions
- Every signal has a named play and a named owner. "Notify" is not a play
- Dedup across sources before routing
- A severity threshold exists, and low-severity signals only move the score
- Backfill test before every renewal, sixty days out
- Never buy a broad intent feed without testing it against your own history first
Related skills
- Feeds: the intent axis in
icp-scoring-engine - Hands off to:
lifecycle-and-routing - See also:
docs/stack.mdon signal sources,docs/metrics.mdon signal health