The classic funnel diagram - awareness, consideration, decision, stacked like a neat pyramid - was always a fiction. But it was a useful fiction when buyers actually talked to sales early. That world is gone.
Today a B2B buyer reads three of your blog posts, watches a competitor's demo, lurks in a Slack community, ghosts you for six weeks, then shows up to a sales call already 70% decided. The journey is a graph, not a line. Your automation needs to model it as one.
Why the linear funnel breaks your automation
Most marketing automation is built on stage progression. A lead enters MQL, gets nudged to SQL, then handed to sales. The logic assumes forward motion.
Real buyers move backward, sideways, and in loops. Someone in the "decision" stage will happily re-read a top-of-funnel explainer to sanity-check a claim. If your system fires a "book a demo" email at every touch because it thinks they're advancing, you look tone-deaf.
The fix isn't more stages. It's modeling behavior instead of position.
Stop tracking stages. Start tracking signals.
Instead of a single stage field, track a rolling profile of intent signals:
- Content depth (pricing page vs blog post)
- Recency and frequency of visits
- Channel mix (organic, community, referral)
- Explicit actions (demo request, doc download)
A lead's readiness is a score derived from these, decaying over time. Here's a lightweight scoring model you can run on any event stream.
from datetime import datetime, timedelta
SIGNAL_WEIGHTS = {
"pricing_view": 25,
"demo_request": 60,
"doc_download": 15,
"blog_read": 5,
"webinar_attend": 30,
}
DECAY_HALF_LIFE_DAYS = 14
def score_lead(events, now=None):
now = now or datetime.utcnow()
total = 0.0
for e in events:
base = SIGNAL_WEIGHTS.get(e["type"], 0)
age_days = (now - e["ts"]).days
decay = 0.5 ** (age_days / DECAY_HALF_LIFE_DAYS)
total += base * decay
return round(total, 1)
events = [
{"type": "blog_read", "ts": datetime.utcnow() - timedelta(days=20)},
{"type": "pricing_view", "ts": datetime.utcnow() - timedelta(days=3)},
{"type": "demo_request", "ts": datetime.utcnow() - timedelta(days=1)},
]
print(score_lead(events)) # e.g. 82.4
Decay matters. A pricing view from two months ago tells you little. One from yesterday is a flare going up.
Map the journey as a graph
Once you're scoring behavior, map the actual paths people take. Pull your analytics or CRM event data and build transition frequencies: who goes from blog to pricing, who jumps straight from a community referral to a demo.
You'll find clusters. Maybe engineering-led buyers hit docs first and never touch your case studies. Maybe ops leaders binge webinars. These aren't funnel stages - they're personas with distinct routes.
That map tells you what to send next, not based on where someone "should" be, but on what people like them actually do next.
Nurture off the next likely action
Here's the shift in logic. Instead of "this lead is an MQL, send the MQL sequence," you ask: given this behavior profile, what's the highest-value next touch?
function chooseNextTouch(lead) {
const { score, lastSignal, hasSeenPricing, persona } = lead;
if (score > 70 && hasSeenPricing) {
return { action: "sales_handoff", channel: "human" };
}
if (lastSignal === "doc_download" && persona === "technical") {
return { action: "send_integration_guide", channel: "email" };
}
if (score > 40 && !hasSeenPricing) {
return { action: "send_roi_case_study", channel: "email" };
}
return { action: "hold", channel: "none" };
}
Note the hold state. Doing nothing is a valid, underused move. Over-nurturing burns trust faster than silence.
Wire it together
You don't need a monolithic platform. A practical stack looks like:
- Event capture - webhooks from your site, product, and forms into a queue.
- Scoring service - a scheduled job (or n8n workflow) that recomputes lead scores nightly with decay applied.
- Routing logic - the decision function above, deciding channel and message.
- Execution - email tool, Slack alert to a rep, or a CRM task.
The glue is orchestration. A tool like n8n handles the event-to-decision-to-action flow without you writing a job scheduler from scratch. The scoring math lives in a code node; the branching lives in the workflow.
The human handoff is still the point
Automation's job in B2B is not to close. It's to keep the relationship warm through the non-linear middle and hand a genuinely ready lead to a human at the right moment - with context.
When a rep picks up a lead, they should see the path: what content, what recency, what the score is made of. That context is the difference between "Hi, saw you downloaded our whitepaper" and a conversation that actually lands.
The takeaway
Stop forcing buyers through a funnel that only exists in your CRM. Model behavior, decay old signals, map real paths, and let your automation choose the next best touch instead of the next stage.
The buyers who don't move in straight lines are still buying. Meet them where they are - not where your diagram says they should be.
Originally published at getmichaelai.com
Top comments (0)