| Caller | Address | Trade | Urgency | Status | Time |
|---|---|---|---|---|---|
| Loading calls… | |||||
| Time | Operative | Call | Method | Status | Confirmed |
|---|---|---|---|---|---|
| Loading… | |||||
| Name | Phone | Trades | Available | |
|---|---|---|---|---|
| Loading… | ||||
Each client has their own rule set. Rules run after every call — first match wins. Clients with no rules fall back to default handling and trigger an admin alert.
Automated routines that run on a schedule. Changes take effect on the next deployment.
| User | Role | Last sign in | ||
|---|---|---|---|---|
| Loading users… | ||||
-
1
Resident calls in out-of-hours
The bOnline OOH number diverts to Twilio, which fires a webhook to Safe-Haus. A call record is created in the database immediately.
-
2
GDPR consent plays
"This call will be recorded and handled by an AI assistant..." — the caller continues to consent. No data is collected before this point.
-
3
AI triage agent gathers the details
Claude (the AI) has a natural conversation to capture: landlord/housing association, property address, caller's name and number, issue type, trade required, and urgency. It confirms the caller's number from the inbound call rather than asking them to repeat it.
-
4
Workflow engine decides the route
The triage data hits the workflow rules. Emergency calls go to dispatch; non-urgent calls are logged for next-day; drainage and incomplete calls escalate to a supervisor.
-
5
Operative receives a dispatch SMS
The matched operative gets a text with the job details. They reply YES to accept or NO to decline. If they don't reply within 30 seconds, the system tries an outbound call.
-
6
ETA collected and resident notified
On acceptance, the operative is asked how long until they're on site. Their reply (e.g. "30 mins") is stored, and the resident receives a personalised SMS: "Hi Mrs Davies, great news — [Name] is on their way and expects to arrive in approximately 30 mins."
-
7
Job complete
When the operative texts DONE, the call is marked complete and the resident receives a job-complete confirmation. Everything is logged in the portal for your records.
Call statuses
| Status | Meaning |
|---|---|
| Active | Call is in progress or triage just completed — workflow running. |
| Complete | Operative marked the job DONE. |
| Escalated | Passed to a supervisor — no operative available or drainage/incomplete triage. |
| Incomplete | Call ended before triage finished, or auto-closed after timeout. |
Dispatch statuses
| Status | Meaning |
|---|---|
| Sent | SMS dispatched, waiting for operative reply. |
| Awaiting ETA | Operative said YES — system has asked for their ETA. |
| Confirmed | Operative confirmed with ETA. Resident has been notified. |
| Declined | Operative said NO — system trying next available. |
| Escalated | No operatives responded — supervisor alerted. |
| Job complete | Operative sent DONE. Resident notified. |
| Trade | Examples | Default routing |
|---|---|---|
| Electrical | No power, tripped fuse, exposed wiring | Dispatch electrical operative → if none, escalate electrical supervisor |
| Plumbing | Burst pipe, no hot water, overflowing tank | Dispatch multi-trade operative |
| Drainage | Blocked drain, sewer smell, external flooding | Always escalate to drainage supervisor |
| Joinery | Door off hinges, broken window, security issue | Dispatch multi-trade operative |
| General | Anything that doesn't fit above | Dispatch multi-trade operative → if none, escalate duty manager |
Operatives
Add an operative under Team → Operatives. Enter their mobile number — this is where the dispatch SMS goes. Tick each trade they cover. Make sure Available is toggled on, or they won't be contacted.
To mark an operative unavailable temporarily (holiday, off-call), toggle Available off from their row in the table.
Supervisors
Add a supervisor under Team → Supervisors. Set their trade if they specialise (e.g. drainage) or leave it blank for a duty manager who covers everything.
Supervisors receive escalation SMS and email. The email field is important — escalations go there as well as by text so nothing gets missed.
Each rule is an IF / THEN: if certain conditions are met in the triage data, take a specific action.
| Condition fields | Action types |
|---|---|
| trade — electrical, plumbing, drainage, joinery, general | dispatch — send SMS to the best available operative |
| urgency — emergency, non_emergency | escalate — SMS + email the matching supervisor |
| landlord — housing association name | log_only — record the call, no dispatch (e.g. non-urgent) |
Rules are checked in order — the first rule that matches wins. If no rules match, the built-in fallback escalates to the duty manager.
| Question | Answer |
|---|---|
| Why is a call showing as "active" with no dispatch? | The workflow engine may not have found an available operative. Check Team → Operatives and make sure at least one is toggled Available for the relevant trade. |
| Can a resident reply to the confirmation SMS? | Yes — any reply is logged in the comms log for that call and an admin alert is sent. The system sends an auto-acknowledgement so the resident isn't left waiting. |
| What happens if the operative doesn't reply? | After 30 seconds without a reply, the system makes an outbound call to the operative. If that also fails, it escalates to the supervisor for that trade. |
| How long are call records kept? | 90 days from the call date. The GDPR auto-delete routine runs every night at 2:00 AM UTC and permanently removes records past their retention date. This cannot be disabled. |
| Where is the data stored? | All data is in Supabase PostgreSQL hosted in the EU (London region) and AWS eu-west-2. No data leaves the UK. |
| How do I update the AI's script or greeting? | The triage agent system prompt is in triage-agent.js in the Lambda codebase. Changes require a Lambda redeploy. Contact your platform administrator. |