Real-estate AI agent on WhatsApp

Understands what clients want, suggests matching listings and books viewings — in Arabic or English.

AI agentAdvanced Saves ~25 hours/month AI AgentsBy Flowngn team

Works with n8n · Make · Zapier

How it works

Trigger: WhatsApp — a client sends a message
  1. A client asks about a property on WhatsApp.
  2. The agent asks about buy/rent, area, budget, bedrooms and timing.
  3. It suggests up to 3 available listings with price and photos link.
  4. It books a viewing in your calendar and alerts your agent on Telegram.

What it can do

Unlike a fixed flow, an agent decides which of its tools to use, in what order — and remembers the conversation.

  • Qualifies clients naturally: buy or rent, area, budget, bedrooms, timing
  • Suggests only available listings from your sheet
  • Books viewings in the agent's calendar
  • Alerts your agent about serious buyers

System prompt

The instructions that shape the agent. It's already inside the n8n template — copy it into Make or Zapier, and adjust the YOUR_… parts.

System prompt
You are the WhatsApp assistant for YOUR_AGENCY, a real-estate agency. Reply in the customer's language and dialect (Egyptian Arabic, Gulf Arabic, Modern Standard Arabic or English). Be warm and brief.

Help people find properties, answer questions about listings, and book viewings.

Ask (one at a time, naturally): buy or rent, area, budget, bedrooms, and when they want to move.

Tools:
- "Search listings": our current listings (code, area, type, bedrooms, price, status, photos link). Only suggest listings marked available.
- "Book viewing": books a viewing in the agent's calendar. Use only after the client picks a listing and a time and gives their name.
- "Notify agent": tells our agent about a serious buyer, a booked viewing, or a question you can't answer.

Today is {{ $now.toFormat('cccc d LLLL yyyy') }}. Viewings: YOUR_VIEWING_HOURS.

Rules:
- Never invent listings, prices, payment plans or legal details.
- Share at most 3 listings at a time, each with its code, price and photos link.
- Never pressure; if nothing fits, offer to notify them when something matching comes up.

Safety rules

Built into the prompt and the tools:

  • Never invents listings, prices, payment plans or legal details
  • Shares at most 3 listings at a time
  • No pressure selling

Uses your own AI key (Claude, OpenAI or another model). Cost depends on the model and conversation length — a small, fast model keeps most conversations to a fraction of a cent.

Diagram

WIncoming messageWhatsApp Trigger{ }Get questionCodeReal-estate agentAI AgentClaude modelAnthropic Chat Mo…◷MemorySimple MemoryGSearch listingsGoogle Sheets ToolCBook viewingGoogle Calendar T…TNotify agentTelegram ToolWReply on WhatsAppWhatsApp Business Cloud
Trigger App Code AI Agent tool

Code

JavaScript used in the Code step — already included in the template below.

Get question · Code node
// Keeps only text messages and pulls out who sent it and what they asked.
const msg = $input.first().json.messages?.[0];
if (!msg || msg.type !== "text") return [];

return [{ json: { from: msg.from, question: msg.text.body } }];

Build it

Pick your tool — same automation, step by step.

Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder. AI steps use a Claude model node — swap it for OpenAI, Gemini or Ollama if you prefer.

Workflow JSON
Show code (283 lines)
{
  "name": "Real-estate AI agent on WhatsApp (Flowngn)",
  "nodes": [
    {
      "parameters": {
        "content": "## Real-estate AI agent on WhatsApp\nUnderstands what clients want, suggests matching listings and books viewings — in Arabic or English.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
        "height": 260,
        "width": 340
      },
      "id": "47157a09-b4de-42a3-abd6-68f495f76b64",
      "name": "Setup notes",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -420,
        -60
      ]
    },
    {
      "parameters": {
        "updates": [
          "messages"
        ]
      },
      "id": "47157a09-b4de-42a3-abd6-68f495f76b64",
      "name": "Incoming message",
      "type": "n8n-nodes-base.whatsAppTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ],
      "webhookId": "47157a09-b4de-42a3-abd6-68f495f76b64"
    },
    {
      "parameters": {
        "jsCode": "// Keeps only text messages and pulls out who sent it and what they asked.\nconst msg = $input.first().json.messages?.[0];\nif (!msg || msg.type !== \"text\") return [];\n\nreturn [{ json: { from: msg.from, question: msg.text.body } }];"
      },
      "id": "47157a09-b4de-42a3-abd6-68f495f76b64",
      "name": "Get question",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        300,
        0
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.question }}",
        "options": {
          "systemMessage": "=You are the WhatsApp assistant for YOUR_AGENCY, a real-estate agency. Reply in the customer's language and dialect (Egyptian Arabic, Gulf Arabic, Modern Standard Arabic or English). Be warm and brief.\n\nHelp people find properties, answer questions about listings, and book viewings.\n\nAsk (one at a time, naturally): buy or rent, area, budget, bedrooms, and when they want to move.\n\nTools:\n- \"Search listings\": our current listings (code, area, type, bedrooms, price, status, photos link). Only suggest listings marked available.\n- \"Book viewing\": books a viewing in the agent's calendar. Use only after the client picks a listing and a time and gives their name.\n- \"Notify agent\": tells our agent about a serious buyer, a booked viewing, or a question you can't answer.\n\nToday is {{ $now.toFormat('cccc d LLLL yyyy') }}. Viewings: YOUR_VIEWING_HOURS.\n\nRules:\n- Never invent listings, prices, payment plans or legal details.\n- Share at most 3 listings at a time, each with its code, price and photos link.\n- Never pressure; if nothing fits, offer to notify them when something matching comes up."
        }
      },
      "id": "47157a09-b4de-42a3-abd6-68f495f76b64",
      "name": "Real-estate agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.9,
      "position": [
        600,
        0
      ]
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "claude-sonnet-5",
          "mode": "list"
        },
        "options": {}
      },
      "id": "47157a09-b4de-42a3-abd6-68f495f76b64",
      "name": "Claude model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.3,
      "position": [
        260,
        220
      ]
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('Get question').item.json.from }}",
        "contextWindowLength": 10
      },
      "id": "47157a09-b4de-42a3-abd6-68f495f76b64",
      "name": "Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.3,
      "position": [
        430,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Returns our listings (code, area, type, bedrooms, price, status, photos link).",
        "operation": "read",
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Listings",
          "mode": "name"
        },
        "options": {}
      },
      "id": "47157a09-b4de-42a3-abd6-68f495f76b64",
      "name": "Search listings",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.5,
      "position": [
        600,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Books a property viewing in the agent's calendar.",
        "calendar": {
          "__rl": true,
          "value": "primary",
          "mode": "id"
        },
        "start": "={{ $fromAI('start', \"Viewing start, ISO 8601 with timezone\", 'string') }}",
        "end": "={{ $fromAI('end', \"Viewing end (45 minutes later), ISO 8601 with timezone\", 'string') }}",
        "additionalFields": {
          "summary": "={{ $fromAI('title', \"Viewing: <listing code> – <client name>\", 'string') }}",
          "description": "=Client WhatsApp: +{{ $('Get question').item.json.from }}"
        }
      },
      "id": "47157a09-b4de-42a3-abd6-68f495f76b64",
      "name": "Book viewing",
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        770,
        220
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Tells our agent about a serious buyer, a booked viewing, or a question you can't answer.",
        "chatId": "YOUR_AGENT_CHAT_ID",
        "text": "={{ $fromAI('message', \"Client needs, budget, listing codes and phone\", 'string') }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "id": "47157a09-b4de-42a3-abd6-68f495f76b64",
      "name": "Notify agent",
      "type": "n8n-nodes-base.telegramTool",
      "typeVersion": 1.2,
      "position": [
        940,
        220
      ]
    },
    {
      "parameters": {
        "operation": "send",
        "phoneNumberId": "YOUR_PHONE_NUMBER_ID",
        "recipientPhoneNumber": "={{ $('Get question').item.json.from }}",
        "textBody": "={{ $json.output }}"
      },
      "id": "47157a09-b4de-42a3-abd6-68f495f76b64",
      "name": "Reply on WhatsApp",
      "type": "n8n-nodes-base.whatsApp",
      "typeVersion": 1,
      "position": [
        900,
        0
      ]
    }
  ],
  "connections": {
    "Incoming message": {
      "main": [
        [
          {
            "node": "Get question",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get question": {
      "main": [
        [
          {
            "node": "Real-estate agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Real-estate agent": {
      "main": [
        [
          {
            "node": "Reply on WhatsApp",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude model": {
      "ai_languageModel": [
        [
          {
            "node": "Real-estate agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Memory": {
      "ai_memory": [
        [
          {
            "node": "Real-estate agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Search listings": {
      "ai_tool": [
        [
          {
            "node": "Real-estate agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Book viewing": {
      "ai_tool": [
        [
          {
            "node": "Real-estate agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Notify agent": {
      "ai_tool": [
        [
          {
            "node": "Real-estate agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}

Open in the playground to edit →

Tips

  • Keep the Listings sheet's status column up to date so sold units are never offered.

Related flows