Collect → Identify → Ask What's Missing → Tag → Create Ticket

Omnichannel Intake and Triage

Pulls requests in from email, SMS, and the portal, identifies the resident and unit, asks for whatever detail is missing, and creates a complete, correctly-tagged ticket ready for dispatch.

The Problem

The lead was real. The detail was missing. The ticket sat.

A resident sends an email: "The kitchen thing is broken again." Your coordinator reads it, tries to figure out which unit, which appliance, and whether it's urgent. They call back to ask. No answer. The ticket sits incomplete for a day. Maintenance gets a vague work order. A tech shows up with the wrong parts.

What Changes

Your coordinator's morning - with the agent running.

The agent reads the email, identifies the unit from the resident's record, and sends a quick text: "Which appliance - dishwasher, faucet, or something else?" and "Is there water leaking right now?" The resident replies in 30 seconds. The agent creates a complete ticket - right trade, right priority, right unit details. Your coordinator opens a clean work order ready for dispatch.

Humans stay in control: Your coordinator reviews and dispatches every ticket. The agent handles the collecting, the identifying, and the back-and-forth that fills in missing detail. It produces a complete record, your team makes the call.

HOW THE AGENT WORKS

TRIGGERLLMAPIDECISIONACTIONWAIT
TRIGGERMessage ArrivesEmail, SMS, or portal submission
LLMRead & UnderstandLLM extracts intent, unit hints, urgency
APIIdentify ResidentMatch sender to resident + unit in PMS
DECISIONDetail Complete?
LLMAsk What’s MissingSend targeted follow-up question
LLMTag & CategoriseAssign trade, priority, unit details
ACTIONCreate TicketWrite complete work order to PMS
ACTIONFlag for ReviewSurface to coordinator for dispatch
The agent doesn't make the repair decision. It collects what's missing and produces a complete record. Your team still reviews and dispatches. The agent removes the back-and-forth, not the judgment.

HOW TO BUILD IT

Three levels of depth. Pick the one that matches where you are.

For the ops person who needs to understand what's involved and brief their team.

Your ChannelsEmail, SMS, portal
The AgentWorkflow engine + LLM
Your PMSResidents, units, tickets

WHAT YOUR TEAM PROVIDES ONCE

  • Channel access - the inboxes, numbers, and portal feed requests come from
  • Resident directory - so the agent can match a sender to a unit
  • Required fields per request type - what a complete ticket needs
  • Trade and priority taxonomy - how requests get tagged
  • Follow-up templates - the approved wording for missing-detail questions
What happens day-to-day: Residents message you however they like. The agent reads each one, works out who and what, asks the one question that's missing, and files a clean ticket. Your coordinator opens complete work orders instead of half-formed messages to decode.

For the IT person or technical lead who needs to scope the integration.

INQUIRY SOURCES

Email inbox
Inbound SMS
Resident portal

WORKFLOW ENGINE (N8N)

Trigger
LLM - Understand request
PMS API - Identify resident
Branch - detail complete?
LLM - Ask + tag
PMS API - Create ticket
Notify coordinator

CONNECTS TO

PMS (Yardi / AppFolio / RealPage)Read: resident directory. Write: complete tickets
Email + SMS (IMAP / Twilio)Read inbound, send follow-up questions
Resident portalRead: submitted requests
Notifications (Slack / email)Surface ready tickets to the coordinator
WITHOUT PMS API

Agent reads from a shared inbox and posts tickets to a sheet. Resident matching is manual or skipped. The missing-detail chase still runs unattended.

WITH PMS API

Agent matches residents against the live directory and writes complete tickets straight into the PMS. Best experience.

For the person who wants to build this agent step by step. Each node below maps to an n8n workflow node.

TRIGGERNode 1
Trigger - Email / SMS / Portal
IMAP on the resident inbox + Twilio inbound + portal webhook, normalised into one payload.
Output: { sender, channel, raw_message, attachments, received_at }
LLMNode 2
LLM - Understand Request
Extracts intent, any unit/appliance hints, and urgency from free text.
Output: { intent, unit_hint, item, urgency, missing_fields[] }
You read an inbound resident message and extract a maintenance request.

Return:
- intent: maintenance / question / complaint / other
- item: what is broken or asked about, in a few words
- unit_hint: any unit reference in the message, or null
- urgency: emergency / high / normal
- missing_fields: list any of [unit, specific_item, active_damage, access] not stated

Respond ONLY with valid JSON. No explanation.

--- MESSAGE ---
{raw_message}
INPUT
"The kitchen thing is broken again."
OUTPUT
{
  "intent": "maintenance",
  "item": "unspecified kitchen appliance",
  "unit_hint": null,
  "urgency": "normal",
  "missing_fields": ["unit", "specific_item", "active_damage"]
}
APINode 3
HTTP Request - Identify Resident
Look up the sender (email/phone) in the PMS to resolve resident name and unit.
Output: { resident_name, unit_id, lease_status }
DECISIONNode 4
Condition - Detail Complete?
IF missing_fields is empty → go straight to tagging. ELSE → send a targeted follow-up and wait for the reply.
Output: Branch: COMPLETE (tag + create) or INCOMPLETE (ask, then continue)
LLMNode 5
LLM - Ask & Tag
Sends the one or two questions that close the gaps, then tags trade and priority once the reply lands.
Output: { trade, priority, unit_id, complete_description }
You turn a resident request plus their reply into a clean, tagged ticket.

Given the original message, the resident's reply, and the unit record, return:
- trade: one of [plumbing, hvac, electrical, appliance, general, pest, life_safety]
- priority: emergency / high / normal (emergency only for active damage or safety)
- complete_description: a clear one-paragraph work order description
- access_notes: any entry instructions

Respond ONLY with valid JSON.

ORIGINAL: {raw_message}
REPLY: {resident_reply}
UNIT: {unit_record}
OUTPUT
{
  "trade": "appliance",
  "priority": "normal",
  "complete_description": "Unit 214 dishwasher not draining, standing water in the bottom. No active leak onto floor.",
  "access_notes": "Resident home after 5pm, no pets"
}
APINode 6
HTTP Request - Create Ticket
POST the complete work order to the PMS with trade, priority, unit, and description. Status: "Ready for dispatch".
Output: Complete ticket created in the PMS.
ACTIONNode 7
Notify Coordinator
Send the coordinator a one-line summary with approve/dispatch.
Output: Coordinator notified, ticket ready to dispatch.
MVP vs Advanced — Where To Start
MVP — START HERE
  • Single inbox (email only)
  • LLM extraction only
  • Manual resident match
  • One fixed follow-up question
  • Ticket to a shared sheet
  • Coordinator alert by email
ADVANCED — ADD LATER

    Full Video Walkthrough Coming Soon

    From a vague message to a clean ticket - step by step.

    Register to be notified

    Everything on this page is free to learn.

    When you're ready to build — do it yourself or bring us in.

    OTHER AGENTS IN LEASING & MARKETING

    Sends milestone updates automatically, escalates stalled cases
    Sends status updates tied to ticket milestones, automatically
    Drafts standardised notices with required wording in place
    Answers questions, opens requests, routes to the right team

    Frequently asked questions

    Omnichannel Intake and Triage is an AI agent that collects from every channel, asks what's missing, and creates clean tickets.
    The lead was real. The detail was missing. The Omnichannel Intake and Triage addresses this — it collects from every channel, asks what's missing, and creates clean tickets.
    No — your team stays in control. Your coordinator reviews and dispatches every ticket. The agent handles the collecting, the identifying, and the back-and-forth that fills in missing detail. It produces a complete record, your team makes the call.