AutomationFlowsSlack & Telegram › Generate Real Estate Research Reports with Exa AI

Generate Real Estate Research Reports with Exa AI

Original n8n title: Generate Real Estate Research Reports with Exa Ai, Pandadoc and Instantly AI

ByDevon Toh @devontoh on n8n.io

Use cases are many: send recurring market updates to investors, distribute new listings context to buyers, or push periodic area snapshots to your client base — all without touching it manually after the first setup.

Cron / scheduled trigger★★★★☆ complexity23 nodesHTTP RequestN8N Nodes Exa OfficialSlackGoogle Sheets
Slack & Telegram Trigger: Cron / scheduled Nodes: 23 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #14053 — we link there as the canonical source.

This workflow follows the Google Sheets → HTTP Request recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "WDXb0OKaxTO2mUjx",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Research Report Generation + Instantly",
  "tags": [],
  "nodes": [
    {
      "id": "5d5129cb-811e-4bf8-9965-36c0dbb4d57c",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        -784,
        -48
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "8cc2e836-7107-41a8-9c97-3373c09a2a78",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "pending"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "b44cdc24-27ae-41aa-92ba-927e8ef230bc",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        -576,
        160
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "38dc0516-f67d-4e7a-bd3c-f34599a23d01",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -368,
        -64
      ],
      "parameters": {
        "url": "={{ $json.data.path }}",
        "options": {}
      },
      "typeVersion": 4.3
    },
    {
      "id": "23d937f4-36d8-453e-a17d-7eaaa0995499",
      "name": "Create a research task",
      "type": "n8n-nodes-exa-official.exa",
      "position": [
        -2096,
        -32
      ],
      "parameters": {
        "resource": "research",
        "operation": "createTask"
      },
      "credentials": {},
      "typeVersion": 1
    },
    {
      "id": "75882d2a-f3b4-420d-8e83-39280b5aa0dd",
      "name": "Get a research task",
      "type": "n8n-nodes-exa-official.exa",
      "position": [
        -1872,
        -32
      ],
      "parameters": {
        "resource": "research",
        "operation": "getTask"
      },
      "credentials": {},
      "typeVersion": 1
    },
    {
      "id": "03415fcc-aaaf-4a50-a186-9bb3a61da818",
      "name": "If1",
      "type": "n8n-nodes-base.if",
      "position": [
        -1648,
        -32
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "26adfcd9-666e-4a71-b330-09fdc8116246",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "completed"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "db76f26c-a641-40bc-9d3a-c12c2beaa61c",
      "name": "Wait1",
      "type": "n8n-nodes-base.wait",
      "position": [
        -1488,
        192
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "354fb18c-47e5-44d9-8057-630b5233069c",
      "name": "PandaDoc (Generate Presentation)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1296,
        -48
      ],
      "parameters": {
        "method": "POST",
        "options": {}
      },
      "typeVersion": 4.4
    },
    {
      "id": "9047e534-3404-4ff0-bce5-cc731e3c0e97",
      "name": "PandaDoc (checkPresentationStatus)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1040,
        -48
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 4.4
    },
    {
      "id": "565d7ed3-773f-41db-ac1f-468d3ebde726",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -2352,
        -32
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "6528e245-161c-48f9-9c27-6495d8277f07",
      "name": "Pending Approval",
      "type": "n8n-nodes-base.slack",
      "position": [
        -160,
        -64
      ],
      "parameters": {
        "user": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "select": "user",
        "otherOptions": {}
      },
      "typeVersion": 2.4
    },
    {
      "id": "0ceec5ad-f164-412e-9e14-a50e7487ec4f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2400,
        -528
      ],
      "parameters": {
        "color": 4,
        "width": 1056,
        "height": 992,
        "content": "## Phase 1: Research Layer\n * Schedule Trigger: kicks off the workflow on your defined cadence, daily, weekly, or whatever fits your reporting cycle.\n * Create a Research Task: spins up a research job via Exa AI, querying the web for market data, listings context, and pricing signals for your target area.\n * Get a Research Task \u2014 polls Exa AI to retrieve the completed research output once it's ready.\n * If1 + Wait1 \u2014 checks whether the task is done. If not, it waits and loops back to poll again. Once confirmed, it passes the structured data forward to Phase 2."
      },
      "typeVersion": 1
    },
    {
      "id": "1f5d8434-2f3c-45c6-aba1-26a1c725760d",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1312,
        -528
      ],
      "parameters": {
        "color": 5,
        "width": 880,
        "height": 992,
        "content": "## Report Generation\n * PandaDoc (Generate Presentation): \u2014 POST \u2014 sends the structured research data into your PandaDoc template via API. The data fills into your fixed layout and brand rules automatically.\n * PandaDoc (checkPresentationStatus): \u2014 SET \u2014 polls PandaDoc to confirm the document has finished generating.\n * If + Wait:  same pattern as Phase 1. If the document isn't ready yet, it waits and re-checks. Once the report is confirmed, it moves to Phase 3."
      },
      "typeVersion": 1
    },
    {
      "id": "a34b7654-2ecf-4602-a473-20dd2895ef91",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -400,
        -512
      ],
      "parameters": {
        "color": 6,
        "width": 1920,
        "height": 976,
        "content": "### Send via Instantly AI\n * HTTP Request \u2014 fetches the finalised PandaDoc report URL or payload to pass into the distribution flow.\n * Pending Approval (Slack \u2014 post message) \u2014 sends the report to your Slack channel or DM for human review before anything goes out to clients.\n * Fetch Contact (Google Sheets \u2014 read sheet) \u2014 pulls your client or investor list from Google Sheets once the report is approved.\n * Batch Instantly Upload \u2014 groups contacts into a batch ready for upload to Instantly AI.\n * Instantly Add Lead \u2014 SET \u2014 pushes each contact into your Instantly AI campaign with the personalised report attached.\n * Wait for Instantly Rate Limit \u2014 adds a delay between batches to stay within Instantly AI's API rate limits and avoid dropped leads.\n * Prep Batch Upload Data + Update Sheet Status \u2014 formats the next batch and writes back the send status to your Google Sheet so you always know who's been contacted.\n * Aggregate Final Results \u2014 consolidates the full send summary across all batches.\n * Send a Message (Slack \u2014 post message) \u2014 notifies your Slack once the full distribution is complete. Closed loop, no manual follow-up needed."
      },
      "typeVersion": 1
    },
    {
      "id": "95c1a493-7d95-489d-974b-d4e07fc1fc23",
      "name": "Batch Instantly Upload",
      "type": "n8n-nodes-base.splitInBatches",
      "notes": "Phase 5: Instantly Upload + Reporting",
      "position": [
        304,
        -64
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "d83f1322-9a24-4326-a76f-f06391fd0a01",
      "name": "Instantly Add Lead",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "HTTP Request to Instantly API",
      "position": [
        640,
        -48
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "5ce3c7b7-1f2c-4c30-bc4d-62f5a26814f8",
      "name": "Wait for Instantly Rate Limit",
      "type": "n8n-nodes-base.wait",
      "position": [
        880,
        -48
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "a338b5d2-1b8a-412a-85c8-63382780fda5",
      "name": "Prep Batch Upload Data",
      "type": "n8n-nodes-base.code",
      "position": [
        656,
        -288
      ],
      "parameters": {},
      "typeVersion": 2
    },
    {
      "id": "c2d49cc1-02cd-4a07-b13c-05ed2f7b160c",
      "name": "Update Sheet Status",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        880,
        -288
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "f32205a5-a69d-42bb-84b3-ce718163297e",
      "name": "Aggregate Final Results",
      "type": "n8n-nodes-base.code",
      "position": [
        1104,
        -288
      ],
      "parameters": {},
      "typeVersion": 2
    },
    {
      "id": "e12642bd-c4d7-436e-b3f2-201ef9296c48",
      "name": "Send a message1",
      "type": "n8n-nodes-base.slack",
      "position": [
        1312,
        -288
      ],
      "parameters": {
        "otherOptions": {}
      },
      "typeVersion": 2.4
    },
    {
      "id": "74bbd717-bd9e-4451-b014-52d20bd2b405",
      "name": "Fetch contact",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        48,
        -64
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "80061df0-aa51-487c-810f-d2357c353e36",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3152,
        -528
      ],
      "parameters": {
        "width": 736,
        "height": 992,
        "content": "## Real Estate Research Report Generation + Instantly\n\n\n### This n8n template automates real estate research reports \u2014 pulling live market data, structuring it, and filling it into a branded presentation template.\n\nUse cases include recurring client updates, market snapshots, and listing context reports where the structure stays fixed but the data changes every time.\n\n## How it works\n * Exa AI handles the research layer \u2014 pulling market information, listings context, and related web data automatically. The raw output is routed into n8n for light processing. It gets organized into sections: overview, pricing, listings, and key points.\n * The structured data is then sent to PandaDoc, which has a custom real estate research template with fixed layouts and brand rules already set up. Instead of generating random slides, the data fills into the template. The result is a consistent, clean report every time \u2014 no manual cleanup needed.\n* The report document generated. Will pend for approval in Slack, or email. \n* Onced approved, it will automatically fetch your client/investor list in google sheets, or your preferred CRMs, and send them a personalised report via instantly ai, instead of sending your client/investor individually.\n\n### How to use\n * The schedule trigger node is used as a starting point \u2014 swap it with a webhook or form trigger to fit your workflow.\n * Set up your own PandaDoc template with the layout and branding you want before connecting it. Works best for recurring reports where the structure stays the same but the underlying data changes each time.\n * Set up your Google client Oauth in Google Console. Create project in Google console and apply the Client ID and secret. \n * Set up your template your emails within Instantly AI\n * Set Up Slack chat/channel\n\n### Requirements\n * Exa AI account for web research\n * PandaDoc API with a custom report template configured\n * Google Oauth\n * Slack API\n * Instantly API\n * n8n instance (self-hosted or cloud)\n\n\nThis for anyone taking too much time with research and presentation, great when you're sending updates and listings to your investors and etc   . "
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "4ae6c17d-0f5b-4075-893a-bde50d5d20fa",
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If1": {
      "main": [
        [
          {
            "node": "PandaDoc (Generate Presentation)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "PandaDoc (checkPresentationStatus)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait1": {
      "main": [
        [
          {
            "node": "Get a research task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Pending Approval",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch contact": {
      "main": [
        [
          {
            "node": "Batch Instantly Upload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pending Approval": {
      "main": [
        [
          {
            "node": "Fetch contact",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Create a research task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Instantly Add Lead": {
      "main": [
        [
          {
            "node": "Wait for Instantly Rate Limit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get a research task": {
      "main": [
        [
          {
            "node": "If1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Sheet Status": {
      "main": [
        [
          {
            "node": "Aggregate Final Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Batch Instantly Upload": {
      "main": [
        [
          {
            "node": "Prep Batch Upload Data",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Instantly Add Lead",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create a research task": {
      "main": [
        [
          {
            "node": "Get a research task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prep Batch Upload Data": {
      "main": [
        [
          {
            "node": "Update Sheet Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Final Results": {
      "main": [
        [
          {
            "node": "Send a message1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for Instantly Rate Limit": {
      "main": [
        [
          {
            "node": "Batch Instantly Upload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "PandaDoc (Generate Presentation)": {
      "main": [
        [
          {
            "node": "PandaDoc (checkPresentationStatus)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "PandaDoc (checkPresentationStatus)": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Use cases are many: send recurring market updates to investors, distribute new listings context to buyers, or push periodic area snapshots to your client base — all without touching it manually after the first setup.

Source: https://n8n.io/workflows/14053/ — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

N8N Nodes Scrapegraphai, HTTP Request, Google Sheets +2
Slack & Telegram

Simplify financial oversight with this automated n8n workflow. Triggered daily, it fetches cash flow and expense data from a Google Sheet, analyzes inflows and outflows, validates records, and generat

HTTP Request, Google Sheets, Email Send +3
Slack & Telegram

Automated garden and farm irrigation system that uses weather forecasts and evapotranspiration calculations to determine optimal watering schedules, preventing water waste while maintaining healthy pl

OpenWeatherMap, Google Sheets, HTTP Request +1
Slack & Telegram

This workflow automatically monitors competitor affiliate programs twice daily using Bright Data's web scraping API to extract commission rates, cookie durations, average order values, and payout term

HTTP Request, Google Sheets, Slack +1
Slack & Telegram

Automatically monitor multiple websites every 5 minutes, log downtime, notify your team instantly via multiple channels, and track uptime/downtime in a Google Sheet—without relying on expensive monito

HTTP Request, Google Sheets, Gmail +2