Why speed matters more than process
The Harvard Business Review study everyone cites is real: respond to a B2B inbound lead in 5 minutes and you're 100x more likely to qualify than at 30 minutes. By 24 hours, the lead has researched two competitors and probably already filled out their forms too.
The catch is that "contacted" is fuzzy in HubSpot. The native notes_last_contacted field tracks any logged email, call, or meeting — including outbound sequence emails. A lead that submitted a form 8 hours ago and received an automated drip is technically "contacted." From the buyer's perspective, no human has reached out yet.
For speed-to-lead specifically, you want the cohort of contacts who:
- Submitted a form (or hit some other inbound conversion event) in the last 24+ hours.
- Have no logged human outreach — call, manual email, meeting — since the form fill.
- Are in an active lifecycle stage where someone should be reaching out (Lead, MQL, SQL).
That's the cohort costing you revenue.
What "contacted" actually means in HubSpot
Three signals to combine:
recent_conversion_date< 24 hours ago — a recent form fill.notes_last_contactedis older than the conversion date — no outreach since they raised their hand.- Lead status is
NeworOpen— not already disqualified.
The trick is signal #2. Native notes_last_contacted doesn't distinguish sequence emails from human outreach. The community workaround: build a custom property called something like First genuine reply date or Actual last contact date — populated by a workflow that excludes activities where email_source = Sequence. Then filter on that.
Why a clean filter still leaks leads in practice
For a team running sequences (almost every B2B sales team), the native Last contacted field will give you false negatives — leads that look contacted but only received automated emails. A 24-hour SLA is meaningless if your filter is being gamed by your own automation.
Building the human-touch property is one workflow + one custom field. Maintaining it across portal changes (sequence type renames, new activity types HubSpot adds) is ongoing. And every new SDR you onboard needs to know which field is the real one — the labeled-but-fragile native field, or the custom-but-trustworthy one your team built.
There's a reason 5-minute SLA enforcement is rare in practice. It's not that teams don't want to do it — it's that the underlying data is hard to trust at the threshold of "did someone actually respond?"
The manual HubSpot recipe
If you want to find these leads manually in HubSpot, here's the closest you can get without a third-party tool. This works in Sales Hub Starter and above — Free tier doesn't expose Last contacted filtering.
- Open the Contacts tabNavigate to Contacts → Contacts in the main HubSpot nav. Click 'Create list' in the top right.
- Set object type to Contact-basedChoose 'Active list' so HubSpot auto-updates as new form fills come in.
- Add filter: Last contacted is unknownFilter by Contact properties →
Last contacted→ 'is unknown.' This catches contacts who've never been touched. - Add filter: form fill in last 24 hoursAND group →
Recent conversion date→ 'is more than' → 0 days ago AND 'is less than' 1 day ago. This narrows to fresh leads. - Optional: filter by lifecycle stageIf you only want SQLs or Marketing Qualified Leads, add
Lifecycle stage→ 'is any of' → MQL/SQL. - Save and pin to your dashboardSave the list with a name like 'Speed-to-lead violations.' Pin it to your sales dashboard so reps see it daily.
What Bloated does instead
Every Friday, every form fill from the past week with no real human touch.
Bloated reads HubSpot's engagement timeline directly via the API and filters out sequence emails before flagging. Sequences don't count as touches. Auto-replies don't count. Only outbound emails, calls, and meetings logged by an actual rep. A 24-hour SLA window catches the leak before it cools.
recent_conversion_date, notes_last_contacted · HubSpot contact properties