1. Inquiry Capture, Dedupe and Routing
Trigger: any of - portal integration webhook; parsed portal notification email; website Property Inquiry form submission; inbound call captured by the voice assistant; inbound SMS to the office number.
Conditions and branches:
- Stamp inquiry_received_at, set inquiry_source, apply the matching source tag.
- Parse and write property_ref and property_address. If the reference cannot be parsed, flag the inquiry for a human within 2 minutes rather than sending a generic reply - a reply that gets the property wrong is worse than a slow one.
- Dedupe branch: match on mobile first, then email. If an open opportunity already exists for this contact, apply duplicate-inquiry, append the new property_ref to the existing opportunity, and notify the already-assigned agent. Do not create a second thread or send a second first-response.
- No contact detail branch: if neither mobile nor email is present, apply no-contact-detail, create a task on the office queue, and exit.
- Assignment branch: if the property has a named listing agent, assign to them. Otherwise round robin across agents on duty, skipping anyone outside working hours. Write assignment_reason.
- Create the opportunity at New Inquiry and hand to workflow 2 immediately. No wait step of any kind.
Exit: handed to workflow 2, or closed as a duplicate or contactless inquiry.
2. Instant First Response
Trigger: opportunity created at New Inquiry.
Conditions: branch on time of day and whether a cell number is present.
- Mobile present, any hour: send within 60 seconds. SMS: "Hi {{first_name}}, thanks for your inquiry about {{property_address}} - it's still available. I'm {{assistant_name}}, the assistant at {{office_name}}. When were you hoping to see it? I can get you booked in now."
- Stamp first_response_at, move to Auto-Responded, and start workflow 3.
- Out of hours (after 21:00 or before 08:00 local): still send immediately but adjust the opener: "...I know it's late - happy to sort this now by text, or someone will call you in the morning, whichever you prefer." Speed matters more than politeness about the hour, but acknowledging it costs nothing.
- Send the email version in parallel: listing summary, three photographs, the showing booking link and the agent's name.
- Email only, no mobile: send the email version and ask for a cell number in the first line, so the conversation can move to the channel that actually converts.
- Working hours and lead_score already above the hot threshold from a prior record: ring the assigned agent's mobile at the same time as the SMS sends. Do not make a known hot buyer wait for a text exchange.
Exit: first response sent and logged.
3. Conversational Qualification and Scoring
Trigger: inbound reply on an inquiry thread.
Conditions: BO handles the thread unless a guardrail keyword is present.
- Move to In Qualification. BO asks at most two questions per message, in this order: timeline, then finance, then property to sell, then areas and minimum bedrooms. Never ask budget before finance - it reads as a credit check.
- Write each answer to its field as it arrives: buying_timeline, finance_status, has_property_to_sell, budget_range, areas_of_interest, bedrooms_min.
- Recalculate lead_score on every field write. Suggested weighting: finance approved or cash +30; timeline this month +25, 1–3 months +20, 3–6 months +10; property to sell not yet listed +15; replied within 10 minutes +10; asked a specific question about the property +10; budget consistent with the asking price +10. Just looking, or timeline beyond 6 months, -20.
- Score at or above 55: move to Qualified - Hot, apply hot-buyer, notify the assigned agent by push and SMS with the full summary, and offer showing slots in the same message.
- Score 25 to 54: move to Qualified - Warm, apply warm-buyer, offer a showing and, if declined, a Buyer Discovery Call.
- Score below 25, or buying_timeline = just looking: move to Unqualified, set unqualified_reason, and enroll in the listing alert nurture rather than closing. A browser today is a buyer in nine months.
- Guardrail branch: any mention of making an offer, a attorney, a survey, a chain, or a complaint - exit BO, apply needs-human, notify the assigned agent and the office manager, and create a task due within 30 minutes.
- Finance not started: apply finance-needed and, where the agency has a mortgage adviser relationship, offer an introduction. BO states plainly that it cannot give mortgage advice.
Exit: showing booked, discovery call booked, handed to a human, or moved to Unqualified.
4. No-Response Nudge Ladder
Trigger: opportunity has been at Auto-Responded with no inbound reply.
Conditions: no reply received, no STOP, not a duplicate.
- Wait 20 minutes. SMS: "{{first_name}}, I can hold a showing slot at {{property_address}} - {{slot_one}} or {{slot_two}}? Either works." Two concrete options beat an open question.
- Wait 3 hours, or until 09:00 if that falls inside quiet hours. Place an outbound call attempt from the assigned agent, or the voice assistant out of hours.
- Wait until the next working morning. Email with three comparable listings from the same area and price band, plus the original property. The alternatives are what rescue this lead.
- Wait 2 days. Final SMS: "Last one from me, {{first_name}} - still interested in {{property_address}}, or shall I send you new listings as they come up instead? Reply NEW for alerts."
- Wait 3 days. Move to No Response, enroll in the listing alert build using whatever preferences were captured, and exit.
Exit: any inbound reply - hand to workflow 3 - or the ladder completes. Maximum four outbound touches.
5. Showing Booking, Reminders and No-Show Recovery
Trigger: appointment booked on Property Showing, Buyer Discovery Call or Open House Slots.
- Immediately: confirmation SMS and email with address, access notes, parking, the agent's name and the Showing Confirmation page. Move to Showing Booked and stop workflow 4.
- Write the appointment to the agent's calendar with lead_score, finance_status, buying_timeline and has_property_to_sell in the notes, so the agent arrives informed.
- If the property is tenanted or owner-occupied, notify the vendor or tenant with the required notice period and hold the confirmation until access is agreed. Never confirm a showing the vendor has not accepted.
- 24 hours before: reminder SMS with a one-tap reschedule link.
- 2 hours before: "See you at {{appointment_time}} outside {{property_address}}. {{agent_first_name}} will meet you there - {{agent_mobile}} if you're running late."
- Attended: move to Showing Attended, start workflow 6.
- No-show: wait 15 minutes past the slot, then SMS: "Missed you at {{property_address}} - everything alright? Happy to rearrange: {{booking_link}}". Wait 1 day, one more rebook offer. If neither lands, move to No Response and enroll in listing alerts.
- Canceled by the buyer: ask one question about why, write it to the opportunity notes, and offer two alternatives before closing anything.
Exit: attended, or two rebook attempts exhausted.
6. Post-Showing Feedback and Next Step
Trigger: opportunity moves to Showing Attended.
- Wait 3 hours. SMS: "{{first_name}}, what did you think of {{property_address}}? Honest answer is genuinely useful - the vendor will want to know either way."
- Branch on the reply. Positive and asking about next steps: notify the assigned agent immediately with needs-human; BO does not discuss offers. Positive with reservations: BO asks what would need to be different and writes it to the opportunity. Negative: BO thanks them and asks what to change in the search criteria.
- Wait 1 day. Email three alternative listings matched on areas_of_interest, bedrooms_min and budget_range, whatever the feedback was.
- Relay the buyer's feedback to the vendor on the listing - an automated, honest showing feedback note is one of the highest-value things an agency can send a vendor, and almost nobody does it consistently.
- Wait 3 days with no offer and no further contact: enroll in listing alerts, keep the opportunity open at Showing Attended for 14 days, then close it with a reason.
- If has_property_to_sell = yes: wait 2 days after the showing, then send one low-key valuation offer. One attempt, then hand the valuation opportunity to its own pipeline.
Exit: offer made and handed to a human, or 14 days with no movement.
7. Out of Area and Unqualified Handling
Trigger: unqualified_reason is set, or the inquiry address falls outside the agency's patch.
- Out of area: apply out-of-area, send the Out of Area page with a referral path where one exists, and close the opportunity. One message, no sequence.
- Budget mismatch: do not close. Send the three nearest listings inside their actual band and enroll in listing alerts at that band.
- Not a buyer - a tenant, a nosy neighbor, a canvassing competitor: close silently, tag appropriately, suppress from marketing.
- Already purchased elsewhere: close, and schedule a single message 18 months out. Buyers move again, and nobody else will remember.
- Every unqualified close writes a reason. An unqualified pile with no reasons is the same problem this build exists to fix.
Exit: closed with a reason, or redirected into listing alerts.
8. Response-Time SLA Monitor
Trigger: scheduled check every 5 minutes against all opportunities at New Inquiry, plus a daily roll-up.
- If an opportunity has been at New Inquiry for more than 5 minutes with no first_response_at, apply sla-breached and notify the office manager with the inquiry details. Something in the capture chain is broken and it needs finding today.
- If a needs-human tag has been unclaimed for 30 minutes during working hours, escalate to the office manager. At 2 hours, escalate to the owner.
- Daily at 08:00: internal digest to the manager - inquiries received, median seconds to first response, slowest five, SLA breaches, needs-human items still open, and showings booked.
- Weekly: the same cut split by inquiry_source and by assigned_agent, so you can see which portal produces leads worth paying for and which agent lets threads go cold.
- Monthly: inquiry-to-showing and showing-to-offer rates by source, which is the number that should decide next year's portal spend.
Exit: none - this workflow runs permanently. It is the one that keeps the rest honest.