A contact-form-to-outreach pipeline where the model produces data and the workflow makes the decisions — with human approval on anything risky.
The problem
A founder reading, qualifying and replying to inbound leads by hand is the bottleneck. Handing that to a chat model is worse: in the baseline, the same lead scored 68, 82 and 62 across three fresh conversations.
The workflow open in the n8n editor, from the lead webhook on the left through qualification, guardrails and human approval to sending.
Request pathModel
contact form
→validation · spam
→idempotent lead create
→AI qualification
→deterministic classification
→human approval when required
→send · audit
Thresholds, escalation, approval state and delivery state live in the workflow. The model produces data; it does not decide.
A prototype. Production latency and cost per lead have not been measured, and it does not track replies after the first outbound email.
What I built
Because the model's scores were not reproducible, it was given no authority over them. Classification thresholds, escalation, safety checks, approval state and delivery state all live in the workflow.
The path is explicit: validation and spam checks, idempotent lead creation, AI qualification, deterministic classification, drafting, human approval where required, then delivery and audit.
Pricing and legal questions escalate to a person by rule, not by the model's own assessment of its confidence.
The acceptance pass covered 15 cases — duplicates, spam, prompt injection, malformed model output, escalation, delivery failure and approval recovery — and recorded 15/15.
Testing surfaced two real integration bugs: an approval decision lost after the asynchronous Slack step, and a successful send wired to the wrong branch. Both fixed and regression-tested.