This workflow follows the Agent → Form Trigger 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 →
{
"name": "Real Estate Agent",
"nodes": [
{
"parameters": {
"formTitle": "Real Estate - Submission From",
"formDescription": "Provide all necessary details",
"formFields": {
"values": [
{
"fieldLabel": "Location",
"requiredField": true
},
{
"fieldLabel": "Status",
"fieldType": "dropdown",
"fieldOptions": {
"values": [
{
"option": "forSale"
}
]
},
"requiredField": true
},
{
"fieldLabel": "Minimum Price",
"requiredField": true
},
{
"fieldLabel": "Maxiumum Price",
"requiredField": true
},
{
"fieldLabel": "Minimum Number of Beds",
"requiredField": true
},
{
"fieldLabel": "Minimum Number of Bathrooms",
"requiredField": true
},
{
"fieldLabel": "sortselection",
"fieldType": "dropdown",
"fieldOptions": {
"values": [
{
"option": "pricea"
}
]
},
"requiredField": true
},
{
"fieldLabel": "Multi Family?",
"fieldType": "dropdown",
"fieldOptions": {
"values": [
{
"option": "true"
},
{
"option": "false"
}
]
},
"requiredField": true
}
]
},
"options": {}
},
"type": "n8n-nodes-base.formTrigger",
"typeVersion": 2.2,
"position": [
0,
0
],
"id": "af78c412-2616-4c6d-8dcb-1c7226f4336b",
"name": "On form submission"
},
{
"parameters": {
"fieldToSplitOut": "results",
"options": {}
},
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [
440,
0
],
"id": "5cc609fc-f93e-462b-a807-94bc416ab4c3",
"name": "Split Out"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "61808fe0-e112-4a59-8144-000e01a740a4",
"name": "Address",
"value": "={{ $json.streetAddress }} {{ $json.city }} {{ $json.state }} {{ $json.zipcode }} {{ $json.country }}",
"type": "string"
},
{
"id": "e1ba14f2-70e7-45b8-9689-e7a67e8e727d",
"name": "homeStatus",
"value": "={{ $json.homeStatus }}",
"type": "string"
},
{
"id": "22976b2a-368a-4df6-9908-9b3c0bd67399",
"name": "homeType",
"value": "={{ $json.homeType }}",
"type": "string"
},
{
"id": "26c0e27b-f33b-4a2a-8702-132fc8521f85",
"name": "totalSize",
"value": "={{ $json.lotAreaValue }} {{ $json.lotAreaUnit }}",
"type": "string"
},
{
"id": "50a25013-928b-414b-bf93-e400302e0247",
"name": "LivingArea",
"value": "={{ $json.livingArea }} sqft",
"type": "string"
},
{
"id": "32605b14-d600-46c8-8311-45e40e86acc2",
"name": "price",
"value": "={{ $json.price }}",
"type": "number"
},
{
"id": "ccf8f3da-2d3e-4bb2-8b75-a2e30973b12c",
"name": "taxAssessedValue",
"value": "={{ $json.taxAssessedValue }}",
"type": "number"
},
{
"id": "e9b164b6-e2e2-42ae-8598-e4cedaf95590",
"name": "zestimate",
"value": "={{ $json.zestimate }}",
"type": "number"
},
{
"id": "f38c9d38-378d-4f0c-b978-649a00887deb",
"name": "rentZestimate",
"value": "={{ $json.rentZestimate }}",
"type": "number"
},
{
"id": "b8fe491f-1d3c-4c29-aefe-305360da4e63",
"name": "priceReduction",
"value": "={{ $json.priceReduction }}",
"type": "string"
},
{
"id": "86af9672-e138-46dc-8f7d-760896eec1c0",
"name": "bathrooms",
"value": "={{ $json.bathrooms }}",
"type": "number"
},
{
"id": "f0ab77e3-82de-4eac-9e71-f4c40fe8b59e",
"name": "bedrooms",
"value": "={{ $json.bedrooms }}",
"type": "number"
},
{
"id": "b1381cf6-16a7-48f3-b6ce-57488c3a34c5",
"name": "isNonOwnerOccupied",
"value": "={{ $json.isNonOwnerOccupied }}",
"type": "boolean"
},
{
"id": "96608580-d7dc-408a-93f6-652053b5e10d",
"name": "isPreforeclosureAuction",
"value": "={{ $json.isPreforeclosureAuction }}",
"type": "boolean"
},
{
"id": "c6bcb998-54a8-4b16-a475-bb70aeefd8c6",
"name": "isPremierBuilder",
"value": "={{ $json.isPremierBuilder }}",
"type": "boolean"
},
{
"id": "3239c03a-ff22-40cd-bd0c-4a25b6c137aa",
"name": "isShowcaseListing",
"value": "={{ $json.isShowcaseListing }}",
"type": "boolean"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
660,
0
],
"id": "1f9d5026-cc2f-4a2d-a3b2-a16dc391a33d",
"name": "Edit Fields"
},
{
"parameters": {
"jsCode": "// \u2500\u2500 CONFIGURABLE ASSUMPTIONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst downPaymentPct = 0.20; // 20\u202f% down\nconst closingCostPct = 0.03; // 3\u202f% closing costs\nconst annualInterestRate = 0.05; // 5\u202f% APR\nconst loanTermYears = 30; // 30\u2011yr mortgage\nconst propertyTaxRate = 0.012; // 1.2\u202f% of assessed value per year\nconst insuranceRate = 0.003; // 0.3\u202f% of price per year\nconst maintenanceRate = 0.01; // 1\u202f% of price per year\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// IMPORTANT for n8n: return array of { json: \u2026 }\nreturn items.map(item => {\n\n // \u2014\u2014 raw inputs (fall back to 0 if missing) \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n const j = item.json;\n const price = parseFloat(j.price) || 0;\n const rent = parseFloat(j.rentZestimate) || 0;\n const livingArea = parseFloat(j.LivingArea) || 0; // sqft\n const zEstimate = parseFloat(j.zestimate) || 0;\n const taxAssessedVal = parseFloat(j.taxAssessedValue)|| price;\n // \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n\n // \u2014\u2014 Financing \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n const downPayment = price * downPaymentPct;\n const closingCosts = price * closingCostPct;\n const loanAmount = price - downPayment;\n const monthlyRate = annualInterestRate / 12;\n const numPayments = loanTermYears * 12;\n const mortgagePayment= loanAmount * monthlyRate /\n (1 - Math.pow(1 + monthlyRate, -numPayments));\n\n // \u2014\u2014 Operating expenses \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n const annualTax = taxAssessedVal * propertyTaxRate;\n const annualIns = price * insuranceRate;\n const annualMaint = price * maintenanceRate;\n\n const monthlyTax = annualTax / 12;\n const monthlyIns = annualIns / 12;\n const monthlyMaint = annualMaint / 12;\n\n // \u2014\u2014 Cash\u2011flow & returns \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n const totalMonthlyExp = mortgagePayment + monthlyTax + monthlyIns + monthlyMaint;\n const monthlyCashFlow = rent - totalMonthlyExp;\n const annualCashFlow = monthlyCashFlow * 12;\n\n const capRate = annualCashFlow / price; // NOI \u00f7 price\n const cashOnCashROI = annualCashFlow / (downPayment + closingCosts);\n\n // \u2014\u2014 Extra metrics \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n const pricePerSqft = livingArea ? price / livingArea : 0;\n const rentPerSqft = livingArea ? rent / livingArea : 0;\n const rentToPricePct = price ? (rent * 12) / price : 0; // GRM inverse\n const priceVsZestPct = zEstimate ? (price - zEstimate) / zEstimate : 0;\n // \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\n\n // \u2014\u2014 Attach everything to output JSON \u2014\u2014\n Object.assign(j, {\n downPayment: +downPayment.toFixed(2),\n closingCosts: +closingCosts.toFixed(2),\n loanAmount: +loanAmount.toFixed(2),\n mortgagePayment: +mortgagePayment.toFixed(2),\n\n monthlyPropertyTax: +monthlyTax.toFixed(2),\n monthlyInsurance: +monthlyIns.toFixed(2),\n monthlyMaintenance: +monthlyMaint.toFixed(2),\n totalMonthlyExpenses: +totalMonthlyExp.toFixed(2),\n\n monthlyCashFlow: +monthlyCashFlow.toFixed(2),\n annualCashFlow: +annualCashFlow.toFixed(2),\n\n capRate: +capRate.toFixed(4), // 0.0523 \u279c\u00a05.23\u202f%\n cashOnCashROI: +cashOnCashROI.toFixed(4), // 0.1234 \u279c\u00a012.34\u202f%\n\n pricePerSqft: +pricePerSqft.toFixed(2),\n rentPerSqft: +rentPerSqft.toFixed(2),\n rentToPricePct: +(rentToPricePct*100).toFixed(2), // % of price per yr\n priceVsZestimatePct: +(priceVsZestPct*100).toFixed(2) // over/under %\n });\n\n // Return a proper n8n item\n return { json: j };\n});\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
880,
0
],
"id": "3f31188a-6ae0-4191-a005-b5b3fc51ad45",
"name": "Code"
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"value": "1_99hLmLmw4VIZS7nikZssouRRV24WPNG1U-_BL7Igyk",
"mode": "list",
"cachedResultName": "Real Estate Deals",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1_99hLmLmw4VIZS7nikZssouRRV24WPNG1U-_BL7Igyk/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "Sheet1",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1_99hLmLmw4VIZS7nikZssouRRV24WPNG1U-_BL7Igyk/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Address": "={{ $json.Address }}",
"homeStatus": "={{ $json.homeStatus }}",
"homeType": "={{ $json.homeType }}",
"totalSize": "={{ $json.totalSize }}",
"LivingArea": "={{ $json.LivingArea }}",
"price": "={{ $json.price }}",
"taxAssessedValue": "={{ $json.taxAssessedValue }}",
"zestimate": "={{ $json.zestimate }}",
"rentZestimate": "={{ $json.rentZestimate }}",
"priceReduction": "={{ $json.priceReduction }}",
"bathrooms": "={{ $json.bathrooms }}",
"bedrooms": "={{ $json.bedrooms }}",
"isNonOwnerOccupied": "={{ $json.isNonOwnerOccupied }}",
"isPreforeclosureAuction": "={{ $json.isPreforeclosureAuction }}",
"isPremierBuilder": "={{ $json.isPremierBuilder }}",
"isShowcaseListing": "={{ $json.isShowcaseListing }}",
"downPayment": "={{ $json.downPayment }}",
"closingCosts": "={{ $json.closingCosts }}",
"loanAmount": "={{ $json.loanAmount }}",
"mortgagePayment": "={{ $json.mortgagePayment }}",
"monthlyPropertyTax": "={{ $json.monthlyPropertyTax }}",
"monthlyInsurance": "={{ $json.monthlyInsurance }}",
"monthlyMaintenance": "={{ $json.monthlyMaintenance }}",
"totalMonthlyExpenses": "={{ $json.totalMonthlyExpenses }}",
"monthlyCashFlow": "={{ $json.monthlyCashFlow }}",
"annualCashFlow": "={{ $json.monthlyCashFlow }}",
"capRate": "={{ $json.capRate }}",
"cashOnCashROI": "={{ $json.cashOnCashROI }}",
"pricePerSqft": "={{ $json.pricePerSqft }}",
"rentPerSqft": "={{ $json.rentPerSqft }}",
"rentToPricePct": "={{ $json.rentToPricePct }}",
"priceVsZestimatePct": "={{ $json.priceVsZestimatePct }}"
},
"matchingColumns": [
"Address"
],
"schema": [
{
"id": "Address",
"displayName": "Address",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "homeStatus",
"displayName": "homeStatus",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "homeType",
"displayName": "homeType",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "totalSize",
"displayName": "totalSize",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "LivingArea",
"displayName": "LivingArea",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "price",
"displayName": "price",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "taxAssessedValue",
"displayName": "taxAssessedValue",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "zestimate",
"displayName": "zestimate",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "rentZestimate",
"displayName": "rentZestimate",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "priceReduction",
"displayName": "priceReduction",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "bathrooms",
"displayName": "bathrooms",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "bedrooms",
"displayName": "bedrooms",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "isNonOwnerOccupied",
"displayName": "isNonOwnerOccupied",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "isPreforeclosureAuction",
"displayName": "isPreforeclosureAuction",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "isPremierBuilder",
"displayName": "isPremierBuilder",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "isShowcaseListing",
"displayName": "isShowcaseListing",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "downPayment",
"displayName": "downPayment",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "closingCosts",
"displayName": "closingCosts",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "loanAmount",
"displayName": "loanAmount",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "mortgagePayment",
"displayName": "mortgagePayment",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "monthlyPropertyTax",
"displayName": "monthlyPropertyTax",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "monthlyInsurance",
"displayName": "monthlyInsurance",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "monthlyMaintenance",
"displayName": "monthlyMaintenance",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "totalMonthlyExpenses",
"displayName": "totalMonthlyExpenses",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "monthlyCashFlow",
"displayName": "monthlyCashFlow",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "annualCashFlow",
"displayName": "annualCashFlow",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "capRate",
"displayName": "capRate",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "cashOnCashROI",
"displayName": "cashOnCashROI",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "pricePerSqft",
"displayName": "pricePerSqft",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "rentPerSqft",
"displayName": "rentPerSqft",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "rentToPricePct",
"displayName": "rentToPricePct",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "priceVsZestimatePct",
"displayName": "priceVsZestimatePct",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.6,
"position": [
1160,
220
],
"id": "19c2641d-724e-44c9-8504-5cf8050b3427",
"name": "Append or update row in sheet",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"aggregate": "aggregateAllItemData",
"options": {}
},
"type": "n8n-nodes-base.aggregate",
"typeVersion": 1,
"position": [
1160,
-180
],
"id": "35f27512-d764-4a92-9a75-98fbf10f1e32",
"name": "Aggregate"
},
{
"parameters": {
"promptType": "define",
"text": "=You are a seasoned real estate investment analyst. Each day, you'll receive a JSON array of property records with fields such as:\n\nAddress\n\nhomeStatus, homeType, size\n\nprice, taxAssessedValue, zestimate, rentZestimate\n\ndownPayment, closingCosts, loanAmount, mortgagePayment\n\nmonthlyPropertyTax, monthlyInsurance, monthlyMaintenance\n\ntotalMonthlyExpenses, monthlyCashFlow, annualCashFlow\n\ncapRate, cashOnCashROI\n\nThe input is available as:\n{{ JSON.stringify($json.data) }}\n\nYour tasks:\n\nWrite a short one-sentence summary of the overall real estate market sentiment.\n\nList the Top 3 properties ranked by cash-on-cash ROI, and for each show:\n\nAddress\n\nROI (%)\n\nMonthly cash flow\n\nList the Top 3 properties ranked by cap rate, and for each show:\n\nAddress\n\nCap rate (%)\n\nAnnual cash flow\n\nHighlight any properties with negative monthly cash flow.\n\nCalculate and display portfolio-wide averages for:\n\nCap rate (%)\n\nCash-on-cash ROI (%)\n\nMonthly cash flow (USD)\n\nSuggest up to two next actions, for example:\n\n\u201cSchedule showings for properties X, Y\u201d\n\n\u201cConsider raising your max price filter to find better cap rates\u201d\n\nFormat your output as a clean daily report with headings and bullet points.\n\nUse the Gmail tool to email this summary.\nSet the email subject to:\nDaily Real Estate KPI Report for {{ $now }}\n(Ensure the date is in YYYY-MM-DD format.)\n\nMake sure the email is HTML formatted and easy to read.",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 2,
"position": [
1420,
-180
],
"id": "d966c381-f33a-4efa-9a5a-e1aff794348b",
"name": "AI Agent"
},
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
1380,
0
],
"id": "64c3f0c8-f23c-4941-8e9e-28f6c6a138bc",
"name": "OpenAI Chat Model",
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {},
"type": "@n8n/n8n-nodes-langchain.toolCalculator",
"typeVersion": 1,
"position": [
1640,
0
],
"id": "9e0d0d14-d48f-4901-a56c-0a7d739f6572",
"name": "Calculator"
},
{
"parameters": {
"sendTo": "krystian7431@gmail.com",
"subject": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Subject', ``, 'string') }}",
"message": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Message', ``, 'string') }}",
"options": {}
},
"type": "n8n-nodes-base.gmailTool",
"typeVersion": 2.1,
"position": [
1800,
0
],
"id": "7de9430b-5d54-41e2-aa1c-65804e7106cf",
"name": "Send a message in Gmail",
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"url": "https://zillow56.p.rapidapi.com/search?",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendQuery": true,
"queryParameters": {
"parameters": [
{
"name": "location",
"value": "={{ $json.Location }}"
},
{
"name": "status",
"value": "={{ $json.Status }}"
},
{
"name": "price_min",
"value": "={{ $json['Minimum Price'] }}"
},
{
"name": "price_max",
"value": "={{ $json['Maxiumum Price'] }}"
},
{
"name": "beds_min",
"value": "={{ $json['Minimum Number of Beds'] }}"
},
{
"name": "baths_min",
"value": "={{ $json['Minimum Number of Bathrooms'] }}"
},
{
"name": "sortSelection",
"value": "={{ $json.sortselection }}"
},
{
"name": "isMultiFamily",
"value": "={{ $json['Multi Family?'] }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
220,
0
],
"id": "8dbaf9db-d5a0-460d-a412-1a9d95f362cc",
"name": "Find Deals",
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"content": "# Professional Real Estate AI Agent",
"height": 1020,
"width": 2120,
"color": 5
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-120,
-420
],
"id": "6aeb1d85-32bd-4621-adf5-8e9b5276d834",
"name": "Sticky Note"
}
],
"connections": {
"On form submission": {
"main": [
[
{
"node": "Find Deals",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "Append or update row in sheet",
"type": "main",
"index": 0
},
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Aggregate": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Calculator": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Send a message in Gmail": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Find Deals": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "65009ebe-fe94-45c9-9685-82927a88201a",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "pZWFqpbSr8e27JVx",
"tags": []
}
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.
gmailOAuth2googleSheetsOAuth2ApihttpHeaderAuthopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
Prospective home buyers receive swift, personalised responses to their property enquiries, streamlining the initial consultation process and enhancing satisfaction without manual intervention. This workflow suits real estate agents managing high volumes of leads, automating the triage and reply generation to focus on high-value interactions. Upon form submission, the key step involves an AI agent analysing details against a Google Sheets database of listings, then drafting tailored replies via OpenAI integration.
Use this workflow for handling routine buyer queries like availability checks or price estimates during peak seasons, ensuring 24/7 responsiveness. Avoid it for complex negotiations requiring human nuance, or if your listings exceed basic spreadsheet management—opt for a CRM like HubSpot instead. Common variations include adding email notifications through Gmail for urgent leads or incorporating a calculator tool for mortgage simulations.
About this workflow
Real Estate Agent. Uses formTrigger, googleSheets, agent, lmChatOpenAi. Event-driven trigger; 12 nodes.
Source: https://github.com/Khuzaima-AI-2112/n8n-automation-templates/blob/master/01_Bussiness-&-Support/10_Real-state-ai-agent/Real+Estate+Agent.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.
Digistars - Scrape & Crawl. Uses httpRequest, n8n-nodes-firecrawl-scraper, googleSheets, lmChatOpenAi. Event-driven trigger; 63 nodes.
🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.
Automates SaaS operations by consolidating user management, AI-driven support triage, analytics, and billing into one unified system. User signups flow through registration, support requests route via
The workflow runs every hour with a randomized delay of 5–20 minutes to help distribute load. It records the exact date and time a lead is emailed so you can track outreach. Follow-ups are automatical