Plumbing · AI services
A plumbing assistant built so a dead AI never means a dead chat
An AI chat bolted onto a site breaks quietly. When the AI provider is slow or down, customers stare at a spinner, and the leads they typed are lost.
A server-side n8n proxy with a silent local fallback, gas rules, a price guard, and lead checks that never hold up a booking.
This is a concept build. FlowRight Plumbing is a fictional business. The code is real: open the demo and try the steps below.
The everyday problem
The chat answers locally when the AI is slow, and the booking never depends on it.
The hard part
- The AI service going quiet
The proxy gives n8n 20 seconds. Then the local answerer replies, and the visitor never sees an error.
- A key leaking to the browser
The browser talks only to the site's own API. The n8n address and key stay on the server.
- A reply in an unexpected shape
reply, output, text, message and answer are all read, including n8n's list form.
- A firm price in chat
Price questions get published US average ranges with a disclaimer, never a quote.
- A slow hand-off losing the lead
Leads are checked and accepted first, then passed to n8n in the background.
How it runs
How a message is answered, with or without the AI.
Sample run- Step 1: Message. Posted to the site's own API.
- Step 2: Server proxy to n8n. URL and key never reach the browser.If this fails: 20 seconds: answers locally, silently.
- Step 3: Read the reply. reply, output, text, message or answer.If this fails: Nothing usable: answers locally.
- Step 4: Local rules, gas first. Evacuation, then shut-off steps, before anything else.
- Step 5: Price guard. Ranges with a disclaimer, never a firm quote.
- Step 6: Check the lead. Served city, honeypot.If this fails: City not served: says so.
- Step 7: Forwarded in the background. Never blocks the booking.
Tap “On fail” to see what happens when a step breaks.
Edge cases we handled
| When | What the system does | Try it |
|---|---|---|
| A visitor writes 'I smell gas'. | Leave first, then call the gas utility and 911 from outside. | I smell gas |
| A visitor asks 'how much to replace a water heater'. | Published US average ranges with a disclaimer. No firm price. | how much to replace a water heater |
| n8n takes more than 20 seconds. | The local answerer replies. The visitor sees no error. | No phrase to try |
| A booking names a city that is not served. | The form says the city is not covered yet and asks them to call. | No phrase to try |
| A bot fills the hidden form field. | The lead is quietly ignored. | No phrase to try |
Guardrails and hand-off
Guardrails
- The n8n address and key stay on the server.
- Gas and emergency rules run before anything else in the local answerer.
- Prices are ranges with a disclaimer, never a firm quote.
- Chat messages are rate limited: 30 a minute per address, counted in memory from the forwarded address.
When a person takes over
Gas and emergency messages point the visitor to the phone first. Anything outside the knowledge base gets an honest 'I would rather say so than guess' and the number to call.
Not in this build yet
We would rather you hear it from us.
- The n8n workflow itself is a design document.
- The proxy passes the browser's own site id through; the engine sites add it on the server.
- When n8n is connected, the gas rule lives in its written instructions. The code applies it only on the local path.
- The demo server has no database, so it stores no leads.
Try it yourself
Type:
I smell gasExpect: An evacuation script first.
Type:
how much to replace a water heaterExpect: A range with a disclaimer, never a firm price.
Open the chat on the demo site. Please don't type real personal details.
Built with
- Next.js
- React
- TypeScript
- Node.js
- n8n