Immobilieninvestitionsanalyse: Zillow Immobilien-Scraper und KI-Bewertung in Google Sheets
Dies ist ein Automatisierungsworkflow mit 12 Nodes. Hauptsächlich werden Set, GoogleSheets, Apify, SplitInBatches, OpenAi und andere Nodes verwendet. GPT-4o zur Analyse der Immobilieninvestitionspotenzial nutzen: Zillow Immobeldaten nach Google Sheets übertragen
- •Google Sheets API-Anmeldedaten
- •OpenAI API Key
Verwendete Nodes (12)
Kategorie
{
"id": "pYD1J1Xed3QsjdAG",
"meta": {
"instanceId": "e4d0e159d8908850b6af510bbd50decb04ea0c219fce7fbb97f383f3499aaad7",
"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
],
"webhookId": "3b0f8adc-9fd1-44f1-8fdd-4dc87a5bf253",
"parameters": {
"actorId": {
"__rl": true,
"mode": "list",
"value": "l7auNT3I30CssRrvO"
},
"authentication": "apifyOAuth2Api"
},
"credentials": {
"apifyOAuth2Api": {
"id": "LuIyRwcAoRhOMNOb",
"name": "Apify account 3"
}
},
"typeVersion": 1
},
{
"id": "8c9824bb-7699-4304-8e02-333a867b9fb8",
"name": "Daten bereinigen & formatieren",
"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": "Jede Immobilie verarbeiten",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1424,
-32
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "95c2f8d0-93f9-4c64-9070-738d43e54dea",
"name": "AI-Bewertung: Investitionspotenzial",
"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 → Max score 45\nCap rate below 4% → Max score 40\nGRM above 15 → Max score 45\nDSCR below 1.0 → Max score 40\nPrice > 110% of Zestimate → 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 × 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 ≥6%: 25 pts (scale: 6%=25pts, 5%=15pts, 4%=5pts, <4%=0pts)\nGRM ≤12: 15 pts (scale: <10=15pts, 12=10pts, 15=5pts, >15=0pts)\nDSCR ≥1.25: 15 pts (scale: >1.25=15pts, 1.0=5pts, <1.0=0pts)\nPrice ≤ Zestimate: 10 pts\nSchools avg ≥7: 5 pts\n\nMissing Data Penalty:\n\nMissing price or rent → Score 0, return \"0\"\nMissing HOA → Assume $0 but cap max score at 70\nMissing tax → Estimate 1.2% of price\nMissing Zestimate → 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": {
"id": "QQLtNJqnBjgggpPA",
"name": "OpenAi account"
}
},
"typeVersion": 1.8
},
{
"id": "f49bab12-4ba0-49c3-95fc-beb1f2c4d578",
"name": "Google Tabellen-Datenbank aktualisieren",
"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": {
"id": "wbnaHNLqBQ8lBdpB",
"name": "Google Sheets account"
}
},
"typeVersion": 4.7
},
{
"id": "df151b4d-ebbf-42b1-adec-06f0821c5598",
"name": "Notizzettel",
"type": "n8n-nodes-base.stickyNote",
"position": [
96,
-48
],
"parameters": {
"color": 4,
"width": 480,
"height": 624,
"content": "# 🟩 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": "Notizzettel2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1472,
112
],
"parameters": {
"color": 5,
"width": 544,
"height": 464,
"content": "# 🟦 STEP 2: AI Investment Scoring\n## n8n uses OpenAI to analyze each property’s details and assign an investment potential score (1–10).\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": "Notizzettel4",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
112
],
"parameters": {
"color": 7,
"width": 576,
"height": 464,
"content": "# 🟨 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": "Notizzettel5",
"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 — 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"
},
"typeVersion": 1
},
{
"id": "e50095df-e436-4937-b3ce-f7a1b30d8c25",
"name": "Notizzettel6",
"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": "Notizzettel3",
"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": "Einzelne Immobiliendaten extrahieren",
"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": {
"id": "NMQM4eCSJFqTtRMu",
"name": "Apify account 2"
}
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "ce159dfb-3f09-4491-ab71-1158999379b7",
"connections": {
"8c9824bb-7699-4304-8e02-333a867b9fb8": {
"main": [
[
{
"node": "f9b3948c-d50e-4091-aea5-cc028fc822bb",
"type": "main",
"index": 0
}
]
]
},
"214c6129-834c-46a1-9a58-0e3bad219bc1": {
"main": [
[
{
"node": "1edbc36b-b65d-4989-a30e-37dba5d19814",
"type": "main",
"index": 0
}
]
]
},
"f9b3948c-d50e-4091-aea5-cc028fc822bb": {
"main": [
[],
[
{
"node": "95c2f8d0-93f9-4c64-9070-738d43e54dea",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets-Datenbank aktualisieren": {
"main": [
[
{
"node": "f9b3948c-d50e-4091-aea5-cc028fc822bb",
"type": "main",
"index": 0
}
]
]
},
"95c2f8d0-93f9-4c64-9070-738d43e54dea": {
"main": [
[
{
"node": "Google Sheets-Datenbank aktualisieren",
"type": "main",
"index": 0
}
]
]
},
"1edbc36b-b65d-4989-a30e-37dba5d19814": {
"main": [
[
{
"node": "8c9824bb-7699-4304-8e02-333a867b9fb8",
"type": "main",
"index": 0
}
]
]
}
}
}Wie verwende ich diesen Workflow?
Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.
Für welche Szenarien ist dieser Workflow geeignet?
Fortgeschritten
Ist es kostenpflichtig?
Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.
Verwandte Workflows
Fabian Perez
@fabianprzHi 👋 I’m Fabian — I build automations with n8n that make business easier. I love connecting with other creators, so if you have questions or ideas, drop them below — happy to help!
Diesen Workflow teilen