Property management - qualifying agent

Written By William Bowen

Last updated 14 days ago

Intro

This Property Management Qualifying AI Agent automates lead qualification by gathering key details from potential renters, including property type, preferred neighborhood, budget, bedrooms, bathrooms, and timeline, then syncing the data to a CRM like Salesforce.

For example, if Sarah texts the AI looking for a two-bedroom apartment in downtown Toronto under $2,500/month, the AI collects her details, updates her contact record, and can trigger a Slack notification for the leasing team to follow up instantly.

Use cases

  1. Lead Qualification: The agent gathers essential renter details and logs them automatically.
    Example: Sarah texts that she needs a 2-bedroom apartment in downtown with a $2,200 budget and a 3-month timeline, and the agent records her preferences in Salesforce.

  2. Rental Type Filtering: The agent extracts property type information to differentiate between apartments, houses, or condos.
    Example: John specifies he’s looking for a house in a suburban neighborhood with 3 bedrooms, and the agent captures this data for targeted follow-up.

  3. Neighborhood Targeting: The agent identifies the desired area to help match renters with local listings.
    Example: Maria indicates her interest in properties in the uptown district with a 1-bedroom setup, and the agent updates her contact card accordingly.

  4. Budget-Based Sorting: The agent extracts budget details to prioritize listings within the renter’s financial range.
    Example: Alex mentions his maximum budget is $1,800/month for a studio apartment, and the agent stores this criterion for precise matching.

  5. Timeline Coordination: The agent captures the move-in timeline to streamline scheduling of property viewings.
    Example: Emma specifies she needs a rental within the next month, and the agent adds her timeline to her profile in the CRM.

  6. Detailed Specification Capture: The agent collects combined criteria (bedrooms, bathrooms, property type) for a complete profile.
    Example: David requests a 3-bedroom, 2-bath house in a specific neighborhood, and the agent extracts and logs every detail into his CRM record.

  7. Instant Notification: The agent triggers a notification once a qualified inquiry is received.
    Example: Lisa texts her requirements for a condo with 1 bedroom and a $2,500 budget, prompting an immediate alert to the leasing team via Slack integration.

  8. CRM Data Enrichment: The agent automatically enriches contact cards with extracted property preferences for effective follow-up.
    Example: Michael provides his preferences for a townhouse in a particular area with 2 bathrooms, and his updated contact card is instantly synced with Salesforce.

  9. Follow-Up Preparation: The agent collects essential details to help prioritize subsequent communications.
    Example: Nina states she is interested in a 2-bedroom apartment, available in 2 months with a $2,000 budget, enabling the team to plan timely follow-ups.

  10. Streamlined Lead Management: The agent organizes inquiries by extracting and syncing key data for efficient lead management.
    Example: Kevin texts his interest in a property with 3 bedrooms in a designated area and a flexible timeline, and the agent logs his details to help the team prioritize his inquiry.

Screenshots

Template

Example
{ "$schema": "https://web-api.clerk.chat/pipeline-schema", "name": "Property management - qualifying agent", "nodes": [ { "type": "tool_runner", "name": "Update bedrooms", "triggeredBy": [ "unreadMessage.fromAny" ], "responseType": "json", "nodeConfig": { "type": "contact_tools", "config": {}, "enabledTools": [ "set_attribute" ], "tools": { "set_attribute": { "paramValues": { "attributeName": { "type": "fixed", "value": "Bedrooms & bathrooms" }, "attributeValue": { "path": "bedrooms + bathrooms", "type": "pipeline-variable" } } } } } }, { "type": "tool_runner", "name": "Update rent", "triggeredBy": [ "unreadMessage.fromAny" ], "responseType": "json", "nodeConfig": { "type": "contact_tools", "config": {}, "enabledTools": [ "set_attribute" ], "tools": { "set_attribute": { "paramValues": { "attributeName": { "type": "fixed", "value": "Budget" }, "attributeValue": { "path": "budget", "type": "pipeline-variable" } } } } } }, { "type": "tool_runner", "name": "Update location", "triggeredBy": [ "unreadMessage.fromAny" ], "responseType": "json", "nodeConfig": { "type": "contact_tools", "config": {}, "enabledTools": [ "set_attribute" ], "tools": { "set_attribute": { "paramValues": { "attributeName": { "type": "fixed", "value": "Neighbourhood" }, "attributeValue": { "path": "neighbourhood", "type": "pipeline-variable" } } } } } }, { "type": "tool_runner", "name": "Update timeline", "triggeredBy": [ "unreadMessage.fromAny" ], "responseType": "json", "nodeConfig": { "type": "contact_tools", "config": {}, "enabledTools": [ "set_attribute" ], "tools": { "set_attribute": { "paramValues": { "attributeName": { "type": "fixed", "value": "Timeline" }, "attributeValue": { "path": "timeline", "type": "pipeline-variable" } } } } } }, { "type": "tool_runner", "name": "Update property type", "triggeredBy": [ "unreadMessage.fromAny" ], "responseType": "json", "nodeConfig": { "type": "contact_tools", "config": {}, "enabledTools": [ "set_attribute" ], "tools": { "set_attribute": { "paramValues": { "attributeName": { "type": "fixed", "value": "Property Type" }, "attributeValue": { "path": "property type", "type": "pipeline-variable" } } } } } }, { "type": "ai_bot", "name": "Conclude", "triggeredBy": [ "unreadMessage.fromAny" ], "responseType": "user_message", "nodeConfig": { "modelProvider": "openai", "modelVersion": null, "maxTokens": null, "temperature": null, "variables": {}, "prompt": "Your job is to conclude the conversation with the user. By this point, we have all the information we need. Let them know we will be in touch shortly with some recommendations. \n\nYour output should be max 40 words.", "promptSections": [], "sectionTemplates": {}, "responseSchema": { "type": "object", "required": [], "properties": {} }, "opts": { "sendStructuredConvo": true } } }, { "type": "ai_bot", "name": "2. Bedrooms and bathrooms", "triggeredBy": [ "unreadMessage.fromAny" ], "responseType": "user_message", "nodeConfig": { "modelProvider": "openai", "modelVersion": null, "maxTokens": null, "temperature": null, "variables": {}, "prompt": "Your job is to ask the user how many bedrooms and bathrooms they want their property to have. \n\nYour output should be conversational and max 40 words.", "promptSections": [], "sectionTemplates": {}, "responseSchema": { "type": "object", "required": [], "properties": {} }, "opts": { "sendStructuredConvo": true } } }, { "type": "ai_bot", "name": "4. Monthly budget?", "triggeredBy": [ "unreadMessage.fromAny" ], "responseType": "user_message", "nodeConfig": { "modelProvider": "openai", "modelVersion": null, "maxTokens": null, "temperature": null, "variables": {}, "prompt": "Your job is to ask the user what their monthly budget is for their property. \n\nYour output should be conversational and max 40 words.", "promptSections": [], "sectionTemplates": {}, "responseSchema": { "type": "object", "required": [], "properties": {} }, "opts": { "sendStructuredConvo": true } } }, { "type": "ai_bot", "name": "3. Location?", "triggeredBy": [ "unreadMessage.fromAny" ], "responseType": "user_message", "nodeConfig": { "modelProvider": "openai", "modelVersion": null, "maxTokens": null, "temperature": null, "variables": {}, "prompt": "Your job is to ask the user location/neighbourhood they are looking to live in. \n\nYour output should be conversational and max 40 words.", "promptSections": [], "sectionTemplates": {}, "responseSchema": { "type": "object", "required": [], "properties": {} }, "opts": { "sendStructuredConvo": true } } }, { "type": "ai_bot", "name": "5. Timeline?", "triggeredBy": [ "unreadMessage.fromAny" ], "responseType": "user_message", "nodeConfig": { "modelProvider": "openai", "modelVersion": null, "maxTokens": null, "temperature": null, "variables": {}, "prompt": "Your job is to ask the user for their timeline for moving in.\n\nYour output should be conversational and max 40 words.", "promptSections": [], "sectionTemplates": {}, "responseSchema": { "type": "object", "required": [], "properties": {} }, "opts": { "sendStructuredConvo": true } } }, { "type": "ai_bot", "name": "1. What property type?", "triggeredBy": [ "unreadMessage.fromAny" ], "responseType": "user_message", "nodeConfig": { "modelProvider": "openai", "modelVersion": null, "maxTokens": null, "temperature": null, "variables": {}, "prompt": "Your job is to ask the user what type of property they are interested in. E.g. apartment, condo, house, etc. \n\nYour output should be conversational and max 40 words.", "promptSections": [], "sectionTemplates": {}, "responseSchema": { "type": "object", "required": [], "properties": {} }, "opts": { "sendStructuredConvo": true } } }, { "type": "ai_bot", "name": "Qualification brain", "triggeredBy": [ "unreadMessage.fromAny" ], "responseType": "json", "nodeConfig": { "modelProvider": "openai", "modelVersion": "o3-mini", "maxTokens": null, "temperature": null, "variables": {}, "prompt": "You are working for a landlord. \n\nYour job is to read the conversation history and extract the following bits of data: \nWhat property type are they interested in? (condo, apartment, house, etc)\nHow many bedrooms & bathrooms do they want?\nTimeline. When are they looking to move in?\nWhat is their monthly rent budget?\nWhich neighbourhood are they interested in?\n\nIf a data point hasn't been given in the conversation, leave it blank. \n\nIf the user has answered as unsure or nothing for one of the data points, that's fine, extract that value.", "promptSections": [], "sectionTemplates": {}, "responseSchema": { "type": "object", "required": [ "property type", "bedrooms + bathrooms", "timeline", "budget", "neighbourhood" ], "properties": { "budget": { "type": "string" }, "timeline": { "type": "string" }, "neighbourhood": { "type": "string" }, "property type": { "type": "string" }, "bedrooms + bathrooms": { "type": "string" } } }, "opts": { "sendStructuredConvo": true } } }, { "type": "trigger", "name": "Start", "triggeredBy": [ "userMessage" ], "responseType": "json" } ], "edges": [ { "name": null, "sourceNode": "Qualification brain", "destinationNode": "Update location", "sourceVariables": null, "filters": [] }, { "name": null, "sourceNode": "Qualification brain", "destinationNode": "Update timeline", "sourceVariables": null, "filters": [] }, { "name": null, "sourceNode": "Qualification brain", "destinationNode": "Update property type", "sourceVariables": null, "filters": [] }, { "name": null, "sourceNode": "Qualification brain", "destinationNode": "Update bedrooms", "sourceVariables": null, "filters": [] }, { "name": null, "sourceNode": "Qualification brain", "destinationNode": "Update rent", "sourceVariables": null, "filters": [] }, { "name": "Got all", "sourceNode": "Qualification brain", "destinationNode": "Conclude", "sourceVariables": null, "filters": [ { "type": "rule", "config": { "syntax": { "and": [ { "!isEmpty": [ { "var": "message.property type" } ] }, { "!isEmpty": [ { "var": "message.bedrooms + bathrooms" } ] }, { "!isEmpty": [ { "var": "message.neighbourhood" } ] }, { "!isEmpty": [ { "var": "message.budget" } ] }, { "!isEmpty": [ { "var": "message.timeline" } ] } ] } } } ] }, { "name": "Got 1, missing 2. ", "sourceNode": "Qualification brain", "destinationNode": "2. Bedrooms and bathrooms", "sourceVariables": null, "filters": [ { "type": "rule", "config": { "syntax": { "and": [ { "!isEmpty": [ { "var": "message.property type" } ] }, { "isEmpty": [ { "var": "message.bedrooms + bathrooms" } ] } ] } } } ] }, { "name": "Got 1, 2, 3, missing 4. ", "sourceNode": "Qualification brain", "destinationNode": "4. Monthly budget?", "sourceVariables": null, "filters": [ { "type": "rule", "config": { "syntax": { "and": [ { "!isEmpty": [ { "var": "message.property type" } ] }, { "!isEmpty": [ { "var": "message.bedrooms + bathrooms" } ] }, { "!isEmpty": [ { "var": "message.neighbourhood" } ] }, { "isEmpty": [ { "var": "message.budget" } ] } ] } } } ] }, { "name": "Got 1, 2, missing 3. ", "sourceNode": "Qualification brain", "destinationNode": "3. Location?", "sourceVariables": null, "filters": [ { "type": "rule", "config": { "syntax": { "and": [ { "!isEmpty": [ { "var": "message.property type" } ] }, { "!isEmpty": [ { "var": "message.bedrooms + bathrooms" } ] }, { "isEmpty": [ { "var": "message.neighbourhood" } ] } ] } } } ] }, { "name": "Got 1, 2, 3, 4, missing 5", "sourceNode": "Qualification brain", "destinationNode": "5. Timeline?", "sourceVariables": null, "filters": [ { "type": "rule", "config": { "syntax": { "and": [ { "!isEmpty": [ { "var": "message.property type" } ] }, { "!isEmpty": [ { "var": "message.bedrooms + bathrooms" } ] }, { "!isEmpty": [ { "var": "message.neighbourhood" } ] }, { "!isEmpty": [ { "var": "message.budget" } ] }, { "isEmpty": [ { "var": "message.timeline" } ] } ] } } } ] }, { "name": "Got none", "sourceNode": "Qualification brain", "destinationNode": "1. What property type?", "sourceVariables": null, "filters": [ { "type": "rule", "config": { "syntax": { "isEmpty": [ { "var": "message.property type" } ] } } } ] }, { "name": null, "sourceNode": "Start", "destinationNode": "Qualification brain", "sourceVariables": null, "filters": [] } ] }