u/Agentic_Future

I built a contact-form triage agent in n8n that scores leads before I see them. Here's the actual node graph.
▲ 3 r/u_Agentic_Future+1 crossposts

I built a contact-form triage agent in n8n that scores leads before I see them. Here's the actual node graph.

My contact form was a graveyard. 30-40 submissions a week, half obvious spam, the other half mixed in with people who wanted a 90-minute call but had a $200 budget.

So I built an agent that fires the moment the form submits. It scores each lead 1-5, archives the bad ones, summarizes the good ones into a Slack DM on my phone, and writes a row to my Notion CRM. Took about 3 hours to build. Costs roughly $0.04 per lead.

Stack:

n8n self-hosted on a $5/mo Hetzner box

Claude sonnet 4.5 via the Anthropic node

Apollo.io for enrichment (paid plan I already had for outbound)

Slack incoming webhook

Notion API for the CRM row

The flow, node by node:

  1. Webhook trigger from the form on my site. Plain POST: name, email, message, optional company.

  2. HTTP Request node hits Apollo with the email. Pulls company name, headcount, industry, LinkedIn URL. If Apollo returns nothing, the lead gets tagged "unknown, likely individual" and skips ahead to step 4 with low priority.

  3. Claude node. One prompt, no chain. Inputs: the original form message, the Apollo enrichment payload, and a static YAML rubric I keep in a Set node. Returns JSON: {score, reason, urgency, suggested_response}.

The rubric is plain English, nothing clever. 5 = SMB owner, 10-100 employees, message describes a real ops pain. 1 = obvious spam, agency pitching me SEO, or someone asking me to be their unpaid cofounder. The reason field is what makes it auditable later.

  1. Switch node on the score. 1-2 archives to Notion as "filtered" and ends. 3 sends a low-key Slack notification. 4-5 sends a Slack message tagged urgent, with the suggested_response embedded so I can copy-paste a reply from my phone in 20 seconds.

  2. Every lead gets a Notion row regardless of score. That's the audit trail. Once a week I scroll the filtered ones to make sure the agent didn't kill a real lead.

What's working:

Response time on score 4-5 leads dropped from "sometime that day if I remembered" to under 15 minutes. Reply rate went from ~30% to ~75%.

The agent flagged a clean-looking inbound last week as score 2 because Apollo had the company as 2 employees in a completely unrelated industry. I would have replied to that one.

What's not working:

It's been overconfident on score 4 twice. Both turned out to be students doing research, not buyers. I'm patching the rubric so score 4+ requires headcount >5 from enrichment.

Apollo is overkill at this volume. If I rebuilt I'd drop Apollo for the first pass and let Claude infer signals from the email domain alone, then only enrich the score 3+ ones.

Cost breakdown per lead:

Apollo: ~$0.03

Claude call: ~$0.005

n8n + Hetzner: fixed, rounding to zero per lead

One thing I haven't solved: the "polite but wrong fit" leads. They go to the filtered folder and probably deserve a one-line "not a fit but here's a resource" reply. Right now they get nothing, which feels rude.

Anyone running similar triage on inbound? Curious how you're handling the wrong-fit-but-polite leads, and whether you trust the agent enough to auto-reply or you keep a human in the loop like I do.

u/Agentic_Future — 4 days ago