Built an AI Customer Support Agent for n8n — GPT-powered, webhook-ready, knows when to escalate

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"