Your pipeline doesn’t leak leads because people are slow. It leaks because your systems refuse to agree on what “a qualified lead” even is, so every handoff becomes a judgement call, and judgement calls turn into silence when the calendar fills up. That’s the gap.
This playbook builds a working lead-intake and follow-up system where classification, routing, and response are enforced by tooling, not memory. The outcome: every inbound request gets scored, enriched, routed, and answered with a real first step inside five minutes, with an audit trail you can debug.
Tools:
Airtable as the source of truth for lead state and SLA timestamps.
n8n as the workflow engine that moves data and enforces branching logic.
Perplexity as the enrichment layer to pull quick company context and risk flags.
Gemini as the response writer that drafts a first reply matched to route and intent.
Flow:
1) Capture leads from form, email, or chat into Airtable with a single normalized schema (channel, intent, company, role, urgency, free-text). One table. No “misc” columns.
2) n8n watches Airtable for new records, stamps received_at, and starts an SLA timer. If the record isn’t touched by a human within X minutes, it escalates automatically.
3) n8n calls Perplexity with company + domain to fetch: what they do, size signals, recent funding/news, and any obvious mismatch (student project, agency, competitor). Store the citation links back in Airtable. Make it debuggable.
4) n8n routes based on rules you can actually read: territory, segment, intent, and red-flag score. It assigns an owner, sets next_action, and opens a task queue.
5) n8n sends Gemini a structured prompt (lead summary, enrichment, routing decision, allowed offers) and writes back a first-response draft plus a single concrete CTA (book link, quick qualification questions, or “not a fit” close).
If you can’t explain why a lead went where it went, you don’t have routing. You have vibes.
Maya runs growth for a 12-person B2B SaaS. Mondays start the same way: a pile of “Contact us” forms, two inbound emails, a live chat transcript someone pasted into Slack. She opens three tabs. Tries to remember if “pricing” means high intent or just curiosity. Then a meeting. Then another. Silence creeps in.
They installed this workflow to stop that.
Every inbound lands in one Airtable table. Same fields every time. Channel, intent, company, role, urgency, free-text. No extra “notes2” column that only one person uses. n8n sees the new record, stamps received_at, and starts a five-minute SLA clock. If nobody updates status or owner before the timer hits, it pings Maya and posts a “SLA breach pending” message in the sales queue. Annoying. Effective.
Here’s where it got messy.
Their first implementation routed based on “company” text matching. “Apple” went to enterprise. So did “Appleton Dental.” A founder typed “Stealth” as company and got flagged as competitor because Perplexity pulled the wrong domain from the email signature. And someone thought it was smart to let reps edit the “segment” field manually to fix mistakes. They did. Constantly. Routing became a tug-of-war.
So they tightened it. n8n calls Perplexity using company + domain (not just company), fetches what they do, size signals, and red flags. Stores citations back into Airtable. If the domain is missing or generic (gmail), the enrichment step sets a “needs_human_domain” flag and routes to a triage queue instead of pretending. That one change reduced bad assignments more than any scoring tweak.
Gemini drafts the first response from structured inputs: lead summary, enrichment snippet, routing decision, allowed offers. One CTA only. Book link if high intent. Two questions if unclear. Polite close if not a fit.
Does five minutes always happen? No. A rep can “touch” a record by accident and stop escalation without replying. Looks compliant. Feels broken. They fixed it by requiring a next_action plus a sent_at timestamp, not just a status change. But it raises a question: is a system enforcing speed, or just enforcing fields?
If you want to know whether this system is enforcing speed or just enforcing fields, stop looking at SLA dashboards and start looking at outcomes you can’t fake. The uncomfortable truth: most teams build these workflows as if “reply sent” is the finish line. It isn’t. The finish line is “lead progressed to a real next step” and that requires more than timestamps.
So implement it like you’d implement billing or security: with definitions, controls, and exceptions that are treated as first-class citizens.
First, define what “touched” means in a way that correlates with revenue. We ended up making it binary: either sent_at exists (email sent, chat responded, or meeting link delivered) or it doesn’t. Status flips don’t count. Owner changes don’t count. Notes don’t count. If someone needs to research before responding, fine—send a holding reply that contains a concrete next step and sets expectations. That still produces sent_at.
Second, create an exceptions lane that doesn’t poison your main metrics. “Needs_human_domain” shouldn’t be a failure state; it’s a valid route. Give it a separate SLA and a different CTA (“Can you share your company site?”). Otherwise you’ll train reps to force-fit domains just to clear the queue, and your enrichment will quietly rot.
Third, don’t let humans edit derived fields. Segment, territory, and red-flag score should be computed and locked. If a rep disagrees, they submit an override request with a reason code. That sounds bureaucratic until you realize it’s the only way to improve rules without turning routing into vibes again. Overrides become training data.
Fourth, instrument the workflow like a product: misroutes per week, time-to-first-real-step, and “false compliance” rate (touched but no sent_at within 15 minutes). If that last number is nonzero, you’re not scaling a system—you’re scaling avoidance.
The hidden upside is cultural: once you make the system strict, people stop arguing about individual leads and start arguing about definitions. That’s the argument you actually want.