Análisis de inversión inmobiliaria: Scraper de propiedades Zillow con puntuación de IA hacia Google Sheets

Intermedio

Este es unautomatización que contiene 12 nodos.Utiliza principalmente nodos como Set, GoogleSheets, Apify, SplitInBatches, OpenAi. Usar GPT-4o para analizar el potencial de inversión inmobiliaria: datos de propiedades de Zillow a Google Sheets

Requisitos previos
  • Credenciales de API de Google Sheets
  • Clave de API de OpenAI

Categoría

-
Vista previa del flujo de trabajo
Visualización de las conexiones entre nodos, con soporte para zoom y panorámica
Exportar flujo de trabajo
Copie la siguiente configuración JSON en n8n para importar y usar este flujo de trabajo
{
  "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": "Iniciar Rastreador 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": "Limpiar y Formatear Datos",
      "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": "Procesar Cada Propiedad",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1424,
        -32
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "95c2f8d0-93f9-4c64-9070-738d43e54dea",
      "name": "Puntuación IA: Potencial de Inversión",
      "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": "Actualizar Base de Datos 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": "Nota Adhesiva",
      "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": "Nota Adhesiva2",
      "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": "Nota Adhesiva4",
      "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": "Nota Adhesiva5",
      "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![ ](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": "Nota Adhesiva6",
      "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": "Nota Adhesiva3",
      "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": "Extraer Datos de Propiedad Individual",
      "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
          }
        ]
      ]
    }
  }
}
Preguntas frecuentes

¿Cómo usar este flujo de trabajo?

Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.

¿En qué escenarios es adecuado este flujo de trabajo?

Intermedio

¿Es de pago?

Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.

Información del flujo de trabajo
Nivel de dificultad
Intermedio
Número de nodos12
Categoría-
Tipos de nodos7
Descripción de la dificultad

Adecuado para usuarios con experiencia intermedia, flujos de trabajo de complejidad media con 6-15 nodos

Autor
Fabian Perez

Fabian Perez

@fabianprz

Hi 👋 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!

Enlaces externos
Ver en n8n.io

Compartir este flujo de trabajo

Categorías

Categorías: 34