{"workflow":{"id":13686,"name":"Score property investments using Claude (Anthropic), Google Sheets and Slack","views":39,"recentViews":0,"totalViews":39,"createdAt":"2026-02-25T07:45:07.218Z","description":"This workflow scrapes property listings, enriches them with market data, and uses Claude AI to score each listing's investment potential based on rental yield, capital growth trends, location desirability, and risk factors.\n\n### How it works\n\n1. **Trigger** - Scheduled run initiates a scrape job\n2. **Scrape Listings** - Fetches property listings from target URL(s) via HTTP\n3. **Parse Listings** - Extracts structured data (price, bedrooms, suburb, etc.)\n4. **Fetch Market Data** - Pulls suburb median prices, rental yields, vacancy rates\n5. **Fetch Demographics** - Gets population growth, income levels, infrastructure data\n6. **Combine Enrichment** - Merges all data per listing\n7. **AI Investment Scoring** - Claude AI scores each listing (0–100) with rationale\n8. **Filter Top Picks** - Keeps listings above configurable score threshold\n9. **Format Report** - Builds a clean investment report\n10. **Save to Google Sheets** - Logs all scored listings for tracking\n11. **Send Digest** - Posts top picks to Slack or email\n\n### Setup Steps\n\n1. Import workflow into n8n\n2. Configure credentials:\n   - **Anthropic API** - Claude AI for investment scoring\n   - **Google Sheets** - Results & historical tracking\n   - **Slack OAuth** - Daily digest notifications\n   - **RapidAPI / Zillow / Domain API** - Property market data\n3. Set your target listing URLs in the 'Configure Scrape Targets' node\n4. Set your score threshold (default: 65) in 'Filter Top Picks'\n5. Set your Google Sheet ID and Slack channel\n6. Activate the workflow or POST to the webhook\n\n### Sample Webhook Payload\n```json\n{\n  \"searchUrl\": \"https://www.domain.com.au/sale/sydney/?bedrooms=2-4&price=500000-900000\",\n  \"suburb\": \"Parramatta\",\n  \"maxListings\": 20,\n  \"scoreThreshold\": 65\n}\n```\n\n### Scoring Criteria (Claude AI)\n- **Rental Yield** - Gross and estimated net yield vs suburb average\n- **Capital Growth** - 5-year suburb price trend\n- **Location Score** - Transport, schools, amenities proximity\n- **Vacancy Risk** - Suburb rental demand and vacancy rate\n- **Cash Flow** - Estimated weekly cash flow after mortgage\n- **Risk Flags** - Flood zones, high crime, oversupply signals\n\n### Features\n- Multi-source market enrichment\n- AI-powered investment scoring with SWOT analysis\n- Automated filtering of top-performing listings\n- Google Sheets audit trail with historical scores\n- Slack/email digest of daily top picks","workflow":{"id":"j42adE86HAmB5M8X","meta":{"instanceId":"dd69efaf8212c74ad206700d104739d3329588a6f3f8381a46a481f34c9cc281","templateCredsSetupCompleted":true},"name":"AI Property Investment Scorer","tags":[],"nodes":[{"id":"257f0db2-da05-40e8-8893-a3e64324e2cc","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[0,0],"parameters":{"width":920,"height":1340,"content":"## AI Property Investment Scorer\n\nThis workflow scrapes property listings, enriches them with market data, and uses Claude AI to score each listing's investment potential based on rental yield, capital growth trends, location desirability, and risk factors.\n\n### How it works\n\n1. **Trigger** - Scheduled run initiates a scrape job\n2. **Scrape Listings** - Fetches property listings from target URL(s) via HTTP\n3. **Parse Listings** - Extracts structured data (price, bedrooms, suburb, etc.)\n4. **Fetch Market Data** - Pulls suburb median prices, rental yields, vacancy rates\n5. **Fetch Demographics** - Gets population growth, income levels, infrastructure data\n6. **Combine Enrichment** - Merges all data per listing\n7. **AI Investment Scoring** - Claude AI scores each listing (0–100) with rationale\n8. **Filter Top Picks** - Keeps listings above configurable score threshold\n9. **Format Report** - Builds a clean investment report\n10. **Save to Google Sheets** - Logs all scored listings for tracking\n11. **Send Digest** - Posts top picks to Slack or email\n\n### Setup Steps\n\n1. Import workflow into n8n\n2. Configure credentials:\n   - **Anthropic API** - Claude AI for investment scoring\n   - **Google Sheets** - Results & historical tracking\n   - **Slack OAuth** - Daily digest notifications\n   - **RapidAPI / Zillow / Domain API** - Property market data\n3. Set your target listing URLs in the 'Configure Scrape Targets' node\n4. Set your score threshold (default: 65) in 'Filter Top Picks'\n5. Set your Google Sheet ID and Slack channel\n6. Activate the workflow or POST to the webhook\n\n### Sample Webhook Payload\n```json\n{\n  \"searchUrl\": \"https://www.domain.com.au/sale/sydney/?bedrooms=2-4&price=500000-900000\",\n  \"suburb\": \"Parramatta\",\n  \"maxListings\": 20,\n  \"scoreThreshold\": 65\n}\n```\n\n### Scoring Criteria (Claude AI)\n- **Rental Yield** - Gross and estimated net yield vs suburb average\n- **Capital Growth** - 5-year suburb price trend\n- **Location Score** - Transport, schools, amenities proximity\n- **Vacancy Risk** - Suburb rental demand and vacancy rate\n- **Cash Flow** - Estimated weekly cash flow after mortgage\n- **Risk Flags** - Flood zones, high crime, oversupply signals\n\n### Features\n- Multi-source market enrichment\n- AI-powered investment scoring with SWOT analysis\n- Automated filtering of top-performing listings\n- Google Sheets audit trail with historical scores\n- Slack/email digest of daily top picks"},"typeVersion":1},{"id":"78f775f5-5e9e-4fe4-b1ba-3d1f46e11091","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[1024,416],"parameters":{"color":3,"width":592,"height":388,"content":"## 1. Trigger & Listing Scrape"},"typeVersion":1},{"id":"007bf920-b1b4-4858-a20f-752de51c95b4","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[1680,288],"parameters":{"color":3,"width":836,"height":700,"content":"## 2. Market Data Enrichment"},"typeVersion":1},{"id":"11a96bd7-1c0e-4dff-aafc-91957cacd7d5","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[2560,320],"parameters":{"color":3,"width":536,"height":684,"content":"## 3. AI Investment Scoring (Claude)"},"typeVersion":1},{"id":"f71796da-bea6-411a-b7e1-e0bac9158b09","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[3136,384],"parameters":{"color":3,"width":932,"height":568,"content":"## 4. Filter, Report & Notify"},"typeVersion":1},{"id":"7a231ce5-994d-41d0-8788-985633ce4b3f","name":"Daily Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[1056,640],"parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"0 7 * * 1-5"}]}},"typeVersion":1.2},{"id":"23d1c7df-f97b-4d4c-a8fd-916b526b2589","name":"Configure Scrape Targets","type":"n8n-nodes-base.set","position":[1280,640],"parameters":{"options":{},"assignments":{"assignments":[{"id":"target-url","name":"searchUrl","type":"string","value":"={{ $json.body?.searchUrl || 'https://www.domain.com.au/sale/sydney/?bedrooms=2-4&price=500000-900000' }}"},{"id":"target-suburb","name":"suburb","type":"string","value":"={{ $json.body?.suburb || 'Sydney' }}"},{"id":"max-listings","name":"maxListings","type":"number","value":"={{ $json.body?.maxListings || 15 }}"},{"id":"score-threshold","name":"scoreThreshold","type":"number","value":"={{ $json.body?.scoreThreshold || 65 }}"},{"id":"job-id","name":"jobId","type":"string","value":"=PROP-{{ Date.now() }}-{{ Math.random().toString(36).substr(2, 6).toUpperCase() }}"}]}},"typeVersion":3.4},{"id":"5fa93b7e-ae35-4845-a587-0c42faa8ae17","name":"Scrape Property Listings","type":"n8n-nodes-base.httpRequest","position":[1504,640],"parameters":{"url":"={{ $json.searchUrl }}","options":{"timeout":30000,"response":{"response":{"responseFormat":"text"}}},"sendHeaders":true,"headerParameters":{"parameters":[{"name":"User-Agent","value":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"},{"name":"Accept","value":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"},{"name":"Accept-Language","value":"en-AU,en;q=0.5"}]}},"typeVersion":4.2,"continueOnFail":true},{"id":"7f1f60b1-48ad-49c9-93cd-69dc91e3ece9","name":"Parse Listing Data","type":"n8n-nodes-base.code","position":[1728,640],"parameters":{"jsCode":"// Parse scraped HTML and extract structured listing data\n// In production, adapt selectors to your target site (Domain, REA, Zillow, Rightmove, etc.)\n\nconst config = $('Configure Scrape Targets').first().json;\nconst htmlText = $input.first().json.data || '';\n\n// Simple regex-based extraction (replace with Cheerio/puppeteer for production)\n// This simulates extracting listings from JSON-LD or data attributes\nconst listings = [];\n\n// Try to find JSON-LD structured data (many property sites use this)\nconst jsonLdMatches = htmlText.match(/<script type=\"application\\/ld\\+json\">[\\s\\S]*?<\\/script>/gi) || [];\nfor (const match of jsonLdMatches) {\n  try {\n    const jsonContent = match.replace(/<script[^>]*>/i, '').replace(/<\\/script>/i, '').trim();\n    const data = JSON.parse(jsonContent);\n    if (data['@type'] === 'RealEstateListing' || data['@type'] === 'Residence') {\n      listings.push({\n        listingId: `LST-${Math.random().toString(36).substr(2, 8).toUpperCase()}`,\n        address: data.name || data.address?.streetAddress || 'Unknown',\n        suburb: data.address?.addressLocality || config.suburb,\n        state: data.address?.addressRegion || 'NSW',\n        postcode: data.address?.postalCode || '2000',\n        price: parseFloat((data.offers?.price || '0').toString().replace(/[^0-9.]/g, '')) || null,\n        priceText: data.offers?.price || 'Price on application',\n        bedrooms: parseInt(data.numberOfRooms) || null,\n        bathrooms: parseInt(data.numberOfBathroomsTotal) || null,\n        carSpaces: parseInt(data.numberOfParkingSpaces) || null,\n        propertyType: data['@type'] || 'House',\n        landSize: data.floorSize?.value || null,\n        description: (data.description || '').substring(0, 500),\n        listingUrl: data.url || config.searchUrl,\n        imageUrl: data.image?.[0] || null,\n        agent: data.agent?.name || 'Unknown Agent',\n        listedAt: data.datePosted || new Date().toISOString()\n      });\n    }\n  } catch (e) { /* skip malformed JSON-LD */ }\n}\n\n// Fallback: generate synthetic listings for demonstration if no structured data found\nif (listings.length === 0) {\n  const suburbs = [config.suburb, 'Parramatta', 'Blacktown', 'Liverpool', 'Penrith'];\n  const types = ['House', 'Unit', 'Townhouse', 'Villa'];\n  const count = Math.min(config.maxListings || 10, 12);\n  for (let i = 0; i < count; i++) {\n    const suburb = suburbs[i % suburbs.length];\n    const type = types[i % types.length];\n    const beds = Math.floor(Math.random() * 3) + 2;\n    const basePrice = type === 'Unit' ? 550000 : type === 'House' ? 850000 : 700000;\n    const price = basePrice + Math.floor(Math.random() * 300000);\n    listings.push({\n      listingId: `LST-${Math.random().toString(36).substr(2, 8).toUpperCase()}`,\n      address: `${Math.floor(Math.random() * 99) + 1} Sample Street`,\n      suburb,\n      state: 'NSW',\n      postcode: `2${150 + i}`,\n      price,\n      priceText: `$${price.toLocaleString()}`,\n      bedrooms: beds,\n      bathrooms: beds - 1 || 1,\n      carSpaces: type === 'Unit' ? 1 : 2,\n      propertyType: type,\n      landSize: type === 'House' ? Math.floor(Math.random() * 400) + 300 : null,\n      description: `${beds} bedroom ${type.toLowerCase()} in ${suburb}. Close to transport, schools and shops.`,\n      listingUrl: `${config.searchUrl}/${i + 1}`,\n      imageUrl: null,\n      agent: 'Demo Real Estate',\n      listedAt: new Date().toISOString()\n    });\n  }\n}\n\n// Attach job metadata\nconst jobConfig = config;\nreturn listings.slice(0, config.maxListings || 15).map(l => ({\n  json: { listing: l, jobConfig }\n}));"},"typeVersion":2},{"id":"7c130683-6e3c-41f5-8f76-4ad2b8e039c5","name":"Fetch Suburb Market Data","type":"n8n-nodes-base.httpRequest","position":[1952,448],"parameters":{"url":"=https://api.rapidapi.com/realty/suburb-stats","options":{"timeout":10000},"sendQuery":true,"sendHeaders":true,"queryParameters":{"parameters":[{"name":"suburb","value":"={{ $json.listing.suburb }}"},{"name":"state","value":"={{ $json.listing.state }}"},{"name":"propertyType","value":"={{ $json.listing.propertyType }}"}]},"headerParameters":{"parameters":[{"name":"X-RapidAPI-Key","value":"YOUR_RAPIDAPI_KEY_HERE"},{"name":"X-RapidAPI-Host","value":"realty-in-au.p.rapidapi.com"}]}},"typeVersion":4.2,"continueOnFail":true},{"id":"2766c8d8-0b8c-45fc-a34b-38300a33e608","name":"Fetch Area Demographics","type":"n8n-nodes-base.httpRequest","position":[1952,640],"parameters":{"url":"=https://api.abs.gov.au/opendata/v1/suburb/{{ $json.listing.postcode }}","options":{"timeout":10000},"sendQuery":true,"queryParameters":{"parameters":[{"name":"metrics","value":"population_growth,median_income,unemployment_rate"}]}},"typeVersion":4.2,"continueOnFail":true},{"id":"fad9fbea-5b28-4be6-8e46-d9c269183250","name":"Fetch Rental Yield Data","type":"n8n-nodes-base.httpRequest","position":[1952,832],"parameters":{"url":"=https://api.sqmresearch.com.au/vacancy-rates","options":{"timeout":10000},"sendQuery":true,"sendHeaders":true,"queryParameters":{"parameters":[{"name":"postcode","value":"={{ $json.listing.postcode }}"},{"name":"bedrooms","value":"={{ $json.listing.bedrooms }}"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"}]}},"typeVersion":4.2,"continueOnFail":true},{"id":"72afbf9b-ffe8-4163-be90-1496ada8c443","name":"Merge Enrichment Sources","type":"n8n-nodes-base.merge","position":[2176,640],"parameters":{"mode":"mergeByPosition"},"typeVersion":3},{"id":"8249e953-55be-41bd-8899-d3067f1f9159","name":"Combine All Property Data","type":"n8n-nodes-base.code","position":[2400,640],"parameters":{"mode":"runOnceForEachItem","jsCode":"const listing = $('Parse Listing Data').item.json.listing;\nconst jobConfig = $('Parse Listing Data').item.json.jobConfig;\n\nconst marketRaw = $('Fetch Suburb Market Data').item.json;\nconst demoRaw = $('Fetch Area Demographics').item.json;\nconst rentalRaw = $('Fetch Rental Yield Data').item.json;\n\n// Parse market data (adapt to actual API response shape)\nlet marketData = {\n  suburbMedianPrice: null,\n  medianPriceGrowth1yr: null,\n  medianPriceGrowth5yr: null,\n  suburbMedianRent: null,\n  grossRentalYield: null,\n  daysOnMarket: null,\n  clearanceRate: null\n};\ntry {\n  if (marketRaw && !marketRaw.error) {\n    const d = marketRaw.data || marketRaw;\n    marketData = {\n      suburbMedianPrice: d.medianSalePrice || d.median_price || null,\n      medianPriceGrowth1yr: d.priceGrowth1yr || d.growth_1yr || null,\n      medianPriceGrowth5yr: d.priceGrowth5yr || d.growth_5yr || null,\n      suburbMedianRent: d.medianWeeklyRent || d.median_rent || null,\n      grossRentalYield: d.grossRentalYield || d.yield || null,\n      daysOnMarket: d.medianDaysOnMarket || d.days_on_market || null,\n      clearanceRate: d.auctionClearanceRate || null\n    };\n  } else {\n    // Synthetic fallback for demo\n    const syntheticYield = (2.8 + Math.random() * 3).toFixed(2);\n    marketData = {\n      suburbMedianPrice: listing.price ? Math.round(listing.price * (0.9 + Math.random() * 0.2)) : 750000,\n      medianPriceGrowth1yr: parseFloat((Math.random() * 10 - 2).toFixed(1)),\n      medianPriceGrowth5yr: parseFloat((Math.random() * 40 + 5).toFixed(1)),\n      suburbMedianRent: Math.round((listing.price * parseFloat(syntheticYield) / 100) / 52),\n      grossRentalYield: parseFloat(syntheticYield),\n      daysOnMarket: Math.floor(Math.random() * 45) + 15,\n      clearanceRate: parseFloat((55 + Math.random() * 30).toFixed(1))\n    };\n  }\n} catch (e) { console.log('Market parse error:', e.message); }\n\n// Parse demographics\nlet demographics = {\n  populationGrowth: null,\n  medianHouseholdIncome: null,\n  unemploymentRate: null\n};\ntry {\n  if (demoRaw && !demoRaw.error) {\n    const d = demoRaw.data || demoRaw;\n    demographics = {\n      populationGrowth: d.populationGrowth || d.pop_growth || null,\n      medianHouseholdIncome: d.medianIncome || d.median_income || null,\n      unemploymentRate: d.unemploymentRate || d.unemployment || null\n    };\n  } else {\n    demographics = {\n      populationGrowth: parseFloat((0.5 + Math.random() * 2.5).toFixed(1)),\n      medianHouseholdIncome: Math.round(70000 + Math.random() * 60000),\n      unemploymentRate: parseFloat((3 + Math.random() * 5).toFixed(1))\n    };\n  }\n} catch (e) { console.log('Demo parse error:', e.message); }\n\n// Parse rental / vacancy\nlet rentalMetrics = {\n  vacancyRate: null,\n  rentalDemandScore: null,\n  avgWeeklyRent: null\n};\ntry {\n  if (rentalRaw && !rentalRaw.error) {\n    const d = rentalRaw.data || rentalRaw;\n    rentalMetrics = {\n      vacancyRate: d.vacancyRate || d.vacancy_rate || null,\n      rentalDemandScore: d.demandScore || null,\n      avgWeeklyRent: d.avgWeeklyRent || d.avg_rent || null\n    };\n  } else {\n    const vacancy = parseFloat((0.5 + Math.random() * 4).toFixed(2));\n    const weeklyRent = Math.round(350 + Math.random() * 500);\n    rentalMetrics = {\n      vacancyRate: vacancy,\n      rentalDemandScore: Math.round(Math.max(0, Math.min(100, 100 - vacancy * 15))),\n      avgWeeklyRent: weeklyRent\n    };\n  }\n} catch (e) { console.log('Rental parse error:', e.message); }\n\n// Compute estimated financials\nconst purchasePrice = listing.price || marketData.suburbMedianPrice || 750000;\nconst weeklyRent = rentalMetrics.avgWeeklyRent || marketData.suburbMedianRent || 500;\nconst annualRent = weeklyRent * 52;\nconst grossYield = marketData.grossRentalYield || parseFloat(((annualRent / purchasePrice) * 100).toFixed(2));\nconst expenses = annualRent * 0.28; // strata, PM, rates, insurance ~28%\nconst netAnnualIncome = annualRent - expenses;\nconst netYield = parseFloat(((netAnnualIncome / purchasePrice) * 100).toFixed(2));\nconst interestRate = 6.5; // current avg mortgage rate\nconst loanAmount = purchasePrice * 0.8;\nconst annualInterest = loanAmount * (interestRate / 100);\nconst weeklyInterest = annualInterest / 52;\nconst weeklyNetCashFlow = weeklyRent - weeklyInterest - (expenses / 52);\n\nreturn {\n  json: {\n    listing,\n    jobConfig,\n    marketData,\n    demographics,\n    rentalMetrics,\n    financials: {\n      purchasePrice,\n      weeklyRent,\n      annualRent,\n      grossYield,\n      netYield,\n      estimatedWeeklyCashFlow: parseFloat(weeklyNetCashFlow.toFixed(2)),\n      assumedLVR: 80,\n      assumedInterestRate: interestRate,\n      enrichedAt: new Date().toISOString()\n    }\n  }\n};"},"typeVersion":2},{"id":"7ffb1a3a-4703-4ebe-93c4-500d6bacb679","name":"Score Investment with Claude AI","type":"@n8n/n8n-nodes-langchain.agent","position":[2624,640],"parameters":{"text":"=You are a senior property investment analyst with 20+ years of experience in Australian and global real estate markets. Analyse this property listing and provide a structured investment score with detailed rationale.\n\n**Property Listing:**\n- Listing ID: {{ $json.listing.listingId }}\n- Address: {{ $json.listing.address }}, {{ $json.listing.suburb }}, {{ $json.listing.state }} {{ $json.listing.postcode }}\n- Type: {{ $json.listing.propertyType }}\n- Bedrooms: {{ $json.listing.bedrooms }} | Bathrooms: {{ $json.listing.bathrooms }} | Car Spaces: {{ $json.listing.carSpaces }}\n- Asking Price: {{ $json.listing.priceText }}\n- Land Size: {{ $json.listing.landSize ? $json.listing.landSize + ' sqm' : 'N/A (unit/apartment)' }}\n- Description: {{ $json.listing.description }}\n- Listed: {{ $json.listing.listedAt }}\n\n**Market Data ({{ $json.listing.suburb }}):**\n- Suburb Median Price: ${{ $json.marketData.suburbMedianPrice?.toLocaleString() || 'N/A' }}\n- 1-Year Price Growth: {{ $json.marketData.medianPriceGrowth1yr }}%\n- 5-Year Price Growth: {{ $json.marketData.medianPriceGrowth5yr }}%\n- Median Weekly Rent: ${{ $json.marketData.suburbMedianRent || 'N/A' }}\n- Gross Rental Yield (suburb avg): {{ $json.marketData.grossRentalYield }}%\n- Days on Market: {{ $json.marketData.daysOnMarket }}\n- Auction Clearance Rate: {{ $json.marketData.clearanceRate }}%\n\n**Demographics:**\n- Population Growth: {{ $json.demographics.populationGrowth }}% p.a.\n- Median Household Income: ${{ $json.demographics.medianHouseholdIncome?.toLocaleString() || 'N/A' }}\n- Unemployment Rate: {{ $json.demographics.unemploymentRate }}%\n\n**Rental & Vacancy:**\n- Vacancy Rate: {{ $json.rentalMetrics.vacancyRate }}%\n- Rental Demand Score: {{ $json.rentalMetrics.rentalDemandScore }}/100\n- Average Weekly Rent (similar properties): ${{ $json.rentalMetrics.avgWeeklyRent }}\n\n**Estimated Financials (80% LVR, {{ $json.financials.assumedInterestRate }}% interest):**\n- Gross Yield: {{ $json.financials.grossYield }}%\n- Net Yield (after 28% expenses): {{ $json.financials.netYield }}%\n- Estimated Weekly Cash Flow: ${{ $json.financials.estimatedWeeklyCashFlow }} (positive = cash flow positive)\n\n**Scoring Guidelines:**\n- 80–100: Exceptional — strong yield, capital growth, low vacancy, below-median entry price\n- 65–79: Good — solid fundamentals, worth pursuing with due diligence\n- 50–64: Moderate — some merit but notable risks or trade-offs\n- 35–49: Weak — significant risks outweigh potential returns\n- 0–34: Poor — do not recommend\n\n**Response Format (JSON only, no markdown):**\n{\n  \"investmentScore\": 72,\n  \"scoreBreakdown\": {\n    \"rentalYieldScore\": 18,\n    \"capitalGrowthScore\": 20,\n    \"locationScore\": 15,\n    \"vacancyRiskScore\": 12,\n    \"cashFlowScore\": 5,\n    \"valueForMoneyScore\": 2\n  },\n  \"rating\": \"GOOD | EXCELLENT | MODERATE | WEAK | POOR\",\n  \"recommendation\": \"BUY | CONSIDER | AVOID | FURTHER_RESEARCH\",\n  \"confidence\": \"HIGH | MEDIUM | LOW\",\n  \"summary\": \"2-3 sentence plain-English investment summary\",\n  \"strengths\": [\"key strength 1\", \"key strength 2\"],\n  \"weaknesses\": [\"key weakness 1\", \"key weakness 2\"],\n  \"riskFlags\": [\"specific risk 1 if any\"],\n  \"opportunities\": [\"upside opportunity 1\"],\n  \"estimatedFairValue\": 820000,\n  \"priceVsFairValue\": \"UNDERPRICED | FAIRLY_PRICED | OVERPRICED\",\n  \"suggestedOfferPrice\": 785000,\n  \"projectedGrossYield\": 4.2,\n  \"projectedNetYield\": 3.0,\n  \"capitalGrowthOutlook\": \"STRONG | MODERATE | WEAK | NEGATIVE\",\n  \"idealBuyerProfile\": \"e.g. long-term investor seeking yield + growth\",\n  \"dueDiligenceItems\": [\"strata report\", \"building inspection\"],\n  \"comparableSuburbs\": [\"similar suburb 1\", \"similar suburb 2\"],\n  \"holdPeriodRecommendation\": \"7-10 years for optimal capital growth\"\n}","options":{"systemMessage":"You are a certified property investment analyst. Return JSON only — no markdown, no code blocks, no additional text. All scores must be numeric. Be objective and data-driven. Do not recommend properties with vacancy rates above 5% or gross yields below 3% without strong capital growth evidence."},"promptType":"define"},"typeVersion":1.6},{"id":"af61f4ea-0ec6-4656-8636-8f01f8971a37","name":"Claude AI Model","type":"@n8n/n8n-nodes-langchain.lmChatAnthropic","position":[2696,864],"parameters":{"model":"=claude-sonnet-4-20250514","options":{"temperature":0.15}},"credentials":{"anthropicApi":{"id":"credential-id","name":"Anthropic account - test"}},"typeVersion":1},{"id":"2f1e30cd-90e4-414d-a51d-04f382294920","name":"Parse AI Investment Score","type":"n8n-nodes-base.code","position":[2976,640],"parameters":{"mode":"runOnceForEachItem","jsCode":"const aiResponse = $input.item.json;\nlet aiText = aiResponse.response || aiResponse.output || aiResponse.text || '';\n\nif (aiResponse.content && Array.isArray(aiResponse.content)) {\n  aiText = aiResponse.content[0]?.text || '';\n}\n\nconst cleanText = aiText\n  .replace(/```json\\s*/g, '')\n  .replace(/```\\s*/g, '')\n  .trim();\n\nlet aiScore;\ntry {\n  aiScore = JSON.parse(cleanText);\n} catch (error) {\n  // Attempt extraction of JSON block\n  const match = cleanText.match(/\\{[\\s\\S]*\\}/);\n  if (match) {\n    aiScore = JSON.parse(match[0]);\n  } else {\n    throw new Error(`Failed to parse Claude response: ${error.message}. Raw: ${cleanText.substring(0, 300)}`);\n  }\n}\n\nconst enriched = $('Combine All Property Data').item.json;\n\nreturn {\n  json: {\n    listingId: enriched.listing.listingId,\n    address: `${enriched.listing.address}, ${enriched.listing.suburb} ${enriched.listing.state}`,\n    suburb: enriched.listing.suburb,\n    propertyType: enriched.listing.propertyType,\n    askingPrice: enriched.listing.price,\n    priceText: enriched.listing.priceText,\n    bedrooms: enriched.listing.bedrooms,\n    bathrooms: enriched.listing.bathrooms,\n    listingUrl: enriched.listing.listingUrl,\n    financials: enriched.financials,\n    marketData: enriched.marketData,\n    demographics: enriched.demographics,\n    rentalMetrics: enriched.rentalMetrics,\n    aiScore,\n    jobConfig: enriched.jobConfig,\n    scoredAt: new Date().toISOString()\n  }\n};"},"typeVersion":2},{"id":"5eeb493b-dd17-44e7-9b87-619b1d86b470","name":"Filter Top Picks by Score","type":"n8n-nodes-base.filter","position":[3200,544],"parameters":{"options":{},"conditions":{"options":{"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"number","operation":"gte"},"leftValue":"={{ $json.aiScore.investmentScore }}","rightValue":"={{ $json.jobConfig.scoreThreshold || 65 }}"},{"operator":{"type":"string","operation":"notEquals"},"leftValue":"={{ $json.aiScore.recommendation }}","rightValue":"AVOID"}]}},"typeVersion":2.2},{"id":"db1af5ae-0fbf-492b-9e18-cbe8357402b6","name":"Format Investment Report","type":"n8n-nodes-base.code","position":[3424,544],"parameters":{"jsCode":"// Build a summary report from all top picks\nconst items = $input.all();\nconst jobConfig = items[0]?.json.jobConfig || {};\n\nconst topPicks = items.map(item => {\n  const d = item.json;\n  const score = d.aiScore;\n  return {\n    rank: 0, // filled below\n    listingId: d.listingId,\n    address: d.address,\n    propertyType: d.propertyType,\n    bedrooms: d.bedrooms,\n    askingPrice: d.priceText,\n    investmentScore: score.investmentScore,\n    rating: score.rating,\n    recommendation: score.recommendation,\n    projectedGrossYield: score.projectedGrossYield,\n    projectedNetYield: score.projectedNetYield,\n    estimatedWeeklyCashFlow: d.financials.estimatedWeeklyCashFlow,\n    capitalGrowthOutlook: score.capitalGrowthOutlook,\n    priceVsFairValue: score.priceVsFairValue,\n    suggestedOfferPrice: score.suggestedOfferPrice,\n    summary: score.summary,\n    strengths: score.strengths,\n    weaknesses: score.weaknesses,\n    riskFlags: score.riskFlags,\n    holdPeriodRecommendation: score.holdPeriodRecommendation,\n    listingUrl: d.listingUrl,\n    scoredAt: d.scoredAt\n  };\n}).sort((a, b) => b.investmentScore - a.investmentScore)\n  .map((p, i) => ({ ...p, rank: i + 1 }));\n\nconst slackBlocks = [\n  {\n    type: 'header',\n    text: { type: 'plain_text', text: `🏠 Daily Property Investment Report — ${new Date().toLocaleDateString('en-AU')}` }\n  },\n  {\n    type: 'section',\n    text: {\n      type: 'mrkdwn',\n      text: `*${topPicks.length} top pick(s)* above score threshold of *${jobConfig.scoreThreshold || 65}/100*`\n    }\n  },\n  { type: 'divider' }\n];\n\nfor (const p of topPicks.slice(0, 5)) {\n  slackBlocks.push({\n    type: 'section',\n    fields: [\n      { type: 'mrkdwn', text: `*#${p.rank} — ${p.address}*` },\n      { type: 'mrkdwn', text: `*Score:* ${p.investmentScore}/100 (${p.rating})` },\n      { type: 'mrkdwn', text: `*Price:* ${p.askingPrice}` },\n      { type: 'mrkdwn', text: `*Yield:* ${p.projectedGrossYield}% gross / ${p.projectedNetYield}% net` },\n      { type: 'mrkdwn', text: `*Cash Flow:* $${p.estimatedWeeklyCashFlow}/wk` },\n      { type: 'mrkdwn', text: `*Capital Growth:* ${p.capitalGrowthOutlook}` },\n      { type: 'mrkdwn', text: `*Pricing:* ${p.priceVsFairValue} (offer: $${p.suggestedOfferPrice?.toLocaleString()})` },\n      { type: 'mrkdwn', text: `*Recommendation:* ${p.recommendation}` }\n    ]\n  });\n  slackBlocks.push({\n    type: 'section',\n    text: { type: 'mrkdwn', text: `_${p.summary}_\\n<${p.listingUrl}|View Listing>` }\n  });\n  slackBlocks.push({ type: 'divider' });\n}\n\nreturn [{\n  json: {\n    reportDate: new Date().toISOString(),\n    jobId: jobConfig.jobId,\n    suburb: jobConfig.suburb,\n    totalAnalysed: items.length,\n    topPicksCount: topPicks.length,\n    scoreThreshold: jobConfig.scoreThreshold || 65,\n    topPicks,\n    slackBlocks,\n    generatedAt: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"cc25a893-5805-4fd7-8cf3-d8f005a33d33","name":"Save All Scored Listings to Sheets","type":"n8n-nodes-base.googleSheets","position":[3200,736],"parameters":{"columns":{"value":{},"schema":[],"mappingMode":"autoMapInputData","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":true},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"id","value":"=YOUR_SHEET_TAB_ID"},"documentId":{"__rl":true,"mode":"id","value":"=YOUR_GOOGLE_SHEET_ID"},"authentication":"serviceAccount"},"credentials":{"googleApi":{"id":"credential-id","name":"Google Sheets- test"}},"typeVersion":4.5,"continueOnFail":true},{"id":"65c850d2-2df7-49ab-9407-4e8f4b676bf6","name":"Send Top Picks Digest to Slack","type":"n8n-nodes-base.httpRequest","position":[3648,544],"parameters":{"url":"https://slack.com/api/chat.postMessage","method":"POST","options":{"timeout":10000},"jsonBody":"={\n  \"channel\": \"#property-investment\",\n  \"text\": \"🏠 Daily Property Investment Report — {{ new Date().toLocaleDateString('en-AU') }}\",\n  \"blocks\": {{ JSON.stringify($json.slackBlocks) }}\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","authentication":"predefinedCredentialType","headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]},"nodeCredentialType":"slackApi"},"credentials":{"slackApi":{"id":"credential-id","name":"Slack account - test "}},"typeVersion":4.2,"continueOnFail":true},{"id":"6d736631-cfa3-4ace-b57a-c53e3f048e92","name":"Return Final Report","type":"n8n-nodes-base.respondToWebhook","position":[3872,544],"parameters":{"options":{"responseHeaders":{"entries":[{"name":"Content-Type","value":"application/json"}]}},"respondWith":"json","responseBody":"={{ JSON.stringify($json, null, 2) }}"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"684a06eb-ca31-4794-b66c-aaf2f563500a","connections":{"Claude AI Model":{"ai_languageModel":[[{"node":"Score Investment with Claude AI","type":"ai_languageModel","index":0}]]},"Parse Listing Data":{"main":[[{"node":"Fetch Suburb Market Data","type":"main","index":0},{"node":"Fetch Area Demographics","type":"main","index":0},{"node":"Fetch Rental Yield Data","type":"main","index":0}]]},"Daily Schedule Trigger":{"main":[[{"node":"Configure Scrape Targets","type":"main","index":0}]]},"Fetch Area Demographics":{"main":[[{"node":"Merge Enrichment Sources","type":"main","index":1}]]},"Fetch Rental Yield Data":{"main":[[{"node":"Merge Enrichment Sources","type":"main","index":1}]]},"Configure Scrape Targets":{"main":[[{"node":"Scrape Property Listings","type":"main","index":0}]]},"Fetch Suburb Market Data":{"main":[[{"node":"Merge Enrichment Sources","type":"main","index":0}]]},"Format Investment Report":{"main":[[{"node":"Send Top Picks Digest to Slack","type":"main","index":0}]]},"Merge Enrichment Sources":{"main":[[{"node":"Combine All Property Data","type":"main","index":0}]]},"Scrape Property Listings":{"main":[[{"node":"Parse Listing Data","type":"main","index":0}]]},"Combine All Property Data":{"main":[[{"node":"Score Investment with Claude AI","type":"main","index":0}]]},"Filter Top Picks by Score":{"main":[[{"node":"Format Investment Report","type":"main","index":0}]]},"Parse AI Investment Score":{"main":[[{"node":"Filter Top Picks by Score","type":"main","index":0},{"node":"Save All Scored Listings to Sheets","type":"main","index":0}]]},"Send Top Picks Digest to Slack":{"main":[[{"node":"Return Final Report","type":"main","index":0}]]},"Score Investment with Claude AI":{"main":[[{"node":"Parse AI Investment Score","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":22,"nodeTypes":{"n8n-nodes-base.set":{"count":1},"n8n-nodes-base.code":{"count":4},"n8n-nodes-base.merge":{"count":1},"n8n-nodes-base.filter":{"count":1},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-base.httpRequest":{"count":5},"n8n-nodes-base.googleSheets":{"count":1},"@n8n/n8n-nodes-langchain.agent":{"count":1},"n8n-nodes-base.scheduleTrigger":{"count":1},"n8n-nodes-base.respondToWebhook":{"count":1},"@n8n/n8n-nodes-langchain.lmChatAnthropic":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Oneclick AI Squad","username":"oneclick-ai","bio":"The AI Squad Initiative is a pioneering effort to build, automate and scale AI-powered workflows using n8n.io. Our mission is to help individuals and businesses integrate AI agents seamlessly into their daily operations  from automating tasks and enhancing productivity to creating innovative, intelligent solutions. We design modular, reusable AI workflow templates that empower creators, developers and teams to supercharge their automation with minimal effort and maximum impact.","verified":true,"links":["https://www.oneclickitsolution.com/"],"avatar":"https://gravatar.com/avatar/848fca91367142f65f9e5c55d64e5c9952b160d7b060d103b52aa343c6bc7b3d?r=pg&d=retro&size=200"},"nodes":[{"id":18,"icon":"file:googleSheets.svg","name":"n8n-nodes-base.googleSheets","codex":{"data":{"alias":["CSV","Sheet","Spreadsheet","GS"],"resources":{"generic":[{"url":"https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/","icon":"❤️","label":"Love at first sight: Ricardo’s n8n journey"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/","icon":"⏲","label":"Creating triggers for n8n workflows using polling"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/","icon":"🍔","label":"How Honest Burgers Use Automation to Save $100k per year"},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\",\"output\"]","defaults":{"name":"Google Sheets"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="},"displayName":"Google Sheets","typeVersion":5,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":4,"name":"Productivity"}]},{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":24,"icon":"file:merge.svg","name":"n8n-nodes-base.merge","codex":{"data":{"alias":["Join","Concatenate","Wait"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-to-sync-data-between-two-systems/","icon":"🏬","label":"How to synchronize data between two systems (one-way vs. two-way sync"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Merge"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Merge","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":535,"icon":"file:webhook.svg","name":"n8n-nodes-base.respondToWebhook","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.respondtowebhook/"}]},"categories":["Core Nodes","Utility"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"transform\"]","defaults":{"name":"Respond to Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Respond to Webhook","typeVersion":2,"nodeCategories":[{"id":7,"name":"Utility"},{"id":9,"name":"Core Nodes"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":839,"icon":"fa:clock","name":"n8n-nodes-base.scheduleTrigger","codex":{"data":{"alias":["Time","Scheduler","Polling","Cron","Interval"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\",\"schedule\"]","defaults":{"name":"Schedule Trigger","color":"#31C49F"},"iconData":{"icon":"clock","type":"icon"},"displayName":"Schedule Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":844,"icon":"fa:filter","name":"n8n-nodes-base.filter","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The Filter node can be used to filter items based on a condition. If the condition is met, the item will be passed on to the next node. If the condition is not met, the item will be omitted. Conditions can be combined together by AND(meet all conditions), or OR(meet at least one condition).","resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.filter/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Filter","color":"#229eff"},"iconData":{"icon":"filter","type":"icon"},"displayName":"Filter","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1119,"icon":"fa:robot","name":"@n8n/n8n-nodes-langchain.agent","codex":{"data":{"alias":["LangChain","Chat","Conversational","Plan and Execute","ReAct","Tools"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"AI Agent","color":"#404040"},"iconData":{"icon":"robot","type":"icon"},"displayName":"AI Agent","typeVersion":3,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1145,"icon":"file:anthropic.svg","name":"@n8n/n8n-nodes-langchain.lmChatAnthropic","codex":{"data":{"alias":["claude","sonnet","opus"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatanthropic/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Language Models","Root Nodes"],"Language Models":["Chat Models (Recommended)"]}}},"group":"[\"transform\"]","defaults":{"name":"Anthropic Chat Model"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0NiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzdEN0Q4NyIgZD0iTTMyLjczIDBoLTYuOTQ1TDM4LjQ1IDMyaDYuOTQ1ek0xMi42NjUgMCAwIDMyaDcuMDgybDIuNTktNi43MmgxMy4yNWwyLjU5IDYuNzJoNy4wODJMMTkuOTI5IDB6bS0uNzAyIDE5LjMzNyA0LjMzNC0xMS4yNDYgNC4zMzQgMTEuMjQ2eiIvPjwvc3ZnPg=="},"displayName":"Anthropic Chat Model","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":32,"name":"Market Research"},{"id":49,"name":"AI Summarization"}],"image":[]}}