Roofing · AI services
A roofing assistant that keeps answering when the AI goes quiet
The same few dozen questions about pricing, repairs and insurance arrive every day, and the answers change with who picks up.
Three answer tiers: an n8n workflow, then the server's knowledge base, then the same retriever in the browser. Sensitive words reach a person.
This is a concept build. CrestBay Roofing is a fictional business. The code is real: open the demo and try the steps below.
The everyday problem
One knowledge base answers them the same way every time, with a person one step away.
The hard part
- The AI service going quiet
If n8n gives nothing within 12 seconds, the server answers from the knowledge base. A pushed reply that misses the 30-second cutoff is answered locally.
- The server itself is down
The same retriever runs in the browser over the same files, so the answer does not change.
- 'Issue' read as 'sue'
Hand-off words match whole words only, so a question about an issue stays with the bot.
- A question it cannot answer
Below the confidence bar, it says it has no good answer and points to a person.
How it runs
How a question finds an answer, whichever tier is up.
Sample run- Step 1: Question.
- Step 2: Hand-off words. sue, refund, injured, cancel go to a person; "issue" does not match "sue".
- Step 3: n8n workflow. Direct reply, 12-second timeout; pushed reply, 30-second cutoff.If this fails: No reply: server knowledge base.
- Step 4: Server knowledge base. 58 entries, confidence bar.If this fails: Server down: same retriever in the browser.
- Step 5: In-browser retriever. Same files, same answers.If this fails: Below the bar: says it does not know, offers a person.
- Step 6: Logged with its source. On the server: every message and where its answer came from.
Tap “On fail” to see what happens when a step breaks.
Edge cases we handled
| When | What the system does | Try it |
|---|---|---|
| A visitor asks 'how much is a tile roof'. | A tile price range from the knowledge base. | how much is a tile roof |
| A visitor writes 'I want to sue you'. | Handed straight to a person: 'That one needs a person', with Call us and Send a message buttons. | I want to sue you |
| A visitor mentions an 'issue' with a gutter. | Not handed over: 'issue' is not 'sue'. | No phrase to try |
| A visitor asks 'what is the capital of France'. | An honest 'I don't have a good answer', not a guess. | what is the capital of France |
| n8n is slow or down. | The knowledge base answers instead. | No phrase to try |
Guardrails and hand-off
Guardrails
- Hand-off words match whole words only.
- Below the confidence bar, it does not guess.
- The route n8n pushes replies to checks its secret in constant time.
- On the server, public write routes are rate limited per address, counted in memory.
When a person takes over
Words like 'sue', 'refund', 'injured' or 'cancel' skip the bot. The visitor is told 'That one needs a person' and offered Call us and Send a message.
Not in this build yet
We would rather you hear it from us.
- The live demo is static, so only the in-browser tier runs.
- No AI model is connected.
- 'Looking up property details' is an animation, not a lookup.
Try it yourself
Type:
how much is a tile roofExpect: A tile price range from its knowledge base.
Type:
I want to sue youExpect: Straight to a person: 'That one needs a person.'
Type:
what is the capital of FranceExpect: An honest 'I don't have a good answer', not a guess.
Open the chat on the demo site. Please don't type real personal details.
Built with
- React
- TypeScript
- Node.js
- n8n