AutomationFlowsAI & RAG › Analyze Real Estate Investment Potential: Zillow Properties to Google Sheets…

Analyze Real Estate Investment Potential: Zillow Properties to Google Sheets…

Original n8n title: Analyze Real Estate Investment Potential: Zillow Properties to Google Sheets with Gpt-4o

ByFabian Perez @fabianprz on n8n.io

This workflow automates the process of scraping, analyzing, and storing real estate data from Zillow using Apify, OpenAI, and Google Sheets.

Event trigger★★★★☆ complexityAI-powered12 nodes@Apify/N8N Nodes ApifyOpenAIGoogle Sheets
AI & RAG Trigger: Event Nodes: 12 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Apifyn8N Nodes Apify → Google Sheets 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": "pYD1J1Xed3QsjdAG",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Real Estate Investment Analysis: Zillow Property Scraper with AI Scoring to Google Sheets",
  "tags": [
    {
      "id": "7cd4GMBDcwH0ENjJ",
      "name": "Data Scraper",
      "createdAt": "2025-10-07T21:31:29.904Z",
      "updatedAt": "2025-10-07T21:31:29.904Z"
    }
  ],
  "nodes": [
    {
      "id": "214c6129-834c-46a1-9a58-0e3bad219bc1",
      "name": "Start Zillow Scraper",
      "type": "@apify/n8n-nodes-apify.apifyTrigger",
      "position": [
        144,
        192
      ],
      "parameters": {
        "actorId": {
          "__rl": true,
          "mode": "list",
          "value": "l7auNT3I30CssRrvO"
        },
        "authentication": "apifyOAuth2Api"
      },
      "credentials": {
        "apifyOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8c9824bb-7699-4304-8e02-333a867b9fb8",
      "name": "Clean & Format Data",
      "type": "n8n-nodes-base.set",
      "position": [
        672,
        192
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "81922c2a-f21f-47f4-9b76-2bd67b42e9db",
              "name": "Picture",
              "type": "string",
              "value": "={{ $json.desktopWebHdpImageLink }}"
            },
            {
              "id": "a825b416-bafa-47e2-b11f-e3dc04cf072a",
              "name": "Price",
              "type": "string",
              "value": "={{ $json.price }}"
            },
            {
              "id": "8f3887fb-ca68-40c5-858e-30c221f2cb5d",
              "name": "Virtual Tour URL",
              "type": "string",
              "value": "={{ $json.resoFacts.virtualTour }}"
            },
            {
              "id": "d54c8a72-9c54-4143-ac93-5c9cfd17b442",
              "name": "propertyURL",
              "type": "string",
              "value": "=https://www.zillow.com/{{ $json.hdpUrl }}"
            },
            {
              "id": "3a4f5b51-66c4-41b6-a8d8-8fc7262aa7b2",
              "name": "MLS ID#",
              "type": "string",
              "value": "={{ $json.mlsid }}"
            },
            {
              "id": "37a7ea64-7d23-44ed-8445-4edce293b56d",
              "name": "Google Maps URL",
              "type": "string",
              "value": "=https://www.google.com/maps/place/{{ $json.address.streetAddress }}/"
            },
            {
              "id": "b13b982a-05d0-46d7-a17f-f174689cd07b",
              "name": "Address",
              "type": "string",
              "value": "={{ $json.address.streetAddress }}"
            },
            {
              "id": "727e22b7-0e6b-4191-a789-9b89cbcae3d0",
              "name": "city",
              "type": "string",
              "value": "={{ $json.address.city }}"
            },
            {
              "id": "ac05a8ee-0696-4bd9-9b0c-90dbdd27655c",
              "name": "County",
              "type": "string",
              "value": "={{ $json.adTargets.cnty }}"
            },
            {
              "id": "1eb478f7-530d-4833-98d5-268bbbf385b4",
              "name": "zipcode",
              "type": "string",
              "value": "={{ $json.address.zipcode }}"
            },
            {
              "id": "66f82f5f-00c4-44d9-8d96-7514796cddf3",
              "name": "yearBuilt",
              "type": "string",
              "value": "={{ $json.yearBuilt }}"
            },
            {
              "id": "38c54122-916c-448e-9912-acae3903b97f",
              "name": "homeType",
              "type": "string",
              "value": "={{ $json.homeType }}"
            },
            {
              "id": "a0f6c7c4-9f09-4177-89d5-4fde36ab2454",
              "name": "Home Status",
              "type": "string",
              "value": "={{ $json.homeStatus }}"
            },
            {
              "id": "9c87bbac-6dbe-4ee7-93ab-972703fa0596",
              "name": "Bedrooms",
              "type": "string",
              "value": "={{ $json.bedrooms }}"
            },
            {
              "id": "bf5d091b-e0fd-4ed3-b309-f0a8f1ec706b",
              "name": "Bathrooms",
              "type": "string",
              "value": "={{ $json.bathrooms }}"
            },
            {
              "id": "ac92120a-ea05-446d-b3cf-e730be0a0c78",
              "name": "Lot Size",
              "type": "string",
              "value": "={{ $json.resoFacts.lotSize }}"
            },
            {
              "id": "3a101b77-4854-457b-abca-8bc30a16b400",
              "name": "Living area",
              "type": "string",
              "value": "={{ $json.resoFacts.livingArea }}"
            },
            {
              "id": "ef392fc5-a258-4c10-9dca-f99a26d1cf15",
              "name": "Date on Market",
              "type": "string",
              "value": "={{ new Date($json.resoFacts.onMarketDate).toLocaleDateString('en-US') }}"
            },
            {
              "id": "89da5f9c-32f6-4dcd-a756-e4b36e68d5f7",
              "name": "Rent Zestimate",
              "type": "string",
              "value": "={{ $json.rentZestimate }}"
            },
            {
              "id": "9bc21ae7-8f97-46c9-adac-ff1180506c53",
              "name": "Zestimate",
              "type": "string",
              "value": "={{ $json.zestimate }}"
            },
            {
              "id": "03682393-99de-473f-a2be-4f66e323261c",
              "name": "Last Price sold",
              "type": "string",
              "value": "=Date: {{ $json.priceHistory[1].date }} for ${{ $json.priceHistory[1].price }}"
            },
            {
              "id": "33ff8911-edcd-450c-808c-8aeb744cf3b1",
              "name": "Tax Assessed Value",
              "type": "string",
              "value": "={{ $json.resoFacts.taxAssessedValue }}"
            },
            {
              "id": "c03cf63e-b6f1-4afc-9200-c0f39759307f",
              "name": "Tax Annual Amount",
              "type": "string",
              "value": "={{ $json.resoFacts.taxAnnualAmount }}"
            },
            {
              "id": "42bc8b65-dd1a-40ba-9203-1ee3ba8694fb",
              "name": "Price per Sqrf",
              "type": "string",
              "value": "={{ $json.resoFacts.pricePerSquareFoot }}"
            },
            {
              "id": "a5bf4e2d-5217-4709-a7ae-33fee7b9d706",
              "name": "GRM",
              "type": "string",
              "value": "={{ Math.round($json.price / ($json.rentZestimate * 12) * 100) / 100 }}"
            },
            {
              "id": "3da2bf63-420f-44d7-8125-b985d9adb157",
              "name": "NDI 50 rule",
              "type": "string",
              "value": "={{ Math.round((($json.rentZestimate * 12) * 0.5) / $json.price * 100 * 100) / 100 }}"
            },
            {
              "id": "aefe3687-fc23-47f0-aa2c-356a163f47e7",
              "name": "15 year Fixed Rate Bucket",
              "type": "string",
              "value": "={{ $json.mortgageZHLRates.fifteenYearFixedBucket.rate }} Sources: {{ $json.mortgageZHLRates.fifteenYearFixedBucket.rateSource }}"
            },
            {
              "id": "4b06371d-b0fa-4f08-b367-6245a92d7749",
              "name": "30 year Fixed Rate Bucket",
              "type": "string",
              "value": "={{ $json.mortgageZHLRates.thirtyYearFixedBucket.rate }}  Source:{{ $json.mortgageZHLRates.thirtyYearFixedBucket.rateSource }}"
            },
            {
              "id": "07693eed-526c-44e3-9cfb-5c7c3cf774fe",
              "name": "Agent Name",
              "type": "string",
              "value": "={{ $json.attributionInfo.agentName }}"
            },
            {
              "id": "e82b5238-0bb8-4c95-b816-66849bb0b02d",
              "name": "Agent Phone #",
              "type": "string",
              "value": "={{ $json.attributionInfo.agentPhoneNumber }}"
            },
            {
              "id": "67f44ded-da93-42c4-b4c1-d04076d2fc59",
              "name": "Broker Name",
              "type": "string",
              "value": "={{ $json.attributionInfo.brokerName }}"
            },
            {
              "id": "d288fb24-2dc2-432a-8f69-b813f2a85ac2",
              "name": "Broker Phone #",
              "type": "string",
              "value": "={{ $json.attributionInfo.brokerPhoneNumber }}"
            },
            {
              "id": "922c4c8a-3523-4a8f-a07b-9392b9f8689f",
              "name": "Co Agent",
              "type": "string",
              "value": "={{ $json.attributionInfo.coAgentName }}"
            },
            {
              "id": "2c693926-284d-4180-8819-adfb3ac55ec7",
              "name": "Co Agent Phone #",
              "type": "string",
              "value": "={{ $json.attributionInfo.coAgentNumber }}"
            },
            {
              "id": "a302b76a-20b9-405a-adb6-e4dcba8c7381",
              "name": "HOA monthly fee",
              "type": "string",
              "value": "={{ $json.resoFacts.feesAndDues[0].fee }}"
            },
            {
              "id": "3c091532-81b4-49a8-88ec-0ed9d462bcc7",
              "name": "HOA name",
              "type": "string",
              "value": "={{ $json.resoFacts.feesAndDues[0].name }}"
            },
            {
              "id": "0b648acc-2c99-4447-ba5c-b8fce19cbd1b",
              "name": "HOA Phon e#",
              "type": "string",
              "value": "={{ $json.resoFacts.feesAndDues[0].phone }}"
            },
            {
              "id": "a54d0ada-2941-4b35-95bb-2d1caefc0be1",
              "name": "Pets allowed",
              "type": "string",
              "value": "={{ $json.resoFacts.hasPetsAllowed }}"
            },
            {
              "id": "6a037339-465b-4d65-815d-e70dd27e45b7",
              "name": "Pet Fees",
              "type": "string",
              "value": "={{ $json.resoFacts.feesAndDues[2].fee }}"
            },
            {
              "id": "0ad3773b-571f-4c2a-b7b2-02c85202e776",
              "name": "School 1",
              "type": "string",
              "value": "={{ $json.schools[0].name }}"
            },
            {
              "id": "5c92cf78-f456-4c8a-8dc2-6abbd9893d59",
              "name": "School 2",
              "type": "string",
              "value": "={{ $json.schools[1].name }} "
            },
            {
              "id": "da87734d-c67a-4a51-9f66-4af6349e1797",
              "name": "School 3",
              "type": "string",
              "value": "={{ $json.schools[2].name }}"
            },
            {
              "id": "b5c76f30-6bea-4312-b31a-f390361d1abe",
              "name": "Rating 1",
              "type": "string",
              "value": "={{ $json.schools[0].rating }}"
            },
            {
              "id": "12053f64-44bd-4213-9fe2-d1e6429cf8c2",
              "name": "Rating 2",
              "type": "string",
              "value": "= {{ $json.schools[1].rating }}"
            },
            {
              "id": "259ff015-be0c-4faa-b7da-1d8cec6b5710",
              "name": "Rating 3",
              "type": "string",
              "value": "={{ $json.schools[2].rating }}"
            },
            {
              "id": "21ce8ddf-312c-41f6-a7f4-756b8b58bd74",
              "name": "Description",
              "type": "string",
              "value": "={{ $json.description }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "f9b3948c-d50e-4091-aea5-cc028fc822bb",
      "name": "Process Each Property",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1424,
        -32
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "95c2f8d0-93f9-4c64-9070-738d43e54dea",
      "name": "AI Scoring: Investment Potential",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        1712,
        384
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are an intelligent Real Estate investement analizer"
            },
            {
              "content": "Analyze this property as a real estate investment screening tool. Score 1-100.\nCRITICAL FILTERS (Auto-fail below 50 if ANY are true):\n\nNegative monthly cash flow \u2192 Max score 45\nCap rate below 4% \u2192 Max score 40\nGRM above 15 \u2192 Max score 45\nDSCR below 1.0 \u2192 Max score 40\nPrice > 110% of Zestimate \u2192 Max score 50\n\nCalculate (assume 20% down, 30-year at 6.274% if rate not provided):\n\nMonthly cash flow: rent - (mortgage + HOA + tax/12 + insurance $100 + maintenance 1%)\nCap rate: (annual rent - annual operating expenses) / price \u00d7 100\nGRM: price / annual rent\nDSCR: monthly rent / monthly mortgage payment\nHOA as % of rent (red flag if >25%)\n\nScoring (out of 100):\n\nCash flow positive +$200/month: 30 pts (scale down proportionally, 0 pts if negative)\nCap rate \u22656%: 25 pts (scale: 6%=25pts, 5%=15pts, 4%=5pts, <4%=0pts)\nGRM \u226412: 15 pts (scale: <10=15pts, 12=10pts, 15=5pts, >15=0pts)\nDSCR \u22651.25: 15 pts (scale: >1.25=15pts, 1.0=5pts, <1.0=0pts)\nPrice \u2264 Zestimate: 10 pts\nSchools avg \u22657: 5 pts\n\nMissing Data Penalty:\n\nMissing price or rent \u2192 Score 0, return \"0\"\nMissing HOA \u2192 Assume $0 but cap max score at 70\nMissing tax \u2192 Estimate 1.2% of price\nMissing Zestimate \u2192 Skip that 10pt section\n\nOutput:\nReturn only the final score as an integer (1-100). No text, no explanation.\nExample: 42\n"
            },
            {
              "content": "=Analyze this property data:\n\n\nPrice- ${{ $json.Price }}\n\nYear built-{{ $json.yearBuilt }}\n\n#number if bathrooms- {{ $json.Bathrooms }}\n\n#number if bedrooms- {{ $json.Bedrooms }}\n\nHometype- {{ $json.homeType }}\n\nHOA Fee-  ${{ $json['HOA monthly fee'] }}\n\nLot Size- {{ $json['Lot Size'] }}\n\nLiving Area Sqft- {{ $json['Living area'] }}\n\nDate on Market- {{ $json['Date on Market'] }}\n\nPrice per Sqft- ${{ $json['Price per Sqrf'] }}\n\nAnnual Tax- ${{ $json['Tax Annual Amount'] }}\n\nTotal Assessed Value- ${{ $json['Tax Assessed Value'] }}\n\nRent Estimate by Zillow- ${{ $json['Rent Zestimate'] }}\n\nPrice Estimate by Zillow-  ${{ $json.Zestimate }}\n\nNear Schools- 1){{ $json['School 1'] }} Rate:{{ $json['Rating 1'] }}\n              2){{ $json['School 2'] }} Rate:{{ $json['Rating 2'] }}\n              3){{ $json['School 3'] }} Rate:{{ $json['Rating 3'] }}\n\n15 year Fixed Rate-  %{{ $json['15 year Fixed Rate Bucket'] }}\n\n30 year Fixed Rate-  %{{ $json['30 year Fixed Rate Bucket'] }}\n\nGRM Calculated ( infinity = nothing )-  {{ $json.GRM }}\n\n50% Rule ( 0 = Notfound) - {{ $json['NDI 50 rule'] }}\n\nPets Allowed?-  {{ $json['Pets allowed'] }}\n\nOther Fees- {{ $json['Pet Fees'] }}\n\nDescription- {{ $json.Description }}"
            },
            {
              "role": "assistant",
              "content": "85"
            },
            {
              "role": "assistant",
              "content": "73"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "f49bab12-4ba0-49c3-95fc-beb1f2c4d578",
      "name": "Update Google Sheets Database",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1184,
        336
      ],
      "parameters": {
        "columns": {
          "value": {
            "GRM": "={{ $('Process Each Property').item.json.GRM }}",
            "URL": "={{ $('Process Each Property').item.json.propertyURL }}",
            "Rate": "={{ $json.message.content }}",
            "city": "={{ $('Process Each Property').item.json.city }}",
            "Price": "={{ $('Process Each Property').item.json.Price }}",
            "County": "={{ $('Process Each Property').item.json.County }}",
            "Address": "={{ $('Process Each Property').item.json.Address }}",
            "HOA fee": "={{ $('Process Each Property').item.json[\"HOA monthly fee\"] }}",
            "MLS ID#": "={{ $('Process Each Property').item.json[\"MLS ID#\"] }}",
            "Picture": "={{ $('Process Each Property').item.json.Picture }}",
            "zipcode": "={{ $('Process Each Property').item.json.zipcode }}",
            "HOA name": "={{ $('Process Each Property').item.json[\"HOA name\"] }}",
            "Pets Fee": "={{ $('Process Each Property').item.json[\"Pet Fees\"] }}",
            "bedrooms": "={{ $('Process Each Property').item.json.Bedrooms }}",
            "homeType": "={{ $('Process Each Property').item.json.homeType }}",
            "AgentName": "={{ $('Process Each Property').item.json[\"Agent Name\"] }}",
            "bathrooms": "={{ $('Process Each Property').item.json.Bathrooms }}",
            "yearBuilt": "={{ $('Process Each Property').item.json.yearBuilt }}",
            "BrokerName": "={{ $('Process Each Property').item.json[\"Broker Name\"] }}",
            "HOA Phone#": "={{ $('Process Each Property').item.json[\"HOA Phon e#\"] }}",
            "homeStatus": "={{ $('Process Each Property').item.json[\"Home Status\"] }}",
            " Annual Tax": "={{ $('Process Each Property').item.json[\"Tax Annual Amount\"] }}",
            "Description": "={{ $('Process Each Property').item.json.Description }}",
            "Co-AgentName": "={{ $('Process Each Property').item.json[\"Co Agent\"] }}",
            "NOI 50% Rule": "={{ $('Process Each Property').item.json[\"NDI 50 rule\"] }}",
            "Pets allowed": "={{ $('Process Each Property').item.json[\"Pets allowed\"] }}",
            "lotSize Sqft": "={{ \n  Number($('Process Each Property').item.json[\"Lot Size\"]) < 20 \n    ? Number($('Process Each Property').item.json[\"Lot Size\"]) * 43560 \n    : Number($('Process Each Property').item.json[\"Lot Size\"]) \n}}\n",
            "pricePerSqft": "={{ $('Process Each Property').item.json[\"Price per Sqrf\"] }}",
            "Agent Phone #": "={{ $('Process Each Property').item.json[\"Co Agent Phone #\"] }}",
            "RentZestimate": "={{ $('Process Each Property').item.json[\"Rent Zestimate\"] }}",
            " BrokerPhone #": "={{ $('Process Each Property').item.json[\"Broker Phone #\"] }}",
            "Date on Market": "={{ $('Process Each Property').item.json[\"Date on Market\"] }}",
            "Google Maps URL": "={{ $('Process Each Property').item.json[\"Google Maps URL\"] }}",
            "Co-Agent Phone #": "={{ $('Process Each Property').item.json[\"Co Agent Phone #\"] }}",
            "Living Area Sqft": "={{ $('Process Each Property').item.json[\"Living area\"] }}",
            "Price Zestimate ": "={{ $('Process Each Property').item.json.Zestimate }}",
            "Virtual Tour URL": "={{ $('Process Each Property').item.json[\"Virtual Tour URL\"] }}",
            "Tax Assessed Value": "={{ $('Process Each Property').item.json[\"Tax Assessed Value\"] }}",
            "Near Schools + rating": "=1) {{ $('Process Each Property').item.json['School 1'] }} Rate - {{ $('Process Each Property').item.json['Rating 1'] }}\n\n2) {{ $('Process Each Property').item.json['School 2'] }} Rate -  {{ $('Process Each Property').item.json['Rating 2'] }}\n \n3) {{ $('Process Each Property').item.json['School 3'] }} Rate - {{ $('Process Each Property').item.json['Rating 3'] }}",
            "Last Price + Date Sold": "={{ $('Process Each Property').item.json[\"Last Price sold\"] }}",
            "15 year Fixed Rate Bucket": "={{ $('Process Each Property').item.json[\"15 year Fixed Rate Bucket\"] }}",
            "30 year Fixed Rate Bucket": "={{ $('Process Each Property').item.json[\"30 year Fixed Rate Bucket\"] }}"
          },
          "schema": [
            {
              "id": "STATUS",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "STATUS",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Picture",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Picture",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Rate",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Rate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Price",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Price",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Virtual Tour URL",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Virtual Tour URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "URL",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "MLS ID#",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "MLS ID#",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Google Maps URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Google Maps URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Address",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "city",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "city",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "County",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "County",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "zipcode",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "zipcode",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "yearBuilt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "yearBuilt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "homeType",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "homeType",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "homeStatus",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "homeStatus",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "bedrooms",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "bedrooms",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "bathrooms",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "bathrooms",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "lotSize Sqft",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "lotSize Sqft",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Living Area Sqft",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Living Area Sqft",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date on Market",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Date on Market",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "RentZestimate",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "RentZestimate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Price Zestimate ",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Price Zestimate ",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last Price + Date Sold",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Last Price + Date Sold",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Tax Assessed Value",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Tax Assessed Value",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": " Annual Tax",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": " Annual Tax",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "pricePerSqft",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "pricePerSqft",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "GRM",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "GRM",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "NOI 50% Rule",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "NOI 50% Rule",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "15 year Fixed Rate Bucket",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "15 year Fixed Rate Bucket",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "30 year Fixed Rate Bucket",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "30 year Fixed Rate Bucket",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "AgentName",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "AgentName",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Agent Phone #",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Agent Phone #",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "BrokerName",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "BrokerName",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": " BrokerPhone #",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": " BrokerPhone #",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Co-AgentName",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Co-AgentName",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Co-Agent Phone #",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Co-Agent Phone #",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "HOA fee",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "HOA fee",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "HOA name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "HOA name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "HOA Phone#",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "HOA Phone#",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Pets allowed",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Pets allowed",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Pets Fee",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Pets Fee",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Near Schools + rating",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Near Schools + rating",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Description",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "URL"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1YGwCNhatkOLMR49pYHXSYJoGcg22qLS6O8aCYO7jpfM/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1YGwCNhatkOLMR49pYHXSYJoGcg22qLS6O8aCYO7jpfM",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1YGwCNhatkOLMR49pYHXSYJoGcg22qLS6O8aCYO7jpfM/edit?usp=drivesdk",
          "cachedResultName": "Property Database"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "df151b4d-ebbf-42b1-adec-06f0821c5598",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        96,
        -48
      ],
      "parameters": {
        "color": 4,
        "width": 480,
        "height": 624,
        "content": "# \ud83d\udfe9 STEP 1: Zillow Data Extraction\n## This section starts the Apify Actor to scrape property listings from Zillow.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## It retrieves essential details such as price, location, and property features.\n**Ideal for investors or analysts who want fast, structured access to Zillow data.**"
      },
      "typeVersion": 1
    },
    {
      "id": "22743f36-d1e9-4597-9890-be29448788ae",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1472,
        112
      ],
      "parameters": {
        "color": 5,
        "width": 544,
        "height": 464,
        "content": "# \ud83d\udfe6 STEP 2: AI Investment Scoring\n## n8n uses OpenAI to analyze each property\u2019s details and assign an investment potential score (1\u201310).\n\n\n\n\n\n\n\n\n\n\n\n\n## This helps prioritize which listings are worth deeper research or immediate action."
      },
      "typeVersion": 1
    },
    {
      "id": "8e29afbc-2ec8-4166-b024-31d7df25f1a7",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        880,
        112
      ],
      "parameters": {
        "color": 7,
        "width": 576,
        "height": 464,
        "content": "# \ud83d\udfe8 STEP 3: Google Sheets Data Storage\n## The processed and scored results are automatically added to your Google Sheet database.\n\n\n\n\n\n\n\n\n\n\n\n\n## Each new run updates or appends data, keeping your property database current and organized"
      },
      "typeVersion": 1
    },
    {
      "id": "0ca5dc6a-075f-46c9-94b5-16caab3dc3ad",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        96,
        -656
      ],
      "parameters": {
        "color": 6,
        "width": 1920,
        "height": 592,
        "content": "# Zillow Property Scraper with AI Scoring to Google Sheets\n\n## This workflow automates real estate data collection and AI-based analysis using Apify, OpenAI, and Google Sheets.\n\nIt scrapes live property listings from Zillow, processes the data, and assigns an investment score for qualified properties \u2014 helping investors quickly identify high-potential listings.\n\nThe process begins by triggering an Apify Actor that extracts listing details such as price, location, and key features.\nn8n then formats and cleans the data before sending it to an AI model, which evaluates only properties containing the required data fields. Listings missing crucial information are automatically skipped to maintain data integrity.\nFinally, all valid and scored listings are updated or appended to a Google Sheets database for easy review and tracking.\n\nPerfect for real estate analysts, investors, or automation builders who want a fast and reliable way to rate properties with minimal manual effort.\n\n**Tools used: Apify, OpenAI, Google Sheets, n8n**\n\n(Disclaimer: This workflow uses community nodes and **requires valid API keys.** Ensure configuration before running.)\n\n\n![ ](https://media.licdn.com/dms/image/v2/D4E0BAQEJx3y3mzwQrg/company-logo_200_200/B4EZg8HGobHIAI-/0/1753355152288/apify_logo?e=2147483647&v=beta&t=7cvNZoQFcfHfs69bfwauevrpt_sJBXYCQaEfEaspIHQ)"
      },
      "typeVersion": 1
    },
    {
      "id": "e50095df-e436-4937-b3ce-f7a1b30d8c25",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        880,
        -48
      ],
      "parameters": {
        "color": 3,
        "width": 1136,
        "height": 144,
        "content": "# Process Each Property"
      },
      "typeVersion": 1
    },
    {
      "id": "a9827e50-75da-43af-ac15-44dc1e591d52",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        592,
        -48
      ],
      "parameters": {
        "width": 272,
        "height": 624,
        "content": "# Clean & Format Data"
      },
      "typeVersion": 1
    },
    {
      "id": "1edbc36b-b65d-4989-a30e-37dba5d19814",
      "name": "Extract Individual Property Data",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        352,
        192
      ],
      "parameters": {
        "memory": 8192,
        "actorId": {
          "__rl": true,
          "mode": "id",
          "value": "=ENK9p4RZHg0iVso52"
        },
        "operation": "Run actor and get dataset",
        "customBody": "={\n  \"propertyStatus\": \"FOR_SALE\",\n  \"searchResultsDatasetId\": \"{{ $json.resource.defaultDatasetId }}\",\n  \"startUrls\": [],\n  \"addresses\": [],\n  \"extractBuildingUnits\": \"disabled\"\n}",
        "authentication": "apifyOAuth2Api"
      },
      "credentials": {
        "apifyOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "ce159dfb-3f09-4491-ab71-1158999379b7",
  "connections": {
    "Clean & Format Data": {
      "main": [
        [
          {
            "node": "Process Each Property",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start Zillow Scraper": {
      "main": [
        [
          {
            "node": "Extract Individual Property Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Each Property": {
      "main": [
        [],
        [
          {
            "node": "AI Scoring: Investment Potential",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Google Sheets Database": {
      "main": [
        [
          {
            "node": "Process Each Property",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Scoring: Investment Potential": {
      "main": [
        [
          {
            "node": "Update Google Sheets Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Individual Property Data": {
      "main": [
        [
          {
            "node": "Clean & Format Data",
            "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

This workflow automates the process of scraping, analyzing, and storing real estate data from Zillow using Apify, OpenAI, and Google Sheets.

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

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

Imagine a relentless, intelligent sales assistant working for you 24/7. That's exactly what this system is. It takes the grueling, manual work of outreach and transforms it into a precision-guided, au

@Apify/N8N Nodes Apify, Hunter, Google Sheets +3
AI & RAG

Categories Marketing Intelligence, Ad Operations, Competitive Research, Creative Analysis

HTTP Request, Google Sheets, OpenAI +3
AI & RAG

Stop wasting hours manually hunting for business leads. This workflow automates the entire process from scraping Google Maps to extracting contact emails all triggered from your phone via Telegram.

@Apify/N8N Nodes Apify, Google Sheets, Telegram Trigger +3
AI & RAG

Automatically turn top performing Instagram reels into 7 new ready to use content scripts. This workflow scrapes high performing posts from a chosen Instagram profile, downloads and transcribes the re

OpenAI, HTTP Request, @Apify/N8N Nodes Apify +2
AI & RAG

Stop wasting hours on manual competitor research and content briefing. This workflow automates the creation of data-backed content briefs by analyzing the current top-ranking pages for your specific k

Form Trigger, @Apify/N8N Nodes Apify, OpenAI +2