There's a lead routing template that's made the rounds in automation circles: run the inbound form message through an LLM, get back a hot/warm/cold classification, and split your n8n flow from there. Hot leads ping Slack. Warm go into a nurture sequence. Cold get archived. The appeal is real — no one has to triage form submissions by hand, and responses go out before your team wakes up.
The problem is what "sentiment" is actually measuring. It's reading writing tone, not buying intent. And tone tracks a lot of things that have nothing to do with whether someone will pay you.
What sentiment routing is actually doing
When you ask an LLM to score a lead message as hot, warm, or cold, the model looks at enthusiasm, word choice, and phrasing. Confident language → hot. Uncertain hedging → cold. The assumption built into that logic is that how someone writes a contact form message correlates with how serious they are as a buyer. It doesn't, consistently.
A dev.to post making the rounds on n8n lead routing — a solid walkthrough of exactly this pattern — acknowledged the failure mode in its own conclusion: sentiment classification breaks on short messages and on non-native English. The recommended fix was a low-confidence branch. But that branch routes ambiguous cases to manual review, which means the automation is handling the easy decisions and humans still handle the hard ones. You haven't solved the triage problem; you've moved it.
From six weeks of testing our own lead qualification workflow, roughly 27% of real form submissions are short, terse, or written in a register that reads as uncertain to a sentiment model. That's not an edge case you can tune around. That's a quarter of your pipeline routing wrong.
Where it misfires specifically
Serious buyers often write the shortest messages. They've already decided they want to have a conversation — they don't feel the need to pitch themselves in a contact form. "Interested in your automation services" from a director with a real project scores as warm or ambiguous. Meanwhile, someone who'll never sign anything writes three enthusiastic paragraphs and comes through as a hot lead.
Non-native English speakers score cold systematically. Hedged politeness — "I was wondering if perhaps you might be able to assist with" — is a linguistic pattern, not a lack of intent. Treat it as low intent and you've quietly filtered a chunk of international buyers from your Slack notifications.
Polite buyers with budget read as cold. Enthusiastic tire-kickers read as hot. Sentiment is measuring the wrong thing.
The confidence score problem compounds both failures. If you don't know your classifier's hit rate field-by-field, a single "80% confidence" number doesn't tell you anything useful. It averages over every submission type and hides which cases the model is actually confused about.
What to route on instead
Ask the model to extract specific facts from the message rather than judge its tone. Facts are either there or they're not — no confidence dial, no ambiguity about what you're measuring.
The fields worth extracting for most service businesses:
- Location: did they mention a city, region, or state? Does it match your service area?
- Timeline: is there a date signal — "by end of August," "Q4 project," "ASAP"?
- Budget: did they name a number, a range, or say something like "we have budget for"?
- Specific ask: did they name a service or describe an actual problem (vs. just "need help")?
- Vendor context: "we're currently on Zapier," "we outgrew our current setup"?
Each field is populated or null. Two or more populated → high-intent, worth a Slack alert and a same-day call. One field populated → warm, into a sequence. All null → manual review queue, 30 seconds of human judgment.
The constraint that makes this work:
If the model can't quote the exact phrase from the message that fills a field, the field stays null. No inference, no interpretation — a direct extraction or nothing.
This isn't just accuracy theater. It turns the extraction into a measurable thing. You can track the null rate per field over time — "budget" will probably be your weakest extractor for a while — and tune the prompt for that specific field. Every null-routing lead that eventually converts also tells you exactly what language your real buyers use that the current prompt isn't catching.
How to set this up in n8n
The architecture is simpler than the sentiment version:
- Trigger (form webhook or email) fires on a new submission.
- A Claude or GPT-4o node runs a structured extraction prompt. Output is a JSON object with your five or six fields, each a string or null.
- A Switch node checks how many fields came back populated. Branch on ≥2, exactly 1, and all null.
- The manual review queue is a Slack message or a row in a sheet — not a dead end.
The extraction prompt ends with something like: "For each field, include the exact phrase from the message you extracted it from. If you cannot find a direct quote, return null for that field." That line is what enforces the constraint and what makes the null rate a meaningful metric.
If you're already running a Claude node for AI automation, this swaps in as a prompt change, not an architecture change. The lead qualification walkthrough we published covers the n8n setup; this replaces the sentiment-scoring step inside that workflow with the fact-extraction prompt above. The rest of the flow stays the same.
The manual review queue gets shorter as the prompt improves, not longer. And when you audit it, you're not looking at failures — you're looking at a dataset of how your real buyers actually write when a model can't extract anything from them. That's the useful feedback loop sentiment scoring never gives you.
— Cole
Sources
- Community discussion that prompted this post: Route leads by sentiment before your team wakes up (dev.to, forgeflows)
- Genesis Web Digital, Lead Qualification with Claude: What We Tested Before Recommending It — six-week testing data including the 27% ambiguous-submission figure