Sharing what I Experimented With: Built an account-prioritization engine (Fit × Intent × Signal Decay) with Clay + n8n + HubSpot - ranked list of who to contact this week, not just who fits the ICP
Someone on one of the previous posts of mine suggested building something like this.
Problem statement: Sales teams waste time contacting companies that technically fit their ICP but aren't currently in a buying window. Fitting the ICP is a filter, not a ranking - the real question was, which accounts should sales actually contact this week?
ICP: US SaaS companies, 50–1,000 employees, B2B, $5M+ revenue
Workflow: trigger sources or signals (Funding, Hiring, Leadership Change, Job Postings, Tech Change) -> Enrichment -> ICP Fit Score -> Intent Score -> Account Score -> Signal Decay -> Prioritized account list
Fit Score:
- 0–100: four criteria worth 25 points each: US-based, SaaS/B2B, 50–1,000 employees, $5M+ revenue.
- Binary per criterion - either the account matches or it doesn't.
- Calculated once and left alone; only recalculated if firmographics actually change (a company crossing from 40 to 55 employees, for example).
Intent Score:
- 0–100, built from three signals I could reliably measure from a single enrichment pass:
- Funding - 40 points if the company has raised it recently, 0 if not.
- Headcount growth (3-month window) — scaled: >20% growth = 30 points, 5–20% = 18 points, 0–5% = 8 points, negative = 0.
- Open job postings — scaled by relevance: a Sales/Revenue/GTM-titled opening = 30 points, any other open role = 15 points, nothing open = 0.
- These three sum to the Intent Score (capped at 100).
- Account Score = Fit × (Intent / 100) - keeps everything on a 0–100 scale and sets the tier: 60+ is hot, 30–59 is warm, and under 30 is cold.
Signal decay:
- Each signal's contribution isn't fixed at the moment it's detected - it decays on a half-life curve:
weight × 0.5^(days_since_signal / half_life). - Different signal types decay at different speeds: funding has a ~30-day half-life (a raise still matters a month later), hiring/headcount growth is ~21 days, and a single job posting is ~14 days (weaker, shorter-lived signal on its own).
- This recomputes on a recurring cadence, not just once at detection time — so an account that scored hot two weeks ago with no new signals since automatically cools toward warm or cold without anyone touching it.
Outcome
- Ran it against 10 real companies matching the ICP - got a genuinely differentiated ranking, not the ICP filter restated.
- The two coldest-scoring accounts fit every ICP criterion on paper but had declining headcount, no funding activity, and no open roles.
- Pulled a real sales/GTM contact for every account - name, title, verified email and wrote everything into HubSpot as Company + Contact records, each with a Note explaining exactly which signals drove the score.
Open to suggestions and thoughts/feedback.