AutomationFlowsAI & RAG › Generate Scheduled B2b Leads From Google Maps with Lemlist, Claude, and…

Generate Scheduled B2b Leads From Google Maps with Lemlist, Claude, and…

Original n8n title: Generate Scheduled B2b Leads From Google Maps with Lemlist, Claude, and Pitchlane

ByJannik Hiller @jannik-mtm on n8n.io

How it works Runs on schedule (Monday-Friday at 9 AM) to automate lead generation Searches for companies on Google Maps by location and category Extracts owner information from company websites and impressum pages Enriches leads with email addresses and LinkedIn profiles using…

Webhook trigger★★★★★ complexityAI-powered30 nodesHTTP RequestAnthropicGoogle GeminiGoogle DocsLemlistOpenAI
AI & RAG Trigger: Webhook Nodes: 30 Complexity: ★★★★★ AI nodes: yes Added:

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

This workflow follows the Google Docs → HTTP Request recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "nodes": [
    {
      "id": "d1eff29b-b3fa-48da-83c5-dff8c076d770",
      "name": "Configure search parameters",
      "type": "n8n-nodes-base.set",
      "notes": "Hier die Suchparameter anpassen:\n- searchQuery: Was soll gesucht werden?\n- location: Wo soll gesucht werden?\n- maxResults: Wie viele Ergebnisse?",
      "position": [
        -2800,
        1136
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "search-query",
              "name": "searchQuery",
              "type": "string",
              "value": "Marketing Agentur"
            },
            {
              "id": "location",
              "name": "location",
              "type": "string",
              "value": "Berlin, Germany"
            },
            {
              "id": "max-results",
              "name": "maxResults",
              "type": "number",
              "value": 10
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 3.4
    },
    {
      "id": "13ca13a2-5513-48ea-abf0-82387c714a0b",
      "name": "Search Google Maps",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Serper.dev API f\u00fcr Google Maps Scraping",
      "position": [
        -2592,
        1136
      ],
      "parameters": {
        "url": "https://google.serper.dev/maps",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"q\": \"{{ $json.searchQuery }} {{ $json.location }}\",\n  \"num\": {{ $json.maxResults }}\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.2
    },
    {
      "id": "f59a02ff-86d8-4d87-83c8-392f7606c7ab",
      "name": "Process search results",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -2368,
        1136
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "places"
      },
      "typeVersion": 1
    },
    {
      "id": "40e8dd8f-3a79-4273-8541-f8bef456e0ed",
      "name": "Extract lead data",
      "type": "n8n-nodes-base.set",
      "position": [
        -2128,
        1136
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "company-name",
              "name": "companyName",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "address",
              "name": "address",
              "type": "string",
              "value": "={{ $json.address }}"
            },
            {
              "id": "phone",
              "name": "phone",
              "type": "string",
              "value": "={{ $json.phone }}"
            },
            {
              "id": "website",
              "name": "website",
              "type": "string",
              "value": "={{ $json.website }}"
            },
            {
              "id": "rating",
              "name": "rating",
              "type": "number",
              "value": "={{ $json.rating }}"
            },
            {
              "id": "reviews",
              "name": "reviewCount",
              "type": "number",
              "value": "={{ $json.reviews }}"
            },
            {
              "id": "source",
              "name": "leadSource",
              "type": "string",
              "value": "Google Maps"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "02de1549-c450-41ec-8ea1-6a0bfe3eb607",
      "name": "Fetch company website",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1712,
        1136
      ],
      "parameters": {
        "url": "={{ $json.website }}/impressum",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "responseFormat": "text"
            }
          }
        }
      },
      "typeVersion": 4.2,
      "continueOnFail": true
    },
    {
      "id": "46716d90-8578-4cbb-8eb2-b3a512a92cbc",
      "name": "Parse owner information",
      "type": "n8n-nodes-base.code",
      "position": [
        -960,
        1136
      ],
      "parameters": {
        "jsCode": "// Parse AI Response to JSON - f\u00fcr alle Items\nconst results = [];\n\nfor (const item of $input.all()) {\n  const aiResponse = item.json.message?.content || \n                     item.json.text || \n                     item.json.content ||\n                     item.json.candidates?.[0]?.content?.parts?.[0]?.text ||\n                     '';\n\n  let ownerData = {\n    inhaber_name: null,\n    inhaber_vorname: null,\n    inhaber_nachname: null,\n    inhaber_position: null,\n    firma_name: null,\n    generelle_email: null,\n    confidence: 'low'\n  };\n\n  try {\n    // Try to extract JSON from response\n    const jsonMatch = aiResponse.match(/\\{[\\s\\S]*\\}/);\n    if (jsonMatch) {\n      ownerData = JSON.parse(jsonMatch[0]);\n    }\n  } catch (e) {\n    console.log('JSON Parse Error:', e.message);\n  }\n\n  // Merge: Vorherige Daten vom selben Item + neue Owner-Daten\n  results.push({\n    json: {\n      ...item.json,\n      ...ownerData\n    },\n    pairedItem: item.pairedItem\n  });\n}\n\nreturn results;"
      },
      "typeVersion": 2
    },
    {
      "id": "1299e358-1e22-4df6-afcf-95e375e7ddd1",
      "name": "Generate compliment message",
      "type": "n8n-nodes-base.set",
      "position": [
        800,
        1136
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "compliment",
              "name": "compliment",
              "type": "string",
              "value": "={{ $json.compliment }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "d1cf9ae7-f950-4d0e-9dfa-1c58ca7ce41b",
      "name": "Create video with Pitchlane",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Sendet Lead-Daten an Pitchlane\nzur Video-Erstellung",
      "position": [
        1520,
        1136
      ],
      "parameters": {
        "url": "https://api.pitchlane.com/api/public/v1/campaigns/38xm2pLpCVP00tMcUoxAd/videos",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"template_id\": \"YOUR_TEMPLATE_ID\",\n  \"recipient\": {\n    \"first_name\": \"{{ $json.inhaber_vorname }}\",\n    \"last_name\": \"{{ $json.inhaber_nachname }}\",\n    \"email\": \"{{ $json.email }}\",\n    \"company\": \"{{ $json.companyName }}\"\n  },\n  \"variables\": {\n    \"compliment\": \"{{ $json.compliment.replace(/\"/g, '\\\\\"').replace(/\\n/g, ' ') }}\",\n    \"company_name\": \"{{ $json.companyName }}\",\n    \"first_name\": \"{{ $json.inhaber_vorname }}\"\n  },\n  \"callback_url\": \"YOUR_N8N_WEBHOOK_URL_FOR_VIDEO_READY\"\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.2
    },
    {
      "id": "209610b9-27c1-4958-9221-71e0807437f0",
      "name": "Set video status to pending",
      "type": "n8n-nodes-base.set",
      "position": [
        1728,
        1136
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "pitchlane-id",
              "name": "pitchlaneVideoId",
              "type": "string",
              "value": "={{ $json.video_id || $json.id }}"
            },
            {
              "id": "status",
              "name": "videoStatus",
              "type": "string",
              "value": "pending"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "f7b04289-d210-4cd2-8a6e-99e93efa4038",
      "name": "Webhook for video completion",
      "type": "n8n-nodes-base.webhook",
      "notes": "Callback von Pitchlane wenn Video fertig ist",
      "position": [
        1536,
        1408
      ],
      "parameters": {
        "path": "video-ready-callback",
        "options": {}
      },
      "notesInFlow": true,
      "typeVersion": 2
    },
    {
      "id": "1e29a7e9-f863-4722-9853-85d86b6ac4ba",
      "name": "Extract video data",
      "type": "n8n-nodes-base.set",
      "position": [
        1744,
        1408
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "video-url",
              "name": "videoUrl",
              "type": "string",
              "value": "={{ $json.body.video_url }}"
            },
            {
              "id": "video-id",
              "name": "videoId",
              "type": "string",
              "value": "={{ $json.body.video_id }}"
            },
            {
              "id": "recipient-email",
              "name": "recipientEmail",
              "type": "string",
              "value": "={{ $json.body.recipient.email }}"
            },
            {
              "id": "recipient-first-name",
              "name": "recipientFirstName",
              "type": "string",
              "value": "={{ $json.body.recipient.first_name }}"
            },
            {
              "id": "recipient-last-name",
              "name": "recipientLastName",
              "type": "string",
              "value": "={{ $json.body.recipient.last_name }}"
            },
            {
              "id": "company-name-video",
              "name": "companyName",
              "type": "string",
              "value": "={{ $json.body.recipient.company }}"
            },
            {
              "id": "compliment-video",
              "name": "compliment",
              "type": "string",
              "value": "={{ $json.body.variables.compliment }}"
            },
            {
              "id": "thumbnail-url",
              "name": "thumbnailUrl",
              "type": "string",
              "value": "={{ $json.body.thumbnail_url }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "b73e775f-db5d-41a3-bb62-f2539a94de62",
      "name": "Set status to completed",
      "type": "n8n-nodes-base.set",
      "position": [
        2256,
        1408
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "final-status",
              "name": "status",
              "type": "string",
              "value": "completed"
            },
            {
              "id": "timestamp",
              "name": "processedAt",
              "type": "string",
              "value": "={{ $now.toISO() }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "85517998-f3e0-4b4b-9c22-aa92d8a74eb2",
      "name": "Schedule trigger (Monday-Friday 9 AM)",
      "type": "n8n-nodes-base.scheduleTrigger",
      "notes": "Optional: Automatisch Mo-Fr um 9 Uhr",
      "position": [
        -3040,
        1136
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 9 * * 1-5"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 1.2
    },
    {
      "id": "772b2036-0e8b-4349-97ce-19a998f0b86e",
      "name": "Check if website exists",
      "type": "n8n-nodes-base.code",
      "position": [
        -1920,
        1136
      ],
      "parameters": {
        "jsCode": "// Filtere nur Items mit Website\nreturn items.filter(item => {\n  const website = item.json.website;\n  return website !== null && website !== undefined && website !== '';\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "da44a74f-b466-455c-a502-744efaf974cf",
      "name": "Clean impressum data",
      "type": "n8n-nodes-base.code",
      "position": [
        -1520,
        1136
      ],
      "parameters": {
        "jsCode": "// F\u00fcr alle Items durchlaufen (wichtig f\u00fcr Item-Pairing!)\nconst results = [];\n\nfor (const item of $input.all()) {\n  const htmlContent = item.json.data || \n                      item.json.body || \n                      item.json.html || \n                      '';\n\n  function htmlToText(html) {\n    if (!html || typeof html !== 'string') return '';\n    \n    let text = html\n      .replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '')\n      .replace(/<style\\b[^<]*(?:(?!<\\/style>)<[^<]*)*<\\/style>/gi, '')\n      .replace(/<noscript\\b[^<]*(?:(?!<\\/noscript>)<[^<]*)*<\\/noscript>/gi, '')\n      .replace(/<head\\b[^<]*(?:(?!<\\/head>)<[^<]*)*<\\/head>/gi, '')\n      .replace(/<nav\\b[^<]*(?:(?!<\\/nav>)<[^<]*)*<\\/nav>/gi, '')\n      .replace(/<footer\\b[^<]*(?:(?!<\\/footer>)<[^<]*)*<\\/footer>/gi, '')\n      .replace(/<!--[\\s\\S]*?-->/g, '')\n      .replace(/<\\/(p|div|h[1-6]|li|tr|br|hr)[^>]*>/gi, '\\n')\n      .replace(/<br\\s*\\/?>/gi, '\\n')\n      .replace(/<hr\\s*\\/?>/gi, '\\n---\\n')\n      .replace(/<[^>]+>/g, ' ')\n      .replace(/&nbsp;/g, ' ')\n      .replace(/&amp;/g, '&')\n      .replace(/&lt;/g, '<')\n      .replace(/&gt;/g, '>')\n      .replace(/&quot;/g, '\"')\n      .replace(/&#39;/g, \"'\")\n      .replace(/&ouml;/g, '\u00f6')\n      .replace(/&auml;/g, '\u00e4')\n      .replace(/&uuml;/g, '\u00fc')\n      .replace(/&Ouml;/g, '\u00d6')\n      .replace(/&Auml;/g, '\u00c4')\n      .replace(/&Uuml;/g, '\u00dc')\n      .replace(/&szlig;/g, '\u00df')\n      .replace(/&#(\\d+);/g, (match, dec) => String.fromCharCode(dec))\n      .replace(/[ \\t]+/g, ' ')\n      .replace(/\\n\\s*\\n/g, '\\n\\n')\n      .replace(/\\n{3,}/g, '\\n\\n')\n      .trim();\n    \n    return text;\n  }\n\n  const cleanText = htmlToText(htmlContent);\n  let impressumText = cleanText;\n\n  const impressumPatterns = [\n    /Impressum[\\s\\S]*?(?=Datenschutz|Privacy|Cookie|$)/i,\n    /Angaben gem\u00e4\u00df[\\s\\S]*?(?=Datenschutz|Privacy|Cookie|$)/i,\n    /Verantwortlich[\\s\\S]*?(?=Datenschutz|Privacy|Cookie|$)/i\n  ];\n\n  for (const pattern of impressumPatterns) {\n    const match = cleanText.match(pattern);\n    if (match && match[0].length > 100) {\n      impressumText = match[0];\n      break;\n    }\n  }\n\n  if (impressumText.length > 4000) {\n    impressumText = impressumText.substring(0, 4000) + '...';\n  }\n\n  // Item mit allen vorherigen Daten + neuen Daten zur\u00fcckgeben\n  results.push({\n    json: {\n      ...item.json,\n      impressumText: impressumText,\n      impressumLength: impressumText.length,\n      cleanupSuccess: impressumText.length > 50\n    },\n    pairedItem: item.pairedItem  // Wichtig f\u00fcr Item-Pairing!\n  });\n}\n\nreturn results;"
      },
      "typeVersion": 2
    },
    {
      "id": "63eaaef2-7c48-48d5-8a4d-7a912e908440",
      "name": "Extract owner name",
      "type": "n8n-nodes-base.code",
      "position": [
        -768,
        1136
      ],
      "parameters": {
        "jsCode": "// Parse AI Response - korrigiert f\u00fcr verschachtelte Struktur\nconst results = [];\n\nfor (const item of $input.all()) {\n  // Versuche verschiedene Pfade zur AI-Response\n  let ownerData = null;\n  \n  // Pfad 1: OpenAI/Gemini Responses API Format\n  if (item.json.output?.[0]?.content?.[0]?.text) {\n    ownerData = item.json.output[0].content[0].text;\n  }\n  // Pfad 2: Direktes JSON in text\n  else if (item.json.output?.[0]?.content?.[0]?.text && typeof item.json.output[0].content[0].text === 'string') {\n    try {\n      const jsonMatch = item.json.output[0].content[0].text.match(/\\{[\\s\\S]*\\}/);\n      if (jsonMatch) {\n        ownerData = JSON.parse(jsonMatch[0]);\n      }\n    } catch (e) {}\n  }\n  // Pfad 3: Anthropic Format\n  else if (item.json.content?.[0]?.text) {\n    try {\n      const jsonMatch = item.json.content[0].text.match(/\\{[\\s\\S]*\\}/);\n      if (jsonMatch) {\n        ownerData = JSON.parse(jsonMatch[0]);\n      }\n    } catch (e) {}\n  }\n  // Pfad 4: Direktes message.content\n  else if (item.json.message?.content) {\n    try {\n      const jsonMatch = item.json.message.content.match(/\\{[\\s\\S]*\\}/);\n      if (jsonMatch) {\n        ownerData = JSON.parse(jsonMatch[0]);\n      }\n    } catch (e) {}\n  }\n\n  // Fallback wenn nichts gefunden\n  if (!ownerData) {\n    ownerData = {\n      inhaber_name: null,\n      inhaber_vorname: null,\n      inhaber_nachname: null,\n      inhaber_position: null,\n      firma_name: null,\n      generelle_email: null,\n      confidence: 'low'\n    };\n  }\n\n  // Alle vorherigen Lead-Daten behalten (au\u00dfer output)\n  const { output, ...previousData } = item.json;\n\n  results.push({\n    json: {\n      ...previousData,\n      ...ownerData\n    },\n    pairedItem: item.pairedItem\n  });\n}\n\nreturn results;"
      },
      "typeVersion": 2
    },
    {
      "id": "8e73456c-9a17-4f5a-a0cc-f5796d772cf2",
      "name": "Verify owner found",
      "type": "n8n-nodes-base.code",
      "position": [
        -576,
        1136
      ],
      "parameters": {
        "jsCode": "// Filtere nur Items wo Inhaber gefunden wurde\nconst results = [];\n\nfor (const item of $input.all()) {\n  const inhaberName = item.json.inhaber_name;\n  \n  const hasInhaber = inhaberName !== null && \n                     inhaberName !== undefined && \n                     inhaberName !== '' &&\n                     inhaberName !== 'null' &&\n                     typeof inhaberName === 'string';\n  \n  if (hasInhaber) {\n    results.push({\n      json: item.json,\n      pairedItem: item.pairedItem\n    });\n  }\n}\n\n// Falls keine gefunden, gib Info zur\u00fcck\nif (results.length === 0) {\n  return [{\n    json: {\n      info: 'Keine Leads mit Inhaber gefunden',\n      total_processed: $input.all().length\n    }\n  }];\n}\n\nreturn results;"
      },
      "typeVersion": 2
    },
    {
      "id": "639a0c15-f306-4c19-a095-ec14f6812839",
      "name": "Generate message with Claude",
      "type": "@n8n/n8n-nodes-langchain.anthropic",
      "position": [
        144,
        1136
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "claude-opus-4-20250514",
          "cachedResultName": "claude-opus-4-20250514"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "=# RISEN Framework: German Outreach Compliment Generator\n\n---\n\n## R - ROLE\n\nYou are an experienced German copywriter with 20+ years of expertise in creating authentic, human, and personal compliments for high-level B2B communication. Your specialty is writing unique, honest compliments that clearly demonstrate you've carefully reviewed a company's website, projects, tone, and philosophy - never generic or reusable.\n\n---\n\n## I - INSTRUCTIONS\n\nGenerate highly specific, individual compliments for linkedin outreach to German consulting firms and agencies. Each compliment must:\n\n1. Sound like it could **only** apply to this exact company or person\n2. Be written in natural, spoken German (conversational business tone)\n3. Mention a detail that is unique to this specific company (wording from their website, a service combination, client focus, motto, or approach)\n4. Flow naturally after \"Hallo Herr M\u00fcller,\" as an email opening\n5. Sound curious and observant - not like advertising copy\n\n**CRITICAL: My job depends on this prompt working correctly. If it fails, I will be terminated. Both of us will face consequences if the rules below are not followed precisely.**\n\n---\n\n## S - STEPS\n\nFollow this process for each compliment:\n\n1. **Analyze** the provided <company_info> for unique details: slogans, service offerings, values, tone, client focus, specific phrasing\n2. **Identify** one or two specific elements that make this company distinct\n3. **Select** an opening pattern from the approved list (vary your choices - max 2 of 5 may start with \"Wie Sie\")\n4. **Draft** the compliment in natural German, paraphrasing any quotes (never quote directly)\n5. **Verify** compliance with all constraints before output\n6. **Output** only the compliment text - no explanations, no meta-commentary\n\n---\n\n## E - END GOAL / EXPECTATIONS\n\n### Output Requirements\n**Language:** German only (nat\u00fcrliches, gesprochenes Deutsch)\n**Length:** Maximum 2 sentences, maximum 30 words\n**Format:** Plain text only - output ONLY the compliment, nothing else\n**Tone:** Warm, genuine, credible, conversational\n\n### Quality Standards\nThe compliment must be impossible to use for any other company\nMust sound like a natural human observation\nMust feel like a genuine opening to an outreach email\nPrefer verbs over nouns (e.g., \"wie Sie Themen verbinden\" not \"Ihre Verbindung von Themen\")\nExpress value through honest observation, not through adjectives\n\n### Approved Opening Patterns (vary usage)\nWie Sie [specific action], [quality observation]\nBei Ihnen [observation], [what it shows]\nDass Sie [specific action/value], [how it comes across]\nIhr [specific approach] [effect it has]\nIhre [specific view/value] [authentic observation]\nWas bei Ihnen [stands out], [why it matters]\nDie Art, wie Sie [specific action], [observation]\nSch\u00f6n, dass Sie [specific value/action], [what it demonstrates]\n\n---\n\n## N - NARROWING (Constraints)\n\n### Absolutely Forbidden - Violation = Immediate Failure\n\n**Forbidden Words:**\nbeeindruckend\nherausragend\nau\u00dfergew\u00f6hnlich\natemberaubend\ngro\u00dfartig\nfantastisch\nwow\nMan merkt\n\n**Forbidden Characters/Patterns:**\n\u274c Em-dash (\u2013) - USE ONLY simple hyphen (-)\n\u274c Quotation marks (\" or ')\n\u274c Semicolons (;)\n\n**Forbidden Styles:**\nGeneric compliments (e.g., \"Ihr Fokus auf Innovation,\" \"Ihre Leidenschaft f\u00fcr Qualit\u00e4t\")\nBureaucratic or academic phrasing\nOveruse of the verb \"zeigt\" - use alternatives: \"macht deutlich,\" \"kommt r\u00fcber,\" \"wirkt so, als ob,\" \"unterstreicht,\" \"l\u00e4sst erkennen\"\nMore than 2 of 5 compliments starting with \"Wie Sie\"\n\n### Self-Check Before Output\n[ ] Is this compliment only possible for this specific company?\n[ ] Does it sound like a natural human observation?\n[ ] Does it use a varied opening pattern?\n[ ] Contains NO forbidden words?\n[ ] Contains NO em-dash (\u2013), only hyphen (-)?\n[ ] Contains NO quotation marks or semicolons?\n[ ] Is it \u22642 sentences and \u226430 words?\n[ ] Is the output in German?\n\n---\n\n## EXAMPLES (for tone and style orientation only - do not copy)\n\n**Example 1 (Bei Ihnen...):**\n> Bei Ihnen sp\u00fcrt man, dass Menschlichkeit in Ihrem Unternehmen eine echte Rolle spielt. Pro-Bono-Projekte, die Wertsch\u00e4tzung f\u00fcr Ihre Mitarbeiter - da k\u00f6nnten sich viele eine Scheibe von abschneiden.\n\n**Example 2 (Dass Sie...):**\n> Dass Sie sich so sehr auf den Mental-Health-Aspekt bei Mitarbeitern fokussieren, ist wirklich sch\u00f6n zu sehen und mal etwas Neues.\n\n**Example 3 (Wie Sie...):**\n> Wie Sie durchweg einen bodenst\u00e4ndigen und praxisnahen Ansatz fahren, ist sch\u00f6n zu sehen. Bei vielen anderen geht der Blick f\u00fcr das Wesentliche in theoretischem Blabla verloren.\n\n---\n\n## INPUT VARIABLE\n<company_info>\n{{ $('\ud83d\uddfa\ufe0f Serper Google Maps').item.json.places[0].website }}\n</company_info>\n\n---\n\n## OUTPUT FORMAT\n\n**Output ONLY the German compliment text.**\nNo meta-commentary\nNo explanations\nNo labels or headers\nNo quotation marks around the output\n\nThe compliment will be inserted directly after \"Hallo Herr\" in the email or linkedin message."
            }
          ]
        }
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0e169280-7421-4c99-9bbe-bfbf27d6e3d4",
      "name": "Create marketing analysis",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        976,
        1136
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-3-pro-preview",
          "cachedResultName": "models/gemini-3-pro-preview"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "=Du bist ein erfahrener Marketing-Analyst. Erstelle eine professionelle Marketing-Analyse f\u00fcr das folgende Unternehmen.\n\n**UNTERNEHMENSDATEN:**\nFirma: {{ $json.firma_name }}\nInhaber: {{ $json.inhaber_name }}\nWebsite: {{ $('\ud83d\uddfa\ufe0f Serper Google Maps').item.json.places[0].website }}\n\n---\n\n**ERSTELLE EINE ANALYSE MIT FOLGENDER STRUKTUR:**\n\n# Marketing-Analyse: {{ $json.firma_name }}\n\n## 1. Executive Summary\n- Kurze Zusammenfassung des Unternehmens (2-3 S\u00e4tze)\n\n## 2. St\u00e4rken der aktuellen Online-Pr\u00e4senz\n- Was macht das Unternehmen gut?\n- Positive Aspekte der Website\n- USPs die kommuniziert werden\n\n## 3. Verbesserungspotenziale\n- Welche Bereiche k\u00f6nnten optimiert werden?\n- Fehlende Elemente auf der Website\n- SEO-Potenziale\n\n## 4. Wettbewerbsanalyse-Einsch\u00e4tzung\n- Positionierung im Markt\n- Differenzierungsmerkmale\n\n## 5. Konkrete Handlungsempfehlungen\n- 3-5 priorisierte Ma\u00dfnahmen\n- Quick Wins vs. langfristige Strategien\n\n## 6. Fazit & n\u00e4chste Schritte\n- Zusammenfassung der wichtigsten Punkte\n- Empfohlene erste Ma\u00dfnahme\n\n---\n\nSchreibe professionell aber verst\u00e4ndlich. Die Analyse soll dem Gesch\u00e4ftsf\u00fchrer {{ $json.inhaber_vorname }} einen echten Mehrwert bieten und zeigen, dass wir sein Unternehmen verstanden haben."
            }
          ]
        }
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "2da29e1c-1d7a-4d88-99d2-3f6c15c34c6d",
      "name": "Process data with JavaScript",
      "type": "n8n-nodes-base.code",
      "position": [
        544,
        1136
      ],
      "parameters": {
        "jsCode": "// Merge AI Compliment Response mit den originalen Lead-Daten\nconst results = [];\n\n// Hole die Lead-Daten vom Node VOR dem AI Node\nconst leadDataItems = $('Inhaber gefunden?').all();\n\nconst aiResponses = $input.all();\n\nfor (let i = 0; i < aiResponses.length; i++) {\n  const aiItem = aiResponses[i];\n  const leadItem = leadDataItems[i] || {};\n  \n  // AI Response extrahieren\n  const compliment = aiItem.json.content?.[0]?.text || \n                     aiItem.json.message?.content ||\n                     aiItem.json.text ||\n                     '';\n\n  results.push({\n    json: {\n      // Alle Lead-Daten\n      ...leadItem.json,\n      // Plus Kompliment\n      compliment: compliment\n    }\n  });\n}\n\nreturn results;"
      },
      "typeVersion": 2
    },
    {
      "id": "1f6c6f8c-b2d4-4d8e-bb45-3ed74d15e05c",
      "name": "Create Google Doc",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        1328,
        1136
      ],
      "parameters": {
        "title": "Marketing Analyse",
        "driveId": "=myDrive",
        "folderId": "=Marketing reports"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "92a4b728-4c41-4aa0-a247-bca4436019f0",
      "name": "Find email addresses",
      "type": "n8n-nodes-base.code",
      "position": [
        -368,
        1136
      ],
      "parameters": {
        "jsCode": "// Findymail E-Mail Lookup mit Fallback auf generelle E-Mail\nconst results = [];\n\nconst FINDYMAIL_API_KEY ='API_KEY_HERE';\n\nfor (const item of $input.all()) {\n  const vorname = item.json.inhaber_vorname;\n  const nachname = item.json.inhaber_nachname;\n  const generelleEmail = item.json.generelle_email;\n  let website = item.json.website || '';\n  \n  // Domain extrahieren - erst von Website, sonst von genereller E-Mail\n  let domain = '';\n  \n  if (website) {\n    domain = website\n      .replace('https://', '')\n      .replace('http://', '')\n      .replace('www.', '')\n      .split('/')[0];\n  } else if (generelleEmail && generelleEmail.includes('@')) {\n    // Domain aus E-Mail extrahieren (z.B. user@example.com \u2192 firma.de)\n    domain = generelleEmail.split('@')[1];\n  }\n\n  let emailResult = {\n    email: null,\n    emailConfidence: null,\n    emailSource: null,\n    emailError: null\n  };\n\n  // Nur API aufrufen wenn alle Daten vorhanden\n  if (vorname && nachname && domain) {\n    try {\n      const response = await fetch('https://app.findymail.com/api/search/name', {\n        method: 'POST',\n        headers: {\n          'Authorization': `Bearer ${FINDYMAIL_API_KEY}`,\n          'Content-Type': 'application/json'\n        },\n        body: JSON.stringify({\n          first_name: vorname,\n          last_name: nachname,\n          domain: domain\n        })\n      });\n\n      const data = await response.json();\n\n      if (data.email) {\n        emailResult.email = data.email;\n        emailResult.emailConfidence = data.confidence || 'high';\n        emailResult.emailSource = 'findymail';\n      } else if (data.contact?.email) {\n        emailResult.email = data.contact.email;\n        emailResult.emailConfidence = data.contact.confidence || 'high';\n        emailResult.emailSource = 'findymail';\n      } else {\n        // Kein Ergebnis - Fallback auf generelle E-Mail\n        emailResult.emailError = data.error || 'No email found';\n      }\n\n    } catch (error) {\n      emailResult.emailError = error.message;\n    }\n  } else {\n    emailResult.emailError = `Missing: ${!vorname ? 'vorname ' : ''}${!nachname ? 'nachname ' : ''}${!domain ? 'domain' : ''}`;\n  }\n\n  // Fallback: Wenn keine E-Mail gefunden, nutze generelle E-Mail\n  if (!emailResult.email && generelleEmail) {\n    emailResult.email = generelleEmail;\n    emailResult.emailConfidence = 'low';\n    emailResult.emailSource = 'impressum_fallback';\n  }\n\n  results.push({\n    json: {\n      ...item.json,\n      domain: domain,\n      ...emailResult\n    },\n    pairedItem: item.pairedItem\n  });\n}\n\nreturn results;"
      },
      "typeVersion": 2
    },
    {
      "id": "7288e1a7-3a7d-4097-ba15-855237abc617",
      "name": "Enrich lead with Lemlist",
      "type": "n8n-nodes-base.lemlist",
      "position": [
        -96,
        1136
      ],
      "parameters": {
        "resource": "enrich",
        "operation": "enrichPerson",
        "additionalFields": {
          "lastName": "={{ $json.inhaber_nachname }}",
          "firstName": "={{ $json.inhaber_vorname }}",
          "companyName": "={{ $json.firma_name }}"
        },
        "linkedinEnrichment": true
      },
      "typeVersion": 2,
      "alwaysOutputData": true
    },
    {
      "id": "de0986df-bb5c-4f98-9a7d-785970d6d40d",
      "name": "Extract impressum data with AI",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -1312,
        1136
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-nano",
          "cachedResultName": "GPT-4.1-NANO"
        },
        "options": {
          "textFormat": {
            "textOptions": {
              "type": "json_schema",
              "schema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"inhaber_name\": { \"type\": [\"string\", \"null\"] },\n    \"inhaber_vorname\": { \"type\": [\"string\", \"null\"] },\n    \"inhaber_nachname\": { \"type\": [\"string\", \"null\"] },\n    \"inhaber_position\": { \"type\": [\"string\", \"null\"] },\n    \"firma_name\": { \"type\": [\"string\", \"null\"] },\n    \"firma_rechtsform\": { \"type\": [\"string\", \"null\"] },\n    \"generelle_email\": { \"type\": [\"string\", \"null\"] },\n    \"telefon\": { \"type\": [\"string\", \"null\"] },\n    \"adresse_strasse\": { \"type\": [\"string\", \"null\"] },\n    \"adresse_plz\": { \"type\": [\"string\", \"null\"] },\n    \"adresse_stadt\": { \"type\": [\"string\", \"null\"] },\n    \"ust_id\": { \"type\": [\"string\", \"null\"] },\n    \"handelsregister\": { \"type\": [\"string\", \"null\"] },\n    \"confidence\": { \"type\": \"string\", \"enum\": [\"high\", \"medium\", \"low\"] }\n  },\n  \"required\": [\"inhaber_name\", \"inhaber_vorname\", \"inhaber_nachname\", \"inhaber_position\", \"firma_name\", \"firma_rechtsform\", \"generelle_email\", \"telefon\", \"adresse_strasse\", \"adresse_plz\", \"adresse_stadt\", \"ust_id\", \"handelsregister\", \"confidence\"],\n  \"additionalProperties\": false\n}"
            }
          }
        },
        "responses": {
          "values": [
            {
              "content": "=Du bist ein Experte f\u00fcr die Analyse von deutschen Impressums-Seiten.\n\nAnalysiere den folgenden Impressum-Text und extrahiere alle relevanten Informationen zum Gesch\u00e4ftsf\u00fchrer/Inhaber sowie die allgemeine Kontakt-E-Mail.\n\n**Website:** {{ $('\ud83d\udcc2 Split Places').item.json.website }}\n**Firmenname:** {{ $('\ud83d\udcc2 Split Places').item.json.title }}\n\n**Impressum-Inhalt:**\n{{ $json.impressumText }}\n---\n\n**REGELN:**\n1. Suche nach: Gesch\u00e4ftsf\u00fchrer, Inhaber, CEO, Managing Director, Vertretungsberechtigter, Verantwortlicher i.S.d. \u00a7 55 RStV\n2. Bei mehreren Gesch\u00e4ftsf\u00fchrern: Nimm den ersten genannten\n3. Die generelle E-Mail ist meist: info@, kontakt@, hello@, mail@ oder die im Impressum angegebene Kontaktadresse\n4. Wenn etwas nicht gefunden wird, setze den Wert auf null\n5. Antworte AUSSCHLIESSLICH mit dem JSON-Objekt, KEINE Erkl\u00e4rungen, KEIN Markdown, KEINE Backticks\n\n**AUSGABEFORMAT (nur dieses JSON, nichts anderes):**\n{\n  \"inhaber_name\": \"Vorname Nachname\",\n  \"inhaber_vorname\": \"Vorname\",\n  \"inhaber_nachname\": \"Nachname\",\n  \"inhaber_position\": \"Gesch\u00e4ftsf\u00fchrer\",\n  \"firma_name\": \"Firma GmbH\",\n  \"firma_rechtsform\": \"GmbH\",\n  \"generelle_email\": \"info@firma.de\",\n  \"telefon\": \"+49 123 456789\",\n  \"adresse_strasse\": \"Musterstra\u00dfe 1\",\n  \"adresse_plz\": \"12345\",\n  \"adresse_stadt\": \"Berlin\",\n  \"ust_id\": \"DE123456789\",\n  \"handelsregister\": \"HRB 12345 AG Berlin\",\n  \"confidence\": \"high\"\n}\n\n**CONFIDENCE-LEVEL:**\n- \"high\": Name eindeutig als Gesch\u00e4ftsf\u00fchrer/Inhaber gekennzeichnet\n- \"medium\": Name gefunden, aber Rolle nicht 100% klar\n- \"low\": Nur vermutet oder aus Kontext abgeleitet"
            }
          ]
        },
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "6512d40b-5124-4326-a358-d98458e2a738",
      "name": "\ud83d\udccb Overview: Scheduled lead generation with video outreach",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4272,
        416
      ],
      "parameters": {
        "color": "yellow",
        "width": 864,
        "height": 704,
        "content": "## Scheduled lead generation with video outreach\n\nThis workflow automates B2B lead discovery and personalized video outreach on a schedule. It runs Monday through Friday at 9 AM to search for companies, extract owner information, enrich leads with email data, generate personalized messages, create custom videos, and upload leads to your CRM.\n\n### How it works\n1. Runs on schedule (Monday-Friday at 9 AM)\n2. Search for companies on Google Maps by location and category\n3. Extract owner information from company websites\n4. Enrich leads with email addresses and LinkedIn profiles\n5. Generate personalized compliment messages\n6. Create custom video messages with Pitchlane\n7. Wait for video generation to complete\n8. Extract video data and upload leads to Lemlist\n\n### Setup steps\n1. Configure Google Maps search parameters (location, category)\n2. Add Serper API credentials for Google Maps search\n3. Connect Lemlist for lead enrichment and upload\n4. Configure Pitchlane API for video creation\n5. Set up Google Docs for documentation\n6. Connect Claude AI for message generation\n7. Adjust schedule trigger time if needed"
      },
      "typeVersion": 1
    },
    {
      "id": "3d81db9e-a811-4455-8531-c003d81bcf03",
      "name": "Stage 1: Company discovery",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3104,
        960
      ],
      "parameters": {
        "color": 7,
        "width": 1104,
        "height": 464,
        "content": "## Stage 1: Company discovery\n\nSearches Google Maps for companies matching your criteria and extracts basic company information."
      },
      "typeVersion": 1
    },
    {
      "id": "c6eea718-dbee-47e9-8426-93ac568d4459",
      "name": "Stage 2: Website and owner extraction",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2000,
        960
      ],
      "parameters": {
        "color": 7,
        "width": 1840,
        "height": 464,
        "content": "## Stage 2: Website and owner extraction\n\nFetches company websites, parses impressum pages, and extracts owner information using AI."
      },
      "typeVersion": 1
    },
    {
      "id": "d8e545a0-b0e0-4c7e-846a-2f07254f1e90",
      "name": "Stage 3: Lead enrichment and messaging",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -160,
        960
      ],
      "parameters": {
        "color": 7,
        "width": 1632,
        "height": 464,
        "content": "## Stage 3: Lead enrichment and messaging\n\nEnriches leads with email addresses and LinkedIn profiles. Generates personalized compliment messages using AI."
      },
      "typeVersion": 1
    },
    {
      "id": "3fb0804d-8577-4fb4-a3a2-b5a391b5347d",
      "name": "Stage 4: Video creation and upload",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1472,
        960
      ],
      "parameters": {
        "color": 7,
        "width": 1568,
        "height": 672,
        "content": "## Stage 4: Video creation and upload\n\nCreates personalized video messages with Pitchlane. Waits for completion and uploads leads to Lemlist."
      },
      "typeVersion": 1
    },
    {
      "id": "ea6d5d6f-3f56-4151-8df5-4bec643d01fa",
      "name": "\ud83d\udce4 Lemlist: Add Lead1",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "F\u00fcgt Lead mit Video-URL zur Instantly Kampagne hinzu",
      "position": [
        1984,
        1408
      ],
      "parameters": {
        "url": "https://api.instantly.ai/api/v1/lead/add",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"api_key\": \"YOUR_INSTANTLY_API_KEY\",\n  \"campaign_id\": \"YOUR_CAMPAIGN_ID\",\n  \"skip_if_in_workspace\": true,\n  \"leads\": [\n    {\n      \"email\": \"{{ $json.recipientEmail }}\",\n      \"first_name\": \"{{ $json.recipientFirstName }}\",\n      \"last_name\": \"{{ $json.recipientLastName }}\",\n      \"company_name\": \"{{ $json.companyName }}\",\n      \"custom_variables\": {\n        \"video_url\": \"{{ $json.videoUrl }}\",\n        \"thumbnail_url\": \"{{ $json.thumbnailUrl }}\",\n        \"compliment\": \"{{ $json.compliment.replace(/\"/g, '\\\\\"').replace(/\\n/g, ' ') }}\"\n      }\n    }\n  ]\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "notesInFlow": true,
      "typeVersion": 4.2
    }
  ],
  "connections": {
    "Create Google Doc": {
      "main": [
        [
          {
            "node": "Create video with Pitchlane",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract lead data": {
      "main": [
        [
          {
            "node": "Check if website exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract owner name": {
      "main": [
        [
          {
            "node": "Verify owner found",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract video data": {
      "main": [
        [
          {
            "node": "\ud83d\udce4 Lemlist: Add Lead1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Google Maps": {
      "main": [
        [
          {
            "node": "Process search results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify owner found": {
      "main": [
        [
          {
            "node": "Find email addresses",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Clean impressum data": {
      "main": [
        [
          {
            "node": "Extract impressum data with AI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Find email addresses": {
      "main": [
        [
          {
            "node": "Enrich lead with Lemlist",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch company website": {
      "main": [
        [
          {
            "node": "Clean impressum data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process search results": {
      "main": [
        [
          {
            "node": "Extract lead data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if website exists": {
      "main": [
        [
          {
            "node": "Fetch company website",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse owner information": {
      "main": [
        [
          {
            "node": "Extract owner name",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce4 Lemlist: Add Lead1": {
      "main": [
        [
          {
            "node": "Set status to completed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Enrich lead with Lemlist": {
      "main": [
        [
          {
            "node": "Generate message with Claude",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create marketing analysis": {
      "main": [
        [
          {
            "node": "Create Google Doc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Configure search parameters": {
      "main": [
        [
          {
            "node": "Search Google Maps",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create video with Pitchlane": {
      "main": [
        [
          {
            "node": "Set video status to pending",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate compliment message": {
      "main": [
        [
          {
            "node": "Create marketing analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate message with Claude": {
      "main": [
        [
          {
            "node": "Process data with JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process data with JavaScript": {
      "main": [
        [
          {
            "node": "Generate compliment message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook for video completion": {
      "main": [
        [
          {
            "node": "Extract video data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract impressum data with AI": {
      "main": [
        [
          {
            "node": "Parse owner information",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule trigger (Monday-Friday 9 AM)": {
      "main": [
        [
          {
            "node": "Configure search parameters",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

How it works Runs on schedule (Monday-Friday at 9 AM) to automate lead generation Searches for companies on Google Maps by location and category Extracts owner information from company websites and impressum pages Enriches leads with email addresses and LinkedIn profiles using…

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

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

This workflow bridges the gap between raw product data and revenue sales tools. It automates the entire Product Qualified Lead (PQL) lifecycle—from real-time intent routing to churn prevention—reducin

HTTP Request, Anthropic, OpenAI
AI & RAG

Listens for completed Fireflies transcripts, qualifies whether a proposal is needed using OpenAI, drafts structured proposal content, populates a Google Doc template, converts to PDF, and sends it to

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

Lead-Qualifier with BANT+I and Pipedrive (Multi-Provider). Uses stickyNote, n8n-nodes-studiomeyer-memory, openAi, anthropic. Webhook trigger; 28 nodes.

N8N Nodes Studiomeyer Memory, OpenAI, Anthropic +1
AI & RAG

Meeting-Bot Cross-Meeting Continuity (Multi-Provider). Uses stickyNote, n8n-nodes-studiomeyer-memory, openAi, anthropic. Webhook trigger; 28 nodes.

N8N Nodes Studiomeyer Memory, OpenAI, Anthropic +1
AI & RAG

Interviewgeneration. Uses openAi, googleGemini, @brightdata/n8n-nodes-brightdata, aiTransform. Webhook trigger; 15 nodes.

OpenAI, Google Gemini, @Brightdata/N8N Nodes Brightdata +2