Spent the last week building and testing this on n8n Cloud. Figured I’d share since a lot of people ask about AI chatbots here.
What it does:
- Receives customer messages via webhook → GPT-5-mini processes it → returns a helpful JSON response
- Built-in escalation logic for billing, security, and account deletion requests
- Keeps replies under 150 words — concise, on-brand
Why I built it:
Most SaaS support bots are either too basic (keyword matching) or too expensive (Zendesk AI). This sits in the middle — smart enough to handle real queries, cheap enough to run 24/7.
Tech stack:
- Webhook trigger (POST /customer-support)
- OpenAI GPT-5-mini via n8n managed credits (free on n8n Cloud)
- Respond to Webhook node
Pricing: $9 one-time on n8n Markets
Link: n8n Markets — Buy, Sell & Hire n8n Workflow Experts
Happy to answer questions or take feedback. If there’s interest I’ll share a stripped-down open-source version too.
1 Like
Nice work. Quick question — is the escalation (billing/security/account deletion) something the model flags in its own output, or is there a hard check on that downstream? Curious how you wired it ?
Good question! The escalation is handled in the AI agent’s system prompt — I gave it explicit instructions to flag billing, security, and account deletion requests with a specific JSON field like “escalate”: true rather than attempting to resolve them directly. So it’s model-driven via the prompt, not a hard downstream check. Makes it easy to customize for different business types just by editing the system prompt.
Makes sense, and the flexibility argument is real — editing a prompt beats rewiring nodes.
The tradeoff I’d flag: prompt-driven escalation means your catch rate is whatever the model’s judgment happens to be on that run, with no floor under it and no easy way to measure it. I hit a version of this on an SMS pipeline where escalation depended on the model emitting a flag. Passed everything I wrote. Then a realistic message — serious part buried at the end of a long chatty one — got a genuinely good reply and no flag. Green execution, nobody notified.
Worth knowing which failure you’re actually exposed to:
- If you’re using structured output / json_schema mode, the field is always present — the soft spot is the model’s judgment of when it’s true.
- If you’re prompting “return JSON” without a schema, the field can go missing entirely on longer or unusual inputs.
Either way, ambiguous phrasing is what surfaces it, not clear-cut cases. A billing dispute phrased politely and buried mid-message, or account deletion asked sideways — “thinking about closing my account, what happens to my data?” The obvious ones always flag.
What worked for me was a cheap deterministic check on the inbound message for the high-stakes categories, running independent of the model output. Model flag stays, it’s just not the only path — gives you a floor.
Separate thing, if you branch on that boolean in an IF/Switch node: make sure the field contains only the expression, no trailing space. n8n renders it to string and the comparison silently fails false. Cost me a few hours: N8n: Switch node silently routes false when comparing a boolean — "Wrong type: 'true ' is a string but was expecting a boolean"