부동산 투자 분석: Zillow 매물 스크래핑 및 AI 점수 매기기 to Google Sheets
중급
이것은자동화 워크플로우로, 12개의 노드를 포함합니다.주로 Set, GoogleSheets, Apify, SplitInBatches, OpenAi 등의 노드를 사용하며. GPT-4o를 사용하여 부동산 투자 잠재력 분석: Zillow 부동산 데이터를 Google Sheets로
사전 요구사항
- •Google Sheets API 인증 정보
- •OpenAI API Key
카테고리
-
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"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": "Zillow 스크래퍼 시작",
"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": "데이터 정리 및 형식 지정",
"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": "각 부동산 처리",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1424,
-32
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "95c2f8d0-93f9-4c64-9070-738d43e54dea",
"name": "AI 평가: 투자 잠재력",
"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 Sheets 데이터베이스 업데이트",
"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": "스티커 메모",
"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": "스티커 메모2",
"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": "스티커 메모4",
"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": "스티커 메모5",
"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": "스티커 메모6",
"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": "스티커 메모3",
"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": "개별 부동산 데이터 추출",
"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
}
]
]
},
"f49bab12-4ba0-49c3-95fc-beb1f2c4d578": {
"main": [
[
{
"node": "f9b3948c-d50e-4091-aea5-cc028fc822bb",
"type": "main",
"index": 0
}
]
]
},
"95c2f8d0-93f9-4c64-9070-738d43e54dea": {
"main": [
[
{
"node": "f49bab12-4ba0-49c3-95fc-beb1f2c4d578",
"type": "main",
"index": 0
}
]
]
},
"1edbc36b-b65d-4989-a30e-37dba5d19814": {
"main": [
[
{
"node": "8c9824bb-7699-4304-8e02-333a867b9fb8",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
중급
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
AHIJSfA
Apify와 Tavily를 사용하여 Indeed 직업 추출 및 AI 필터링 및 회사 연구
If
Set
Wait
+
If
Set
Wait
23 노드Adrian Bent
리드 생성
자동화된 리드 후속 시스템 - Follow Up Boss의 새 리드 검증, 이메일 및 메시지
Follow Up Boss, Gmail, Twilio, WhatsApp 메시지를 사용한 자동 잠재 고객 후속 조치
If
Set
Code
+
If
Set
Code
24 노드Fabian Perez
AI 생성 WordPress 글 요약 블록
WordPress 글의 AI 생성 요약 블록
If
Set
Slack
+
If
Set
Slack
32 노드Dataki
인공지능
Facebook 페이지 댓글 관리 봇: 답글, 삭제, 차단 및 알림
AI 기반 Facebook 댓글 관리: 자동 답글, 삭제, 차단 및 알림
If
Set
Code
+
If
Set
Code
59 노드SpaGreen Creative
소셜 미디어
AI 기반 Instagram 콘텐츠 재활용
OpenAI GPT-4O와 Perplexity 연구를 통합한 AI 기반 Instagram 콘텐츠 재활용
Set
Http Request
Google Sheets
+
Set
Http Request
Google Sheets
15 노드Hassan
基于AI의潜在고객信息增强(Bright Data MCP및Google Sheets)
基于AI의潜在고객信息增强:사용Bright Data MCP및Google Sheets
If
Set
Wait
+
If
Set
Wait
51 노드Cyril Nicko Gaspar
영업
워크플로우 정보
난이도
중급
노드 수12
카테고리-
노드 유형7
저자
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!
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유