# templates

name: Extract Invoice Data from PDFs with AI - Google Sheets Email Alerts
author_name: Aashit Sharma
author_username: aashitsharma
categories: []
created_at: 2025-06-07T17:49:24.951Z
updated_at: 2025-06-07T17:49:24.951Z
url: https://n8n.io/workflows/4763
scraped_at: 2025-06-19 22:49:12
description:
  Built by Setidure Technologies
  This smart n8n automation extracts invoice details from PDF files uploaded to Google Drive using AI, logs them to a Google Sheet, and notifies the billing team via email — all without manual intervention.

  ⚠️ Note: This workflow requires a self-hosted n8n instance with LangChain, LLM, and Google integrations configured.

  📦 What This Workflow Does
  Monitors a Google Drive folder for new invoice uploads

  Extracts text and parses key invoice details using LLM via LangChain

  Logs extracted data into a Google Sheet (Invoice Database)

  Generates a summary email using GPT-4O-MINI (Greenie)

  Sends the email to the billing team via Gmail

  ✅ Prerequisites
  A Google Drive folder to monitor for PDF uploads

  A Google Sheet named Invoice Database with the following columns:

  Invoice Number, Client Name, Client Email, Client Address, Client Phone, Invoice Date, Due Date, Total Amount

  Service account or OAuth credentials for:

  Google Drive

  Google Sheets

  Gmail

  LangChain + Ollama integration for LLM responses

  🔧 Step-by-Step Setup Instructions
  Clone this workflow into your self-hosted n8n instance

  Set up credentials:

  Google Drive (for folder trigger)

  Google Sheets (for data logging)

  Gmail (for sending email)

  Ollama (local LLM) or any connected LangChain provider

  Configure the trigger node to watch your specific Invoice Uploads folder

  Update the Google Sheet node with your Invoice Database sheet URL and column mapping

  Test with a sample invoice to validate the AI extraction and email generation

  🔄 Workflow Steps
  Step 1: Trigger on New File in Google Drive
  Node Name: Watch for New Invoices
  Type: Google Drive Trigger

  Event: fileCreated

  Triggers when a new PDF file is uploaded to a designated folder

  Step 2: Download the Uploaded File
  Node Name: Download Invoice PDF
  Type: Download Binary

  Downloads the invoice file from Google Drive

  Step 3: Extract Raw Text from PDF
  Node Name: Extract PDF Text
  Type: Extract from File

  Extracts unstructured text content from the downloaded PDF

  Step 4: Parse Invoice Fields Using AI
  Node Name: Parse Invoice Data with LLM
  Type: LangChain Agent

  LLM is prompted to extract:

  Invoice Number

  Client Name, Email, Address, Phone

  Invoice Date, Due Date, Total Amount

  Fields not found are skipped

  Step 5: Log Extracted Data to Google Sheet
  Node Name: Log to Invoice Database
  Type: Google Sheets

  Appends a new row with the extracted fields to the Invoice Database spreadsheet

  Step 6: Create Email Notification via LLM
  Node Name: Generate Billing Email Summary
  Type: LangChain Agent (GPT-4O-MINI)

  Prompt instructs AI to:

  Act as “Greenie” from Green Grass Corp

  Inform billing that a new invoice was processed

  Confirm logging into the Invoice Database

  Step 7: Send the Email to Billing Team
  Node Name: Email Billing Team
  Type: Gmail Send

  To: billing@example.com

  Subject and body injected from LLM output

  Step 8: End Workflow Gracefully
  Node Name: End
  Type: No Operation

  Used to cleanly terminate the flow

  🧠 Example Output (Email)

  Subject: New Invoice Logged – Client: ABC Corp

  Hi Billing Team,

  A new invoice has been received and processed automatically. The following details have been extracted and logged into the Invoice Database:

  Invoice Number: INV-1024  
  Client: ABC Corp  
  Amount: $1,450  
  Due Date: July 15, 2025  

  Please review the Invoice Database for full details.

  Regards,  
  Greenie  
  Green Grass Corp

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.googleDrive","n8n-nodes-base.gmail","@n8n/n8n-nodes-langchain.lmOllama","@n8n/n8n-nodes-langchain.openAi","@n8n/n8n-nodes-langchain.informationExtractor","@n8n/n8n-nodes-langchain.vectorStorePGVector"]

workflow_json:
  {"meta":{"instanceId":"473ff4054f1a6c3ed6f17a2b4a2e55676fe5b921cceb87b2256e6c416c158559"},"nodes":[{"id":"76600f2a-f77c-4c95-8df6-e4d44a2d9e9e","name":"Information Extractor","type":"@n8n/n8n-nodes-langchain.informationExtractor","position":[1420,40],"parameters":{},"typeVersion":1},{"id":"c96acdd1-a755-4700-86b5-c29e8cb5d32d","name":"Send Email","type":"n8n-nodes-base.gmail","position":[1360,420],"webhookId":"da2aa524-25e5-47e2-bd1a-fe7a97edf8a7","parameters":{},"typeVersion":2.1},{"id":"ef869446-c764-4957-8c27-4f51410c80c9","name":"No Operation, do nothing","type":"n8n-nodes-base.noOp","position":[1580,440],"parameters":{},"typeVersion":1},{"id":"8e257d7c-bd82-44c4-901f-1b35d6ed1033","name":"Ollama Model","type":"@n8n/n8n-nodes-langchain.lmOllama","position":[1440,300],"parameters":{},"typeVersion":1},{"id":"2e5babac-d216-48d5-97c5-7b528078a52a","name":"Postgres PGVector Store","type":"@n8n/n8n-nodes-langchain.vectorStorePGVector","position":[1380,680],"parameters":{},"typeVersion":1.2},{"id":"0348c94a-d362-4c1f-8679-3d4e0a42ddfb","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-60,-80],"parameters":{"content":""},"typeVersion":1},{"id":"fc19ba2d-a2ee-424b-a2f8-49690f1a2f74","name":"Google Drive Trigger - file creation","type":"n8n-nodes-base.googleDriveTrigger","position":[0,0],"parameters":{},"typeVersion":1},{"id":"f081fb04-9a51-42f5-8664-9fd866de9cf1","name":"Download Binary - file","type":"n8n-nodes-base.googleDrive","position":[220,0],"parameters":{},"typeVersion":3},{"id":"470c9772-00cf-420e-876f-7efad7274ca9","name":"Extract from PDF","type":"n8n-nodes-base.extractFromFile","position":[800,20],"parameters":{},"typeVersion":1},{"id":"1cc7eae0-ccab-4c8a-a469-b27a7057d22a","name":"Create Email Agent","type":"@n8n/n8n-nodes-langchain.openAi","position":[1020,420],"parameters":{},"typeVersion":1.8},{"id":"42588358-40ba-46f7-bb97-38c67c676901","name":"Update DB - spreadsheet","type":"n8n-nodes-base.googleSheets","position":[1100,600],"parameters":{},"typeVersion":4.5}],"pinData":{},"connections":{"Send Email":{"main":[[{"node":"No Operation, do nothing","type":"main","index":0}]]},"Ollama Model":{"ai_languageModel":[[{"node":"Information Extractor","type":"ai_languageModel","index":0}]]},"Extract from PDF":{"main":[[{"node":"Information Extractor","type":"main","index":0}]]},"Create Email Agent":{"main":[[{"node":"Send Email","type":"main","index":0}]]},"Information Extractor":{"main":[[{"node":"Update DB - spreadsheet","type":"main","index":0}]]},"Download Binary - file":{"main":[[{"node":"Extract from PDF","type":"main","index":0},{"node":"Update DB - spreadsheet","type":"main","index":0}]]},"Postgres PGVector Store":{"ai_tool":[[{"node":"Create Email Agent","type":"ai_tool","index":0}]]},"Update DB - spreadsheet":{"main":[[{"node":"Create Email Agent","type":"main","index":0}]]},"Google Drive Trigger - file creation":{"main":[[{"node":"Download Binary - file","type":"main","index":0}]]}}}


name: 🌐 Firecrawl Website Content Extractor
author_name: Aashit Sharma
author_username: aashitsharma
nodes_used: ["n8n-nodes-base.httpRequest"]
categories: []
created_at: 2025-06-07T17:56:19.339Z
updated_at: 2025-06-07T17:56:19.339Z
url: https://n8n.io/workflows/4764
scraped_at: 2025-06-19 22:49:52
description:
  🌐 Firecrawl Website Content Extractor (n8n Workflow)

  This n8n automation workflow uses Firecrawl API to extract structured data (e.g., quotes and authors) from web pages — such as Quotes to Scrape — and handles retries in case of delayed extraction.

  🔁 Workflow Overview

  🎯 Purpose:
  Crawl and extract structured web data using Firecrawl
  Wait for asynchronous scraping to complete
  Retrieve and validate results
  Support retries if content is not ready

  🔧 Step-by-Step Node Breakdown

  1. 🧪 Manual Trigger
  Node: When clicking ‘Test workflow’
  Used to manually test or execute the workflow during setup or debugging.

  2. 📤 Firecrawl Extract API Request
  Node: Extract
  Sends a POST request to https://api.firecrawl.dev/v1/extract
  Payload includes:
    urls: List of pages to crawl (https://quotes.toscrape.com/*)
    prompt: "Extract all quotes and their corresponding authors from the website."
    schema: JSON schema defining expected structure (quotes[], each with text and author)

  &gt; 📌 Uses an HTTP Header Auth credential for Firecrawl API

  3. ⏱️ Wait for 30 Seconds
  Node: 30 Secs
  Gives Firecrawl time to finish processing in the background
  Prevents hitting the API before results are ready

  4. 📥 Get Results
  Node: Get Results
  Performs a GET request to the status URL using {{ $('Extract').item.json.id }} to retrieve extraction results.

  5. ✅❌ Condition Check
  Node: If
  Checks if the data array is empty (i.e., no results yet)
  If data is empty:
    Waits 10 more seconds and retries
  If data is available:
    Passes data to the next step (e.g., processing or storage)

  6. 🔁 Retry Delay
  Node: 10 Seconds
  Waits briefly before sending another GET request to Firecrawl

  7. 🛠️ Edit Fields (Optional Output Formatting)
  Node: Edit Fields
  Placeholder to structure or format the extracted results (quotes and authors)

  🧾 Sticky Note: Firecrawl Setup Guide

  Included as an embedded reference:
  🔗 10% Firecrawl Discount
  🧰 Instructions to:
    Add Firecrawl API credentials in n8n
    Use Firecrawl Community Node for self-hosted instances
    Set up the schema and prompt for targeted data extraction

  ✅ Key Features

  🔌 API-based crawling with schema-structured output
  ⏱️ Smart waiting + retry mechanism
  🧠 AI prompt integration for intelligent data parsing
  ⚙️ Flexible for different URLs, prompts, and schemas

  📦 Sample Output Schema

  {
    "quotes": [
      {
        "text": "The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.",
        "author": "Albert Einstein"
      },
      {
        "text": "It is our choices, Harry, that show what we truly are, far more than our abilities.",
        "author": "J.K. Rowling"
      }
    ]
  }

workflow_json:
  {"meta":{"instanceId":"473ff4054f1a6c3ed6f17a2b4a2e55676fe5b921cceb87b2256e6c416c158559"},"nodes":[{"id":"ec18e1a4-1da9-4180-9e6d-6acbdf6655dc","name":"When clicking ‘Test workflow’","type":"n8n-nodes-base.manualTrigger","position":[500,320],"parameters":{},"typeVersion":1},{"id":"3de6d683-5db9-49dc-a31e-87a41f87f607","name":"Extract","type":"n8n-nodes-base.httpRequest","position":[720,320],"parameters":{},"typeVersion":4.2},{"id":"1892f176-3523-488d-a7e6-414ee83f540d","name":"If","type":"n8n-nodes-base.if","onError":"continueErrorOutput","position":[1360,320],"parameters":{},"typeVersion":2.2},{"id":"2850a08b-5f66-4c2d-98d0-4cfd3e667592","name":"Get Results","type":"n8n-nodes-base.httpRequest","position":[1160,320],"parameters":{},"typeVersion":4.2},{"id":"1db9ad43-11a4-401b-bfa8-de4b724d983e","name":"30 Secs","type":"n8n-nodes-base.wait","position":[940,320],"webhookId":"e4866198-b806-4746-b57f-97333c497dbf","parameters":{},"typeVersion":1.1},{"id":"863211df-48eb-48d2-bd72-6f713893cf87","name":"10 Seconds","type":"n8n-nodes-base.wait","position":[1620,440],"webhookId":"6cc8c637-bafb-4d64-9cd4-8ae2a9f5b7ca","parameters":{},"typeVersion":1.1},{"id":"550a879f-fd8f-470e-b573-d6c9e35fc1bd","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-80,160],"parameters":{"content":""},"typeVersion":1},{"id":"92dba1ed-9d4c-4eca-99b5-ed9dc7adc3be","name":"Edit Fields","type":"n8n-nodes-base.set","position":[1620,180],"parameters":{},"typeVersion":3.4}],"pinData":{},"connections":{"If":{"main":[[{"node":"10 Seconds","type":"main","index":0}],[{"node":"Edit Fields","type":"main","index":0}]]},"30 Secs":{"main":[[{"node":"Get Results","type":"main","index":0}]]},"Extract":{"main":[[{"node":"30 Secs","type":"main","index":0}]]},"10 Seconds":{"main":[[{"node":"Get Results","type":"main","index":0}]]},"Get Results":{"main":[[{"node":"If","type":"main","index":0}]]},"When clicking ‘Test workflow’":{"main":[[{"node":"Extract","type":"main","index":0}]]}}}


name: Automate LinkedIn Posts with Claude AI, DALL-E Images & Google Sheets Approval
author_name: Usman Liaqat
author_username: usmanliaqat
categories: []
created_at: 2025-06-07T18:34:34.273Z
updated_at: 2025-06-07T18:34:34.273Z
url: https://n8n.io/workflows/4766
scraped_at: 2025-06-19 22:48:40
description:
  How it works

  This workflow automates your entire LinkedIn content strategy, from ideation to publishing.

  Daily Idea Generation:** Every day, the workflow uses an advanced AI agent (Anthropic's Claude model) to generate a new, viral-optimized LinkedIn post idea, complete with a title, full text, and a detailed image description. It analyzes your past posts from a Google Sheet to ensure content is fresh and aligns with one of your four content pillars: timeless principles, case studies, growth hacks, or controversial ads.
  AI Image Creation:** It then uses OpenAI's DALL-E to create a custom, high-quality image based on the generated description and a style reference image you provide, ensuring brand consistency.
  Review & Approval Workflow:** The generated post and its accompanying image are automatically saved as a new row in a Google Sheet, marked with a "review" status. This gives you full editorial control.
  Automated Publishing:** Once you approve a post by changing its status to "ready" in the Google Sheet, a separate part of the workflow picks it up and automatically publishes it to your LinkedIn profile at a scheduled time.
  Status Tracking:** After publishing, the workflow updates the status in your Google Sheet to "posted," so you always have a clear overview of your content pipeline.

  Set up steps

  This workflow integrates several services. Follow these steps to get it running:

  Copy the Google Sheet: Make a copy of the AI Posts Content Machine Google Sheet template and select your copy in the Get Past Ideas, Save Post, Get Ready Posts, and Update Status nodes.
  Set Up Credentials: You will need to create and add API credentials for the following services within the corresponding n8n nodes:
      Google Sheets & Google Drive: Create a Google credential.
      Anthropic: Add your API key in the Anthropic Chat Model node.
      OpenAI: Add your API key as a Header Auth credential in the OpenAI Image node.
      Perplexity AI: Add your API key as a Header Auth credential inside the Perplexity Research sub-workflow.
      LinkedIn: Create a LinkedIn credential.
  Customize Your Content:
      In the Idea Generator node, adjust the system prompt to reflect your specific audience, topics, and content style.
      Create a folder in Google Drive for your post images. Add a reference image to this folder that defines your desired visual style.
      Paste the shareable link to your style reference image into the Image Style node.
  Activate the Workflow: Enable the workflow to start the automated content creation and publishing process.

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.googleDrive","n8n-nodes-base.facebookGraphApi","n8n-nodes-base.twitter","n8n-nodes-base.linkedIn","n8n-nodes-base.code","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatAnthropic","@n8n/n8n-nodes-langchain.outputParserStructured","@n8n/n8n-nodes-langchain.toolWorkflow"]

workflow_json:
  {"meta":{"instanceId":"4e229722e6c43a4914d2d66178b48335adf795d73afbee5b0ea0c52938ef4d8e"},"nodes":[{"id":"2d694354-6ab0-42fd-abbf-d3085813fd49","name":"Idea Generator","type":"@n8n/n8n-nodes-langchain.agent","position":[1100,200],"parameters":{"text":"=Generate materials for my next LinkedIn post.\n\nHere are the ideas that we've already used: {{ $json.mergedText }}.\n\nCome up with a new, super valuable and concrete post, and prepare all the needed materials for it:\n- idea\n- title\n- text\n- image description\n\nUse the least used bucket of content (out of my 4 buckets).\n\nBegin:","options":{"systemMessage":"=ROLE: You're an expert in viral LinkedIn posts content creation with 10 years of experience. You've created viral posts that have gotten 10 billion views in total.\n\nOBJECTIVE: Your goal is to write a 1) name, 2) idea, 3) title, 4) text, and 5) image description for my next LinkedIn Post. They should be super valuable to my audience.\n\nSCENARIO: I run a LinkedIn blog about marketing and sales. My audience is marketers, salespeople, founders, B2B business owners, B2C business owners, brands. My goal is to help them build better brands with valuable, and practical content. \nI have 4 main buckets of content on my page:\n1) timeless principles. ideas for this videos are taken from timeless books: Influnece and Pre-Suasion by Robert Cialdini, $100M Leads and $100M Offers by Alex Hormozi, Ogilvy on Advertising.\n2) case studies. for instance a case study breaking down on of the famous ads from the latest SuperBowl.\n3) growth hacks. latest trends on how to grow with a proof. for instance an SEO tactic that became known in the last year.\n4) contraversial ads. breakdowns of interesting and famous contraversial ads.\nEvery video that I post is focused solely on one of the content buckets. That makes my content more diverse and covering more cool topics.\n\nEXPECTATION: Write me 1) name (short name for the post, less than 50 characters), 2) idea (detailed description in 3 sentences max), 3) title (the first sentence of the post, less than 80 characters, it should be ultra hooking), 4) full text of the post, 5) image description (the image is the first thing people will look at, so make it ultra hooking; write the image description to be super clear and ultra simple, so the AI image generator will precisely know that to generate; the image should be minimalistic) for a 200-300 words LinkedIn post from one of the content buckets described above.\nMake sure to have great: hook, retention, and reward at the end.\nThe post should clearly lead to a marketing/sales insight.\nYour output should be in the JSON format.\nIdea should always start with a category: Timeless principle, Case study, Growth hack, Contraversial ad.\nExample output:\n{\"name\": \"The Power of Social Proof\",\n\"idea\": \"Timeless principle: Social proof is a psychological phenomenon that influences decision-making by showing how others' actions affect our own choices. It works universally across physical spaces and digital platforms. Marketers who strategically implement social proof elements can significantly increase conversion rates and customer trust.\",\n\"title\": \"Why we can't resist looking up when others do (and what it means for sales)\",\n\"text\": \"Why we can't resist looking up when others do (and what it means for sales)\\n\\nA psychology experiment once placed actors on a street corner to stare upward at nothing.\\n\\nWithin minutes, dozens of passersby stopped to look up too.\\n\\nThis is social proof in action—our natural tendency to follow others when uncertain.\\n\\nIn marketing, this same principle powers your conversion rates.\\n\\nNotice how differently you perceive:\\n\\n• A product with 5,000+ five-star reviews\\n• A service used by \\\"67% of Fortune 500 companies\\\"\\n• A landing page showing \\\"10,000+ satisfied customers\\\"\\n\\nCompared to identical offerings without these trust signals.\\n\\nBut here's what many marketers miss: social proof must feel authentic to work.\\n\\nGeneric testimonials or inflated numbers create skepticism, not confidence.\\n\\nThe most effective social proof strategies I've implemented for clients:\\n\\n1. Specificity: \\\"503 marketing agencies use our platform daily\\\" beats \\\"Hundreds of satisfied customers\\\"\\n\\n2. Relevance: Highlight testimonials from users who match your prospect's profile\\n\\n3. Recency: Fresh testimonials outperform older ones by 35% in our tests\\n\\n4. Visibility: Place social proof elements near decision points (like \\\"Buy Now\\\" buttons)\\n\\nImplement these four tactics, and you'll see the same psychological force that makes us look up at the sky work to increase your conversion rates.\\n\\nWhat's your most effective social proof strategy? Share below.\",\n\"image\": \"Simple black background with grainy texture. Six basic stick figure silhouettes in white - five figures on the left all looking up, one figure on the right just starting to look up. Bold text in Inter Bold font at the center reads \\\"FOLLOW THE CROWD\\\" with \\\"FOLLOW\\\" in white and \\\"CROWD\\\" in light green (#cff150). No other elements or details. Clean, minimal design with plenty of empty space.\"}\nNOTES:\n- THE BACKGROUND OF THE IMAGE SHOULD ALWAYS BE BLACK AND DARK GRAINY FILM\nTo accomplish your task you can use the web search."},"promptType":"define","hasOutputParser":true},"retryOnFail":true,"typeVersion":1.7},{"id":"991032b8-6839-4c5a-9df9-6e8e7a924c9e","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[480,100],"parameters":{"color":6,"width":980,"height":480,"content":"# Generate a New Post Idea and All Materials"},"typeVersion":1},{"id":"40294f91-5002-44a2-91e7-5bee74c30698","name":"Sticky Note8","type":"n8n-nodes-base.stickyNote","position":[1480,100],"parameters":{"color":6,"width":1140,"height":480,"content":"# Generate an Image and Save"},"typeVersion":1},{"id":"b3e2d972-f763-4fa5-88eb-bbb1afa7fc2d","name":"Structured Output Parser","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[1300,400],"parameters":{"jsonSchemaExample":"{\n\t\"name\": \"name\",\n    \"idea\": \"idea\",\n    \"title\": \"title\",\n    \"text\": \"text\",\n    \"image\": \"image\"\n}"},"typeVersion":1.2},{"id":"77a4755a-0d64-4bce-b8a1-90b649d21039","name":"Anthropic Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatAnthropic","position":[960,400],"parameters":{"model":{"__rl":true,"mode":"list","value":"claude-3-7-sonnet-20250219","cachedResultName":"Claude 3.7 Sonnet"},"options":{}},"typeVersion":1.3},{"id":"431ac158-ed33-4fdc-ae28-9a8fe1829f7e","name":"Perplexity Research","type":"@n8n/n8n-nodes-langchain.toolWorkflow","position":[1120,400],"parameters":{"name":"web_search","workflowId":{"__rl":true,"mode":"list","value":"eALld0YaOZuUCU5q","cachedResultName":"Perplexity Research"},"description":"Call this tool to make a web search query using Perplexity AI. It will automatically look at multiple relevant websites and combine all the valuable information in one clean response.","workflowInputs":{"value":{},"schema":[{"id":"query","type":"string","display":true,"removed":false,"required":false,"displayName":"query","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["query"],"attemptToConvertTypes":false,"convertFieldsToString":false}},"typeVersion":2.1},{"id":"9098aa0e-e707-4825-a848-50f8a3ad767d","name":"Convert to File","type":"n8n-nodes-base.convertToFile","position":[1960,280],"parameters":{"options":{},"operation":"toBinary","sourceProperty":"data[0].b64_json"},"typeVersion":1.1},{"id":"e7782adf-936a-47a5-8174-469e9d439b76","name":"Schedule","type":"n8n-nodes-base.scheduleTrigger","position":[560,200],"parameters":{"rule":{"interval":[{"triggerAtHour":5}]}},"typeVersion":1.2},{"id":"67704ef3-a0b3-4401-88aa-edc9b332c5fb","name":"Join Ideas","type":"n8n-nodes-base.code","position":[920,200],"parameters":{"jsCode":"// Get all incoming items\nconst items = $input.all();\n\n// Extract the text field from each item\nconst texts = items.map(item => item.json.idea);\n\n// Concatenate them (adjust the separator as needed)\nconst concatenated = texts.join(\", \");\n\n// Return a single item with the concatenated text\nreturn [{ json: { mergedText: concatenated } }];"},"typeVersion":2},{"id":"766ba040-6217-460e-a285-7dd3fe612654","name":"Pick One","type":"n8n-nodes-base.limit","position":[920,700],"parameters":{},"typeVersion":1},{"id":"ab433d53-9946-4778-bb59-bf636388da03","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[480,600],"parameters":{"color":4,"width":1340,"height":300,"content":"# Auto Posting"},"typeVersion":1},{"id":"35b01ea3-8a91-4bdb-8b0b-e1e99f3c0482","name":"X","type":"n8n-nodes-base.twitter","disabled":true,"position":[1140,980],"parameters":{"additionalFields":{}},"typeVersion":2},{"id":"25628428-075e-449c-8585-fc33d9185522","name":"Prepare Data for Instagram API","type":"n8n-nodes-base.set","disabled":true,"position":[1400,980],"parameters":{"options":{},"assignments":{"assignments":[{"id":"8a4260ba-3bde-4444-8f42-8a8abd51ff0c","name":"ImageURL","type":"string","value":"={{ $json.output }}"},{"id":"1953ae03-6a86-4847-8686-5a928637be1d","name":"Caption","type":"string","value":"={{ $('3c. Generate Post Caption (Gemini)').item.json.output.Caption }}"}]}},"typeVersion":3.4},{"id":"61af7e71-5470-44a1-a157-2c15311b9dff","name":"Create Instagram Media Container","type":"n8n-nodes-base.facebookGraphApi","disabled":true,"position":[1580,980],"parameters":{"edge":"media","node":"17841473009917118","options":{"queryParameters":{"parameter":[{"name":"caption","value":"={{ $json.Caption }}"},{"name":"image_url","value":"={{ $json.ImageURL }}"}]}},"graphApiVersion":"v22.0","httpRequestMethod":"POST"},"typeVersion":1},{"id":"177e67d6-2783-4691-a90f-4b6fb398ab5e","name":"Wait for Container Processing","type":"n8n-nodes-base.wait","disabled":true,"position":[1780,980],"webhookId":"1b14c8bf-151a-4054-8215-093dd5b6cbcc","parameters":{},"typeVersion":1.1},{"id":"8ef68b10-af6c-4f05-91ae-43586098b051","name":"Publish Post to Instagram","type":"n8n-nodes-base.facebookGraphApi","disabled":true,"position":[1980,980],"parameters":{"edge":"media_publish","node":"17841473009917118","options":{"queryParameters":{"parameter":[{"name":"creation_id","value":"={{ $json.id }}"}]}},"graphApiVersion":"v22.0","httpRequestMethod":"POST"},"typeVersion":1},{"id":"9702cd17-9bd3-429e-842e-56089b50d50b","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[1080,920],"parameters":{"width":1120,"height":260,"content":"## Twitter & Instagram"},"typeVersion":1},{"id":"8633b8e7-0119-4b60-a42e-362e26134772","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[-260,100],"parameters":{"width":720,"height":1800,"content":"# 🛠️ Setup Guide  \n**Author:** [Usman Liaqat](https://www.linkedin.com/in/usmanliaqat404)\n\nThis guide will walk you through the 7 steps to fully configure your automation workflow using Google Sheets, Google Drive, Anthropic, OpenAI, Perplexity AI and LinkedIn.\n\n---\n\n## ✅ Step 1: Set Up Google Sheets Credential\n1. In the n8n Google Sheets node create a new credential using your Google account\n\n---\n\n## ✅ Step 2: Set Up Google Drive Credential\n1. Go to the [Google Cloud Console](https://console.cloud.google.com) and create or select a project\n2. Enable the Google Drive API under APIs & Services > Library\n3. Still in APIs & Services, select Credentials from the left menu\n4. Click + CREATE CREDENTIALS > OAuth client ID\n5. For Application type, choose Web application\n6. Under Authorized redirect URIs, paste the OAuth Redirect URL: https://oauth.n8n.cloud/oauth2/callback\n7. Click Create, then copy the Client ID and Client Secret shown in the modal\n8. In the n8n Google Drive node click Create Credential\n9. Paste in the Client ID and Client Secret from Google Cloud\n10. Click Sign in with Google, complete the OAuth consent flow, then Save your credential\n\n---\n\n## ✅ Step 3: Set Up Anthropic Credential\n1. Navigate to the [Anthropic Console](https://console.anthropic.com/) and sign in or sign up\n2. Generate an API key\n3. In the n8n \"Anthropic Chat Model\" node click Create Credential, past the API key and save\n\n---\n\n## ✅ Step 4: Configure OpenAI via HTTP Request Node\n1. Visit the [OpenAI API Keys](https://platform.openai.com/account/api-keys) page and create a new secret key\n2. In the n8n OpenAI Image node in the Authentication select Generic Credential Type\n3. In Generic Auth Type select Header Auth\n4. Create a new Header Auth, Name = Authorization, Value = Bearer YOUR_TOKEN\n\n---\n\n## ✅ Step 5: Configure Perplexity AI via HTTP Request Node\n1. Go to the [Perplexity API Portal](https://www.perplexity.ai/account/api/keys) and click Create Key\n2. Copy the generated API key\n3. Inside n8n, in the sub-workflow, open the Perplexity Research node\n4. In the Authentication select Generic Credential Type\n5. In Generic Auth Type select Header Auth\n6. Create a new Header Auth, Name = Authorization, Value = Bearer YOUR_TOKEN\n\n---\n\n## ✅ Step 6: Set Up LinkedIn Credential\n1. In the n8n LinkedIn node create a new credential using your LinkedIn account\n\n---\n\n## ✅ Step 7: Customize The System For Your Use Case\n1. In the Idea Generator node adjust the prompts to reflect your content style and your topics\n2. Create a folder in your Google Drive where you will store all the images\n3. Put in that folder the image with the style of your brand, that you want to replicate every time\n4. Paste the shared link to this image in the \"Image Style\" node\n5. In the OpenAI Image node adjust the prompt to reflect your image style\n6. Copy my [Google Sheet](https://docs.google.com/spreadsheets/d/1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs/edit?usp=sharing)\n7. Select your Google Sheet in the Google Sheets nodes\n8. Activate the system, now every day a new post will be created inside the Google Sheet, and once you've reviewed it (might edit it as well), set the status to \"ready\" and it will be posted; the posting mechanism is set to work every day, one post at a time\n\n---\n\nNow you're ready to run your workflow. Happy automating!\n"},"typeVersion":1},{"id":"e853ea9d-5b19-4b7b-8dc4-110bcc481471","name":"OpenAI Image","type":"n8n-nodes-base.httpRequest","position":[1760,280],"parameters":{"url":"https://api.openai.com/v1/images/edits","method":"POST","options":{},"sendBody":true,"contentType":"multipart-form-data","authentication":"genericCredentialType","bodyParameters":{"parameters":[{"name":"model","value":"gpt-image-1"},{"name":"image","parameterType":"formBinaryData","inputDataFieldName":"data"},{"name":"prompt","value":"=You're a professional graphic designer.\n\nMake a new image in the style very very similar to the reference.\n\nCopy the style, spacing, minimalistic structure, especially copy the FONTS, and everything else.\n\nUse black and dark grainy film (mainly for the background), white and salad green (#cff150).\n\nMake the image super aestetic and minimalistic.\n\nMake it vertical 3x4.\n\nIt will be an image for a LinkedIn post.\n\nHere is the description of the new image:\n{{ $('Idea Generator').item.json.output.image }}"}]},"genericAuthType":"httpHeaderAuth"},"typeVersion":4.2},{"id":"2642278d-235c-46f0-994e-aa1ebec5ae64","name":"Image Style","type":"n8n-nodes-base.googleDrive","position":[1540,280],"parameters":{"fileId":{"__rl":true,"mode":"url","value":"=https://drive.google.com/file/d/1wm4anhC6ygXl4ZJAjJryWfEXTG-VeH8s/view?usp=sharing"},"options":{},"operation":"download"},"typeVersion":3},{"id":"31218124-74e6-4117-bd76-125545aaf969","name":"Get Past Ideas","type":"n8n-nodes-base.googleSheets","position":[740,200],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs/edit#gid=0","cachedResultName":"Posts"},"documentId":{"__rl":true,"mode":"list","value":"1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs/edit?usp=drivesdk","cachedResultName":"AI Posts Content Machine"}},"typeVersion":4.5,"alwaysOutputData":true},{"id":"b4776d32-d742-42d8-8454-048ccadc8ecd","name":"Save Image","type":"n8n-nodes-base.googleDrive","position":[2180,280],"parameters":{"name":"={{ $('Idea Generator').item.json.output.name }}","driveId":{"__rl":true,"mode":"list","value":"My Drive"},"options":{},"folderId":{"__rl":true,"mode":"list","value":"1PZW0Hef8yKwKtBZuRxZAMkakzdyyP0iZ","cachedResultUrl":"https://drive.google.com/drive/folders/1PZW0Hef8yKwKtBZuRxZAMkakzdyyP0iZ","cachedResultName":"AI Posts Content Machine"}},"typeVersion":3},{"id":"c6a71846-4538-4204-9ddc-f5c0fb18ac1a","name":"Save Post","type":"n8n-nodes-base.googleSheets","position":[2380,280],"parameters":{"columns":{"value":{"idea":"={{ $('Idea Generator').item.json.output.idea }}","name":"={{ $('Idea Generator').item.json.output.name }}","text":"={{ $('Idea Generator').item.json.output.text }}","image":"={{ $json.webViewLink.replace(/usp=[^&]+/, 'usp=sharing') }}","status":"review"},"schema":[{"id":"name","type":"string","display":true,"required":false,"displayName":"name","defaultMatch":false,"canBeUsedToMatch":true},{"id":"idea","type":"string","display":true,"required":false,"displayName":"idea","defaultMatch":false,"canBeUsedToMatch":true},{"id":"text","type":"string","display":true,"required":false,"displayName":"text","defaultMatch":false,"canBeUsedToMatch":true},{"id":"image","type":"string","display":true,"required":false,"displayName":"image","defaultMatch":false,"canBeUsedToMatch":true},{"id":"status","type":"string","display":true,"required":false,"displayName":"status","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs/edit#gid=0","cachedResultName":"Posts"},"documentId":{"__rl":true,"mode":"list","value":"1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs/edit?usp=drivesdk","cachedResultName":"AI Posts Content Machine"}},"typeVersion":4.5},{"id":"7b8e2c00-2c14-4bb7-acee-0181990e9434","name":"Schedule 2","type":"n8n-nodes-base.scheduleTrigger","position":[560,700],"parameters":{"rule":{"interval":[{"triggerAtHour":16}]}},"typeVersion":1.2},{"id":"66c0ae82-6ba3-4fa0-8033-3726796cdc0a","name":"Get Ready Posts","type":"n8n-nodes-base.googleSheets","position":[740,700],"parameters":{"options":{},"filtersUI":{"values":[{"lookupValue":"ready","lookupColumn":"status"}]},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs/edit#gid=0","cachedResultName":"Posts"},"documentId":{"__rl":true,"mode":"list","value":"1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs/edit?usp=drivesdk","cachedResultName":"AI Posts Content Machine"}},"typeVersion":4.5},{"id":"7ee9c81f-00ca-4f89-95bb-61d224b06a2e","name":"Download Image","type":"n8n-nodes-base.googleDrive","position":[1120,700],"parameters":{"fileId":{"__rl":true,"mode":"url","value":"={{ $json.image }}"},"options":{},"operation":"download"},"typeVersion":3},{"id":"94fbbd95-fe52-4eda-ac78-2201ff72fe50","name":"Publish Post","type":"n8n-nodes-base.linkedIn","position":[1320,700],"parameters":{"text":"={{ $json.text }}","person":"-NknGiXASA","additionalFields":{},"shareMediaCategory":"IMAGE"},"typeVersion":1},{"id":"0893a7f2-490b-49f1-96cb-56090cb59c10","name":"Update Status","type":"n8n-nodes-base.googleSheets","position":[1520,700],"parameters":{"columns":{"value":{"name":"={{ $('Pick One').item.json.name }}","status":"posted"},"schema":[{"id":"name","type":"string","display":true,"removed":false,"required":false,"displayName":"name","defaultMatch":false,"canBeUsedToMatch":true},{"id":"idea","type":"string","display":true,"removed":true,"required":false,"displayName":"idea","defaultMatch":false,"canBeUsedToMatch":true},{"id":"text","type":"string","display":true,"removed":true,"required":false,"displayName":"text","defaultMatch":false,"canBeUsedToMatch":true},{"id":"image","type":"string","display":true,"removed":true,"required":false,"displayName":"image","defaultMatch":false,"canBeUsedToMatch":true},{"id":"status","type":"string","display":true,"required":false,"displayName":"status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"row_number","type":"string","display":true,"removed":true,"readOnly":true,"required":false,"displayName":"row_number","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["name"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"update","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs/edit#gid=0","cachedResultName":"Posts"},"documentId":{"__rl":true,"mode":"list","value":"1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1-F3ZioIs3oWOKMyDPMuquaH-qiuaZs6qdZXP-yNeRbs/edit?usp=drivesdk","cachedResultName":"AI Posts Content Machine"}},"typeVersion":4.5}],"pinData":{},"connections":{"Pick One":{"main":[[{"node":"Download Image","type":"main","index":0}]]},"Schedule":{"main":[[{"node":"Get Past Ideas","type":"main","index":0}]]},"Join Ideas":{"main":[[{"node":"Idea Generator","type":"main","index":0}]]},"Save Image":{"main":[[{"node":"Save Post","type":"main","index":0}]]},"Schedule 2":{"main":[[{"node":"Get Ready Posts","type":"main","index":0}]]},"Image Style":{"main":[[{"node":"OpenAI Image","type":"main","index":0}]]},"OpenAI Image":{"main":[[{"node":"Convert to File","type":"main","index":0}]]},"Publish Post":{"main":[[{"node":"Update Status","type":"main","index":0}]]},"Download Image":{"main":[[{"node":"Publish Post","type":"main","index":0}]]},"Get Past Ideas":{"main":[[{"node":"Join Ideas","type":"main","index":0}]]},"Idea Generator":{"main":[[{"node":"Image Style","type":"main","index":0}]]},"Convert to File":{"main":[[{"node":"Save Image","type":"main","index":0}]]},"Get Ready Posts":{"main":[[{"node":"Pick One","type":"main","index":0}]]},"Perplexity Research":{"ai_tool":[[{"node":"Idea Generator","type":"ai_tool","index":0}]]},"Anthropic Chat Model":{"ai_languageModel":[[{"node":"Idea Generator","type":"ai_languageModel","index":0}]]},"Structured Output Parser":{"ai_outputParser":[[{"node":"Idea Generator","type":"ai_outputParser","index":0}]]},"Wait for Container Processing":{"main":[[{"node":"Publish Post to Instagram","type":"main","index":0}]]},"Prepare Data for Instagram API":{"main":[[{"node":"Create Instagram Media Container","type":"main","index":0}]]},"Create Instagram Media Container":{"main":[[{"node":"Wait for Container Processing","type":"main","index":0}]]}}}


name: VEO3 Video Generator with AI Optimization and Google Drive Storage
author_name: Friedemann Schuetz
author_username: freddy-schuetz
categories: []
created_at: 2025-06-07T18:34:44.834Z
updated_at: 2025-06-07T18:34:44.834Z
url: https://n8n.io/workflows/4767
scraped_at: 2025-06-19 22:48:35
description:
  Welcome to my VEO3 Video Generator Workflow!

  This automated workflow transforms simple text descriptions into professional 8-second videos using Google's cutting-edge VEO3 AI model. Users submit video ideas through a web form, and the system automatically generates optimized prompts, creates high-quality videos with native audio, and delivers them via Google Drive - all powered by Claude 4 Sonnet for intelligent prompt optimization.

  This workflow has the following sequence:
  VEO3 Generator Form - Web form interface for users to input video content, format, and duration
  Video Prompt Generator - AI agent powered by Claude 4 Sonnet that:
     Analyzes user input for video content requirements
     Creates factual, professional video titles
     Generates detailed VEO3 prompts with subject, context, action, style, camera motion, composition, ambiance, and audio elements
     Optimizes prompts for 16:9 landscape format and 8-second duration
  Create VEO3 Video - Submits the optimized prompt to fal.ai VEO3 API for video generation
  Wait 30 seconds - Initial waiting period for video processing to begin
  Check VEO3 Status - Monitors the video generation status via fal.ai API
  Video completed? - Decision node that checks if video generation is finished
     If not completed: Returns to wait cycle
     If completed: Proceeds to video retrieval
  Get VEO3 Video URL - Retrieves the final video download URL from fal.ai
  Download VEO3 Video - Downloads the generated MP4 video file
  Merge - Combines video data with metadata for final processing
  Save Video to Google Drive - Uploads the video to specified Google Drive folder
  Video Output - Displays completion message with Google Drive link to user

  The following accesses are required for the workflow:
  Anthropic API** (Claude 4 Sonnet): Documentation
  Fal.ai API** (VEO3 Model): Create API key at https://fal.ai/dashboard/keys
  Google Drive API**: Documentation

  Workflow Features:
  User-friendly web form**: Simple interface for video content input
  AI-powered prompt optimization**: Claude 4 Sonnet creates professional VEO3 prompts
  Automatic video generation**: Leverages Google's VEO3 model via fal.ai
  Status monitoring**: Real-time tracking of video generation progress
  Google Drive integration**: Automatic upload and sharing of generated videos
  Structured output**: Consistent video titles and professional prompt formatting
  Audio optimization**: VEO3's native audio generation with ambient sounds and music

  Current Limitations:
  Format**: Only 16:9 landscape videos supported
  Duration**: Only 8-second videos supported
  Processing time**: Videos typically take 60-120 seconds to generate

  Use Cases:
  Content creation**: Generate videos for social media, websites, and presentations
  Marketing materials**: Create promotional videos and advertisements
  Educational content**: Produce instructional and explanatory videos
  Prototyping**: Rapid video concept development and testing
  Creative projects**: Artistic and experimental video generation
  Business presentations**: Professional video content for meetings and pitches

  Feel free to contact me via LinkedIn, if you have any questions!

nodes_used:
  ["n8n-nodes-base.httpRequest","n8n-nodes-base.googleDrive","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatAnthropic","@n8n/n8n-nodes-langchain.outputParserStructured"]

workflow_json:
  {"id":"iuPhSS8Dr2Dl7Hbo","meta":{"instanceId":"7dfa146768a036d27a67d125f90ea637bfb301bd4fd25d0086548016421d44bd","templateCredsSetupCompleted":true},"name":"VEO3 Video Generator TEMPLATE","tags":[],"nodes":[{"id":"62e94b7e-b516-4cba-8a00-8179e743520f","name":"Anthropic Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatAnthropic","position":[-52,370],"parameters":{"model":{"__rl":true,"mode":"list","value":"claude-sonnet-4-20250514","cachedResultName":"Claude 4 Sonnet"},"options":{}},"credentials":{"anthropicApi":{"id":"WgfLltDtHqUy7q9O","name":"Anthropic account"}},"typeVersion":1.3},{"id":"78444fe1-3289-4f2a-871b-03908ba47553","name":"Structured Output Parser","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[68,370],"parameters":{"schemaType":"manual","inputSchema":"{\n  \"type\": \"object\",\n  \"properties\": {\n    \"title\": {\n      \"type\": \"string\",\n      \"description\": \"Creative, meaningful title for the video - short, concise and matching the content\",\n      \"minLength\": 5,\n      \"maxLength\": 80\n    },\n    \"prompt\": {\n      \"type\": \"string\",\n      \"description\": \"Detailed VEO3 prompt with Subject, Context, Action, Style, Camera Motion, Composition, Ambiance and Audio elements\",\n      \"minLength\": 50,\n      \"maxLength\": 2000\n    },\n    \"aspect_ratio\": {\n      \"type\": \"string\",\n      \"enum\": [\"16:9\"],\n      \"description\": \"Video aspect ratio - currently only 16:9 Landscape/Cinema supported\"\n    },\n    \"duration\": {\n      \"type\": \"string\",\n      \"enum\": [\"8s\"],\n      \"description\": \"Video duration in seconds - currently only 8s supported\"\n    }\n  },\n  \"required\": [\"title\", \"prompt\", \"aspect_ratio\", \"duration\"],\n  \"additionalProperties\": false\n}"},"typeVersion":1.2},{"id":"6b7fa224-d30c-4acc-84ee-c458c20f2c89","name":"Video Prompt Generator","type":"@n8n/n8n-nodes-langchain.agent","position":[-80,150],"parameters":{"text":"=Video Content: {{ $json['Video Content'] }}\nFormat: {{ $json.Format }}\nDuration: {{ $json['Duration'] }}","options":{"systemMessage":"=You are an expert for VEO3 video prompts and video marketing. Create optimal parameters for high-quality video generation with Google's VEO3 model from user input, including a creative, appealing title.\n\nTITLE CREATION:\n- Factual and objective (5-80 characters)\n- Precisely describes the main content of the video\n- Factual and informative, without exaggeration\n- Uses neutral, descriptive language\n- Avoids emotional words like \"epic\", \"magical\", \"incredible\"\n- Professionally and seriously formulated\n\nTITLE CATEGORIES:\n- Action/Sport: \"Skier on Alpine slope\", \"Winter sports in the mountains\"\n- Dialog/Drama: \"Woman at train station\", \"Waiting scene in vintage setting\"\n- Nature/Landscape: \"Waterfall in rainforest\", \"Nature shot with water drops\"\n- Everyday/People: \"Chef in kitchen\", \"Work scene while cooking\"\n- Technology/Objects: \"Icicles melting\", \"Close-up of ice\"\n- Architecture: \"Modern building architecture\", \"Concrete building with organic forms\"\n\nVEO3 PROMPT STRUCTURE (use all relevant elements):\n\nMANDATORY ELEMENTS:\n- Subject: Main subject (person, object, animal, scenery)\n- Context: Background, setting, environment\n- Action: What happens, movements, actions\n\nOPTIONAL ELEMENTS (for better quality):\n- Style: Specific film styles (cinematic, film noir, documentary, 3D cartoon, realistic, action movie, etc.)\n- Camera Motion: dolly shot, tracking shot, aerial view, eye-level, top-down, low-angle, zoom in/out, pan shot, static shot\n- Composition: wide shot, close-up, extreme close-up, medium shot, over-the-shoulder, single shot, two shot\n- Ambiance: Color palette and lighting (warm golden tones, cool blue tones, natural sunlight, dramatic shadows, soft focus, shallow depth of field)\n- Audio: Dialogues (in quotation marks), Ambient Sounds, Music (VEO3 generates native audio!)\n\nTECHNICAL BEST PRACTICES:\n- Use descriptive adjectives and adverbs for clear images\n- For people: Specify facial details, emotions, clothing, body posture\n- For dialogues: Write exact words in quotation marks for perfect lip-sync\n- For realism: Mention physics, natural movements, realistic interactions\n- Camera work: Use professional film terminology\n- Lighting: Specify light sources and mood\n- Audio: Describe ambient sounds, music and spoken words\n\nASPECT RATIO INTELLIGENCE:\n- FAL.AI VEO3 currently supports ONLY 16:9 (Landscape) format\n- All videos are automatically created in 16:9 format\n- Optimize prompts for Landscape/Cinema presentation\n\nDURATION INTELLIGENCE:\n- FAL.AI VEO3 currently supports ONLY 8s duration\n- All videos are automatically created with 8s length\n- Optimize prompts for 8-second sequences\n\nAUDIO OPTIMIZATION (VEO3's strength!):\n- ALWAYS specify audio elements since VEO3 generates native audio\n- Dialogues: Exact words in quotation marks for perfect lip-sync\n- Ambient: Matching background sounds to the scene (wind, traffic, nature, etc.)\n- Music: Mood-appropriate description (energetic, melancholic, epic, upbeat, dramatic, etc.)\n- Sound Effects: Specific sounds (footsteps, doors, machines, etc.)\n\nSTYLE CATEGORIES (all optimized for 16:9 Landscape):\n- Cinematic: \"Cinematic style\", \"film noir\", \"documentary style\", \"movie scene\"\n- Animation: \"3D cartoon style render\", \"animated style\", \"stylized animation\"\n- Realistic: \"Photorealistic\", \"documentary footage\", \"natural lighting\"\n- Gaming: \"Video game aesthetic\", \"third-person view\", \"FPS perspective\"\n- Commercial: \"Advertisement style\", \"product showcase\", \"commercial photography\"\n- Action/Sport: \"Dynamic wide shots\", \"landscape cinematography\", \"widescreen action\"\n\nEXAMPLE PROMPTS (all optimized for 16:9 Landscape, 8s):\n\nAction/Sport:\nTitle: \"Skier on Alpine slope\"\nPrompt: \"Wide cinematic tracking shot following a professional skier carving down a pristine alpine slope. Camera positioned parallel to slope, capturing skier's full body and dramatic powder sprays against mountain landscape. Skier approaches from distance, passes camera at mid-range and continues down slope. As he passes, he shouts: 'I LOVE SKIING!' Audio captures swoosh of skis, wind rushing, clear English exclamation. Widescreen sports cinematography with motion blur, 8-second sequence showcasing pure skiing joy.\"\n\nDialog/Drama:\nTitle: \"Woman waiting at train station\"\nPrompt: \"Wide cinematic shot of a vintage train station with woman in 1940s dress walking through the bustling scene. Camera dollies alongside in medium wide shot, showing full environment and character. Steam rises from locomotives in background. She checks pocket watch while walking, worry visible on her face. Warm golden lighting filters through tall station windows. She whispers: 'He promised to be here.' Train announcements and steam hissing throughout. Film noir style, 8-second scene building dramatic tension.\"\n\nNature/Landscape:\nTitle: \"Waterfall in rainforest\"\nPrompt: \"Sweeping aerial establishing shot of a majestic waterfall cascading through lush rainforest. Camera starts wide, slowly moving closer to reveal mist and spray details. Full landscape visible with dense canopy and multiple water levels. Dappled sunlight filters through trees creating dynamic lighting. Natural sounds of rushing water, birds chirping, leaves rustling build throughout 8-second sequence. Documentary style with rich green tones and cinematic widescreen composition.\"\n\nEveryday/People:\nTitle: \"Chef preparing meal\"\nPrompt: \"Wide shot of a modern kitchen with chef enthusiastically preparing a meal. Camera circles around showing full cooking environment. Steam rises from multiple pans as chef juggles ingredients with theatrical flair. He declares with passion: 'Cooking is pure magic!' Sounds of sizzling, chopping, and upbeat background music. Bright, colorful lighting with warm kitchen ambiance. 8-second sequence capturing culinary excitement and energy.\"\n\nTransform the user input into a factual title and professional VEO3 prompt with maximum visual and audio quality. Consider all prompt elements for best possible results.\n\nIMPORTANT:\n- Create FIRST an objective, factual title without exaggeration\n- All videos are automatically created in 16:9 Landscape format with 8s duration\n- Optimize prompts accordingly for widescreen presentation and 8-second sequences\n- Title should factually describe what is shown in the video\n- Avoid emotional words like \"epic\", \"magical\", \"incredible\", \"spectacular\""},"promptType":"define","hasOutputParser":true},"typeVersion":2},{"id":"5791f2ee-9e4f-4eae-832f-42b091e6e118","name":"Merge","type":"n8n-nodes-base.merge","position":[1616,150],"parameters":{"mode":"combine","options":{},"combineBy":"combineByPosition"},"typeVersion":3.2},{"id":"2b7ed2cc-bd91-48f1-b2aa-1b77ea4350ae","name":"Create VEO3 Video","type":"n8n-nodes-base.httpRequest","position":[296,75],"parameters":{"url":"https://queue.fal.run/fal-ai/veo3","method":"POST","options":{"timeout":60000,"redirect":{"redirect":{}},"response":{"response":{"responseFormat":"json"}},"allowUnauthorizedCerts":false},"jsonBody":"={\n  \"prompt\": \"{{ $json.output.prompt }}\",\n  \"aspect_ratio\": \"{{ $json.output.aspect_ratio || '16:9' }}\",\n  \"duration\": \"{{ $json.output.duration || '8s' }}\"\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"Key <YOUR-FAL.AI API KEY>"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.2},{"id":"997b17c4-5e3c-48fa-8008-e44ead3556c2","name":"Wait 30 seconds","type":"n8n-nodes-base.wait","position":[516,75],"webhookId":"1b6bbe9b-4bfe-4a77-8627-73a05db0de8c","parameters":{"amount":30},"typeVersion":1.1},{"id":"2e94296b-5207-43a8-afe7-4e330df2d838","name":"Check VEO3 Status","type":"n8n-nodes-base.httpRequest","position":[736,0],"parameters":{"url":"=https://queue.fal.run/fal-ai/veo3/requests/{{ $('Create VEO3 Video').first().json.request_id }}/status","options":{},"sendHeaders":true,"headerParameters":{"parameters":[{"name":"Authorization","value":"Key <YOUR-FAL.AI API KEY>"}]}},"typeVersion":4.2},{"id":"3b7d8752-f0c7-4315-bb31-cf0345762ed0","name":"Video completed?","type":"n8n-nodes-base.if","position":[956,75],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"e83af8f6-f0db-47fd-b41a-44c07929b186","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.status }}","rightValue":"COMPLETED"}]}},"typeVersion":2.2},{"id":"69760626-baf5-45a9-abe9-86c1b17b893d","name":"Get VEO3 Video URL","type":"n8n-nodes-base.httpRequest","position":[1176,75],"parameters":{"url":"=https://queue.fal.run/fal-ai/veo3/requests/{{ $('Create VEO3 Video').first().json.request_id }}","options":{},"sendHeaders":true,"headerParameters":{"parameters":[{"name":"Authorization","value":"Key <YOUR-FAL.AI API KEY>"}]}},"typeVersion":4.2},{"id":"1f53010b-9041-4849-9e87-387ab1f389f6","name":"Download VEO3 Video","type":"n8n-nodes-base.httpRequest","position":[1396,75],"parameters":{"url":"={{ $json.video.url }}","options":{"response":{"response":{"responseFormat":"file"}}}},"typeVersion":4.2},{"id":"54231111-a879-412d-902d-bf52089f40cd","name":"Save Video to Google Drive","type":"n8n-nodes-base.googleDrive","position":[1836,150],"parameters":{"name":"={{ $json.output.title }}.mp4","driveId":{"__rl":true,"mode":"list","value":"My Drive"},"options":{},"folderId":{"__rl":true,"mode":"list","value":"1Q5slmjwk2tDrhN2BgQeZ6ITD-69dKYnV","cachedResultUrl":"https://drive.google.com/drive/folders/1Q5slmjwk2tDrhN2BgQeZ6ITD-69dKYnV","cachedResultName":"VEO3_Videos"}},"credentials":{"googleDriveOAuth2Api":{"id":"pTaHnocQoftc5pcK","name":"Google Drive account FSEP"}},"typeVersion":3},{"id":"a943c007-a670-419c-956d-7a95277892ab","name":"Video Output","type":"n8n-nodes-base.form","position":[2056,150],"webhookId":"7784e7d1-e01a-4b44-a6af-76811f3c5fca","parameters":{"options":{},"operation":"completion","completionTitle":"Your video has been created!","completionMessage":"=Your video \"{{ $('Merge').first().json.output.title }}\" has been successfully created!\nYou can access it here: {{ $json.webViewLink }}"},"typeVersion":1},{"id":"ed6338f2-edcb-40d0-9f08-dd9c79345ab8","name":"VEO3 Generator Form","type":"n8n-nodes-base.formTrigger","position":[-300,150],"webhookId":"1dea6a1a-8699-4b7a-a1be-0eeb50a10cc1","parameters":{"options":{"path":"veo3-video-generator","buttonLabel":"Create Video","appendAttribution":false},"formTitle":"VEO3 Video Generator","formFields":{"values":[{"fieldLabel":"Video Content","placeholder":"e.g. Magical waterfall in the rainforest","requiredField":true},{"fieldType":"dropdown","fieldLabel":"Format","fieldOptions":{"values":[{"option":"16:9"}]},"requiredField":true},{"fieldType":"dropdown","fieldLabel":"Duration","fieldOptions":{"values":[{"option":"8s"}]},"requiredField":true}]},"formDescription":"Currently only 16:9 and 8s videos are supported via fal.ai!"},"typeVersion":2.2},{"id":"93108f68-f541-4445-8795-007927b621b3","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-1120,-420],"parameters":{"width":720,"height":1280,"content":"# Welcome to my VEO3 Video Generator Workflow!\n## This workflow has the following sequence:\n1. **VEO3 Generator Form** - Web form interface for users to input video content, format, and duration\n2. **Video Prompt Generator** - AI agent powered by Claude 4 Sonnet that:\n   - Analyzes user input for video content requirements\n   - Creates factual, professional video titles\n   - Generates detailed VEO3 prompts with subject, context, action, style, camera motion, composition, ambiance, and audio elements\n   - Optimizes prompts for 16:9 landscape format and 8-second duration\n3. **Create VEO3 Video** - Submits the optimized prompt to fal.ai VEO3 API for video generation\n4. **Wait 30 seconds** - Initial waiting period for video processing to begin\n5. **Check VEO3 Status** - Monitors the video generation status via fal.ai API\n6. **Video completed?** - Decision node that checks if video generation is finished\n   - If not completed: Returns to wait cycle\n   - If completed: Proceeds to video retrieval\n7. **Get VEO3 Video URL** - Retrieves the final video download URL from fal.ai\n8. **Download VEO3 Video** - Downloads the generated MP4 video file\n9. **Merge** - Combines video data with metadata for final processing\n10. **Save Video to Google Drive** - Uploads the video to specified Google Drive folder\n11. **Video Output** - Displays completion message with Google Drive link to user\n\n## The following accesses are required for the workflow:\n- **Anthropic API** (Claude 4 Sonnet): [Documentation](https://docs.n8n.io/integrations/builtin/credentials/anthropic/)\n- **Fal.ai API** (VEO3 Model): Create API key at [https://fal.ai/dashboard/keys](https://fal.ai/dashboard/keys)\n- **Google Drive API**: [Documentation](https://docs.n8n.io/integrations/builtin/credentials/google/)\n\n## Workflow Features:\n- **User-friendly web form**: Simple interface for video content input\n- **AI-powered prompt optimization**: Claude 4 Sonnet creates professional VEO3 prompts\n- **Automatic video generation**: Leverages Google's VEO3 model via fal.ai\n- **Status monitoring**: Real-time tracking of video generation progress\n- **Google Drive integration**: Automatic upload and sharing of generated videos\n- **Structured output**: Consistent video titles and professional prompt formatting\n- **Audio optimization**: VEO3's native audio generation with ambient sounds and music\n\n## Current Limitations:\n- **Format**: Only 16:9 landscape videos supported\n- **Duration**: Only 8-second videos supported\n- **Processing time**: Videos typically take 60-120 seconds to generate\n\n## Use Cases:\n- **Content creation**: Generate videos for social media, websites, and presentations\n- **Marketing materials**: Create promotional videos and advertisements\n- **Educational content**: Produce instructional and explanatory videos\n- **Prototyping**: Rapid video concept development and testing\n- **Creative projects**: Artistic and experimental video generation\n- **Business presentations**: Professional video content for meetings and pitches\n\nYou can contact me via LinkedIn, if you have any questions: https://www.linkedin.com/in/friedemann-schuetz"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"ebfd2536-b5dd-4a08-bd6a-0ca0f654ede7","connections":{"Merge":{"main":[[{"node":"Save Video to Google Drive","type":"main","index":0}]]},"Wait 30 seconds":{"main":[[{"node":"Check VEO3 Status","type":"main","index":0}]]},"Video completed?":{"main":[[{"node":"Get VEO3 Video URL","type":"main","index":0}],[{"node":"Wait 30 seconds","type":"main","index":0}]]},"Check VEO3 Status":{"main":[[{"node":"Video completed?","type":"main","index":0}]]},"Create VEO3 Video":{"main":[[{"node":"Wait 30 seconds","type":"main","index":0}]]},"Get VEO3 Video URL":{"main":[[{"node":"Download VEO3 Video","type":"main","index":0}]]},"Download VEO3 Video":{"main":[[{"node":"Merge","type":"main","index":0}]]},"VEO3 Generator Form":{"main":[[{"node":"Video Prompt Generator","type":"main","index":0}]]},"Anthropic Chat Model":{"ai_languageModel":[[{"node":"Video Prompt Generator","type":"ai_languageModel","index":0}]]},"Video Prompt Generator":{"main":[[{"node":"Create VEO3 Video","type":"main","index":0},{"node":"Merge","type":"main","index":1}]]},"Structured Output Parser":{"ai_outputParser":[[{"node":"Video Prompt Generator","type":"ai_outputParser","index":0}]]},"Save Video to Google Drive":{"main":[[{"node":"Video Output","type":"main","index":0}]]}}}


name: Discover & Analyze TikTok Influencers with Bright Data, Claude AI & Email Outreach
author_name: Dvir Sharon
author_username: dvirsharon
categories: []
created_at: 2025-06-08T08:44:40.329Z
updated_at: 2025-06-08T08:44:40.329Z
url: https://n8n.io/workflows/4774
scraped_at: 2025-06-19 22:48:58
description:
  🎯 Automated TikTok Influencer Discovery & Analysis

  A complete n8n automation that discovers TikTok influencers using Bright Data, evaluates their fit using Claude AI, and sends personalized outreach emails. Designed for marketing teams and brands that need a scalable, intelligent way to find and connect with relevant creators.

  📋 Overview

  This workflow provides a full-service influencer discovery pipeline: it finds TikTok profiles using search keywords, uses AI to assess alignment with your brand, and initiates contact with qualified influencers. Ideal for influencer marketing, brand partnerships, and campaign planning.

  ✨ Key Features

  🔍 Keyword-Based Discovery**  
    Locate TikTok influencers by specific niche-related keywords.

  📊 Bright Data Integration**  
    Access accurate TikTok profile data from Bright Data’s datasets.

  🤖 AI-Powered Analysis**  
    Claude AI evaluates each profile's fit with your brand based on bio, content, and more.

  📧 Smart Email Notifications**  
    Sends tailored outreach emails to creators deemed highly relevant.

  📈 Data Storage**  
    Google Sheets stores profile details, AI evaluation results, and outreach status.

  🎯 Intelligent Filtering**  
    Processes only influencers who meet your criteria (e.g., 5000+ followers, industry match).

  ⚡ Fast & Reliable**  
    Uses professional scraping with robust error handling.

  🔄 Batch Processing**  
    Supports bulk influencer processing through a single automated flow.

  🎯 What This Workflow Does

  Input

  Search Keywords** – TikTok terms for finding niche creators  
  Business Info** – Brand description and industry  
  Collaboration Criteria** – Follower count minimum, niche alignment

  Processing Steps

  Form Submission  
  TikTok Discovery via Bright Data  
  Data Extraction and Normalization  
  Save to Google Sheets  
  Relevance Scoring via Claude AI  
  Filtering Based on AI Score + Follower Count  
  Personalized Email Outreach

  Output Data Points

  | Field         | Description                        | Example                          |
  |---------------|------------------------------------|----------------------------------|
  | Profile ID    | TikTok profile identifier          | tiktoker123456                   |
  | Username      | TikTok handle                      | @creativecreator                 |
  | URL           | Profile link                       | https://tiktok.com/@creativecreator |
  | Description   | Creator bio                        | "Fashion & lifestyle content..." |
  | Followers     | Total follower count               | 50,000                           |
  | Collaboration | AI assessment of brand fit         | "Highly Relevant"               |
  | Analysis      | 50-word Claude AI relevance summary| "Strong alignment with fashion..."|

  🚀 Setup Instructions

  Prerequisites

  n8n (cloud or self-hosted)  
  Bright Data account with TikTok access  
  Google Sheets + Gmail  
  Anthropic Claude API key  
  10–15 minutes setup time

  Step-by-Step Setup

  Import Workflow via JSON in n8n  
  Configure Bright Data – Add API credentials and dataset ID  
  Google Sheets – Setup credentials and map columns  
  Claude AI – Insert API key and select desired model  
  Gmail – Authenticate Gmail and update mail node settings  
  Update Variables – Replace placeholders with business info  
  Test & Launch – Submit a sample form and verify all outputs

  📖 Usage Guide

  Adding Search Keywords

  Submit the form with search terms, business description, and industry category to trigger the workflow.

  Understanding AI Analysis

  Emails are sent only if:
    Collaboration status = Highly Relevant
    Follower count ≥ 5000
    Industry alignment confirmed
  Claude AI returns a 50-word analysis justifying the match

  Customizing Filters

  Edit the "Find the Collaborator" prompt to adjust:
  Follower thresholds
  Industry relevance
  Additional metrics (e.g., engagement rate)

  Viewing Results

  Google Sheets log includes:
  Influencer metadata
  AI scores and rationale
  Collaboration status
  Email delivery timestamp

  🔧 Customization Options

  Add More Fields:** Engagement rate, contact email, content themes  
  Email Personalization:** Customize message templates or integrate other mail services  
  Enhanced Filtering:** Use engagement rates, region, content frequency

  🚨 Troubleshooting

  | Issue | Fix |
  |-------|-----|
  | Bright Data fails | Recheck API and dataset ID |
  | No influencer data | Adjust keywords or dataset scope |
  | Sheets permission error | Re-authenticate and check sharing |
  | Claude fails | Validate API key and prompt |
  | Emails not sent | Re-auth Gmail or update recipient field |
  | Form not triggering | Reconfirm webhook URL and permissions |

  Advanced Debugging

  Check n8n execution logs  
  Run individual nodes for pinpointing failures  
  Confirm all data formats  
  Handle API rate limits  
  Add error-catch nodes for retries

  📊 Use Cases & Examples

  Brand Discovery:** Fashion, tech, fitness creators  
  Competitor Insights:** Find influencers used by rival brands  
  Campaign Planning:** Build targeted influencer lists  
  Market Research:** Identify creator trends across regions

  ⚙️ Advanced Configuration

  Batch Execution:** Process multiple keywords with delay logic  
  Engagement Metrics:** Scrape and calculate likes-to-follower ratios  
  CRM Integration:** Sync qualified profiles to HubSpot, Salesforce, or Slack

  📈 Performance & Limits

  Processing Time:** 3–5 minutes per keyword  
  Concurrency:** 3–5 simultaneous fetches (depends on plan)  
  Accuracy:** >95% influencer data reliability  
  Success Rate:** 90%+ for outreach and processing

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.gmail","n8n-nodes-base.code","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatAnthropic"]

workflow_json:
  {"id":"GA1HTM4YyIidEJb3","meta":{"instanceId":"bc8ca75c203589705ae2e446cad7181d6f2a7cc1766f958ef9f34810e53b8cb2","templateCredsSetupCompleted":true},"name":"Automated TikTok Influencer Discovery & Analysis via Bright Data and Anthropic AI and Send Email Notification","tags":[],"nodes":[{"id":"cb75134b-4746-4715-87b4-c2bb596d4366","name":"Anthropic Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatAnthropic","position":[1460,300],"parameters":{"model":{"__rl":true,"mode":"list","value":"claude-sonnet-4-20250514","cachedResultName":"Claude 4 Sonnet"},"options":{}},"credentials":{"anthropicApi":{"id":"YOUR_ANTHROPIC_CREDENTIAL_ID","name":"Anthropic API Account"}},"typeVersion":1.3},{"id":"aef0b016-6017-4b2a-8bcc-56e78b9a5cc1","name":"Code","type":"n8n-nodes-base.code","position":[1680,0],"parameters":{"jsCode":"// N8N Code Node to extract data from AI output\nconst items = $input.all();\n\nreturn items.map(item => {\n  try {\n    // Get the output string from the item\n    const outputString = item.json.output;\n    \n    // Extract JSON from the markdown code block\n    const jsonMatch = outputString.match(/```json\\n([\\s\\S]*?)\\n```/);\n    \n    if (jsonMatch && jsonMatch[1]) {\n      // Parse the extracted JSON\n      const parsedData = JSON.parse(jsonMatch[1]);\n      \n      // Return the extracted data as separate columns\n      return {\n        json: {\n          Collaboration: parsedData.Collaboration || '',\n          Analysis: parsedData.Analysis || '',\n          Profile_ID: parsedData['Profile ID'] || '',\n          // Keep original data as well if needed\n          original_output: outputString\n        }\n      };\n    } else {\n      // If no JSON found, return empty values\n      return {\n        json: {\n          Collaboration: '',\n          Analysis: '',\n          Profile_ID: '',\n          original_output: outputString,\n          error: 'No JSON found in output'\n        }\n      };\n    }\n  } catch (error) {\n    // Handle any parsing errors\n    return {\n      json: {\n        Collaboration: '',\n        Analysis: '',\n        Profile_ID: '',\n        original_output: item.json.output || '',\n        error: `Parsing error: ${error.message}`\n      }\n    };\n  }\n});"},"typeVersion":2},{"id":"51d9eee9-63c0-43a4-bb03-d94a1d9ceb2a","name":"Google Sheets1","type":"n8n-nodes-base.googleSheets","position":[1980,0],"parameters":{"columns":{"value":{"Analysis":"={{ $json.Analysis }}","Profile ID":"={{ $json.Profile_ID }}","Collaboration":"={{ $json.Collaboration }}"},"schema":[{"id":"Profile ID","type":"string","display":true,"removed":false,"required":false,"displayName":"Profile ID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Username","type":"string","display":true,"required":false,"displayName":"Username","defaultMatch":false,"canBeUsedToMatch":true},{"id":"URL","type":"string","display":true,"required":false,"displayName":"URL","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Description","type":"string","display":true,"required":false,"displayName":"Description","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Followers","type":"string","display":true,"required":false,"displayName":"Followers","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Collaboration","type":"string","display":true,"removed":false,"required":false,"displayName":"Collaboration","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Analysis","type":"string","display":true,"removed":false,"required":false,"displayName":"Analysis","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["Profile ID"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"update","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"YOUR_GOOGLE_SHEET_URL","cachedResultName":"TikTok"},"documentId":{"__rl":true,"mode":"url","value":"YOUR_GOOGLE_SHEET_URL"}},"credentials":{"googleSheetsOAuth2Api":{"id":"YOUR_GOOGLE_SHEETS_CREDENTIAL_ID","name":"Google Sheets OAuth2 Account"}},"typeVersion":4.6},{"id":"4db5fe1f-9038-4746-859b-7b38a2b3056d","name":"Filter","type":"n8n-nodes-base.filter","position":[2240,0],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"7c4c648b-a7df-41d6-bc6c-b6d05221f7bf","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.Collaboration }}","rightValue":"Highly Relevant"}]}},"typeVersion":2.2},{"id":"50db5760-83fe-4119-bb18-27d637acbee9","name":"Gmail","type":"n8n-nodes-base.gmail","position":[2520,0],"webhookId":"76506181-2a59-4275-9277-219134868750","parameters":{"sendTo":"demo@example.com","message":"=Hi,\nI wanted to share some of the best TikTok creators perfectly matched to collaborate with your business. These influencers align closely with your brand and audience, helping you maximize your reach and impact.\nUsername: {{ $('Update Data in the Google Sheet').item.json.Username }}\nTikTok Profile: {{ $('Update Data in the Google Sheet').item.json.URL }}\nFollowers: {{ $('Update Data in the Google Sheet').item.json.Followers }}\n\nLet me know if you'd like more details or to explore specific collaboration opportunities.\n\nBest regards","options":{},"subject":"Top TikTok Influencer Match for Your Business Collaboration","emailType":"text"},"credentials":{"gmailOAuth2":{"id":"YOUR_GMAIL_CREDENTIAL_ID","name":"Gmail OAuth2 Account"}},"typeVersion":2.1},{"id":"a6067955-adf4-4926-8082-81459d5aff1d","name":"Scrape Data from TikTok through Keyword by BrightData","type":"n8n-nodes-base.httpRequest","position":[240,0],"parameters":{"url":"https://api.brightdata.com/datasets/v3/trigger","method":"POST","options":{},"jsonBody":"={\n  \"input\": [\n    {\n      \"search_keyword\": \"{{ $json['Search Keyword'] }}\",\n      \"country\": \"\"\n    }\n  ],\n  \"custom_output_fields\": [\n    \"url\",\n    \"description\",\n    \"profile_id\",\n    \"profile_username\",\n    \"profile_url\",\n    \"profile_followers\"\n  ]\n}","sendBody":true,"sendQuery":true,"sendHeaders":true,"specifyBody":"json","queryParameters":{"parameters":[{"name":"dataset_id","value":"YOUR_BRIGHTDATA_DATASET_ID"},{"name":"include_errors","value":"true"},{"name":"type","value":"discover_new"},{"name":"discover_by","value":"keyword"},{"name":"limit_per_input","value":"5"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_BRIGHTDATA_API_TOKEN"}]}},"typeVersion":4.2},{"id":"fbc8f8b2-5e63-4914-b4b8-a44fa5163cda","name":"3 Minute Wait Time","type":"n8n-nodes-base.wait","position":[520,0],"webhookId":"168ac9b9-ea3f-4aab-b8f1-a3ef6109c70e","parameters":{"unit":"minutes","amount":3},"typeVersion":1.1},{"id":"9ad6728c-2136-46bb-9ddf-0d445b28be22","name":"Extract Data from Snapshot Generated by BrightData","type":"n8n-nodes-base.httpRequest","position":[800,0],"parameters":{"url":"=https://api.brightdata.com/datasets/v3/snapshot/{{ $json.snapshot_id }}","options":{},"sendQuery":true,"sendHeaders":true,"queryParameters":{"parameters":[{"name":"format","value":"json"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_BRIGHTDATA_API_TOKEN"}]}},"typeVersion":4.2},{"id":"8e3577fb-1077-44d4-bada-ca9f5f2aa141","name":"Update Data in the Google Sheet","type":"n8n-nodes-base.googleSheets","position":[1040,0],"parameters":{"columns":{"value":{"URL":"={{ $json.profile_url }}","Username":"={{ $json.profile_username }}","Followers":"={{ $json.profile_followers }}","Profile ID":"={{ $json.profile_id }}","Description":"={{ $json.description }}"},"schema":[{"id":"Profile ID","type":"string","display":true,"required":false,"displayName":"Profile ID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Username","type":"string","display":true,"required":false,"displayName":"Username","defaultMatch":false,"canBeUsedToMatch":true},{"id":"URL","type":"string","display":true,"required":false,"displayName":"URL","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Description","type":"string","display":true,"required":false,"displayName":"Description","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Followers","type":"string","display":true,"required":false,"displayName":"Followers","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Collaboration","type":"string","display":true,"required":false,"displayName":"Collaboration","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Analysis","type":"string","display":true,"required":false,"displayName":"Analysis","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"YOUR_GOOGLE_SHEET_URL","cachedResultName":"TikTok"},"documentId":{"__rl":true,"mode":"url","value":"YOUR_GOOGLE_SHEET_URL"}},"credentials":{"googleSheetsOAuth2Api":{"id":"YOUR_GOOGLE_SHEETS_CREDENTIAL_ID","name":"Google Sheets OAuth2 Account"}},"typeVersion":4.6},{"id":"16bfd75e-fc30-4e6f-94f2-5e554d25cf64","name":"Find the Collaborator","type":"@n8n/n8n-nodes-langchain.agent","position":[1300,0],"parameters":{"text":"=Assume you are a social media expert and you find the best influencers based on the business and industry by analyzing the below data.\nHere are the Details of the Influencers.\nProfile URL: {{ $json.URL }}\nDescription: {{ $json.Description }}\nFollowers: {{ $json.Followers }}\nProfile ID: {{ $json['Profile ID'] }}\n\nMy Business Details:\nAbout my business: {{ $('Submit Form with Keyword, Business Info, Industry').item.json['About My Business'] }}\nIndustry: {{ $('Submit Form with Keyword, Business Info, Industry').item.json.Industry }}\n\nRequirements:\nFollowers should be more than 5000\nand Influencer should be in my industry.\nand Just Provide the Output according to below format\n\nFormat:\nOutput should be in Json\nCollaboration: Not Relevant, Highly Relevant\nAnalysis: Explain in 50 words\nProfile ID: Just add the Profile ID without any change\n","options":{},"promptType":"define"},"typeVersion":2},{"id":"6d482ee5-fd98-4ed3-bfac-dc1ca014769f","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-60,-80],"parameters":{"color":2,"width":220,"height":260,"content":"Triggers the workflow when user submits keyword, business info & industry via form."},"typeVersion":1},{"id":"2b3f2a04-cee9-4fae-8199-2c5cef6969cd","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[180,-80],"parameters":{"color":3,"height":260,"content":"Calls Bright Data API to fetch TikTok profiles by keyword."},"typeVersion":1},{"id":"3aed623a-1827-4641-96dc-d652332946e9","name":"Submit Form with Keyword, Business Info, Industry","type":"n8n-nodes-base.formTrigger","position":[0,0],"webhookId":"f1b746de-9cc3-4218-a9a0-45ff142f5bc7","parameters":{"options":{},"formTitle":"TikTok Profile Scraper","formFields":{"values":[{"fieldLabel":"Search Keyword"},{"fieldLabel":"About My Business"},{"fieldLabel":"Industry"}]}},"typeVersion":2.2},{"id":"c8434c0a-5df9-43e6-924e-6078bbf13c3f","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[460,-80],"parameters":{"color":4,"height":260,"content":"Waits 3 minutes to allow Bright Data to complete scraping."},"typeVersion":1},{"id":"951080be-56e7-4616-a8f3-4bdf6e29be06","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[720,-80],"parameters":{"color":5,"height":260,"content":"Fetches snapshot data (scraped influencer profiles) from Bright Data."},"typeVersion":1},{"id":"2fe42472-7b93-41f3-b2d9-ddf6a1472c32","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[980,-80],"parameters":{"color":6,"height":260,"content":"Stores raw influencer data (ID, followers, description, etc.) in Google Sheets."},"typeVersion":1},{"id":"c6340b5e-bd02-469c-909c-5300430fcba8","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[1260,-80],"parameters":{"color":2,"width":360,"height":260,"content":"Uses Claude AI to evaluate each influencer's relevance to your business. Returns profile ID, relevance, and a 50-word analysis."},"typeVersion":1},{"id":"3c94de79-c64d-4d89-ad9d-387314d84d2b","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[1380,200],"parameters":{"color":6,"height":240,"content":"Claude Sonnet 4 model that powers the influencer analysis."},"typeVersion":1},{"id":"eb61e536-d234-450c-94db-896d24757ad5","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[1640,-80],"parameters":{"color":4,"height":260,"content":"Parses Claude AI's markdown output and extracts structured JSON fields for further use."},"typeVersion":1},{"id":"d08dd360-e26f-421a-bf1f-95976adce3a2","name":"Sticky Note8","type":"n8n-nodes-base.stickyNote","position":[1900,-80],"parameters":{"color":3,"width":260,"height":260,"content":"Logs Claude's insights (Profile ID, Collaboration status, Analysis) into Google Sheets."},"typeVersion":1},{"id":"02d41818-b12f-4b45-9e93-f3b7162cd6f6","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[2180,-80],"parameters":{"height":260,"content":"Filters results to retain only Highly Relevant influencers for email outreach."},"typeVersion":1},{"id":"873b1c8a-fb26-40ca-9885-51c80eb1bd61","name":"Sticky Note11","type":"n8n-nodes-base.stickyNote","position":[2440,-80],"parameters":{"color":5,"width":260,"height":260,"content":"Sends personalized collaboration email to your target contact with top influencer information."},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"18042508-1631-4802-8863-d015a36bed62","connections":{"Code":{"main":[[{"node":"Google Sheets1","type":"main","index":0}]]},"Filter":{"main":[[{"node":"Gmail","type":"main","index":0}]]},"Google Sheets1":{"main":[[{"node":"Filter","type":"main","index":0}]]},"3 Minute Wait Time":{"main":[[{"node":"Extract Data from Snapshot Generated by BrightData","type":"main","index":0}]]},"Anthropic Chat Model":{"ai_languageModel":[[{"node":"Find the Collaborator","type":"ai_languageModel","index":0}]]},"Find the Collaborator":{"main":[[{"node":"Code","type":"main","index":0}]]},"Update Data in the Google Sheet":{"main":[[{"node":"Find the Collaborator","type":"main","index":0}]]},"Submit Form with Keyword, Business Info, Industry":{"main":[[{"node":"Scrape Data from TikTok through Keyword by BrightData","type":"main","index":0}]]},"Extract Data from Snapshot Generated by BrightData":{"main":[[{"node":"Update Data in the Google Sheet","type":"main","index":0}]]},"Scrape Data from TikTok through Keyword by BrightData":{"main":[[{"node":"3 Minute Wait Time","type":"main","index":0}]]}}}


name: LinkedIn Job Finder Automation using Bright Data API & Google Sheets
author_name: Dvir Sharon
author_username: dvirsharon
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest"]
categories: []
created_at: 2025-06-08T08:46:42.907Z
updated_at: 2025-06-08T08:46:42.907Z
url: https://n8n.io/workflows/4775
scraped_at: 2025-06-19 22:48:53
description:
  💼 LinkedIn Job Finder Automation using Bright Data API & Google Sheets


  A comprehensive n8n automation that searches LinkedIn job postings using Bright Data’s API and automatically organizes results in Google Sheets for efficient job hunting and recruitment workflows.

  📋 Overview
  This workflow provides an automated LinkedIn job search solution that collects job postings based on your search criteria and organizes them in Google Sheets. Perfect for job seekers, recruiters, HR professionals, and talent acquisition teams.

  ✨ Key Features
  🔍 Smart Job Search:** Form-based input for city, job title, country, and job type
  🛍 LinkedIn Integration:** Uses Bright Data’s LinkedIn dataset for accurate job posting data
  📊 Automated Organization:** Populates Google Sheets with structured job data
  📧 Real-time Processing:** Processes job search requests in real-time
  📈 Data Storage:** Stores job details including company info, locations, and apply links
  🔄 Batch Processing:** Handles multiple job postings efficiently
  ⚡ Fast & Reliable:** Built-in error handling for scraping
  🎯 Customizable Filters:** Advanced job filtering based on criteria

  🎯 What This Workflow Does
  Input

  Job Search Criteria:** City, job title, country, and optional job type
  Search Parameters:** Configurable filters and limits
  Output Preferences:** Google Sheets destination

  Processing Steps

  Form Submission
  Data Request to Bright Data API
  Status Monitoring
  Data Extraction
  Data Filtering
  Sheet Update
  Error Handling

  Output Data Points

  Field

  Description

  Example

  Job Title

  Position title from posting

  Senior Software Engineer

  Company Name

  Employer company name

  Tech Solutions Inc.

  Job Detail

  Job summary/description

  Remote position requiring 5+ years…

  Location

  Job location

  San Francisco, CA

  Company URL

  Company profile link

  View Profile

  Apply Link

  Direct application link

  Apply Now

  🚀 Setup Instructions
  Prerequisites

  n8n instance (self-hosted or cloud)
  Google account with Sheets access
  Bright Data account with LinkedIn dataset access

  Steps

  Import the Workflow: Use JSON import in n8n
  Configure Bright Data: Add API credentials and dataset ID
  Configure Google Sheets: Create sheet, set credentials, map columns
  Update Workflow Settings: Replace placeholders with your actual data
  Test & Activate: Submit test form and verify data in Google Sheets

  📖 Usage Guide
  Submitting Job Searches

  Go to your webhook URL and fill in the form with:

  City:** e.g., New York
  Job Title:** e.g., Software Engineer
  Country:** e.g., US
  Job Type:** Optional (Full-Time, Remote, etc.)

  Understanding Results

  Comprehensive job data
  Company info and profile links
  Direct application links
  Location and job descriptions

  Customizing Search Parameters

  Edit the Create Snapshot ID node to change:

  Time range (e.g., “Past month”)
  Result limits
  Company filters

  🔧 Customization Options
  More Data Points:** Add salary, seniority, applicants, etc.
  Custom Form Fields:** Add filters for salary, experience, industry
  Multiple Sheets:** Route results by job type or location

  🚨 Troubleshooting
  Bright Data connection failed:** Check API credentials and dataset access
  No job data extracted:** Verify search parameters and API limits
  Google Sheets permission denied:** Re-authenticate and check sharing
  Form not working:** Check webhook URL and field mappings
  Filter issues:** Review logic and data types
  Execution failed:** Check logs, retry logic, and network status

  📊 Use Cases & Examples
  Job Seeker Dashboard:** Automate job search and track applications
  Recruitment Pipeline:** Source candidates and monitor hiring trends
  Market Research:** Analyze job trends and salary benchmarks
  HR Analytics:** Support workforce planning and competitive insights

  ⚙️ Advanced Configuration
  Batch Processing:** Queue multiple searches with delays
  Search History:** Track and analyze past searches
  Tool Integration:** Connect to CRM, Slack, databases, BI tools

  📈 Performance & Limits
  Processing Time:** 30–60 seconds per search
  Concurrent Requests:** 2–3 (depends on Bright Data plan)
  Data Accuracy:** 95%+
  Success Rate:** 90%+
  Daily Capacity:** 50–200 searches
  Memory:** ~50MB per execution
  API Calls:** 3–4 Bright Data + 1 Google Sheets per search

  🤝 Support & Community
  n8n Community:** community.n8n.io
  Documentation:** docs.n8n.io
  Bright Data Support:** Via your Bright Data dashboard
  GitHub Issues:** Report bugs and request features

  🎯 Ready to Use!
  Your workflow is ready for automated LinkedIn job searching. Customize it to your recruiting or job search needs.

  Webhook URL: https://your-n8n-instance.com/webhook/linkedin-job-finder

  What Gets Extracted:

     *   ✅ Job Title *   ✅ Company Information *   ✅ Location Data *   ✅ Job Details *   ✅ Application Links *   ✅ Processing Timestamps  ### Use Cases:  *   🔍 Job Search Automation *   📊 Recruitment Intelligence *   📝 Market Research *   🎯 HR Analytics   

workflow_json:
  {"id":"Eo2mqDdtIQFdZhxp","meta":{"instanceId":"bc8ca75c203589705ae2e446cad7181d6f2a7cc1766f958ef9f34810e53b8cb2","templateCredsSetupCompleted":true},"name":"LinkedIn Job Finder Automation using Bright Data API & Google Sheets Integration","tags":[],"nodes":[{"id":"9617d433-62f7-4ddf-bf47-a9a3208aa248","name":"On form submission1","type":"n8n-nodes-base.formTrigger","position":[-660,-460],"webhookId":"37d0e84c-0cda-47f8-826d-9ae5b22ba1d5","parameters":{"options":{},"formTitle":"LinkedIn Job Finder","formFields":{"values":[{"fieldLabel":"City","requiredField":true},{"fieldLabel":"Job Title","requiredField":true},{"fieldLabel":"Country","requiredField":true},{"fieldType":"dropdown","fieldLabel":"Job_type(Optional)","fieldOptions":{"values":[{"option":"Full-Time"},{"option":"Part-Time"},{"option":"Remote"},{"option":"WFH"},{"option":"Contract"},{"option":"Internship"},{"option":"Freelance"}]}}]}},"typeVersion":2.2},{"id":"47c35950-354c-42e4-b707-60ed5b1eeb2f","name":"Check Final Status","type":"n8n-nodes-base.if","position":[320,-460],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"or","conditions":[{"id":"35ed620d-b5d5-4e97-bcc5-52b283d85616","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.status }}","rightValue":"ready"}]}},"typeVersion":2.2},{"id":"cef9c86d-98ce-4944-9907-d815cba406f4","name":"Create Snapshot ID","type":"n8n-nodes-base.httpRequest","position":[-360,-460],"parameters":{"url":"https://api.brightdata.com/datasets/v3/trigger","method":"POST","options":{},"jsonBody":"={\n  \"input\": [\n    {\n      \"location\": \"{{$node['On form submission1'].json['City'] ? $node['On form submission1'].json['City'].trim() : ''}}\",\n      \"keyword\": \"{{$node['On form submission1'].json['Job Title'] ? $node['On form submission1'].json['Job Title'].trim() : ''}}\",\n      \"country\": \"{{$node['On form submission1'].json['Country'] ? $node['On form submission1'].json['Country'].slice(0, 2).toUpperCase() : ''}}\",\n      \"time_range\": \"Past week\",\n      \"job_type\": \"{{ ['full-time', 'part-time', 'internship', 'contract', 'temporary'].includes($node['On form submission1'].json['Job_type']?.toLowerCase()) ? $node['On form submission1'].json['Job_type'] : '' }}\"\n    }\n  ],\n  \"custom_output_fields\": [\n    \"url\",\n    \"job_posting_id\",\n    \"job_title\",\n    \"company_name\",\n    \"company_id\",\n    \"job_location\",\n    \"job_summary\",\n    \"job_seniority_level\",\n    \"job_function\",\n    \"job_employment_type\",\n    \"job_industries\",\n    \"job_base_pay_range\",\n    \"company_url\",\n    \"job_posted_time\",\n    \"job_num_applicants\",\n    \"discovery_input\",\n    \"apply_link\",\n    \"country_code\",\n    \"title_id\",\n    \"company_logo\",\n    \"job_posted_date\",\n    \"job_poster\",\n    \"application_availability\",\n    \"job_description_formatted\",\n    \"base_salary\",\n    \"timestamp\",\n    \"error\",\n    \"error_code\",\n    \"warning\",\n    \"warning_code\"\n  ]\n}\n","sendBody":true,"sendQuery":true,"sendHeaders":true,"specifyBody":"json","queryParameters":{"parameters":[{"name":"dataset_id","value":"YOUR_DATASET_ID_HERE"},{"name":"include_errors","value":"true"},{"name":"type","value":"discover_new"},{"name":"discover_by","value":"keyword"},{"name":"limit_per_input","value":"2"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_BRIGHTDATA_API_TOKEN_HERE"}]}},"typeVersion":4.2},{"id":"66705bee-6424-4f6f-8c24-d9aa7a198399","name":"Check Snapshot Status","type":"n8n-nodes-base.httpRequest","position":[20,-460],"parameters":{"url":"=https://api.brightdata.com/datasets/v3/progress/{{ $json.snapshot_id }}","options":{},"sendQuery":true,"sendHeaders":true,"queryParameters":{"parameters":[{"name":"format","value":"json"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_BRIGHTDATA_API_TOKEN_HERE"}]}},"typeVersion":4.2},{"id":"b5f9e1c9-eace-4a68-a084-dc254b1b9c46","name":"Wait 1 minute","type":"n8n-nodes-base.wait","position":[620,-100],"webhookId":"7047efad-de41-4608-b95c-d3e0203ef620","parameters":{"unit":"minutes","amount":1},"typeVersion":1.1},{"id":"fff887f5-0388-4667-a5e9-7ef72ea36ac0","name":"Scrape Data from SnapID","type":"n8n-nodes-base.httpRequest","position":[900,-500],"parameters":{"url":"=https://api.brightdata.com/datasets/v3/snapshot/{{ $json.snapshot_id }}","options":{},"sendQuery":true,"sendHeaders":true,"queryParameters":{"parameters":[{"name":"format","value":"json"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_BRIGHTDATA_API_TOKEN_HERE"}]}},"typeVersion":4.2},{"id":"57572d1d-3366-447d-8186-62a121824033","name":"Update Job Lists in sheet","type":"n8n-nodes-base.googleSheets","position":[1380,-500],"parameters":{"columns":{"value":{"Location":"={{ $json.job_location }}","Job Title":"={{ $json.job_title }}","Apply Link":"={{ $json.apply_link }}","Job Detail":"={{ $json.job_summary }}","Company URL":"={{ $json.company_url }}","Company Name ":"={{ $json.company_name }}"},"schema":[{"id":"Company URL","type":"string","display":true,"required":false,"displayName":"Company URL","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Job Title","type":"string","display":true,"required":false,"displayName":"Job Title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Company Name ","type":"string","display":true,"required":false,"displayName":"Company Name ","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Location","type":"string","display":true,"required":false,"displayName":"Location","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Job Detail","type":"string","display":true,"required":false,"displayName":"Job Detail","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Apply Link","type":"string","display":true,"removed":false,"required":false,"displayName":"Apply Link","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID_HERE/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"YOUR_GOOGLE_SHEET_ID_HERE","cachedResultUrl":"https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID_HERE/edit?usp=drivesdk","cachedResultName":"LinkedIn"}},"credentials":{"googleSheetsOAuth2Api":{"id":"YOUR_GOOGLE_SHEETS_CREDENTIAL_ID","name":"Google Sheets Credential"}},"typeVersion":4.6},{"id":"3afbef52-97fe-4ead-8d57-d8e98e684b47","name":"Filter","type":"n8n-nodes-base.filter","position":[1140,-500],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"eb682420-fc89-4e01-a491-5a4a3f6bf10f","operator":{"type":"string","operation":"contains"},"leftValue":"={{ $json.job_summary }}","rightValue":"={{ $json.shortCommonName }}"}]}},"typeVersion":2.2},{"id":"1badd4f4-4f66-4777-a2b7-3343f2afb2b3","name":"If","type":"n8n-nodes-base.if","position":[620,-480],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f01bd215-c406-493c-a6e4-2b8ec5686b44","operator":{"type":"number","operation":"notEquals"},"leftValue":"={{ $json.records }}","rightValue":"={{ 0 }}"}]}},"typeVersion":2.2},{"id":"df16ac92-0f96-40cd-ad9c-da17332a3e81","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-760,-620],"parameters":{"color":2,"width":300,"height":340,"content":"🔹 Search by Keyword — Form Trigger\nPurpose:\nCollects the user-submitted job search criteria including city, job title, country, and job type.\nTriggers the workflow when new search parameters are entered."},"typeVersion":1},{"id":"454c5db0-beb7-4a0b-95ca-8308a114e420","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-440,-660],"parameters":{"color":3,"width":320,"height":380,"content":"🔹 LinkedIn Job Search Fetcher — HTTP Request (POST to Bright Data)\nPurpose:\nSends the job search criteria to Bright Data's LinkedIn dataset API.\nInitiates the scraping job to fetch LinkedIn job postings matching the criteria."},"typeVersion":1},{"id":"c68c4da8-6965-45cb-833f-0bb3a99a289c","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-100,-640],"parameters":{"color":4,"width":300,"height":360,"content":"🔹 Check Delivery Status of Snap ID — HTTP Request (GET)\nPurpose:\nChecks the status of the scraping job using the returned snapshot_id.\nEnsures the task is complete before continuing to data extraction."},"typeVersion":1},{"id":"57d2b098-41ce-4ee6-ab1d-130e2645dc3e","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[500,-220],"parameters":{"color":7,"width":380,"height":280,"content":"🔹 Wait 1 minute — Wait Node\nPurpose:\nDelays the workflow execution by 1 minute.\nPrevents frequent polling of Bright Data API to reduce load and errors."},"typeVersion":1},{"id":"47fc7436-1f6b-4bec-b88c-4df12ceddf57","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[220,-640],"parameters":{"color":5,"width":270,"height":360,"content":"🔹 Check Final Status — IF Node #1\nPurpose:\nConditionally checks if snapshot status is \"ready\".\nIf yes → proceed to download scraped data.\nIf no → loop back to Wait Node and recheck."},"typeVersion":1},{"id":"7a978cd2-efad-474d-92b7-3f9f28155f00","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[820,-680],"parameters":{"color":6,"width":260,"height":400,"content":"🔹 Decode Snapshot from Response — HTTP Request (GET)\nPurpose:\nDownloads the final scraped LinkedIn job dataset using the ready snapshot ID.\nContains full job posting data in JSON format."},"typeVersion":1},{"id":"6ff9b0c5-b18c-44e9-b671-86388428927b","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[1300,-660],"parameters":{"color":3,"width":340,"height":400,"content":"🔹 Google Sheets — Google Sheets (AppendOrUpdate)\nPurpose:\nAppends each LinkedIn job result into your Google Sheet.\nCaptures data fields like job title, company name, location, job details, and apply links."},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"57896d29-3f06-44b6-bb08-964875ffc7fb","connections":{"If":{"main":[[{"node":"Scrape Data from SnapID","type":"main","index":0}]]},"Filter":{"main":[[{"node":"Update Job Lists in sheet","type":"main","index":0}]]},"Wait 1 minute":{"main":[[{"node":"Check Snapshot Status","type":"main","index":0}]]},"Check Final Status":{"main":[[{"node":"If","type":"main","index":0}],[{"node":"Wait 1 minute","type":"main","index":0}]]},"Create Snapshot ID":{"main":[[{"node":"Check Snapshot Status","type":"main","index":0}]]},"On form submission1":{"main":[[{"node":"Create Snapshot ID","type":"main","index":0}]]},"Check Snapshot Status":{"main":[[{"node":"Check Final Status","type":"main","index":0}]]},"Scrape Data from SnapID":{"main":[[{"node":"Filter","type":"main","index":0}]]}}}


name: Transform Documents into Engaging LinkedIn Posts with GPT-4.1 and Email Approval
author_name: Yannick
author_username: yjoly
categories: []
created_at: 2025-06-08T09:48:36.844Z
updated_at: 2025-06-08T09:48:36.844Z
url: https://n8n.io/workflows/4777
scraped_at: 2025-06-19 22:49:30
description:
  🚀 How it works (Fonctionnement résumé) :

  Ce template permet de transformer un document (PDF, TXT, DocX...) en post LinkedIn engageant, prêt à être publié ou validé par email, le tout avec l’aide d’une IA spécialisée en copywriting LinkedIn. Voici les étapes clés :

  Formulaire de dépôt : L'utilisateur charge un fichier ou colle un texte.
  Détection du type de contenu : Un Switch analyse le type de fichier (PDF, DOCX, TXT, ou texte brut). Attention pour DocX nécessite un compte Make pour transformer le doc (mais cela fonctionne aussi sans docX)
  Extraction du contenu : Selon le format, le bon module d'extraction est utilisé.
  Génération d’un post LinkedIn : L'IA transforme le contenu en post LinkedIn selon une méthodologie de copywriting optimisée.
  Validation par email : Un email est envoyé à l’utilisateur pour approbation avec possibilité d’ajouter une image.
  Publication automatique : Si l'utilisateur valide, le post est publié sur LinkedIn.

  ⚙️ Setup Steps :

  Connecte tes comptes :

     Google Docs OAuth
     LinkedIn OAuth
     OpenAI (via gpt-4.1-mini ou un autre modèle)
     SMTP + IMAP pour l'envoi et la lecture d'emails

  Configure les champs du formulaire dans le nœud Form Trigger selon ton usage.

  Personnalise le prompt IA dans le nœud AI Agent si tu veux adapter le ton ou la méthodologie.

  Vérifie les emails dans le nœud d'envoi (Send Email) et de lecture (Email Trigger (IMAP)), pour que la validation fonctionne.

  Teste le workflow avec différents fichiers pour t'assurer que tous les types sont bien traités (PDF, DOCX, TXT, etc.).

  🧩 Cas d’usage typiques :

  Créer des posts à partir de notes de réunion ou de rapports.
  Valoriser un article ou une publication professionnelle sous forme de contenu LinkedIn.
  Déléguer à l'IA le premier jet de ton contenu réseau.
  Bonus surveille une newsletter de ta messagerie pour proposer un post pertinent sur LinkedIn (vous pouvez supprimer il fonctionne en parallèle)

nodes_used:
  ["n8n-nodes-base.emailSend","n8n-nodes-base.httpRequest","n8n-nodes-base.linkedIn","n8n-nodes-base.googleDocs","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatOpenAi"]

workflow_json:
  {"meta":{"instanceId":"6002a3befabff3ab0d043def51067168abaeda5aae33e1ff8bb96d7ae446a51d","templateCredsSetupCompleted":true},"nodes":[{"id":"f83c8742-ad0a-4ce4-83d8-9aa1bcd105f3","name":"On form submission","type":"n8n-nodes-base.formTrigger","position":[0,-220],"webhookId":"459a7ac0-c259-4ec9-b86c-69da2382e965","parameters":{"options":{},"formTitle":"Test","formFields":{"values":[{"fieldType":"file","fieldLabel":"fichier"},{"fieldLabel":"Text","placeholder":"Copier le texte ici"}]}},"typeVersion":2.2},{"id":"ec90f76e-01bb-452a-967b-58e42bdbbff3","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[880,-220],"parameters":{"text":"=Voici un doc peux tu m'en faire un post linkedin : Son titre est {{ $json.info.Title }} son contenu est : {{ $json.text }}, {{ $json.data }}, {{ $json.content }}, {{ $json.Text }},{{ $json.text }}","options":{"systemMessage":"You are a helpful french assistant, tu es spécialiste Linkedin et tu crées des post hyper personnel en mon nom et tu utilises \"Je\" et engageant avec des émoticônes mais pas trop pour maximiser le taux d'engagement tu utilises cette méthode en 4 étapes pour ton contenu :\nLa méthode en 4 étapes pour un contenu qui convertit\nÉtape 1 : définir ton jeu\nIl existe 3 grands types de jeux, et tu dois en choisir un sans compromis :\n1. Le jeu de l'influenceur : Maximiser ta portée pour la monétiser. Tu poursuis le reach.\n- Avantage : une portée de fou qui fait plaisir à l'égo\n- Inconvénient : corrélation faible entre performances du contenu et retombées business.\n2. Le leadership d'opinion : Développer ta marque personnelle pour occuper une thématique et en être au sommet. Tu mesures ton leadership à la fréquence à laquelle on t'invite en conférence ou en podcast pour partager à ce sujet.\n3. Le jeu entrepreneurial : Produire du contenu pour générer des ventes en s'adressant à son client idéal, en partageant son expertise et ses résultats.\n\nMon conseil : choisis le jeu entrepreneurial.\n\nÉtape 2 : définir ton client idéal\nLe client idéal se trouve à l'entrecroisement de 4 facteurs :\n\n1. Problème-solution fit très fort : Tu lui vends A, tu lui délivres A, il est content de recevoir A et rachète potentiellement A\n\n 2. Facilité de génération de résultats : Tu le connais, il est bien positionné\n\n3. Il te paie bien, rapidement, beaucoup et sur la durée : Bonne lifetime value\n\n4. Fit humain : Tu pourrais aller déjeuner avec lui\nL'anti-client, c'est l'inverse :\n- Il convertit lentement\n- Rechigne à payer\n- Tu galères à produire pour lui\n- Le fit humain est faible.\n\n \n\nIdentifier ces deux profils détermine énormément de choses et évolue dans le temps.\nL'anti-client, c'est l'inverse :\n- Il convertit lentement\n- Rechigne à payer\n- Tu galères à produire pour lui\n- Le fit humain est faible.\n\n \n\nIdentifier ces deux profils détermine énormément de choses et évolue dans le temps.\n\nÉtape 3 : ne plus parler qu'à ton client idéal\nVoici la ligne éditoriale théorisée d'un entrepreneur. Il n'y a que trois sujets dont parler :\n\n \n\nLe problème : Tu explores la problématique sous toutes ses dimensions :\n- Le coût d'opportunité de ne pas le résoudre\n- L'urgence\n- Les conséquences.\n\n \n\nLe problème doit être douloureux, urgent, reconnu.\n\n \n\nLes solutions concrètes : Tu transmets ton expertise et démontres pourquoi ton option est la meilleure pour ce client idéal spécifiquement.\n\n \n\nLes preuves : Cas clients, témoignages qui illustrent tout ça. C'est ce qu'on fait jamais assez car ces posts génèrent moins de portée, mais nettement plus de conversions.\n\n \n\n95% du contenu doit corréler à ces 3 piliers : problème,solution,preuve.\n\nÉtape 4 : on s'adresse à des TPE\n\nTu n'hésites pas à citer des références et des parties de texte intéressantes ! Ton texte sera viable sans que j'intervienne pour mettre des liens ou autres, tu n'ajoutes pas dans ton texte Joker : Je suis une IA déguisée !\n\n \n\n"},"promptType":"define","hasOutputParser":true},"typeVersion":2},{"id":"c408d312-3947-4c28-b8a9-2a4cf4ae1353","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[968,0],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4.1-mini","cachedResultName":"gpt-4.1-mini"},"options":{"temperature":0.7}},"credentials":{"openAiApi":{"id":"mpAnIbk6wl7Qmwem","name":"OpenAi account"}},"typeVersion":1.2},{"id":"906ae331-b613-41b9-840a-c0ccb055a874","name":"Extract from File","type":"n8n-nodes-base.extractFromFile","position":[660,-420],"parameters":{"options":{},"operation":"pdf","binaryPropertyName":"fichier"},"typeVersion":1},{"id":"7bb8147e-ae70-46bb-8060-86bfcb365c93","name":"LinkedIn","type":"n8n-nodes-base.linkedIn","position":[1680,-320],"parameters":{"text":"={{ $('AI Agent').item.json.output }}","person":"9wNP5HmVRE","additionalFields":{"visibility":"PUBLIC"},"binaryPropertyName":"Image","shareMediaCategory":"IMAGE"},"credentials":{"linkedInOAuth2Api":{"id":"0cG2Ubnne7CAYCrk","name":"LinkedIn account"}},"typeVersion":1},{"id":"e2b861ad-ce2c-4337-a804-b5880e1df85f","name":"Switch","type":"n8n-nodes-base.switch","position":[220,-220],"parameters":{"rules":{"values":[{"outputKey":"pdf","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"97d20e90-c038-4898-8e79-640e2c95a34c","operator":{"type":"string","operation":"contains"},"leftValue":"={{ $json.fichier[0].mimetype }}","rightValue":"pdf"}]},"renameOutput":true},{"outputKey":"docx","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"22119b44-83c0-49e5-bbf3-7b2896c65314","operator":{"type":"string","operation":"contains"},"leftValue":"={{ $json.fichier[0].mimetype }}","rightValue":"document"}]},"renameOutput":true},{"outputKey":"txt","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"8b3d7fc3-a5d0-48d0-87cb-587465f04b2f","operator":{"type":"string","operation":"contains"},"leftValue":"={{ $json.fichier[0].mimetype }}","rightValue":"text"}]},"renameOutput":true},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"70110653-142e-499e-9104-487699413902","operator":{"type":"string","operation":"notEmpty","singleValue":true},"leftValue":"{{ $json.Text }}","rightValue":"="}]}}]},"options":{}},"typeVersion":3.2},{"id":"9d798da2-c2c9-4483-bca9-2e3b8ef070d5","name":"Extract from File1","type":"n8n-nodes-base.extractFromFile","position":[660,-20],"parameters":{"options":{},"operation":"text","binaryPropertyName":"fichier"},"typeVersion":1},{"id":"03e9122f-99c6-4a26-8373-2e1c7c4136bd","name":"Google Docs","type":"n8n-nodes-base.googleDocs","position":[660,-220],"parameters":{"operation":"get","documentURL":"={{ $json.data }}"},"credentials":{"googleDocsOAuth2Api":{"id":"5dX4YZsx0ouWm0RF","name":"Google Docs account"}},"typeVersion":2},{"id":"7829c078-fb7b-4296-ba42-c7ba76ef7db7","name":"HTTP Request2","type":"n8n-nodes-base.httpRequest","position":[440,-220],"parameters":{"url":"https://hook.integrator.boost.space/w71nefqvpxa60j1u58gd44nwbogpoo25","method":"POST","options":{},"sendBody":true,"contentType":"binaryData","inputDataFieldName":"fichier"},"typeVersion":4.2},{"id":"afdc4cc8-8af5-42c5-a813-da63132e53f1","name":"Send Email","type":"n8n-nodes-base.emailSend","position":[1260,-220],"webhookId":"3c904a1a-9fc1-405d-8c20-4d6d4f1d2a91","parameters":{"message":"=<p>Tu valides ou pas ?</p>\n\n {{ $json.output }}","options":{"appendAttribution":false},"subject":"LinkedIn ?","toEmail":"yjoly@yjoly.fr","fromEmail":"yannick.joly@agroparistech.fr","operation":"sendAndWait","formFields":{"values":[{"fieldType":"file","fieldLabel":"Image"},{"fieldLabel":"Tu valides (oui/non)","requiredField":true}]},"responseType":"customForm"},"credentials":{"smtp":{"id":"CkiNSc7lzyhCLIBL","name":"SMTP account 2"}},"typeVersion":2.1},{"id":"0e65e913-9a14-4f5d-b1d3-661efff5396d","name":"Switch1","type":"n8n-nodes-base.switch","position":[1480,-220],"parameters":{"rules":{"values":[{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"488f8643-67da-4546-b4ae-c49a3fe0ef00","operator":{"type":"string","operation":"contains"},"leftValue":"={{ $json.data[\"Tu valides (oui/non)\"] }}","rightValue":"oui"}]}},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"7f74c53e-61b2-4977-8342-d54c705a8cbb","operator":{"type":"string","operation":"contains"},"leftValue":"={{ $json.data[\"Tu valides (oui/non)\"] }}","rightValue":"non"}]}}]},"options":{}},"typeVersion":3.2},{"id":"94ac12d5-86a4-4fdc-a778-b42e8fdbe0e8","name":"Email Trigger (IMAP)","type":"n8n-nodes-base.emailReadImap","position":[40,-540],"parameters":{"format":"resolved","options":{"customEmailConfig":"[\"UNSEEN\", [\"FROM\", \"mammam-ia-v2@mail.beehiiv.com\"]]"}},"credentials":{"imap":{"id":"dKdc0hUqfWSexcLF","name":"IMAP yjoly"}},"typeVersion":2}],"pinData":{},"connections":{"Switch":{"main":[[{"node":"Extract from File","type":"main","index":0}],[{"node":"HTTP Request2","type":"main","index":0}],[{"node":"Extract from File1","type":"main","index":0}],[{"node":"AI Agent","type":"main","index":0}]]},"Switch1":{"main":[[{"node":"LinkedIn","type":"main","index":0}],[]]},"AI Agent":{"main":[[{"node":"Send Email","type":"main","index":0}]]},"Send Email":{"main":[[{"node":"Switch1","type":"main","index":0}]]},"Google Docs":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"HTTP Request2":{"main":[[{"node":"Google Docs","type":"main","index":0}]]},"Extract from File":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"Extract from File1":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"On form submission":{"main":[[{"node":"Switch","type":"main","index":0}]]},"Email Trigger (IMAP)":{"main":[[{"node":"AI Agent","type":"main","index":0}]]}}}


name: Automatically Sync Google Calendar Events to Google Sheets Tracker
author_name: Shi Varong
author_username: svar-n8n
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.googleCalendar","n8n-nodes-base.code"]
categories: []
created_at: 2025-06-08T10:07:04.007Z
updated_at: 2025-06-08T10:07:04.007Z
url: https://n8n.io/workflows/4778
scraped_at: 2025-06-19 22:50:42
description:
  How it works
  Listens for new or updated events in your chosen Google Calendar.
  Extracts key details like event name, date, time, description, and attendees.
  Adds each event as a new row in your connected Google Sheet.
  Prevents duplicates by checking for existing Event IDs before inserting.

  ✨ Open your spreadsheet to instantly see a clean, structured list of all scheduled events—perfect for reports, planning, or sharing with others who don’t use Google Calendar.



  Set up steps
  Connect your Google Calendar and Google Sheets accounts in n8n.
  Select the calendar you want to monitor and the spreadsheet you want to write to.
  Set up your Google Sheet with appropriate columns (e.g. Event ID, Title, Description, Start Time, End Time, Location).
  Customize your node to match the event fields with spreadsheet columns.
  Enable the workflow and run it once to test.

  ⏱️ Setup Time: ~10–20 minutes depending on familiarity with n8n and Google integrations.

  🔧 No coding required—just drag, drop, and configure nodes.

workflow_json:
  {"id":"tpJVuoH0Z7kyiXZH","meta":{"instanceId":"3f5dc502ba8ad809ce92e2700eacbfc6e18a9b581bf97a1f829d453fba1ca472","templateCredsSetupCompleted":true},"name":"google-calendar-shees-template-v1.0","tags":[],"nodes":[{"id":"e7d2f6c5-9d54-496b-83ff-1d22e6782c43","name":"Schedule Trigger1","type":"n8n-nodes-base.scheduleTrigger","notes":"Every 1 min","position":[4040,1320],"parameters":{},"notesInFlow":true,"typeVersion":1.2},{"id":"834ec869-a81e-4d28-b9d5-9dc81d4cece6","name":"Get Events1","type":"n8n-nodes-base.googleCalendar","notes":"Get events","position":[4460,1320],"parameters":{},"notesInFlow":true,"typeVersion":1.3},{"id":"5ee267ed-5b2a-4bd3-a4e6-f8d101433892","name":"Check for Empty Events1","type":"n8n-nodes-base.if","position":[4700,1320],"parameters":{},"typeVersion":2.2,"alwaysOutputData":true},{"id":"404884b7-8b8d-405d-a6dd-27217f2c6ac4","name":"Loop Over Events & Rows1","type":"n8n-nodes-base.splitInBatches","notes":"Loop over","position":[5160,1340],"parameters":{},"typeVersion":3},{"id":"9355e33a-109c-41d2-abec-559ebbf97758","name":"Get Rows1","type":"n8n-nodes-base.googleSheets","notes":"Get rows","onError":"continueRegularOutput","position":[5420,1440],"parameters":{},"executeOnce":true,"notesInFlow":true,"retryOnFail":false,"typeVersion":4.6,"alwaysOutputData":true},{"id":"d57d6abc-af73-41b7-8e3d-c4346d934171","name":"Match Events vs Rows1","type":"n8n-nodes-base.code","notes":"Check event against sheet","position":[5800,1320],"parameters":{},"notesInFlow":true,"typeVersion":2,"alwaysOutputData":false},{"id":"d587e1c9-b04d-417f-b155-847df5ac83cb","name":"Check for Match1","type":"n8n-nodes-base.if","notes":"true -> update; false -> add to sheet","position":[6040,1320],"parameters":{},"notesInFlow":true,"typeVersion":2.2},{"id":"48c435fb-df81-44a4-ad55-8cf7db844b76","name":"Update Sheet1","type":"n8n-nodes-base.googleSheets","notes":"Update rows in sheet","position":[6340,1300],"parameters":{},"notesInFlow":true,"typeVersion":4.6},{"id":"04e8f9f2-0c1c-4a2b-83a6-5bf9a9d14943","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[4320,1500],"parameters":{"content":""},"typeVersion":1},{"id":"fcc2f4e1-06bc-4c4a-99b9-1efd869644d5","name":"Sticky Note10","type":"n8n-nodes-base.stickyNote","position":[4320,1220],"parameters":{"content":""},"typeVersion":1},{"id":"66e8c77d-d12b-41ae-a631-bf603687562e","name":"Sticky Note11","type":"n8n-nodes-base.stickyNote","position":[3960,1260],"parameters":{"content":""},"typeVersion":1},{"id":"f978e8f1-0f29-44c3-8e99-4422b5dba01c","name":"Sticky Note12","type":"n8n-nodes-base.stickyNote","position":[3960,1500],"parameters":{"content":""},"typeVersion":1},{"id":"c4929ab1-873d-41d5-8a0d-ff4cc96c2d90","name":"Sticky Note13","type":"n8n-nodes-base.stickyNote","position":[5040,1220],"parameters":{"content":""},"typeVersion":1},{"id":"fdf237ab-5851-472f-92e5-11fa41f53555","name":"Sticky Note14","type":"n8n-nodes-base.stickyNote","position":[5040,1680],"parameters":{"content":""},"typeVersion":1},{"id":"21ee9327-52b6-48b0-b756-ca125c6ed697","name":"Sticky Note15","type":"n8n-nodes-base.stickyNote","position":[5700,1220],"parameters":{"content":""},"typeVersion":1},{"id":"fa732d6e-36a9-4604-90ef-38bc467c6d5a","name":"Sticky Note16","type":"n8n-nodes-base.stickyNote","position":[5700,1680],"parameters":{"content":""},"typeVersion":1},{"id":"ff657f6f-9da2-4c1a-8fc6-89dd8a6c8efa","name":"Add to Sheet1","type":"n8n-nodes-base.googleSheets","notes":"Add rows to sheet","position":[6340,1480],"parameters":{},"notesInFlow":true,"typeVersion":4.6},{"id":"b3c2f7df-409a-4699-a48b-9a1bf1c227fb","name":"Sticky Note17","type":"n8n-nodes-base.stickyNote","position":[3940,1040],"parameters":{"content":""},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"1a845fb1-74c7-4d0f-9c1b-a11d7174fd55","connections":{"Get Rows1":{"main":[[{"node":"Loop Over Events & Rows1","type":"main","index":0}]]},"Get Events1":{"main":[[{"node":"Check for Empty Events1","type":"main","index":0}]]},"Check for Match1":{"main":[[{"node":"Update Sheet1","type":"main","index":0}],[{"node":"Add to Sheet1","type":"main","index":0}]]},"Schedule Trigger1":{"main":[[{"node":"Get Events1","type":"main","index":0}]]},"Match Events vs Rows1":{"main":[[{"node":"Check for Match1","type":"main","index":0}]]},"Check for Empty Events1":{"main":[[],[{"node":"Loop Over Events & Rows1","type":"main","index":0}]]},"Loop Over Events & Rows1":{"main":[[{"node":"Match Events vs Rows1","type":"main","index":0}],[{"node":"Get Rows1","type":"main","index":0}]]}}}


name: Automated Weekly Google Calendar Summary via Email with AI ✨🗓️📧
author_name: Jez
author_username: jez
categories: []
created_at: 2025-06-08T12:50:39.274Z
updated_at: 2025-06-08T12:50:39.274Z
url: https://n8n.io/workflows/4783
scraped_at: 2025-06-19 22:48:52
description:
  Workflow: Automated Weekly Google Calendar Summary via Email with AI ✨🗓️📧

  Get a personalized, AI-powered summary of your upcoming week's Google Calendar events delivered straight to your inbox! This workflow automates the entire process, from fetching events to generating an intelligent summary and emailing it to you.

  🌟 Overview

  This n8n workflow connects to your Google Calendar, retrieves events for the upcoming week (Monday to Sunday, based on the day the workflow runs), uses Google Gemini AI to create a well-structured and insightful summary, and then emails this summary to you. It's designed to help you start your week organized and aware of your commitments.

  Key Features:

  Automated Weekly Summary:** Runs on a schedule (default: weekly) to keep you updated.
  AI-Powered Insights:** Leverages Google Gemini to not just list events, but to identify important ones and offer a brief weekly outlook.
  Personalized Content:** Uses your specified timezone, locale, name, and city for accurate and relevant information.
  Clear Formatting:** Events are grouped by day and displayed chronologically with start and end times. Important events are highlighted.
  Email Delivery:** Receive your schedule directly in your inbox in a clean HTML format.
  Customizable:** Easily adapt to your specific calendar, AI preferences, and email settings.

  ⚙️ How It Works: Step-by-Step

  The workflow consists of the following nodes, working in sequence:

  weekly_schedule (Schedule Trigger):
      What it does: Initiates the workflow.
      Default: Triggers once a week at 12:00 PM. You can adjust this to your preference (e.g., Sunday evening or Monday morning).

  locale (Set Node):
      What it does: This is a crucial node for you to configure! It sets user-specific parameters like your preferred language/region (users-locale), timezone (users-timezone), your name (users-name), and your home city (users-home-city). These are used throughout the workflow for correct date/time formatting and personalizing the AI prompt.

  date-time (Set Node):
      What it does: Dynamically generates various date and time strings based on the current execution time and the locale settings. This is used to define the precise 7-day window (from the current day to 7 days ahead, ending at midnight) for fetching calendar events.

  get_next_weeks_events (Google Calendar Node):
      What it does: Connects to your specified Google Calendar and fetches all events within the 7-day window calculated by the date-time node.
      Requires: Google Calendar API credentials and the ID of the calendar you want to use.

  simplify_evens_json (Code Node):
      What it does: Runs a small JavaScript snippet to clean up the raw event data from Google Calendar. It removes several fields that aren't needed for the summary (like htmlLink, etag, iCalUID), making the data more concise for the AI.

  aggregate_events (Aggregate Node):
      What it does: Takes all the individual (and now simplified) event items and groups them into a single JSON array called eventdata. This is the format the AI agent expects for processing.

  Google Gemini (LM Chat Google Gemini Node):
      What it does: This node is the connection point to the Google Gemini language model.
      Requires: Google Gemini (or PaLM) API credentials.

  event_summary_agent (Agent Node):
      What it does: This is where the magic happens! It uses the Google Gemini model and a detailed system prompt to generate the weekly schedule summary.
      The Prompt Instructs the AI to:
          Start with a friendly greeting.
          Group events by day (Monday to Sunday) for the upcoming week, using the user's timezone and locale.
          Format event times clearly (e.g., 09:30 AM - 10:30 AM: Event Summary).
          Identify and prefix "IMPORTANT:" to events with keywords like "urgent," "deadline," "meeting," etc., in their summary or description.
          Conclude with a 1-2 sentence helpful insight about the week's schedule.
          Process the input eventdata (the JSON array of calendar events).

  Markdown (Markdown to HTML Node):
      What it does: Converts the text output from the event_summary_agent (which is generated in Markdown format for easy structure) into HTML. This ensures the email body is well-formatted with proper line breaks, lists, and emphasis.

  send_email (Email Send Node):
      What it does: Sends the final HTML summary to your specified email address.
      Requires: SMTP (email sending) credentials and your desired "From" and "To" email addresses.

  🚀 Getting Started: Setup Instructions

  Follow these steps to get the workflow up and running:

  Import the Workflow:
      Download the workflow JSON file.
      In your n8n instance, go to "Workflows" and click the "Import from File" button. Select the downloaded JSON file.

  Configure Credentials:
      You'll need to set up credentials for three services. In n8n, go to "Credentials" on the left sidebar and click "Add credential."
      Google Calendar API:
          Search for "Google Calendar" and create new credentials using OAuth2. Follow the authentication flow.
          Once created, select these credentials in the get_next_weeks_events node.
      Google Gemini (PaLM) API:
          Search for "Google Gemini" or "Google PaLM" and create new credentials. You'll typically need an API key from Google AI Studio or Google Cloud.
          Once created, select these credentials in the Google Gemini node.
      SMTP / Email:
          Search for your email provider (e.g., "SMTP," "Gmail," "Outlook") and create credentials. This usually involves providing your email server details, username, and password/app password.
          Once created, select these credentials in the send_email node.

  ‼️ IMPORTANT: Customize User Settings in the locale Node:
      Open the locale node.
      Update the following values in the "Assignments" section:
          users-locale: Set your locale string (e.g., "en-AU" for English/Australia, "en-US" for English/United States, "de-DE" for German/Germany). This affects how dates, times, and numbers are formatted.
          users-timezone: Set your timezone string (e.g., "Australia/Sydney", "America/New_York", "Europe/London"). This is critical for ensuring event times are displayed correctly for your location.
          users-name: Enter your name (e.g., "Bob"). This is used to personalize the email greeting.
          users-home-city: Enter your home city (e.g., "Sydney"). This can be used for additional context by the AI.

  Configure the get_next_weeks_events (Google Calendar) Node:
      Open the node.
      In the "Calendar" parameter, you need to specify which calendar to fetch events from.
          The default might be a placeholder like c_4d9c2d4e139327143ee4a5bc4db531ffe074e98d21d1c28662b4a4d4da898866@group.calendar.google.com.
          Change this to your primary calendar (often your email address) or the specific Calendar ID you want to use. You can find Calendar IDs in your Google Calendar settings.

  Configure the send_email Node:
      Open the node.
      Set the fromEmail parameter to the email address you want the summary to be sent from.
      Set the toEmail parameter to the email address(es) where you want to receive the summary.
      You can also customize the subject line if desired.

  (Optional) Customize the AI Prompt in event_summary_agent:
      If you want to change how the AI summarizes events (e.g., different keywords for important events, a different tone, or specific formatting tweaks), you can edit the "System Message" within the event_summary_agent node's parameters.

  (Optional) Adjust the Schedule in weekly_schedule:
      Open the weekly_schedule node.
      Modify the "Rule" to change when and how often the workflow runs (e.g., a specific day of the week, a different time).

  Activate the Workflow:
      Once everything is configured, toggle the "Active" switch in the top right corner of the workflow editor to ON.

  📬 What You Get

  You'll receive an email (based on your schedule) with a subject like "Next Week Calendar Summary : [Start Date] - [End Date]". The email body will contain:

  A friendly greeting.
  Your schedule for the upcoming week (Monday to Sunday), with events listed chronologically under each day.
  Event times displayed in your local timezone (e.g., 09:30 AM - 10:30 AM: Team Meeting).
  Priority events clearly marked (e.g., IMPORTANT: 02:00 PM - 03:00 PM: Project Deadline Review).
  A brief, insightful observation about your week's schedule.

  🛠️ Troubleshooting & Notes

  Timezone is Key:** Ensure your users-timezone in the locale node is correct. This is the most common source of incorrect event times.
  Google API Permissions:** When setting up Google Calendar and Gemini credentials, make sure you grant the necessary permissions.
  AI Output Varies:** The AI-generated summary can vary slightly each time. The prompt is designed to guide it, but LLMs have inherent creativity.
  Calendar Event Details:** The quality of the summary (especially for identifying important events) depends on how detailed your calendar event titles and descriptions are. Including keywords like "meeting," "urgent," "prepare for," etc., in your events helps the AI.

  💬 Feedback & Contributions

  Feel free to modify and enhance this workflow! If you have suggestions, improvements, or run into issues, please share them in the n8n community.

  Happy scheduling!

nodes_used:
  ["n8n-nodes-base.emailSend","n8n-nodes-base.googleCalendar","n8n-nodes-base.code","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatGoogleGemini"]

workflow_json:
  {"id":"81UkThrSnnFw6IJo","meta":{"instanceId":"3612a0c89f35a354ddd1216385240db51b4635fde7cae2a0d5004be915b832f3","templateCredsSetupCompleted":true},"name":"Google Calendar Coming Week","tags":[],"nodes":[{"id":"b4c54286-a4c5-4a1b-87ca-a37fa1fcb2aa","name":"weekly_schedule","type":"n8n-nodes-base.scheduleTrigger","position":[-180,-40],"parameters":{"rule":{"interval":[{"field":"weeks","triggerAtHour":12}]}},"typeVersion":1.2},{"id":"57a88176-a291-4d65-bfd2-868d4e50befb","name":"get_next_weeks_events","type":"n8n-nodes-base.googleCalendar","position":[1300,-40],"parameters":{"options":{},"timeMax":"={{ $json['users-current-day-1-minute-before-midnight-plus-7-days-iso'] }}","timeMin":"={{ $json['users-current-day-1-minute-before-midnight-iso'] }}","calendar":{"__rl":true,"mode":"list","value":"c_4d9c2d4e139327143ee4a5bc4db531ffe074e98d21d1c28662b4a4d4da898866@group.calendar.google.com","cachedResultName":"n8n-personal-assistant-demo"},"operation":"getAll","returnAll":true},"credentials":{"googleCalendarOAuth2Api":{"id":"a1DI60kDgcdbIlXb","name":"Google Calendar account"}},"typeVersion":1.3},{"id":"ed2eacbb-453f-4e5b-be3a-0c45e3506e1b","name":"Google Gemini","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[2840,580],"parameters":{"options":{},"modelName":"models/gemini-2.5-flash-preview-05-20"},"credentials":{"googlePalmApi":{"id":"lBQrszvhtstelPlO","name":"Google Gemini(PaLM) Api account 4"}},"typeVersion":1},{"id":"20670d58-0c0a-4f17-9a89-131bb2cd2caa","name":"event_summary_agent","type":"@n8n/n8n-nodes-langchain.agent","position":[2740,-40],"parameters":{"text":"={{ $json.eventdata }}","options":{"systemMessage":"=You have been given a JSON array of Google Calendar events for the upcoming week (Monday to Sunday). Today is Sunday, {{ $('locale').item.json['users-current-date'] ? $('locale').item.json['users-current-date'] : $now.setZone($('locale').item.json['users-timezone'] ?? 'Australia/Sydney').setLocale($('locale').item.json['users-locale'] ?? 'en-AU').toLocaleString({ weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' }) }}.\nEach event object in the array has 'summary', 'start.dateTime', 'end.dateTime', and 'description'. Your designated timezone is '{{ $('locale').item.json['users-timezone'] }}' and locale '{{ $('locale').item.json['users-locale'] }}'.\n\nThe users name is: {{ $('locale').item.json['users-name'] }}\nThe user is located in: {{ $('locale').item.json['users-home-city'] }}\n\nYour task is to create a well-formatted weekly schedule summary for an email.\n\n1.  **Greeting**: Start with a friendly greeting, for example: \"Here's your schedule for the upcoming week:\"\n\n2.  **Daily Schedule**:\n    *   Group events by day (e.g., Monday, June 9, 2025; Tuesday, June 10, 2025). Determine the correct dates for the upcoming week (Monday to Sunday) based on today's date.\n    *   For each day of the upcoming week, list its events chronologically.\n    *   Format each event as: `HH:MM AM/PM - HH:MM AM/PM: Event Summary`. For example: `09:30 AM - 10:30 AM: Team Meeting`.\n    *   Parse the `start.dateTime` and `end.dateTime` (which are ISO strings with timezone offsets like `+10:00`) and display them correctly for the '{{ $('locale').item.json['users-timezone'] }}' timezone.\n    *   If a day has no events, state \"No events scheduled for this day.\"\n\n3.  **Priority Events**:\n    *   Review the 'summary' and 'description' fields for keywords such as \"important\", \"urgent\", \"deadline\", \"meeting\", \"critical\", \"prepare\", or similar terms that indicate significance.\n    *   Mark these priority events by prefixing the event line with \"IMPORTANT: \". For example: `IMPORTANT: 02:00 PM - 03:00 PM: Project Deadline Review`.\n    *   If the 'description' provides actionable context for a priority event (e.g., \"Preparation needed: review X document\"), you can briefly mention this context after the event summary.\n\n4.  **Weekly Insight**:\n    *   Conclude with 1-2 sentences offering a helpful insight, observation, or piece of advice related to the week's schedule. Examples:\n        *   \"Thursday looks like your busiest day, so you might want to plan accordingly.\"\n        *   \"Remember to allocate some time to prepare for the client presentation on Wednesday.\"\n        *   \"This week seems to have a good balance of meetings and free time.\"\n\n5.  **Input Data Structure Reminder**: The calendar events are provided as a JSON array. You need to process this entire array.\n\nPlease generate only the text content suitable for the body of an email. Do not include any preamble (like \"Okay, here is the summary...\") or sign-off beyond the requested content."},"promptType":"define"},"typeVersion":2},{"id":"99885550-0c81-4513-86f0-8e82b0d5e0fb","name":"send_email","type":"n8n-nodes-base.emailSend","position":[3800,-40],"webhookId":"7748b0f5-1a6a-42bf-b1c0-63051d6a62a2","parameters":{"html":"={{ $json['email-html'] }}","options":{"appendAttribution":false},"subject":"=Next Week Calendar Summary : {{ $now.plus({ days: 1 }).day }}-{{ $now.plus({ days: 7 }).toLocaleString(DateTime.DATE_MED) }}"},"credentials":{"smtp":{"id":"AoLopFA5yBSkhbrF","name":"SMTP account"}},"typeVersion":2.1},{"id":"9199043b-2255-4a29-9c76-e6edbda41cc5","name":"locale","type":"n8n-nodes-base.set","position":[300,-40],"parameters":{"options":{},"assignments":{"assignments":[{"id":"2fa6da62-0c1b-4abe-b1d1-45dab7c22ab0","name":"users-locale","type":"string","value":"en-AU"},{"id":"e997127b-a7b1-4684-82b3-3e5d66be07fa","name":"users-timezone","type":"string","value":"Australia/Sydney"},{"id":"082e8d8f-5b20-4fc0-a59e-6deb48cb1406","name":"users-name","type":"string","value":"Bob"},{"id":"4a867353-6d0c-4bad-90f9-e739ff1da010","name":"users-home-city","type":"string","value":"Sydney"}]}},"typeVersion":3.4},{"id":"b92e0c62-d83f-417d-9ed1-839b3f680edd","name":"simplify_evens_json","type":"n8n-nodes-base.code","position":[1800,-40],"parameters":{"jsCode":"// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor (const item of $input.all()) {\n  delete item.json.htmlLink\n  delete item.json.etag\n  delete item.json.iCalUID\n  delete item.json.start.timeZone\n  delete item.json.end.timeZone\n  delete item.json.kind\n  delete item.json.reminders\n  delete item.json.organizer\n  delete item.json.creator\n  delete item.json.created\n  delete item.json.updated\n  delete item.json.status\n  delete item.json.eventType\n  delete item.json.id\n}\n\nreturn $input.all();"},"typeVersion":2},{"id":"c3639753-7b59-40ea-b59b-32dc00769146","name":"aggregate_events","type":"n8n-nodes-base.aggregate","position":[2320,-40],"parameters":{"options":{},"aggregate":"aggregateAllItemData","destinationFieldName":"eventdata"},"typeVersion":1},{"id":"bb2804c2-130e-4d53-9eac-cb4f978056d1","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-360,-1100],"parameters":{"color":3,"width":960,"height":520,"content":"### Workflow Overview: Google Calendar Coming Week 🗓️➡️📧\n\nThis n8n workflow automates the process of generating and emailing a summary of your upcoming week's Google Calendar events.\n\n**How it works:**\n1.  **Triggers weekly:** Starts automatically based on a schedule.\n2.  **Sets user context:** Configures your locale, timezone, name, and city.\n3.  **Calculates date ranges:** Determines the start and end dates for the upcoming week.\n4.  **Fetches calendar events:** Retrieves events from your specified Google Calendar for that week.\n5.  **Simplifies data:** Removes unnecessary information from the event data.\n6.  **Aggregates events:** Combines all events into a single list for AI processing.\n7.  **Generates summary:** Uses Google Gemini AI to create a human-readable summary, highlighting important events.\n8.  **Formats for email:** Converts the AI's summary from Markdown to HTML.\n9.  **Sends email:** Emails the formatted summary to you.\n\n**Key User Actions:**\n*   Configure the **`locale`** node with your specific details (timezone, locale, name, city).\n*   Set up credentials for **Google Calendar**, **Google Gemini**, and your **SMTP (Email)** service.\n*   Specify your target Google Calendar ID in the **`get_next_weeks_events`** node.\n*   Update the \"To\" and \"From\" email addresses in the **`send_email`** node."},"typeVersion":1},{"id":"4e8a4adb-fde7-403d-968e-7d15c2fbe770","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[140,-400],"parameters":{"color":4,"width":440,"height":400,"content":"⚙️ **locale (Set)**\n\n*   **Purpose:** Defines essential user-specific settings for personalization and correct date/time processing.\n*   **‼️ USER ACTION REQUIRED ‼️:**\n    *   `users-locale`: (e.g., `en-AU`, `en-US`, `de-DE`) - Affects date/time/number formatting.\n    *   `users-timezone`: (e.g., `Australia/Sydney`, `America/New_York`) - Crucial for accurate event times.\n    *   `users-name`: (e.g., `Bob`) - Used in the email greeting.\n    *   `users-home-city`: (e.g., `Sydney`) - Provides context for the AI.\n*   **Note:** These values are used by downstream nodes."},"typeVersion":1},{"id":"a409ad6d-56be-4b3c-a1e3-b2b3e2c00b63","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-360,-400],"parameters":{"color":4,"width":440,"height":400,"content":"🗓️ **weekly_schedule (Trigger)**\n\n*   **Purpose:** Initiates the workflow automatically.\n*   **Details:** By default, runs once a week at 12:00 PM.\n*   **To Modify:** Adjust the \"Rule\" settings (interval, time, day) if you need a different schedule."},"typeVersion":1},{"id":"714b924c-4cbc-4864-b833-e80b3dcecde8","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[640,-400],"parameters":{"color":4,"width":440,"height":400,"content":"⏰ **date_time (Set)**\n\n*   **Purpose:** Generates various date and time strings based on the current execution time and the settings from the `locale` node.\n*   **Details:** Creates values like \"users-current-date\", \"users-current-day-1-minute-before-midnight-iso\", etc., which are used to define the 7-day window for fetching calendar events.\n*   **To Modify:** Usually no changes needed here; it's dynamic."},"typeVersion":1},{"id":"a31c71e7-98c8-4185-891e-9543ceac217d","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[1140,-400],"parameters":{"color":4,"width":440,"height":400,"content":"📅 **get_next_weeks_events (Google Calendar)**\n\n*   **Purpose:** Fetches events from a specified Google Calendar.\n*   **Details:** Uses `timeMin` and `timeMax` from the `date-time` node to get events for the upcoming 7 days.\n*   **‼️ USER ACTION REQUIRED ‼️:**\n    1.  **Credentials:** Connect your Google Calendar account.\n    2.  **Calendar ID:** Change the `calendar` parameter (currently `c_4d9...group.calendar.google.com`) to *your* desired Google Calendar ID."},"typeVersion":1},{"id":"5e5830c6-9e43-43c7-852e-b9982f6deb6b","name":"date_time","type":"n8n-nodes-base.set","position":[820,-40],"parameters":{"options":{},"assignments":{"assignments":[{"id":"954044f7-3c08-48c2-af9c-59a72690ad76","name":"users-current-date","type":"string","value":"={{\n  $now.setZone($('locale').item.json['users-timezone'] ?? 'UTC').setLocale($('locale').item.json['users-locale'] ?? 'en-US').toLocaleString(DateTime.DATE_FULL)\n}}"},{"id":"2c3a0a1a-cc05-4b5d-b175-20732706aefb","name":"users-current-time","type":"string","value":"={{ $now.setZone($('locale').item.json['users-timezone'] ?? 'UTC').setLocale($('locale').item.json['users-locale'] ?? 'en-US').toLocaleString(DateTime.TIME_SIMPLE) }}"},{"id":"764b3b1a-6a6e-4b92-8f41-ae49405bc72a","name":"users-date-time","type":"string","value":"={{ $now.setZone($('locale').item.json['users-timezone']) }}"},{"id":"4c2851ef-175e-4f81-95af-5671171fdf16","name":"users-date-time-full","type":"string","value":"={{ $now.setZone($('locale').item.json['users-timezone'] ?? 'UTC').setLocale($('locale').item.json['users-locale'] ?? 'en-US').toLocaleString(DateTime.DATETIME_FULL) }}"},{"id":"4ae2c38b-f93a-4b56-9078-d9675a12ec8b","name":"users-date-time-huge","type":"string","value":"={{ $now.setZone($('locale').item.json['users-timezone'] ?? 'UTC').setLocale($('locale').item.json['users-locale'] ?? 'en-US').toFormat('cccc, MMMM d, yyyy, h:mm a') }}"},{"id":"1011c2bf-d311-424d-8537-1788597065d4","name":"users-current-date-plus-1","type":"string","value":"={{   $now.plus({ days: 1 }).setZone($('locale').item.json['users-timezone'] ?? 'UTC').setLocale($('locale').item.json['users-locale'] ?? 'en-US').toLocaleString(DateTime.DATE_FULL) }}"},{"id":"343ec7d5-fcb5-454d-b947-4b0f2e94f930","name":"users-current-date-plus-7","type":"string","value":"={{   $now.plus({ days: 7 }).setZone($('locale').item.json['users-timezone'] ?? 'UTC').setLocale($('locale').item.json['users-locale'] ?? 'en-US').toLocaleString(DateTime.DATE_FULL) }}"},{"id":"ce0de19d-9cb1-4918-ade5-47f22f35f8e8","name":"users-current-day-1-minute-before-midnight","type":"string","value":"={{\n  $now.setZone($('locale').item.json['users-timezone'] ?? 'UTC')\n      .endOf('day')\n      .setLocale($('locale').item.json['users-locale'] ?? 'en-US')\n      .toLocaleString(DateTime.DATETIME_FULL)\n}}"},{"id":"800dff91-469d-4a2b-acb0-a0b79d0b9341","name":"users-current-day-1-minute-before-midnight-plus-7-days","type":"string","value":"={{   $now.setZone($('locale').item.json['users-timezone'] ?? 'UTC')       .plus({ days: 7 })       .endOf('day')       .setLocale($('locale').item.json['users-locale'] ?? 'en-US')       .toLocaleString(DateTime.DATETIME_FULL) }}"},{"id":"d04c43fe-1f6d-4e7e-b82f-70cebb7484a6","name":"users-current-day-1-minute-before-midnight-iso","type":"string","value":"={{\n  $now.setZone($('locale').item.json['users-timezone'] ?? 'UTC')\n      .endOf('day')\n      .toISO()\n}}"},{"id":"5aee9416-0ad6-43b9-936f-edce6a292cce","name":"users-current-day-1-minute-before-midnight-plus-7-days-iso","type":"string","value":"={{   $now.setZone($('locale').item.json['users-timezone'] ?? 'UTC')       .plus({ days: 7 })       .endOf('day')       .toISO() }}"}]}},"typeVersion":3.4},{"id":"f20a83fd-2484-4dc7-92a1-a438c2cf8e02","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[1640,-400],"parameters":{"color":4,"width":440,"height":400,"content":"✨ **simplify_evens_json (Code)**\n\n*   **Purpose:** Cleans the raw event data from Google Calendar.\n*   **Details:** Runs JavaScript to remove fields like `htmlLink`, `etag`, `iCalUID`, etc., to provide a cleaner dataset to the AI.\n*   **To Modify:** Only if you need to keep or remove specific event fields not covered."},"typeVersion":1},{"id":"c5e40e35-8dfa-491c-ba67-21b83f71334b","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[2140,-400],"parameters":{"color":4,"width":440,"height":400,"content":"➕ **aggregate_events (Aggregate)**\n\n*   **Purpose:** Combines all individual simplified event items into a single JSON array.\n*   **Details:** Creates a field named `eventdata` which contains the list of all events. This is necessary for the AI agent to process all events at once.\n*   **To Modify:** Usually no changes needed."},"typeVersion":1},{"id":"db11c407-a238-48ef-9398-1842c1046340","name":"Sticky Note8","type":"n8n-nodes-base.stickyNote","position":[2640,220],"parameters":{"color":6,"width":440,"height":400,"content":"🧠 **Google Gemini (Language Model)**\n\n*   **Purpose:** Establishes the connection to the Google Gemini AI model.\n*   **Details:** This node itself doesn't do the processing but provides the AI capability to the `event_summary_agent`.\n*   **‼️ USER ACTION REQUIRED ‼️:**\n    *   **Credentials:** Set up and select your Google Gemini (PaLM) API credentials.\n    *   **Model Name:** Default is `models/gemini-2.5-flash-preview-05-20`. Change if needed."},"typeVersion":1},{"id":"692413bc-58f9-4d09-a7f7-796d50894e3b","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[3140,-400],"parameters":{"color":4,"width":440,"height":400,"content":"📄➡️🌐 **markdown_to_html (Converter)**\n\n*   **Purpose:** Converts the Markdown text generated by the `event_summary_agent` into HTML.\n*   **Details:** Ensures the email body is well-formatted (line breaks, bolding, lists, emojis).\n*   **To Modify:** Usually no changes needed. Options like `emoji` and `simpleLineBreaks` are enabled."},"typeVersion":1},{"id":"d2803020-1f12-4207-a9c3-678fbb472daf","name":"Sticky Note10","type":"n8n-nodes-base.stickyNote","position":[3640,-400],"parameters":{"color":4,"width":440,"height":400,"content":"📧 **send_email (Email)**\n\n*   **Purpose:** Sends the final HTML summary as an email.\n*   **Details:** Uses the HTML output from the `Markdown` node as the email body. The subject is dynamically generated.\n*   **‼️ USER ACTION REQUIRED ‼️:**\n    1.  **Credentials:** Configure and select your SMTP (email sending) account.\n    2.  `fromEmail`: Set your desired sender email address.\n    3.  `toEmail`: Set the recipient email address(es).\n    *   **To Modify (Optional):** Customize the `subject` line format."},"typeVersion":1},{"id":"73c88ce5-9fa6-418f-b4cc-0b646f5708e7","name":"Sticky Note11","type":"n8n-nodes-base.stickyNote","position":[2640,-400],"parameters":{"color":4,"width":440,"height":400,"content":"🤖 **event_summary_agent (AI Agent)**\n\n*   **Purpose:** Generates a well-formatted weekly schedule summary using the AI model.\n*   **Details:** Takes the `eventdata` (from `aggregate_events`) and a detailed prompt (under \"System Message\") that instructs the AI on output structure, date formatting, priority event identification, and weekly insights.\n*   **To Modify:** The \"System Message\" can be tweaked to change:\n    *   Greeting style.\n    *   Date/time formats (though largely controlled by `locale`).\n    *   Keywords for \"IMPORTANT\" events (`urgent`, `deadline`, etc.).\n    *   The style or focus of the \"Weekly Insight.\""},"typeVersion":1},{"id":"6febb866-888c-4e72-a6b8-296a826b7e66","name":"markdown_to_html","type":"n8n-nodes-base.markdown","position":[3320,-40],"parameters":{"mode":"markdownToHtml","options":{"emoji":true,"simpleLineBreaks":true},"markdown":"={{ $json.output }}","destinationKey":"email-html"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"db6385a3-bd01-4cc0-be20-cb1388b31cdc","connections":{"locale":{"main":[[{"node":"date_time","type":"main","index":0}]]},"date_time":{"main":[[{"node":"get_next_weeks_events","type":"main","index":0}]]},"Google Gemini":{"ai_languageModel":[[{"node":"event_summary_agent","type":"ai_languageModel","index":0}]]},"weekly_schedule":{"main":[[{"node":"locale","type":"main","index":0}]]},"aggregate_events":{"main":[[{"node":"event_summary_agent","type":"main","index":0}]]},"markdown_to_html":{"main":[[{"node":"send_email","type":"main","index":0}]]},"event_summary_agent":{"main":[[{"node":"markdown_to_html","type":"main","index":0}]]},"simplify_evens_json":{"main":[[{"node":"aggregate_events","type":"main","index":0}]]},"get_next_weeks_events":{"main":[[{"node":"simplify_evens_json","type":"main","index":0}]]}}}


name: Automate Sales Pipeline: BuiltWith Technology Data to Trello Lead Cards with Google Sheets
author_name: Yaron Been
author_username: yaron-nofluff
categories: []
created_at: 2025-06-08T14:05:42.263Z
updated_at: 2025-06-08T14:05:42.263Z
url: https://n8n.io/workflows/4786
scraped_at: 2025-06-19 22:49:26
description:
  Automated workflow that transforms BuiltWith technology data into actionable sales leads in Trello, creating a visual sales pipeline.

  🚀 What It Does

  Converts tech stack data into Trello cards
  Organizes leads by technology stack
  Tracks sales pipeline stages
  Enables team collaboration
  Updates automatically

  🎯 Perfect For

  Sales teams
  Business development
  Account executives
  Tech startups
  Digital agencies

  ⚙️ Key Benefits

  ✅ Visual sales pipeline  
  ✅ Easy lead qualification  
  ✅ Team collaboration  
  ✅ Technology-based filtering  
  ✅ Automated data entry  

  🔧 What You Need

  BuiltWith API access
  Trello account
  n8n instance
  Google account (for authentication)

  📊 Data Mapped to Trello

  Company details
  Technology stack
  Contact information
  Website metrics
  Custom labels

  🛠️ Setup & Support

  Quick Setup

  Start in 20 minutes with our step-by-step guide

  📺 Watch Tutorial

  💼 Get Expert Support

  📧 Direct Help



  Turn technology intelligence into sales opportunities with automated lead management.

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.trello","n8n-nodes-base.code"]

workflow_json:
  {"id":"SdBKwXCUZaS6VYQE","meta":{"instanceId":"84ad02d6104594179f43f1ce9cfe3a81637b2faedb57dafcb9e649b7542988db"},"name":"BuiltWith to trello","tags":[],"nodes":[{"id":"ecafd36c-ff4a-4348-95ec-5a221a73ddf7","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","position":[-420,900],"parameters":{},"typeVersion":1},{"id":"efbaced5-1171-406b-9704-277a12a51f0d","name":"Read Domains from Google Sheets","type":"n8n-nodes-base.googleSheets","position":[-200,900],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1Hs9LcBpC-kaGgD_QjkkqBEJzDeAd85RW_L1fXTYEdCA/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1Hs9LcBpC-kaGgD_QjkkqBEJzDeAd85RW_L1fXTYEdCA","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1Hs9LcBpC-kaGgD_QjkkqBEJzDeAd85RW_L1fXTYEdCA/edit?usp=drivesdk","cachedResultName":"BuiltWith Domain"}},"credentials":{"googleSheetsOAuth2Api":{"id":"Rp7XiR3hxJfv03ZO","name":"Google Sheets account"}},"typeVersion":4.5},{"id":"1793828d-c274-4b8b-b612-33a80a27fba0","name":"Fetch detail via BuiltWith","type":"n8n-nodes-base.httpRequest","position":[60,900],"parameters":{"url":"https://api.builtwith.com/v21/api.json","options":{},"sendQuery":true,"queryParameters":{"parameters":[{"name":"KEY","value":"YOUR_API_KEY"},{"name":"LOOKUP","value":"={{ $json.Domain }}"}]}},"typeVersion":4.2},{"id":"d64e4b44-5a7c-487d-98ec-5f5ff40ecf56","name":"Extract Tech Stack Info","type":"n8n-nodes-base.code","position":[280,900],"parameters":{"jsCode":"const result = $json.Results?.[0];\nconst domain = result?.Lookup || null;\nconst path = result?.Result?.Paths?.[0];\nconst url = path?.Url || null;\n\nlet extracted = null;\n\n// Loop through Groups to find the first available Tech entry\nfor (const group of path?.Groups || []) {\n  const category = group.Name;\n  const tech = group.Tech?.[0];\n  \n  if (tech) {\n    extracted = {\n      Technology: tech.Name,\n      Category: category,\n      \"First Detected\": tech.FirstDetected,\n      \"Last Detected\": tech.LastDetected,\n      Domain: domain,\n      URL: url\n    };\n    break; // Stop after first match\n  }\n}\n\nreturn extracted ? [extracted] : [];\n"},"typeVersion":2},{"id":"63da73d8-06a5-4780-a8b3-24ebf1c93176","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[480,220],"parameters":{"color":5,"width":360,"height":880,"content":"# 📊 **Section 3: Create Trello Cards**\n\n📥📝\n**Node:**\n\n* `📗 Create Trello Cards with Tech Stack`\n\n---\n\n### 🔹 What it does:\n\n* Takes the extracted data and **create trello cards for scan**.\n* Fills in columns like:\n\n  * `Technology`\n  * `Category`\n  * `First Detected`\n  * `Last Detected`\n  * `URL`\n\n### ✍️ How it works:\n\n* Provide Due date and member ids\n"},"typeVersion":1},{"id":"43a5ae54-2faa-42c0-bdf1-013fe7cdbd34","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[0,0],"parameters":{"color":7,"width":440,"height":1100,"content":"## 🌍 **Section 2: Tech Stack Lookup**\n\n🔍🌐➡️🧠\n**Nodes:**\n\n* `🌐 Fetch Tech Stack from BuiltWith`\n* `🧠 Extract Tech Stack Info (Function node)`\n\n---\n\n### 🔹 What it does:\n\n* For each domain, it sends an HTTP GET request to the **BuiltWith API** to fetch that site's detected technologies.\n* The **Code (Function)** node then parses the complex response and extracts only what you care about:\n\n  * `Technology` 🛠️\n  * `Category` 📦\n  * `First Detected` 🕐\n  * `Last Detected` ⌛\n  * `Domain` 🌐\n  * `URL` 🔗\n\n### 🧠 How it works:\n\n* BuiltWith returns a rich JSON structure with all detected tech.\n* Your function loops through it and pulls **just one matching technology** per domain (to keep it simple).\n* This makes it easy to update a single row in your sheet.\n\n### 💡 Beginner Tips:\n\n* Want **all technologies** per domain? Modify the function to return multiple results per input.\n* Make sure to handle **API limits** if you’re processing many domains—add delays using the `Wait` node if needed.\n\n---\n\n"},"typeVersion":1},{"id":"4b3f94c2-ff44-49b4-9382-da3933a015af","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-460,100],"parameters":{"color":6,"width":420,"height":1000,"content":"## 🧩 **Section 1: Input Collection**\n\n📄➡️📤\n**Nodes:**\n\n* `🖱️ Manual Trigger`\n* `📗 Read Domains from Google Sheets`\n\n---\n\n### 🔹 What it does:\n\n* The workflow starts **when you click \"Test workflow\"** (manual trigger). This is useful for testing before setting up a schedule.\n* Then it connects to a **Google Sheet**, which contains a list of domains (e.g., `webflow.com`, `shopify.com`) you want to analyze.\n\n### 📚 How it works:\n\n* You’ve connected your Google Sheets account.\n* It reads all rows from a specific sheet (e.g., a tab called `Domains`).\n* Each row should include at least one column like `Domain`.\n\n### 💡 Beginner Tips:\n\n* Want to analyze other domains? Just paste them into the Google Sheet.\n* You can automate this by replacing the manual trigger with a `Cron` node to run every day, week, or month.\n\n---\n\n"},"typeVersion":1},{"id":"4be59f24-b1bf-43c9-979c-70d53e4292c8","name":"Trello","type":"n8n-nodes-base.trello","position":[620,900],"parameters":{"name":"Scan BuiltWith Results","description":"=Domain: {{ $json.Domain }}\nTechnology: {{ $json.Technology }}\nCategory: {{ $json.Category }}\nFirst Detected: {{ $json['First Detected'] }}\nLast Detected: {{ $json['Last Detected'] }}\nURL: {{ $json.URL }}","additionalFields":{"due":"","idMembers":""}},"typeVersion":1},{"id":"7df51d43-61d0-4999-8e65-d0d7271e0684","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-2100,100],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"df23bd49-1a2c-4c40-8f38-3b90d24850a8","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-2100,440],"parameters":{"color":4,"width":1289,"height":2858,"content":"## ⚙️ **Workflow Overview: Scrape BuiltWith Tech Data and create trello cards**\n\nThis automation does three main things:\n\n1. 📥 **Reads domains from Google Sheets**\n2. 🌐 **Fetches tech stack data from BuiltWith**\n3. 📤 **Create trello cards for scan**\n\n---\n\n## 🧩 **Section 1: Input Collection**\n\n📄➡️📤\n**Nodes:**\n\n* `🖱️ Manual Trigger`\n* `📗 Read Domains from Google Sheets`\n\n---\n\n### 🔹 What it does:\n\n* The workflow starts **when you click \"Test workflow\"** (manual trigger). This is useful for testing before setting up a schedule.\n* Then it connects to a **Google Sheet**, which contains a list of domains (e.g., `webflow.com`, `shopify.com`) you want to analyze.\n\n### 📚 How it works:\n\n* You’ve connected your Google Sheets account.\n* It reads all rows from a specific sheet (e.g., a tab called `Domains`).\n* Each row should include at least one column like `Domain`.\n\n### 💡 Beginner Tips:\n\n* Want to analyze other domains? Just paste them into the Google Sheet.\n* You can automate this by replacing the manual trigger with a `Cron` node to run every day, week, or month.\n\n---\n\n## 🌍 **Section 2: Tech Stack Lookup**\n\n🔍🌐➡️🧠\n**Nodes:**\n\n* `🌐 Fetch Tech Stack from BuiltWith`\n* `🧠 Extract Tech Stack Info (Function node)`\n\n---\n\n### 🔹 What it does:\n\n* For each domain, it sends an HTTP GET request to the **BuiltWith API** to fetch that site's detected technologies.\n* The **Code (Function)** node then parses the complex response and extracts only what you care about:\n\n  * `Technology` 🛠️\n  * `Category` 📦\n  * `First Detected` 🕐\n  * `Last Detected` ⌛\n  * `Domain` 🌐\n  * `URL` 🔗\n\n### 🧠 How it works:\n\n* BuiltWith returns a rich JSON structure with all detected tech.\n* Your function loops through it and pulls **just one matching technology** per domain (to keep it simple).\n* This makes it easy to update a single row in your sheet.\n\n### 💡 Beginner Tips:\n\n* Want **all technologies** per domain? Modify the function to return multiple results per input.\n* Make sure to handle **API limits** if you’re processing many domains—add delays using the `Wait` node if needed.\n\n---\n\n# 📊 **Section 3: Create Trello Cards**\n\n📥📝\n**Node:**\n\n* `📗 Create Trello Cards with Tech Stack`\n\n---\n\n### 🔹 What it does:\n\n* Takes the extracted data and **create trello cards for scan**.\n* Fills in columns like:\n\n  * `Technology`\n  * `Category`\n  * `First Detected`\n  * `Last Detected`\n  * `URL`\n\n### ✍️ How it works:\n\n* Provide Due date and member ids\n\n\n### 💡 Beginner Tips:\n\n* Add more columns like `Confidence`, `Data Source`, or `Notes` if you want to enrich your research.\n* Use this sheet for:\n\n  * 💼 Lead qualification\n  * 📊 Market analysis\n  * 🚀 Tech product targeting\n\n---\n\n## 🎯 Final Thoughts\n\n🔁 This automation turns a **manual and tedious research task** into a repeatable, scalable, and accurate process. By connecting **Google Sheets + BuiltWith + Trello + n8n**, you can:\n\n✅ Automatically analyze websites\n✅ Store structured data for marketing or sales\n✅ Scale your intelligence gathering with just a few clicks\n\n---\n\n\n"},"typeVersion":1}],"active":false,"pinData":{"Fetch detail via BuiltWith":[{"json":{"Results":[{"Lookup":"webflow.com","Result":{"Paths":[{"Url":"http://webflow.com","Groups":[{"Name":"Web Hosting Providers","Tech":[{"Name":"Amazon Web Services","LastDetected":"2025-06-06","FirstDetected":"2022-01-10"}]},{"Name":"JavaScript Libraries","Tech":[{"Name":"React","LastDetected":"2025-06-06","FirstDetected":"2021-05-01"},{"Name":"jQuery","LastDetected":"2024-12-01","FirstDetected":"2020-09-15"}]}]}]}}]}}]},"settings":{"executionOrder":"v1"},"versionId":"c7136027-b14e-4f10-a759-fbd538ae3991","connections":{"Manual Trigger":{"main":[[{"node":"Read Domains from Google Sheets","type":"main","index":0}]]},"Extract Tech Stack Info":{"main":[[{"node":"Trello","type":"main","index":0}]]},"Fetch detail via BuiltWith":{"main":[[{"node":"Extract Tech Stack Info","type":"main","index":0}]]},"Read Domains from Google Sheets":{"main":[[{"node":"Fetch detail via BuiltWith","type":"main","index":0}]]}}}


name: CrunchBase Competitor Intelligence Tracker
author_name: Yaron Been
author_username: yaron-nofluff
nodes_used: ["n8n-nodes-base.httpRequest","n8n-nodes-base.clickUp","n8n-nodes-base.code"]
categories: []
created_at: 2025-06-08T14:07:13.023Z
updated_at: 2025-06-08T14:07:13.023Z
url: https://n8n.io/workflows/4789
scraped_at: 2025-06-19 22:50:27
description:
  Automated system for monitoring and analyzing competitor activities, funding rounds, and market movements using CrunchBase data.

  🚀 What It Does

  Tracks competitor funding rounds
  Monitors leadership changes
  Analyzes investment patterns
  Identifies new market entries
  Tracks product launches

  🎯 Perfect For

  Startup founders
  Business strategists
  Market analysts
  Investment professionals
  Corporate development

  ⚙️ Key Benefits

  ✅ Competitive intelligence  
  ✅ Early warning system  
  ✅ Market trend analysis  
  ✅ Strategic insights  
  ✅ Time-saving automation  

  🔧 What You Need

  CrunchBase API access
  n8n instance
  Google Sheets (for data storage)
  Notification preferences

  📊 Tracking Metrics

  Funding amounts and rounds
  Investor networks
  Hiring trends
  Market expansion
  Product updates

  🛠️ Setup & Support

  Quick Setup

  Start tracking in 20 minutes with our step-by-step guide

  📺 Watch Tutorial

  💼 Get Expert Support

  📧 Direct Help



  Gain a competitive edge with automated tracking and analysis of your competitors' activities and strategies.

workflow_json:
  {"id":"7ITgmmCKTMFGlTYD","meta":{"instanceId":"84ad02d6104594179f43f1ce9cfe3a81637b2faedb57dafcb9e649b7542988db","templateCredsSetupCompleted":true},"name":"Competitor tracking on CrunchBase","tags":[],"nodes":[{"id":"9bed760c-bd66-46b6-b949-08316d073237","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","position":[0,0],"parameters":{},"typeVersion":1},{"id":"14b8319e-bba0-4b59-9ecb-c3ddb212738d","name":"Set Competitor Name","type":"n8n-nodes-base.set","position":[220,0],"parameters":{"options":{},"assignments":{"assignments":[{"id":"0edc5749-a4da-4148-8ebd-9e21aa9b419e","name":"Competitor","type":"string","value":"OpenAI"}]}},"typeVersion":3.4},{"id":"9dfe1f50-14a8-40b9-a229-0afdf4f84a86","name":"Generate Crunchbase Slug","type":"n8n-nodes-base.code","position":[440,0],"parameters":{"jsCode":"// Convert \"Competitor\" field into Crunchbase slug format\nreturn items.map(item => {\n  const name = item.json.Competitor || \"\";\n\n  // Convert to lowercase, remove special chars, replace spaces with dashes\n  const slug = name\n    .toLowerCase()\n    .trim()\n    .replace(/[^a-z0-9\\s-]/g, \"\")   // Remove non-alphanumeric characters\n    .replace(/\\s+/g, \"-\");          // Replace spaces with hyphens\n\n  return {\n    json: {\n      ...item.json,\n      slug\n    }\n  };\n});\n"},"typeVersion":2},{"id":"0c7107f4-1a7a-4a50-a259-b14db106ddd5","name":"Fetch Crunchbase Data","type":"n8n-nodes-base.httpRequest","position":[740,0],"parameters":{"url":"=https://api.crunchbase.com/api/v4/entities/organizations/{{ $json.slug }}","options":{},"sendBody":true,"sendQuery":true,"bodyParameters":{"parameters":[{}]},"queryParameters":{"parameters":[{"name":"user_key","value":"YOUR_API_KEY"}]}},"typeVersion":4.2},{"id":"7f98afae-d216-4037-b475-2b37ce65f3c8","name":"Create Review Task in ClickUp","type":"n8n-nodes-base.clickUp","position":[980,0],"parameters":{"name":"Review Crunchbase Update and inform your manager","additionalFields":{"status":"","content":"=Company: {{ $json.data.properties.name }}\nLast Updated: {{ $json.data.properties.updated_at }}\nDescription: {{ $json.data.properties.short_description }}\nTotal Funding: {{ $json.data.properties.total_funding_usd }}\nLast Funding: {{ $json.data.properties.last_funding_type }}\nHomepage: {{ $json.data.properties.homepage_url }}","dueDate":"","priority":3,"assignees":[]}},"typeVersion":1},{"id":"24fd0d4e-a329-4c65-9b7c-f6b30dd3b7a2","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-40,-1900],"parameters":{"color":3,"width":640,"height":2160,"content":"## 🔹 **SECTION 1: Input & Preparation 🔧✏️🧠**\n\n### 🧩 Nodes Included:\n\n1. 🔘 **Manual Trigger**\n2. 📝 **Set Competitor Name**\n3. 🧠 **Generate Crunchbase Slug**\n\n---\n\n### 1️⃣ 🔘 **Manual Trigger** — `Manual Trigger`\n\n🚀 **What it does:**\nThis node allows you to **manually run the workflow** during testing or setup. It doesn't trigger automatically on a schedule, but gives you control to click and run whenever you want.\n\n🧰 **Why it's useful:**\nPerfect for **debugging** and **testing**. Instead of waiting for a scheduled run, you can instantly see what the workflow does.\n\n---\n\n### 2️⃣ 📝 **Set Competitor Name** — `Set Competitor Name`\n\n🛠 **What it does:**\nThis node manually defines the company (competitor) you're tracking on Crunchbase.\n\n🔡 **Example input:**\n\n```json\n{\n  \"Competitor\": \"Stripe, Inc.\"\n}\n```\n\n💡 **Why it's useful:**\nAllows you to customize which competitor to check — one at a time — while testing. Later, you could replace this with a list from a database or Google Sheet for full automation.\n\n---\n\n### 3️⃣ 🧠 **Generate Crunchbase Slug** — `Generate Crunchbase Slug`\n\n🔄 **What it does:**\nConverts the raw company name into a **Crunchbase-friendly slug** (like a web-safe name) used in the Crunchbase API call.\n\n🔡 **Example:**\n\n* `\"Stripe, Inc.\"` → `\"stripe-inc\"`\n\n🧠 **How it works:**\n\n* Lowercases the text\n* Removes punctuation\n* Replaces spaces with hyphens (`-`)\n\n📌 **Why it's important:**\nCrunchbase’s API requires company slugs in the URL, not full names. This function ensures you get the correct format every time.\n\n---\n\n### ✅ **End of Section 1:**\n\nYou now have a properly formatted `slug` for a company like `openai` or `stripe-inc`, ready to query Crunchbase for real-time data.\n\n---\n\n"},"typeVersion":1},{"id":"47a23c5d-e6ce-4ea2-b2e5-101fd9d02189","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[660,-1560],"parameters":{"color":5,"width":580,"height":1820,"content":"## 🔹 **SECTION 2: Fetch + Create Task 📡🗂**\n\n### 🧩 Nodes Included:\n\n4. 🌐 **Fetch Crunchbase Data**\n5. 📋 **Create Review Task in ClickUp**\n\n---\n\n### 4️⃣ 🌐 **Fetch Crunchbase Data** — `Fetch Crunchbase Data`\n\n🔍 **What it does:**\nMakes a real-time API call to **Crunchbase** using the generated `slug`, and pulls in key information about the company — like funding, description, homepage, and last updated date.\n\n🔑 **Requires:** Crunchbase API Key\n\n🔡 **Example API Call:**\n\n```http\nGET https://api.crunchbase.com/api/v4/entities/organizations/stripe-inc?user_key=YOUR_API_KEY\n```\n\n🧾 **Sample Data Retrieved:**\n\n* `name`: Stripe\n* `updated_at`: 2025-06-05T12:34:56Z\n* `total_funding_usd`: 10B+\n* `homepage_url`: [https://stripe.com](https://stripe.com)\n* `short_description`: Online payment infrastructure\n\n📌 **Why it's useful:**\nThis gives you all the relevant data about the competitor's recent activities that might be worth your team's attention.\n\n---\n\n### 5️⃣ 📋 **Create Review Task in ClickUp** — `Create Review Task in ClickUp`\n\n🗂 **What it does:**\nAutomatically creates a new **task in ClickUp**, assigning the Crunchbase update to your team for review.\n\n📄 **Task Includes:**\n\n* 🏷 Title: `Review Crunchbase Update: Stripe`\n* 📝 Description:\n\n  ```text\n  Company: Stripe\n  Last Updated: 2025-06-05\n  Description: Online payment infrastructure\n  Total Funding: $10B\n  Website: https://stripe.com\n  ```\n\n💡 **Why it's powerful:**\nNo manual tracking or checking needed — your team is alerted **automatically** when there’s something new. It ensures nothing slips through the cracks.\n\n---\n\n"},"typeVersion":1},{"id":"60181cc2-f735-4db3-87d0-db0fc89dc336","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-1880,-1900],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"8cd558b6-8353-4d9d-af68-7ea02cef2b73","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-1880,-1560],"parameters":{"color":4,"width":1289,"height":3478,"content":" ✨ **Crunchbase → ClickUp Automation**\n\nTrack competitor updates from **Crunchbase** and automatically create **ClickUp tasks** for your team to review — all in just a few clicks!\n\n---\n\n## 🔹 **SECTION 1: Input & Preparation 🔧✏️🧠**\n\n### 🧩 Nodes Included:\n\n1. 🔘 **Manual Trigger**\n2. 📝 **Set Competitor Name**\n3. 🧠 **Generate Crunchbase Slug**\n\n---\n\n### 1️⃣ 🔘 **Manual Trigger** — `Manual Trigger`\n\n🚀 **What it does:**\nThis node allows you to **manually run the workflow** during testing or setup. It doesn't trigger automatically on a schedule, but gives you control to click and run whenever you want.\n\n🧰 **Why it's useful:**\nPerfect for **debugging** and **testing**. Instead of waiting for a scheduled run, you can instantly see what the workflow does.\n\n---\n\n### 2️⃣ 📝 **Set Competitor Name** — `Set Competitor Name`\n\n🛠 **What it does:**\nThis node manually defines the company (competitor) you're tracking on Crunchbase.\n\n🔡 **Example input:**\n\n```json\n{\n  \"Competitor\": \"Stripe, Inc.\"\n}\n```\n\n💡 **Why it's useful:**\nAllows you to customize which competitor to check — one at a time — while testing. Later, you could replace this with a list from a database or Google Sheet for full automation.\n\n---\n\n### 3️⃣ 🧠 **Generate Crunchbase Slug** — `Generate Crunchbase Slug`\n\n🔄 **What it does:**\nConverts the raw company name into a **Crunchbase-friendly slug** (like a web-safe name) used in the Crunchbase API call.\n\n🔡 **Example:**\n\n* `\"Stripe, Inc.\"` → `\"stripe-inc\"`\n\n🧠 **How it works:**\n\n* Lowercases the text\n* Removes punctuation\n* Replaces spaces with hyphens (`-`)\n\n📌 **Why it's important:**\nCrunchbase’s API requires company slugs in the URL, not full names. This function ensures you get the correct format every time.\n\n---\n\n### ✅ **End of Section 1:**\n\nYou now have a properly formatted `slug` for a company like `openai` or `stripe-inc`, ready to query Crunchbase for real-time data.\n\n---\n\n## 🔹 **SECTION 2: Fetch + Create Task 📡🗂**\n\n### 🧩 Nodes Included:\n\n4. 🌐 **Fetch Crunchbase Data**\n5. 📋 **Create Review Task in ClickUp**\n\n---\n\n### 4️⃣ 🌐 **Fetch Crunchbase Data** — `Fetch Crunchbase Data`\n\n🔍 **What it does:**\nMakes a real-time API call to **Crunchbase** using the generated `slug`, and pulls in key information about the company — like funding, description, homepage, and last updated date.\n\n🔑 **Requires:** Crunchbase API Key\n\n🔡 **Example API Call:**\n\n```http\nGET https://api.crunchbase.com/api/v4/entities/organizations/stripe-inc?user_key=YOUR_API_KEY\n```\n\n🧾 **Sample Data Retrieved:**\n\n* `name`: Stripe\n* `updated_at`: 2025-06-05T12:34:56Z\n* `total_funding_usd`: 10B+\n* `homepage_url`: [https://stripe.com](https://stripe.com)\n* `short_description`: Online payment infrastructure\n\n📌 **Why it's useful:**\nThis gives you all the relevant data about the competitor's recent activities that might be worth your team's attention.\n\n---\n\n### 5️⃣ 📋 **Create Review Task in ClickUp** — `Create Review Task in ClickUp`\n\n🗂 **What it does:**\nAutomatically creates a new **task in ClickUp**, assigning the Crunchbase update to your team for review.\n\n📄 **Task Includes:**\n\n* 🏷 Title: `Review Crunchbase Update: Stripe`\n* 📝 Description:\n\n  ```text\n  Company: Stripe\n  Last Updated: 2025-06-05\n  Description: Online payment infrastructure\n  Total Funding: $10B\n  Website: https://stripe.com\n  ```\n\n💡 **Why it's powerful:**\nNo manual tracking or checking needed — your team is alerted **automatically** when there’s something new. It ensures nothing slips through the cracks.\n\n---\n\n## 🎯 **Final Outcome**\n\nYou now have a streamlined mini-intelligence system:\n\n* ✅ Input a company\n* 🔁 Convert it into a slug\n* 📡 Fetch live data\n* 📝 Create an action task for your team\n\nAll **automated**, all **within n8n** — no coding required beyond smart node usage. ✨\n\n---\n\n"},"typeVersion":1}],"active":false,"pinData":{"Fetch Crunchbase Data":[{"json":{"data":{"uuid":"abc123","properties":{"name":"OpenAI","identifier":{"uuid":"abc123","value":"OpenAI","image_id":"v12345","permalink":"organization/openai"},"updated_at":"2025-06-05T17:32:12Z","homepage_url":"https://openai.com","last_funding_type":"Series F","profile_image_url":"https://example.com/image.jpg","short_description":"AI research and deployment company.","total_funding_usd":11300000000,"num_funding_rounds":5}}}}]},"settings":{"executionOrder":"v1"},"versionId":"162f7b36-530f-44a1-92a4-bcd5d20fe0df","connections":{"Manual Trigger":{"main":[[{"node":"Set Competitor Name","type":"main","index":0}]]},"Set Competitor Name":{"main":[[{"node":"Generate Crunchbase Slug","type":"main","index":0}]]},"Fetch Crunchbase Data":{"main":[[{"node":"Create Review Task in ClickUp","type":"main","index":0}]]},"Generate Crunchbase Slug":{"main":[[{"node":"Fetch Crunchbase Data","type":"main","index":0}]]},"Create Review Task in ClickUp":{"main":[[]]}}}


name: Personalized CrunchBase Lead Outreach with AI-Generated Summaries and Gmail
author_name: Yaron Been
author_username: yaron-nofluff
categories: []
created_at: 2025-06-08T14:07:42.423Z
updated_at: 2025-06-08T14:07:42.423Z
url: https://n8n.io/workflows/4790
scraped_at: 2025-06-19 22:50:21
description:
  Automated outreach system that identifies and contacts potential leads from CrunchBase with personalized, timely messages.

  🚀 What It Does

  Identifies target companies and contacts
  Personalizes email content
  Schedules follow-ups
  Tracks responses
  Integrates with email providers

  🎯 Perfect For

  Sales development reps
  Business development teams
  Startup founders
  Investment professionals
  Partnership managers

  ⚙️ Key Benefits

  ✅ Automated lead generation  
  ✅ Personalized outreach at scale  
  ✅ Follow-up automation  
  ✅ Response tracking  
  ✅ Time-saving workflow  

  🔧 What You Need

  CrunchBase API access
  Email service (e.g., Gmail, SendGrid)
  n8n instance
  CRM (optional)

  📊 Features

  Contact information extraction
  Email template personalization
  Send time optimization
  Open/click tracking
  Response handling

  🛠️ Setup & Support

  Quick Setup

  Start sending in 30 minutes with our step-by-step guide

  📺 Watch Tutorial

  💼 Get Expert Support

  📧 Direct Help



  Transform your outbound sales process with automated, personalized outreach to high-quality leads from CrunchBase.

nodes_used:
  ["n8n-nodes-base.httpRequest","n8n-nodes-base.gmail","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatOpenAi","@n8n/n8n-nodes-langchain.outputParserStructured"]

workflow_json:
  {"id":"yNl6TycBIVr4r9Ef","meta":{"instanceId":"84ad02d6104594179f43f1ce9cfe3a81637b2faedb57dafcb9e649b7542988db","templateCredsSetupCompleted":true},"name":"Cruchbase email outreach","tags":[],"nodes":[{"id":"4a5a04cc-062d-4822-b690-61d072bf1e88","name":"Structured Output Parser","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[1220,220],"parameters":{"jsonSchemaExample":"{\n  \"subject\": \"🚀 Startup Founder Highlights for Outreach - June 6, 2025\",\n  \"body\": \"🚀 Here's a summary of promising startup founders for potential outreach:\\n\\n🔹 **Jane Doe**\\nCo-Founder & CEO at Acme AI. She is a serial entrepreneur with over 10 years of experience in AI and SaaS startups. Educated at Stanford University with an MBA. You can find her on LinkedIn: https://www.linkedin.com/in/janedoe.\\n\\n🔹 **John Smith**\\nCTO at GreenLoop. Passionate about sustainable packaging innovation and technology leadership. Holds a Bachelor’s degree in Environmental Engineering from MIT. Connect on LinkedIn: https://www.linkedin.com/in/johnsmith.\"\n}\n"},"typeVersion":1.2},{"id":"05aaede3-213d-43f3-b42f-c1c7188c6b3b","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[1000,220],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"wYwTjEv45IzlAOAu","name":"OpenAi account 2"}},"typeVersion":1.2},{"id":"02c283da-ace1-41f0-a298-ac89882b0c1d","name":"Updated profiles List","type":"n8n-nodes-base.httpRequest","position":[220,0],"parameters":{"url":"https://api.crunchbase.com/api/v4/relationships/organizations/1234abcd-5678-efgh-ijkl-9012mnop3456/people","options":{},"sendQuery":true,"sendHeaders":true,"queryParameters":{"parameters":[{"name":"page","value":"1"}]},"headerParameters":{"parameters":[{"name":"X-Cb-User-Key","value":"YOUR_API_KEY_HERE"}]}},"typeVersion":4.2},{"id":"3f0723a9-73eb-43be-834b-bc2a8c5d9c50","name":"Founder Profiles by UUID","type":"n8n-nodes-base.httpRequest","position":[500,0],"parameters":{"url":"=https://api.crunchbase.com/api/v4/entities/people/{{ $json.data.items[0].uuid }}","options":{},"sendHeaders":true,"headerParameters":{"parameters":[{"name":"X-Cb-User-Key","value":"YOUR_API_KEY_HERE"}]}},"typeVersion":4.2},{"id":"25dcbcc9-5155-4d61-b4b7-ce5e9646b56e","name":"Extract Key Profile Fields","type":"n8n-nodes-base.set","position":[720,0],"parameters":{"options":{},"assignments":{"assignments":[{"id":"eeff9c2c-fe9f-4f6c-a030-99ff87308529","name":"Full name","type":"string","value":"={{ $json.data.properties.full_name }}"},{"id":"1ba5a408-31b3-409e-a7bf-95f708b0374a","name":"Title","type":"string","value":"={{ $json.data.properties.title }}"},{"id":"c8344897-be61-47cd-b7fd-3d932644ad07","name":"biography","type":"string","value":"={{ $json.data.properties.biography }}"},{"id":"28ee7b7a-1d5d-46fd-aa35-b9e767626ba3","name":"Education","type":"string","value":"={{ $json.data.properties.education }}"},{"id":"10271203-a0c9-4b16-b88e-4999e210bf03","name":"Social Links","type":"string","value":"={{ $json.data.properties.social_links }}"},{"id":"6144bd09-cbf4-4c27-800b-3b0552c0f5ca","name":"Associated companies","type":"string","value":"={{ $json.data.properties.associated_companies }}"}]}},"typeVersion":3.4},{"id":"8734c81e-515f-481f-aa1e-70ef7bd4ddab","name":"Summarizer Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[1020,0],"parameters":{"text":"=Full name: {{ $json['Full name'] }}\nTitle: {{ $json.Title }}\nbiography: {{ $json.biography }}\nEducation: {{ $json.Education }}\nSocial Links: {{ $json['Social Links'] }}\nAssociated companies: {{ $json['Associated companies'] }}\n","options":{"systemMessage":"You are an expert at writing concise, professional summaries for business email outreach. Given detailed information about a person’s professional profile, your task is to generate a short summary focusing only on the most relevant information for outreach emails.\n\nOnly include:\n- Full name\n- Current title/role\n- Brief, relevant part of the biography (max 1-2 sentences)\n- Key education highlights (school and degree)\n- Social links (only LinkedIn or Twitter if available)\n- Most relevant associated company (name and role)\n\nDo NOT include unnecessary details. Make the summary clear, engaging, and suitable for a personalized outreach email introduction."},"promptType":"define","hasOutputParser":true},"typeVersion":1.9},{"id":"738f7615-bc05-4335-8a93-d4025c8cf885","name":"Send email for outreach","type":"n8n-nodes-base.gmail","position":[1380,0],"webhookId":"2aefe416-f9e3-4b15-82c0-3314acc97048","parameters":{"sendTo":"shahkar.genai@gmail.com","message":"={{ $json.output.body }}","options":{"appendAttribution":false},"subject":"=CrunchBase profile for outreach"},"credentials":{"gmailOAuth2":{"id":"noKcKj5FEpHHvboL","name":"Gmail account"}},"typeVersion":2.1},{"id":"d359f26d-fe8d-4d34-a96c-42b176b946a1","name":"When clicking ‘Test workflow’","type":"n8n-nodes-base.manualTrigger","position":[0,0],"parameters":{},"typeVersion":1},{"id":"3529f772-cb46-4145-ba2e-f115dce37db4","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-40,-1040],"parameters":{"color":7,"width":420,"height":1220,"content":"## 🔁 **SECTION 1: Trigger + Company Fetching**\n\n**🧱 Nodes:**\n\n* 🔘 **Manual Trigger**\n* 🌐 **HTTP Request – Fetch: Updated Companies List**\n\n---\n\n### 🚀 What This Section Does\n\n🔘 **Manual Trigger**\nThis allows you to manually run the automation anytime you want. Perfect for testing or when you only want to fetch founder data on demand (instead of a scheduled time).\n\n🌐 **HTTP Request – Fetch: Updated Companies List**\nThis node connects to the **Crunchbase API** to get a list of the latest startups or companies that have been updated recently.\n\n#### 🔧 What You Can Customize\n\n🛠️ **Page Query**:\nIn the URL or query parameters, you'll find something like `page=1`.\n➡️ You can manually change this to `page=2`, `page=3`, etc., to explore other sets of companies.\n\n🛠️ **Date Filter**:\nThe `updated_since` parameter can also be changed to look for startups updated within a certain time window.\n\n---\n\n"},"typeVersion":1},{"id":"c10bafbe-3d3b-4cce-b8a0-5d725a98ffb7","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[440,-1160],"parameters":{"color":3,"width":440,"height":1340,"content":"## 👤 **SECTION 2: Founder Profile Fetching + Field Mapping**\n\n**🧱 Nodes:**\n\n* 🌐 **HTTP Request – Fetch: Founder Profiles by UUID**\n* ✏️ **Edit Fields – Extract Key Profile Data**\n\n---\n\n### 🔎 What This Section Does\n\n🌐 **HTTP Request – Fetch: Founder Profiles by UUID**\nFor each company fetched in Section 1, this node pulls the **detailed profile** of one person (typically a founder, CEO, or C-level executive).\n\n✏️ **Edit Fields – Extract Key Profile Data**\nThis step takes the raw profile data and selects only the fields we care about:\n✅ Full Name,\n✅ Title,\n✅ Biography,\n✅ Education,\n✅ Social Links,\n✅ Associated Companies\n\n#### 🔧 What You Can Customize\n\n🔢 **Person Indexing**:\nIn this node’s configuration, you can find the list of people associated with a company.\n➡️ To switch from Founder #1 to Founder #2, change the **item number** or **array index** — for example, from `[0]` to `[1]`.\n\n💡 This is useful when a company has **multiple co-founders** or key executives you may want to evaluate separately.\n\n---\n\n"},"typeVersion":1},{"id":"e8c27235-f214-444e-8b1a-5e445e65e0af","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[940,-640],"parameters":{"color":6,"width":580,"height":1020,"content":"## 🤖📨 **SECTION 3: AI-Powered Summary + Email Outreach**\n\n**🧱 Nodes:**\n\n* 🤖 **AI Agent – Generate Email Summary**\n* 📧 **Gmail – Send Founder Digest**\n\n---\n\n### 🧠 What This Section Does\n\n🤖 **AI Agent – Generate Email Summary**\nThis uses **OpenAI’s GPT model** with a **Structured Output Parser** to turn the extracted profile into a polished, professional email-ready summary.\nIt's trained to output:\n\n> Jane Doe is currently Co-Founder & CEO at Acme AI. She is a serial entrepreneur with 10+ years in AI and SaaS. Educated at Stanford (MBA). Connect on LinkedIn: [https://linkedin.com/in/janedoe](https://linkedin.com/in/janedoe)\n\n📧 **Gmail – Send Founder Digest**\nFinally, this node **sends the email** — which could go to your team, your CRM, or even directly to your inbox — with a subject like:\n\n> 🚀 Startup Founder Highlights for Outreach - June 6, 2025\n\n"},"typeVersion":1},{"id":"fd781b49-45c0-4006-bb22-7d82ff3f4e31","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-1580,-1040],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"9b478bcf-5ba5-4edf-91a6-61e3fffa1078","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-1580,-700],"parameters":{"color":4,"width":1289,"height":2558,"content":"## 🔁 **SECTION 1: Trigger + Company Fetching**\n\n**🧱 Nodes:**\n\n* 🔘 **Manual Trigger**\n* 🌐 **HTTP Request – Fetch: Updated Companies List**\n\n---\n\n### 🚀 What This Section Does\n\n🔘 **Manual Trigger**\nThis allows you to manually run the automation anytime you want. Perfect for testing or when you only want to fetch founder data on demand (instead of a scheduled time).\n\n🌐 **HTTP Request – Fetch: Updated Companies List**\nThis node connects to the **Crunchbase API** to get a list of the latest startups or companies that have been updated recently.\n\n#### 🔧 What You Can Customize\n\n🛠️ **Page Query**:\nIn the URL or query parameters, you'll find something like `page=1`.\n➡️ You can manually change this to `page=2`, `page=3`, etc., to explore other sets of companies.\n\n🛠️ **Date Filter**:\nThe `updated_since` parameter can also be changed to look for startups updated within a certain time window.\n\n---\n\n## 👤 **SECTION 2: Founder Profile Fetching + Field Mapping**\n\n**🧱 Nodes:**\n\n* 🌐 **HTTP Request – Fetch: Founder Profiles by UUID**\n* ✏️ **Edit Fields – Extract Key Profile Data**\n\n---\n\n### 🔎 What This Section Does\n\n🌐 **HTTP Request – Fetch: Founder Profiles by UUID**\nFor each company fetched in Section 1, this node pulls the **detailed profile** of one person (typically a founder, CEO, or C-level executive).\n\n✏️ **Edit Fields – Extract Key Profile Data**\nThis step takes the raw profile data and selects only the fields we care about:\n✅ Full Name,\n✅ Title,\n✅ Biography,\n✅ Education,\n✅ Social Links,\n✅ Associated Companies\n\n#### 🔧 What You Can Customize\n\n🔢 **Person Indexing**:\nIn this node’s configuration, you can find the list of people associated with a company.\n➡️ To switch from Founder #1 to Founder #2, change the **item number** or **array index** — for example, from `[0]` to `[1]`.\n\n💡 This is useful when a company has **multiple co-founders** or key executives you may want to evaluate separately.\n\n---\n\n## 🤖📨 **SECTION 3: AI-Powered Summary + Email Outreach**\n\n**🧱 Nodes:**\n\n* 🤖 **AI Agent – Generate Email Summary**\n* 📧 **Gmail – Send Founder Digest**\n\n---\n\n### 🧠 What This Section Does\n\n🤖 **AI Agent – Generate Email Summary**\nThis uses **OpenAI’s GPT model** with a **Structured Output Parser** to turn the extracted profile into a polished, professional email-ready summary.\nIt's trained to output:\n\n> Jane Doe is currently Co-Founder & CEO at Acme AI. She is a serial entrepreneur with 10+ years in AI and SaaS. Educated at Stanford (MBA). Connect on LinkedIn: [https://linkedin.com/in/janedoe](https://linkedin.com/in/janedoe)\n\n📧 **Gmail – Send Founder Digest**\nFinally, this node **sends the email** — which could go to your team, your CRM, or even directly to your inbox — with a subject like:\n\n> 🚀 Startup Founder Highlights for Outreach - June 6, 2025\n\n#### 🛠️ What You Can Customize\n\n* ✍️ Change the **recipient** to your sales or outreach inbox\n* 🖋️ Modify the **subject line** to match your brand or campaign\n* 📬 Send to **multiple emails** using a comma-separated list\n\n---\n\n## ✅ Final Thoughts: How You Can Use This\n\nThis workflow is perfect for:\n\n* 🚀 Startup Scouts\n* 📬 Cold Outreach Campaigns\n* 🧠 VC Analysts or Tech Researchers\n* 🧩 Enriching founder data in your CRM\n\n💥 **No more copy-pasting Crunchbase profiles manually!**\nJust trigger the workflow, skim the summaries, and reach out.\n\n---\n\n"},"typeVersion":1}],"active":false,"pinData":{"Updated profiles List":[{"json":{"data":{"items":[{"type":"person","uuid":"abc123-def456","identifier":{"value":"Jane Doe","api_path":"https://api.crunchbase.com/api/v4/entities/people/abc123-def456","image_id":null,"permalink":"person/jane-doe"},"properties":{"title":"Co-Founder & CEO","last_name":"Doe","created_at":"2024-06-01T10:00:00Z","first_name":"Jane","started_on":"2023-01-10","entity_def_id":"person"}},{"type":"person","uuid":"xyz789-pqr012","identifier":{"value":"John Smith","api_path":"https://api.crunchbase.com/api/v4/entities/people/xyz789-pqr012","image_id":null,"permalink":"person/john-smith"},"properties":{"title":"CTO","last_name":"Smith","created_at":"2024-06-01T10:30:00Z","first_name":"John","started_on":"2023-01-10","entity_def_id":"person"}}],"paging":{"total_items":2,"current_page":1}}}}],"Founder Profiles by UUID":[{"json":{"data":{"type":"person","uuid":"abc123-def456","identifier":{"value":"Jane Doe","api_path":"https://api.crunchbase.com/api/v4/entities/people/abc123-def456","permalink":"person/jane-doe"},"properties":{"title":"Co-Founder & CEO","biography":"Jane Doe is a serial entrepreneur with over 10 years of experience in AI and SaaS startups.","education":[{"degree":"MBA","end_year":2012,"start_year":2010,"school_name":"Stanford University","field_of_study":"Business Administration"}],"full_name":"Jane Doe","last_name":"Doe","created_at":"2024-06-01T10:00:00Z","first_name":"Jane","updated_at":"2024-06-10T12:00:00Z","social_links":{"twitter":"https://twitter.com/janedoe","linkedin":"https://www.linkedin.com/in/janedoe"},"associated_companies":[{"name":"Acme AI","role":"Co-Founder & CEO","uuid":"1234abcd-5678-efgh-ijkl-9012mnop3456","api_path":"https://api.crunchbase.com/api/v4/entities/organizations/1234abcd-5678-efgh-ijkl-9012mnop3456"},{"name":"NextGen Tech","role":"Advisor","uuid":"7890qrst-uvwx-1234-yzab-5678cdef9012","api_path":"https://api.crunchbase.com/api/v4/entities/organizations/7890qrst-uvwx-1234-yzab-5678cdef9012"}]}}}}]},"settings":{"executionOrder":"v1"},"versionId":"ddab3a6c-8291-44bb-87bb-9085d4ce845a","connections":{"Summarizer Agent":{"main":[[{"node":"Send email for outreach","type":"main","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"Summarizer Agent","type":"ai_languageModel","index":0}]]},"Updated profiles List":{"main":[[{"node":"Founder Profiles by UUID","type":"main","index":0}]]},"Founder Profiles by UUID":{"main":[[{"node":"Extract Key Profile Fields","type":"main","index":0}]]},"Structured Output Parser":{"ai_outputParser":[[{"node":"Summarizer Agent","type":"ai_outputParser","index":0}]]},"Extract Key Profile Fields":{"main":[[{"node":"Summarizer Agent","type":"main","index":0}]]},"When clicking ‘Test workflow’":{"main":[[{"node":"Updated profiles List","type":"main","index":0}]]}}}


name: Track Investor Data from Crunchbase to Google Sheets for Market Analysis
author_name: Yaron Been
author_username: yaron-nofluff
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.code"]
categories: []
created_at: 2025-06-08T14:08:56.505Z
updated_at: 2025-06-08T14:08:56.505Z
url: https://n8n.io/workflows/4791
scraped_at: 2025-06-19 22:50:42
description:
  Automated pipeline to collect and analyze investor data from Crunchbase, tracking investment patterns, funding history, and portfolio companies for market analysis and lead generation.

  🚀 What It Does

  Investor Profiling**: Collects comprehensive data on investors and VC firms
  Investment Pattern Analysis**: Tracks funding history and investment preferences
  Portfolio Monitoring**: Keeps tabs on investor portfolios and new investments
  Data Enrichment**: Enhances raw data with additional context and metrics

  🎯 Perfect For

  Startup founders seeking investors
  Market research analysts
  Investment professionals
  Business development teams
  Competitive intelligence

  ⚙️ Key Benefits

  ✅ Comprehensive investor profiles  
  ✅ Real-time investment tracking  
  ✅ Market trend analysis  
  ✅ Data-driven investment decisions  
  ✅ Time-saving automation  

  🔧 What You Need

  Crunchbase API access
  n8n instance
  Storage solution (database or spreadsheet)

  📊 Data Points Collected

  Investor/Firm details
  Investment history
  Portfolio companies
  Funding rounds participated in
  Investment focus areas
  Contact information (when available)

  🛠️ Setup & Support

  Quick Setup

  Deploy in 30 minutes with our step-by-step configuration guide

  📺 Watch Tutorial

  💼 Get Expert Support

  📧 Direct Help



  Transform your investor research with automated data collection and analysis. Spend less time gathering data and more time making strategic decisions.

workflow_json:
  {"id":"8hRFK0iEjVKmthLq","meta":{"instanceId":"84ad02d6104594179f43f1ce9cfe3a81637b2faedb57dafcb9e649b7542988db","templateCredsSetupCompleted":true},"name":"CrunchBase Invester Data","tags":[],"nodes":[{"id":"49130296-ad2e-43f6-8ec4-7f72161a3a1b","name":"Daily Investor Data Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[0,0],"parameters":{"rule":{"interval":[{"triggerAtHour":9}]}},"typeVersion":1.2},{"id":"24caa890-abba-435d-a385-18cdef03dfe2","name":"Fetch Crunchbase Investor Data","type":"n8n-nodes-base.httpRequest","position":[220,0],"parameters":{"url":"https://api.crunchbase.com/api/v4/searches/organizations","method":"POST","options":{},"jsonBody":"{\n  \"field_ids\": [\n    \"identifier\",\n    \"name\",\n    \"short_description\",\n    \"location_identifiers\",\n    \"investment_stage\"\n  ],\n  \"query\": [\n    {\n      \"type\": \"predicate\",\n      \"field_id\": \"organization_types\",\n      \"operator_id\": \"includes\",\n      \"values\": [\n        \"investor\"\n      ]\n    }\n  ],\n  \"limit\": 5\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_CRUNCHBASE_API_KEY"},{"name":"Authorization","value":"Bearer YOUR_CRUNCHBASE_API_KEY"}]}},"typeVersion":4.2},{"id":"4de0847b-6e11-457d-b04b-d03b4fb1e3c1","name":"Extract Investor Fields","type":"n8n-nodes-base.code","position":[540,0],"parameters":{"jsCode":"const entities = items[0].json.entities;\n\nreturn entities.map(entity => {\n  return {\n    json: {\n      name: entity.name,\n      short_description: entity.short_description,\n      location_identifiers: entity.location_identifiers,\n      investment_stage: entity.investment_stage\n    }\n  };\n});\n"},"typeVersion":2},{"id":"a7d08f10-1fde-4e99-9127-bf12926d4197","name":"Append to Investor Sheet","type":"n8n-nodes-base.googleSheets","position":[780,0],"parameters":{"columns":{"value":{"Name":"={{ $json.name }}","Location":"={{ $json.location_identifiers }}","Investment Stage":"={{ $json.investment_stage }}","Short description":"={{ $json.short_description }}"},"schema":[{"id":"Name","type":"string","display":true,"required":false,"displayName":"Name","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Short description","type":"string","display":true,"required":false,"displayName":"Short description","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Location","type":"string","display":true,"required":false,"displayName":"Location","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Investment Stage","type":"string","display":true,"removed":false,"required":false,"displayName":"Investment Stage","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1XOUvOgrhDdOorEj0-TL4EiVygMd1wpD3cktI2_bm-Ww/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1XOUvOgrhDdOorEj0-TL4EiVygMd1wpD3cktI2_bm-Ww","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1XOUvOgrhDdOorEj0-TL4EiVygMd1wpD3cktI2_bm-Ww/edit?usp=drivesdk","cachedResultName":"CrunchBase Invester List"}},"credentials":{"googleSheetsOAuth2Api":{"id":"Rp7XiR3hxJfv03ZO","name":"Google Sheets account"}},"typeVersion":4.5},{"id":"45c6eb29-4d24-49a6-b849-938b178b66c9","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-40,-1700],"parameters":{"color":5,"width":420,"height":1900,"content":"### 🔷 **SECTION 1: Getting the Data from Crunchbase**\n\n#### 🧩 Nodes:\n\n1. 🕒 **Daily Investor Data Trigger**\n2. 🌐 **Fetch Crunchbase Investor Data**\n\n---\n\n#### 🔍 What Happens in This Section?\n\nThis section is all about **automatically pulling investor data from Crunchbase** on a scheduled basis, without any manual effort.\n\n---\n\n#### 🕒 1. **Daily Investor Data Trigger**\n\n> *\"When should the automation run?\"*\n\n* This **Schedule Trigger** node starts your workflow automatically at your chosen time.\n* For example, it could run every day at 8 AM.\n* It removes the need to remember to check Crunchbase manually.\n\n✅ *Beginner Benefit:*\n\n> Even if you’re not technical, you just set the schedule and let n8n run this job every day while you sleep ☕📊\n\n---\n\n#### 🌐 2. **Fetch Crunchbase Investor Data**\n\n> *\"Where do we get the data from?\"*\n\n* This **HTTP Request** node sends a **POST request** to [Crunchbase’s API](https://data.crunchbase.com/docs).\n\n* It includes a **filter** for organization types like `investor` and requests fields like:\n\n  * `name`\n  * `short_description`\n  * `location_identifiers`\n  * `investment_stage`\n\n* Crunchbase replies with a **JSON** file full of matching investors.\n\n✅ *Beginner Benefit:*\n\n> You don’t need to open a browser or search anything. This step collects live investor data from Crunchbase and brings it into your workflow for you 🚀\n\n---\n\n### ✅ What This Section Gives You:\n\nA **live, up-to-date snapshot** of investor information, **automatically pulled** from Crunchbase, without coding or clicking.\n\n---\n\n"},"typeVersion":1},{"id":"2dd2de36-770c-4833-884b-1525c1411d46","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[480,-1400],"parameters":{"color":6,"width":460,"height":1600,"content":"### 🔷 **SECTION 2: Processing and Saving the Data**\n\n#### 🧩 Nodes:\n\n3. 🧮 **Extract Investor Fields**\n4. 📄 **Append to Investor Sheet**\n\n---\n\n#### 🔍 What Happens in This Section?\n\nNow that we have raw investor data, this section **cleans it up** and **stores it in a Google Sheet** for easy access and analysis.\n\n---\n\n#### 🧮 3. **Extract Investor Fields**\n\n> *\"Let’s clean and format the response.\"*\n\n* This **Code** node uses JavaScript to loop through the list of investors and extract just what you care about:\n\n  * ✅ Name\n  * 📝 Short description\n  * 🌍 Location\n  * 💰 Investment stage\n\n* Each investor becomes a **separate row-ready item** for Google Sheets.\n\n✅ *Beginner Benefit:*\n\n> You don’t need to look at messy data. This step reshapes it into a clean format automatically ✨\n\n---\n\n#### 📄 4. **Append to Investor Sheet**\n\n> *\"Store it somewhere useful.\"*\n\n* This **Google Sheets** node takes the cleaned data and **adds it to a selected sheet**.\n* It works like a magic assistant, typing the investor data into your spreadsheet row-by-row.\n* You now have a **running list** of investors to use for:\n\n  * 📈 Market research\n  * 🎯 Outreach planning\n  * 💡 Competitor benchmarking\n\n"},"typeVersion":1},{"id":"75231f28-c911-4bdc-a6a2-c6255d293eb3","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-1820,-1680],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"c8a8156f-946e-4a50-8789-aff9c66bd9b6","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-1820,-1340],"parameters":{"color":4,"width":1289,"height":3278,"content":"## ✨ n8n Workflow: Investor Data Automation from Crunchbase to Google Sheets\n\n---\n\n### 🔷 **SECTION 1: Getting the Data from Crunchbase**\n\n#### 🧩 Nodes:\n\n1. 🕒 **Daily Investor Data Trigger**\n2. 🌐 **Fetch Crunchbase Investor Data**\n\n---\n\n#### 🔍 What Happens in This Section?\n\nThis section is all about **automatically pulling investor data from Crunchbase** on a scheduled basis, without any manual effort.\n\n---\n\n#### 🕒 1. **Daily Investor Data Trigger**\n\n> *\"When should the automation run?\"*\n\n* This **Schedule Trigger** node starts your workflow automatically at your chosen time.\n* For example, it could run every day at 8 AM.\n* It removes the need to remember to check Crunchbase manually.\n\n✅ *Beginner Benefit:*\n\n> Even if you’re not technical, you just set the schedule and let n8n run this job every day while you sleep ☕📊\n\n---\n\n#### 🌐 2. **Fetch Crunchbase Investor Data**\n\n> *\"Where do we get the data from?\"*\n\n* This **HTTP Request** node sends a **POST request** to [Crunchbase’s API](https://data.crunchbase.com/docs).\n\n* It includes a **filter** for organization types like `investor` and requests fields like:\n\n  * `name`\n  * `short_description`\n  * `location_identifiers`\n  * `investment_stage`\n\n* Crunchbase replies with a **JSON** file full of matching investors.\n\n✅ *Beginner Benefit:*\n\n> You don’t need to open a browser or search anything. This step collects live investor data from Crunchbase and brings it into your workflow for you 🚀\n\n---\n\n### ✅ What This Section Gives You:\n\nA **live, up-to-date snapshot** of investor information, **automatically pulled** from Crunchbase, without coding or clicking.\n\n---\n\n<br/>\n\n---\n\n### 🔷 **SECTION 2: Processing and Saving the Data**\n\n#### 🧩 Nodes:\n\n3. 🧮 **Extract Investor Fields**\n4. 📄 **Append to Investor Sheet**\n\n---\n\n#### 🔍 What Happens in This Section?\n\nNow that we have raw investor data, this section **cleans it up** and **stores it in a Google Sheet** for easy access and analysis.\n\n---\n\n#### 🧮 3. **Extract Investor Fields**\n\n> *\"Let’s clean and format the response.\"*\n\n* This **Code** node uses JavaScript to loop through the list of investors and extract just what you care about:\n\n  * ✅ Name\n  * 📝 Short description\n  * 🌍 Location\n  * 💰 Investment stage\n\n* Each investor becomes a **separate row-ready item** for Google Sheets.\n\n✅ *Beginner Benefit:*\n\n> You don’t need to look at messy data. This step reshapes it into a clean format automatically ✨\n\n---\n\n#### 📄 4. **Append to Investor Sheet**\n\n> *\"Store it somewhere useful.\"*\n\n* This **Google Sheets** node takes the cleaned data and **adds it to a selected sheet**.\n* It works like a magic assistant, typing the investor data into your spreadsheet row-by-row.\n* You now have a **running list** of investors to use for:\n\n  * 📈 Market research\n  * 🎯 Outreach planning\n  * 💡 Competitor benchmarking\n\n✅ *Beginner Benefit:*\n\n> You don’t copy-paste anything — n8n writes investor data into your sheet for you. It’s like having a personal assistant with no salary 📊🤖\n\n---\n\n### ✅ What This Section Gives You:\n\nA fully automated process that **cleans up Crunchbase data** and **stores it neatly** in Google Sheets — ready for analysis, dashboards, or reporting.\n\n---\n\n### 🎁 Final Outcome\n\n✅ No coding needed\n✅ Runs on autopilot\n✅ Clean data in your sheet\n✅ Use for strategy, marketing, or VC tracking\n\n---\n\n\n"},"typeVersion":1}],"active":false,"pinData":{"Fetch Crunchbase Investor Data":[{"json":{"paging":{"next_page":"cursor_string","total_items":1250,"current_page":1},"entities":[{"name":"Sequoia Capital","identifier":{"uuid":"12345","permalink":"sequoia-capital"},"investment_stage":["early_stage","seed"],"short_description":"Venture capital firm investing in early-stage companies.","location_identifiers":["united_states"]},{"name":"Andreessen Horowitz","identifier":{"uuid":"67890","permalink":"andreesen-horowitz"},"investment_stage":["seed","growth_stage"],"short_description":"Venture capital firm in Silicon Valley.","location_identifiers":["united_states"]}]}}]},"settings":{"executionOrder":"v1"},"versionId":"daeaf695-d4ae-460d-84b1-b4cdba520d28","connections":{"Extract Investor Fields":{"main":[[{"node":"Append to Investor Sheet","type":"main","index":0}]]},"Daily Investor Data Trigger":{"main":[[{"node":"Fetch Crunchbase Investor Data","type":"main","index":0}]]},"Fetch Crunchbase Investor Data":{"main":[[{"node":"Extract Investor Fields","type":"main","index":0}]]}}}


name: Upwork Job Aggregator with OpenAI Summaries & Multi-channel Notifications
author_name: Yaron Been
author_username: yaron-nofluff
categories: []
created_at: 2025-06-08T14:10:05.159Z
updated_at: 2025-06-08T14:10:05.159Z
url: https://n8n.io/workflows/4793
scraped_at: 2025-06-19 22:50:27
description:
  Automated system that aggregates job postings from Upwork based on your criteria and delivers personalized notifications, helping you never miss relevant opportunities.

  🚀 What It Does

  Custom job search based on keywords, skills, and categories
  Real-time job posting monitoring
  Smart filtering and prioritization
  Multi-channel notifications (Email/Slack/Teams)
  Duplicate detection

  🎯 Perfect For

  Freelancers seeking new opportunities
  Agencies looking for projects
  Recruiters sourcing talent
  Business owners finding contractors
  Digital nomads

  ⚙️ Key Benefits

  ✅ Save hours of manual searching  
  ✅ Get notified about relevant jobs first  
  ✅ Never miss perfect opportunities  
  ✅ Customizable search criteria  
  ✅ Time-zone friendly notifications  

  🔧 What You Need

  Upwork account
  n8n instance
  Preferred notification channels setup

  📊 Features

  Custom keyword alerts
  Budget range filtering
  Client history analysis
  Job type filtering (hourly/fixed)
  Experience level filtering

  🛠️ Setup & Support

  Quick Setup

  Be up and running in 15 minutes with our step-by-step guide

  📺 Watch Tutorial

  💼 Get Expert Support

  📧 Direct Help



  Transform your freelance career with automated job hunting. Spend less time searching and more time winning projects.

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.gmail","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatOpenAi","@n8n/n8n-nodes-langchain.outputParserStructured"]

workflow_json:
  {"id":"Q4LhFRDraaQuorBs","meta":{"instanceId":"84ad02d6104594179f43f1ce9cfe3a81637b2faedb57dafcb9e649b7542988db","templateCredsSetupCompleted":true},"name":"Upwork Job Aggregator & Notifier","tags":[],"nodes":[{"id":"834d0a42-1398-4cd4-aaf3-b1164e00b4a8","name":"Daily Upwork Job Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[0,0],"parameters":{"rule":{"interval":[{"triggerAtHour":9}]}},"typeVersion":1.2},{"id":"a0d54dfe-fc68-4020-b2ed-d191a57d5897","name":"Fetch Upwork Jobs (Apify)","type":"n8n-nodes-base.httpRequest","position":[220,0],"parameters":{"url":"https://api.apify.com/v2/actor-tasks/<YOUR_TASK_ID>/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>","method":"POST","options":{}},"typeVersion":4.2},{"id":"a9812fc7-0fa5-492a-91aa-392d0c8ee43b","name":"Format Job Fields","type":"n8n-nodes-base.set","position":[440,0],"parameters":{"options":{},"assignments":{"assignments":[{"id":"24bd782a-a34f-4b98-8d8f-21763181677b","name":"title","type":"string","value":"={{ $json.title }}"},{"id":"ee879b3d-339a-44c2-9e11-f653edab2e7f","name":"url","type":"string","value":"={{ $json.url }}"},{"id":"b5ff7975-667b-4997-ac8f-acbe9a3b3b85","name":"description","type":"string","value":"={{ $json.description }}"},{"id":"29051fc3-e4f8-4e39-a024-d7b943271acc","name":"budget","type":"string","value":"={{ $json.budget }}"},{"id":"a6492128-a58a-4735-b427-12265f81da3a","name":"datePosted","type":"string","value":"={{ $json.datePosted }}"}]}},"typeVersion":3.4},{"id":"a996aa35-8f0d-4e1a-997b-4aadd402f65c","name":"Log Jobs to Google Sheet","type":"n8n-nodes-base.googleSheets","position":[740,0],"parameters":{"columns":{"value":{"url":"={{ $json.url }}","title":"={{ $json.title }}","budget":"={{ $json.budget }}","datePosted":"={{ $json.datePosted }}","description":"={{ $json.description }}"},"schema":[{"id":"title","type":"string","display":true,"required":false,"displayName":"title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"url","type":"string","display":true,"required":false,"displayName":"url","defaultMatch":false,"canBeUsedToMatch":true},{"id":"description","type":"string","display":true,"required":false,"displayName":"description","defaultMatch":false,"canBeUsedToMatch":true},{"id":"budget","type":"string","display":true,"required":false,"displayName":"budget","defaultMatch":false,"canBeUsedToMatch":true},{"id":"datePosted","type":"string","display":true,"required":false,"displayName":"datePosted","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1dEU6uMB4ehiGXjIExjtFQHvUjANRODawKMBGKDaTcEc/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1dEU6uMB4ehiGXjIExjtFQHvUjANRODawKMBGKDaTcEc","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1dEU6uMB4ehiGXjIExjtFQHvUjANRODawKMBGKDaTcEc/edit?usp=drivesdk","cachedResultName":"Upwork Scraper"}},"credentials":{"googleSheetsOAuth2Api":{"id":"v021NCWuTwSSSXPP","name":"Google Sheets account 2"}},"typeVersion":4.5},{"id":"e0cd68e5-4d6d-479a-8a48-1faccc9f3ff7","name":"Summarize Job Listings","type":"@n8n/n8n-nodes-langchain.agent","position":[960,0],"parameters":{"text":"=Provide a summary of the upwork jobs. It should be in email format\n\nTitle: {{ $json.title }}\nURL: {{ $json.url }}\nDescription:{{ $json.description }}\nBudget:{{ $json.budget }}\nDate posted: {{ $json.datePosted }}","options":{},"promptType":"define","hasOutputParser":true},"typeVersion":1.9},{"id":"30002e32-6046-4e5c-a27f-a0d58f380ae9","name":"Send Job Summary Email","type":"n8n-nodes-base.gmail","position":[1500,0],"webhookId":"6937d724-5ede-4c56-83fd-fde84496eabd","parameters":{"sendTo":"shahkar.genai@gmail.com","message":"={{ $json.output.Summary }}","options":{},"subject":"={{ $json.output.subject }}"},"credentials":{"gmailOAuth2":{"id":"YMHjS2nJsRGP7svY","name":"Gmail account"}},"typeVersion":2.1},{"id":"a1fb5d66-b780-4b6b-96be-3391b6196301","name":"OpenAI Job Summarizer","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[900,260],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"wYwTjEv45IzlAOAu","name":"OpenAi account 2"}},"typeVersion":1.2},{"id":"f79a7336-80fc-4832-862b-51d0d737d5a3","name":"Parse Summary Output","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[1160,260],"parameters":{"jsonSchemaExample":"{\n  \"subject\": \"Upwork Job Opportunity: Webflow Expert Needed for Portfolio Website\",\n  \"Summary\": \"The client is seeking a designer with strong experience in Webflow to create a responsive and elegant portfolio site.\"\n}\n"},"typeVersion":1.2},{"id":"85465ead-0a06-455c-9308-866c092d8ef5","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-60,-560],"parameters":{"color":3,"width":640,"height":760,"content":"### 🔁 **Section 1: Job Fetch & Preparation**\n\n📦 **Group Name**: `📥 Fetch & Prepare Upwork Jobs`\n\n#### ✅ **Included Nodes:**\n\n1. `🕒 Daily Upwork Job Trigger`\n2. `🌐 Fetch Upwork Jobs (Apify)`\n3. `🛠️ Format Job Fields`\n\n#### 📋 **What this group does:**\n\nThis group is responsible for automatically triggering the job search, pulling fresh job data from Upwork (via Apify), and formatting that data into a clean, structured format.\n\n#### 📌 **Highlights:**\n\n* Uses Apify’s `run-sync-get-dataset-items` to ensure you get fresh job results in one go.\n* Ensures only the required fields (like title, URL, budget) are passed forward.\n* Keeps your data clean and minimal for logging and summarization.\n\n---"},"typeVersion":1},{"id":"3699ba73-75ee-4bf2-91eb-8d0d05143321","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[680,-620],"parameters":{"color":5,"width":620,"height":1040,"content":"### 📊 **Section 2: Data Logging & Summary Generation**\n\n📦 **Group Name**: `🧾 Log & Summarize Jobs`\n\n#### ✅ **Included Nodes:**\n\n1. `📈 Log Jobs to Google Sheet`\n2. `🤖 Summarize Job Listings`\n\n   * `🧠 OpenAI Job Summarizer`\n   * `📄 Parse Summary Output`\n\n#### 📋 **What this group does:**\n\nThis group handles the dual responsibility of:\n\n* Persistently logging all job entries to a **Google Sheet**\n* Generating a human-friendly **natural language summary** of the fetched jobs using the OpenAI model and parsing the result into clean output\n\n#### 💡 **Why this matters:**\n\n* Keeps historical records in Sheets ✅\n* Makes email digest more meaningful and less overwhelming for the reader 🧠\n\n---\n\n"},"typeVersion":1},{"id":"2289feb5-9ab1-4dbb-a77e-f4742f0f341d","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[1400,-420],"parameters":{"color":6,"width":340,"height":600,"content":"## 📤 **Section 3: Job Summary Notification**\n\n📦 **Group Name**: `✉️ Notify via Email`\n\n#### ✅ **Included Node:**\n\n1. `📧 Send Job Summary Email`\n\n#### 📋 **What this group does:**\n\nSends a **summary email** to the desired recipient(s) with the content generated by the AI agent.\n\n"},"typeVersion":1},{"id":"95727922-4856-4481-acff-519638ac5d23","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-1520,-560],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"c161b105-70a6-431a-91e2-9031ccba8fe4","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-1520,-220],"parameters":{"color":4,"width":1289,"height":3058,"content":"# ✅ n8n Automation: \"Upwork Job Aggregator & Notifier\"\n\n> **Purpose**: Automatically fetch job postings from Upwork with specific keywords, save them in Google Sheets, summarize them using AI, and email the results daily (or at any interval you want).\n\n---\n\n## 🧱 HIGH-LEVEL OVERVIEW\n\n| Feature         | Description                                          |\n| --------------- | ---------------------------------------------------- |\n| 🕐 Trigger      | Scheduled (e.g., every 6 hours)                      |\n| 🌐 Source       | [Apify](https://apify.com) actor for Upwork scraping |\n| 📄 Storage      | Google Sheets                                        |\n| 🧠 Summary      | OpenAI model with structured output                  |\n| 📬 Notification | Gmail with formatted job summary                     |\n\n---\n\n## 🧠 GROUP 1: 📥 Fetch & Prepare Upwork Jobs\n\n### 🟢 Nodes:\n\n1. `🕒 Daily Upwork Job Trigger`\n\n   * **Type**: Cron Trigger\n   * **Purpose**: Runs the flow automatically at your set interval (e.g., every 6 hours or daily)\n\n2. `🌐 Fetch Upwork Jobs (Apify)`\n\n   * **Type**: HTTP Request\n   * **Method**: POST\n   * **URL**: `https://api.apify.com/v2/actor-tasks/<TASK_ID>/run-sync-get-dataset-items?token=<API_TOKEN>`\n   * **Purpose**: Calls your Apify Upwork Scraper task to get the latest job listings\n   * **Output**: JSON array of job objects\n\n3. `🛠️ Format Job Fields`\n\n   * **Type**: Edit Fields (Set or Function Node)\n   * **Purpose**: Extracts needed job fields like `title`, `url`, `description`, `budget`, and `datePosted`\n   * **Reason**: Makes data uniform for Sheet storage and AI summary\n\n---\n\n## 📊 GROUP 2: 🧾 Log & Summarize Jobs\n\n### 🟢 Nodes:\n\n4. `📈 Log Jobs to Google Sheet`\n\n   * **Type**: Google Sheets → Append Sheet\n   * **Sheet Setup**: Must have headers like `Title`, `URL`, `Description`, `Budget`, `Date`\n   * **Purpose**: Appends each new job as a row in the sheet for historical tracking\n\n5. `🤖 Summarize Job Listings` (AI Agent node group)\n\n   * **Type**: Tools Agent (LangChain / OpenAI Integration)\n   * **Connected Sub-Nodes**:\n\n     * `🧠 OpenAI Job Summarizer` (OpenAI Chat Model)\n\n       * **Prompt** example:\n\n         ```\n         You are an assistant summarizing freelance job postings. Summarize each job in 1-2 lines. Include title, budget, and a short description.\n         ```\n     * `📄 Parse Summary Output` (Structured Output Parser)\n\n       * **Purpose**: Converts the AI response into structured n8n items\n   * **Input**: Job data from Google Sheets\n   * **Output**: A clear, natural language summary of all jobs\n\n---\n\n## 📤 GROUP 3: ✉️ Notify via Email\n\n### 🟢 Node:\n\n6. `📧 Send Job Summary Email`\n\n   * **Type**: Gmail → Send Message\n\n   * **Authentication**: Google OAuth2\n\n   * **To**: Yourself or your team\n\n   * **Subject**: `\"🚀 New Upwork Jobs Found!\"`\n\n   * **Body**:\n\n     ```\n     Hello,\n\n     Here’s a summary of the latest Upwork jobs matching your criteria:\n\n     {{summary from AI}}\n\n     ➕ View full job list here: [Google Sheet Link]\n\n     Best,  \n     Your Automation Bot 🤖\n     ```\n\n   * **Error Handling**: Add an IF node to prevent email if no jobs were returned (optional)\n\n---\n\n## 🗂 Suggested Color-Coded Groups in n8n:\n\n| Group                          | Nodes                                | Color     | Description                     |\n| ------------------------------ | ------------------------------------ | --------- | ------------------------------- |\n| 📥 Fetch & Prepare Upwork Jobs | Trigger, HTTP Request, Format Fields | 🟢 Green  | Gets data and prepares it       |\n| 🧾 Log & Summarize Jobs        | Google Sheets, AI Agent, Parser      | 🟡 Yellow | Logs + creates smart summaries  |\n| ✉️ Notify via Email            | Gmail                                | 🔴 Red    | Notifies you with clean summary |\n\n---\n\n## 🚀 ADVANTAGES\n\n✅ Completely automated\n✅ Saves all job history\n✅ AI-enhanced summaries\n✅ Instant email alerts\n✅ Easy to expand or customize\n\n---\n\n## 🧩 Bonus Enhancements (Optional)\n\n| Idea                      | Description                                                   |\n| ------------------------- | ------------------------------------------------------------- |\n| 🔍 Add keyword filters    | Add filters before saving to Sheets (e.g., only “React” jobs) |\n| 🕵️‍♂️ Prevent duplicates | Store job IDs and check before saving                         |\n| 📣 Add Slack alerts       | Add Slack node for team notification                          |\n| 📊 Dashboard              | Build Google Data Studio report over the Sheet                |\n\n---\n\n\n"},"typeVersion":1}],"active":false,"pinData":{"Fetch Upwork Jobs (Apify)":[{"json":{"url":"https://www.upwork.com/job/Looking-Webflow-Expert-Build-Portfolio-Website_~01abcd123456efghij","title":"Looking for a Webflow Expert to Build a Portfolio Website","budget":"$300","datePosted":"2025-06-03T08:45:00Z","description":"Need a designer with strong Webflow experience to create a responsive and elegant portfolio site."}},{"json":{"url":"https://www.upwork.com/job/React-Developer-Needed-SaaS-Dashboard_~0123abcd4567efghij","title":"React Developer Needed for SaaS Dashboard","budget":"$500","datePosted":"2025-06-03T06:30:00Z","description":"Looking for an experienced React developer to work on our SaaS product dashboard UI. Experience with Tailwind is a plus."}},{"json":{"url":"https://www.upwork.com/job/Copywriter-Landing-Page-Finance_~0a1b2c3d4e5f67890","title":"Copywriter for Landing Page Content (Finance Industry)","budget":"$150","datePosted":"2025-06-02T21:15:00Z","description":"We need SEO-optimized copy for a fintech landing page. Prior experience in finance writing preferred."}}]},"settings":{"executionOrder":"v1"},"versionId":"8c929fc6-2198-4adf-89c3-ff0a2b296fdd","connections":{"Format Job Fields":{"main":[[{"node":"Log Jobs to Google Sheet","type":"main","index":0}]]},"Parse Summary Output":{"ai_outputParser":[[{"node":"Summarize Job Listings","type":"ai_outputParser","index":0}]]},"OpenAI Job Summarizer":{"ai_languageModel":[[{"node":"Summarize Job Listings","type":"ai_languageModel","index":0}]]},"Summarize Job Listings":{"main":[[{"node":"Send Job Summary Email","type":"main","index":0}]]},"Daily Upwork Job Trigger":{"main":[[{"node":"Fetch Upwork Jobs (Apify)","type":"main","index":0}]]},"Log Jobs to Google Sheet":{"main":[[{"node":"Summarize Job Listings","type":"main","index":0}]]},"Fetch Upwork Jobs (Apify)":{"main":[[{"node":"Format Job Fields","type":"main","index":0}]]}}}


name: Upwork Lead Generation: Extract Client Emails with LinkedIn Scraping and AI
author_name: Yaron Been
author_username: yaron-nofluff
categories: []
created_at: 2025-06-08T14:10:26.119Z
updated_at: 2025-06-08T14:10:26.119Z
url: https://n8n.io/workflows/4794
scraped_at: 2025-06-19 22:48:49
description:
  Automated solution to extract and organize contact information from Upwork job postings, enabling direct outreach to potential clients who post jobs matching your expertise.

  🚀 What It Does

  Scrapes job postings for contact information
  Extracts email addresses and social profiles
  Organizes leads in a structured format
  Enables direct outreach campaigns
  Tracks response rates

  🎯 Perfect For

  Freelancers looking to expand their client base
  Agencies targeting specific industries
  Sales professionals in the gig economy
  Recruiters sourcing clients
  Digital marketing agencies

  ⚙️ Key Benefits

  ✅ Access to hidden contact information  
  ✅ Expand your client base  
  ✅ Beat the competition to opportunities  
  ✅ Targeted outreach campaigns  
  ✅ Higher response rates  

  🔧 What You Need

  Upwork account
  n8n instance
  Email service (for outreach)
  CRM (optional)

  📊 Features

  Email pattern detection
  Social media profile extraction
  Company website discovery
  Lead scoring system
  Outreach tracking

  🛠️ Setup & Support

  Quick Setup

  Start collecting leads in 20 minutes with our step-by-step guide

  📺 Watch Tutorial

  💼 Get Expert Support

  📧 Direct Help



  Take control of your freelance career with direct access to potential clients. Transform how you find and secure projects on Upwork.

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatOpenAi"]

workflow_json:
  {"id":"wAomRf96IfSnpTA7","meta":{"instanceId":"84ad02d6104594179f43f1ce9cfe3a81637b2faedb57dafcb9e649b7542988db","templateCredsSetupCompleted":true},"name":"Upwork Job Poster Email","tags":[],"nodes":[{"id":"aa72ce26-28ae-4dab-982f-be16fa123d87","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[420,360],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"wYwTjEv45IzlAOAu","name":"OpenAi account 2"}},"typeVersion":1.2},{"id":"94fba561-bc7e-4180-9b5d-beb9482b28b6","name":"Run Every X Hours","type":"n8n-nodes-base.scheduleTrigger","position":[0,140],"parameters":{"rule":{"interval":[{"field":"hours"}]}},"typeVersion":1.2},{"id":"603403fa-6f4b-4124-90ee-f852954e67a4","name":"Fetch Latest Upwork Jobs (Apify)","type":"n8n-nodes-base.httpRequest","position":[220,140],"parameters":{"url":"https://api.apify.com/v2/actor-tasks/<TASK_ID>/run-sync-get-dataset-items?token=<API_TOKEN>","options":{},"sendBody":true,"bodyParameters":{"parameters":[{}]}},"typeVersion":4.2},{"id":"0ed2ab83-1fcb-459c-aa6d-ef81c8414b45","name":"Extract Company or Person Name from Job","type":"@n8n/n8n-nodes-langchain.agent","position":[440,140],"parameters":{"text":"=Title: {{ $json.title }}\nDescription: {{ $json.description }}","options":{"systemMessage":"\"Extract the client's name or company name if it is mentioned. Return only the name or 'null' if not found.\""},"promptType":"define"},"typeVersion":1.9},{"id":"ccd6cf3c-2666-45eb-8dc3-6575180c897b","name":"Name is Found?","type":"n8n-nodes-base.if","position":[800,140],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"7366a7c6-e767-4aea-96e1-0cbbcbb26100","operator":{"type":"string","operation":"notEquals"},"leftValue":"={{ $json.output }}","rightValue":"null"}]}},"typeVersion":2.2},{"id":"c9721e93-707d-45c1-a06b-68606157f995","name":"No Name Found - End Early","type":"n8n-nodes-base.noOp","position":[1240,320],"parameters":{},"typeVersion":1},{"id":"4164b6e9-9ba7-4fc6-a1b6-c976f626aea5","name":"Is It a Person or Company?","type":"@n8n/n8n-nodes-langchain.agent","position":[1180,40],"parameters":{"text":"={{ $json.output }}","options":{"systemMessage":"\"Extract the client's name or company name. Return only the 'person' if looks like a person's name if not return 'company'.\"\n"},"promptType":"define"},"typeVersion":1.9},{"id":"93c7b341-6257-4ee2-a54f-ecbfcdf0f89b","name":"Person or Company?","type":"n8n-nodes-base.if","position":[1540,40],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"729e7baa-ae94-4661-a061-7d656faf820f","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.output }}","rightValue":"company"}]}},"typeVersion":2.2},{"id":"7dcacf79-eb65-454c-97fd-16ea6aed2f94","name":"Search LinkedIn for Company (Phantombuster)","type":"n8n-nodes-base.httpRequest","position":[1960,-120],"parameters":{"url":"https://api.phantombuster.com/api/v2/agents/<AGENT_ID>/launch","method":"POST","options":{},"jsonBody":"={\n  \"argument\": {\n    \"search\": {{ $json.output }},\n    \"numberOfProfiles\": 5,\n    \"sessionCookie\": \"<LINKEDIN_SESSION_COOKIE>\"\n  },\n  \"saveArguments\": true\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"X-Phantombuster-Key-1","value":"<YOUR_API_KEY>"}]}},"typeVersion":4.2},{"id":"e2f7db77-373e-462a-bc57-57653e067e30","name":"Scrape LinkedIn Company Profile","type":"n8n-nodes-base.httpRequest","position":[2180,-120],"parameters":{"url":"https://api.phantombuster.com/api/v2/agents/<AGENT_ID>/launch","method":"POST","options":{},"jsonBody":"={\n  \"argument\": {\n    \"spreadsheetUrl\": {{ $json.profileUrl }},\n    \"sessionCookie\": \"<LINKEDIN_SESSION_COOKIE>\"\n  },\n  \"saveArguments\": true\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"X-Phantombuster-Key-1","value":"<YOUR_API_KEY>"}]}},"typeVersion":4.2},{"id":"14d7f669-dbc1-484e-b3c0-3d1e83d4c74f","name":"Find Company Email (Hunter.io)","type":"n8n-nodes-base.httpRequest","position":[2400,-120],"parameters":{"url":"=https://api.hunter.io/v2/domain-search?domain{{ $json.website }}=&api_key=<YOUR_API_KEY>","options":{}},"typeVersion":4.2},{"id":"4fd05ce5-495e-4d3a-8998-3120c3456e57","name":"Search LinkedIn for Person (Phantombuster)","type":"n8n-nodes-base.httpRequest","position":[1960,1280],"parameters":{"url":"https://api.phantombuster.com/api/v2/agents/<AGENT_ID>/launch","method":"POST","options":{},"jsonBody":"{\n  \"argument\": {\n    \"search\": {{ $json.output }},\n    \"numberOfProfiles\": 3,\n    \"sessionCookie\": \"<LINKEDIN_SESSION_COOKIE>\"\n  },\n  \"saveArguments\": true\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"X-Phantombuster-Key-1","value":"<YOUR_API_KEY>"}]}},"typeVersion":4.2},{"id":"f048e198-cc4b-4739-be7d-d3d885c6d2bb","name":"Scrape LinkedIn Person Profile","type":"n8n-nodes-base.httpRequest","position":[2180,1280],"parameters":{"url":"https://api.phantombuster.com/api/v2/agents/<AGENT_ID>/launch","method":"POST","options":{},"jsonBody":"={\n  \"argument\": {\n    \"spreadsheetUrl\": {{ $json.profileUrl }},\n    \"sessionCookie\": \"<LINKEDIN_SESSION_COOKIE>\"\n  },\n  \"saveArguments\": true\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"X-Phantombuster-Key-1","value":"<YOUR_API_KEY>"}]}},"typeVersion":4.2},{"id":"dbc8c317-b469-4125-b939-614524a0339b","name":"Find Personal Email (Hunter.io)","type":"n8n-nodes-base.httpRequest","position":[2400,1280],"parameters":{"url":"=https://api.hunter.io/v2/email-finder?domain={{ $json.fullName }}=Ali%20Raza&api_key=<YOUR_API_KEY>","options":{}},"typeVersion":4.2},{"id":"047146a8-2b02-4098-a0e9-f8366c42aa4f","name":"Store Results in Google Sheet","type":"n8n-nodes-base.googleSheets","position":[2760,20],"parameters":{"operation":"append","sheetName":{"__rl":true,"mode":"list","value":""},"documentId":{"__rl":true,"mode":"list","value":""}},"credentials":{"googleSheetsOAuth2Api":{"id":"Rp7XiR3hxJfv03ZO","name":"Google Sheets account"}},"typeVersion":4.5},{"id":"1e9dee68-e0c2-4588-b6ca-666534d14dd4","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-1820,-2200],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"2085a7ca-f68b-490a-9dcb-3c96fc6a739d","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-1820,-1860],"parameters":{"color":4,"width":1289,"height":5558,"content":"# 🚀 **Automated Upwork Lead Enrichment Workflow**\n\n> ✨ *Fetch potential clients from Upwork, extract their info using AI, search them on LinkedIn, gather emails, and store all in Google Sheets* ✨\n\n---\n\n## 🧩 **1. Trigger & Data Collection**\n\n---\n\n### ⏰ `Trigger - Run Every X Hours`\n\n**🔧 Node Type**: Schedule Trigger\n**🧠 Purpose**:\nThis node starts your automation periodically. You define how often it runs (e.g., every 6 hours, daily, etc.).\n\n**📚 Why It’s Important**:\nYou don’t want to manually check Upwork every few hours. This node automates it for you.\n\n---\n\n### 🌐 `Fetch Latest Upwork Jobs (Apify)`\n\n**🔧 Node Type**: HTTP Request\n**🧠 Purpose**:\nFetch the latest Upwork jobs by calling the [Apify Upwork Actor API](https://apify.com/).\n\n**⚙️ Tech Behind It**:\nA simple `GET` request pulls in structured job listings (title, description, budget, etc.) as JSON data.\n\n**💡 Beginner Tip**:\nNo coding needed—just copy your Apify API URL with your token and plug it into the node.\n\n---\n\n## 🤖 **2. AI Name Extraction**\n\n---\n\n### 🧠 `AI - Extract Company or Person Name from Job`\n\n**🔧 Node Type**: AI Agent / OpenAI Chat\n**🧠 Purpose**:\nUses GPT to scan the job title + description and extract a **company name or client’s full name**, if present.\n\n**📚 Why It’s Smart**:\nClients sometimes mention names like “Hi, we at DevSync...” or sign with their name at the bottom. This step grabs that.\n\n**🧠 AI Prompt Tip**:\nUse structured prompts like:\n\n> “Extract a full person or company name from this job description. If not found, say 'none’.”\n\n---\n\n### 🧪 `IF - Name is Found?`\n\n**🔧 Node Type**: IF\n**🧠 Purpose**:\nChecks whether the AI returned a name. If not, it skips that job.\n\n**🛑 `No Name Found - End Early`**\nStops further processing and prevents wasted API calls or errors.\n\n---\n\n## 🧭 **3. AI Classification – Person vs Company**\n\n---\n\n### 🧠 `AI - Is It a Person or Company?`\n\n**🔧 Node Type**: AI Agent\n**🧠 Purpose**:\nClassifies the extracted name as either a **company** or a **person** using simple AI logic.\n\n**🔍 Why It Matters**:\nDepending on what it is, the next step—searching LinkedIn—will differ.\n\n---\n\n### 🔀 `IF - Person or Company?`\n\n**🔧 Node Type**: IF\n**🧠 Purpose**:\nRoutes the flow to two different paths:\n\n* Company → Search company profile\n* Person → Search individual profile\n\n---\n\n## 🏢 **4A. Company Path**\n\n---\n\n### 🔍 `Search LinkedIn for Company (Phantombuster)`\n\n**🔧 Node Type**: HTTP Request\n**📡 Purpose**:\nUses [Phantombuster’s LinkedIn Search API](https://phantombuster.com/) to search for the **company name**.\n\n**📦 Input**: `\"DevSync\"`\n**📤 Output**: Company’s LinkedIn URL\n\n---\n\n### 🏭 `Scrape LinkedIn Company Profile`\n\n**🔧 Node Type**: HTTP Request\n**🔍 Purpose**:\nScrapes the company’s LinkedIn page to pull:\n\n* Size\n* Website\n* Industry\n* Location\n* Description\n\n---\n\n### 📬 `Find Company Email (Hunter.io)`\n\n**🔧 Node Type**: HTTP Request\n**🔍 Purpose**:\nUses [Hunter.io](https://hunter.io) to find company-level email addresses like `info@devsync.com`, `hello@devsync.com`, etc.\n\n**📦 Input**: Company’s domain (e.g., `devsync.com`)\n**📤 Output**: Emails + Confidence Score\n\n---\n\n## 👤 **4B. Person Path**\n\n---\n\n### 🔍 `Search LinkedIn for Person (Phantombuster)`\n\n**🔧 Node Type**: HTTP Request\n**📡 Purpose**:\nSearches for the extracted **person’s name** like \"John Smith\" using Phantombuster.\n\n**📤 Output**: LinkedIn profile URL(s)\n\n---\n\n### 🧑‍💼 `Scrape LinkedIn Person Profile`\n\n**🔧 Node Type**: HTTP Request\n**📄 Purpose**:\nScrapes:\n\n* Name\n* Current Job Title\n* Company\n* Location\n* Education\n* LinkedIn URL\n\n---\n\n### ✉️ `Find Personal Email (Hunter.io)`\n\n**🔧 Node Type**: HTTP Request\n**🔍 Purpose**:\nAttempts to find personal emails using the name + company domain.\n\n**📤 Output**: Email (if public), sometimes with confidence score.\n\n---\n\n## 📑 **5. Store Everything in Google Sheets**\n\n---\n\n### 🧾 `Store Results in Google Sheet`\n\n**🔧 Node Type**: Google Sheets (Append Row)\n**🧠 Purpose**:\nSaves:\n\n* Job title\n* Description\n* Client Name\n* Person/Company\n* LinkedIn Profile\n* Scraped Info\n* Emails\n\n**📚 Why It’s Gold**:\nYou now have a **personal CRM of Upwork clients** to reach out to directly or research further.\n\n---\n\n## 🌟 **Summary of Benefits**\n\n| ✅ Feature              | 💡 Benefit                            |\n| ---------------------- | ------------------------------------- |\n| Fully automated        | Save hours of manual research         |\n| Uses AI                | No need to write complex regex or NLP |\n| Phantombuster scraping | Get verified LinkedIn profiles        |\n| Hunter.io              | Helps gather email leads              |\n| Google Sheets          | Easy to filter, review, and manage    |\n\n---\n\n## 📌 **Beginner Tips**\n\n* 🧪 Start with dummy job data and test just the first few nodes.\n* 🔑 Always **secure your API keys** using environment variables or secrets.\n* 🧠 Use **n8n’s execution log** to debug any failures.\n* 🧹 Add rate-limiting or error handling if APIs return errors or limits.\n\n---\n\nWould you like a Notion-ready documentation, downloadable PDF, or HTML guide for your team or clients?\n"},"typeVersion":1},{"id":"5bda85dd-7559-4239-9b38-c887a39dbb54","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-60,-2180],"parameters":{"color":3,"width":1800,"height":2680,"content":"## 🧩 **1. Trigger & Data Collection**\n\n---\n\n### ⏰ `Trigger - Run Every X Hours`\n\n**🔧 Node Type**: Schedule Trigger\n**🧠 Purpose**:\nThis node starts your automation periodically. You define how often it runs (e.g., every 6 hours, daily, etc.).\n\n**📚 Why It’s Important**:\nYou don’t want to manually check Upwork every few hours. This node automates it for you.\n\n---\n\n### 🌐 `Fetch Latest Upwork Jobs (Apify)`\n\n**🔧 Node Type**: HTTP Request\n**🧠 Purpose**:\nFetch the latest Upwork jobs by calling the [Apify Upwork Actor API](https://apify.com/).\n\n**⚙️ Tech Behind It**:\nA simple `GET` request pulls in structured job listings (title, description, budget, etc.) as JSON data.\n\n**💡 Beginner Tip**:\nNo coding needed—just copy your Apify API URL with your token and plug it into the node.\n\n---\n\n## 🤖 **2. AI Name Extraction**\n\n---\n\n### 🧠 `AI - Extract Company or Person Name from Job`\n\n**🔧 Node Type**: AI Agent / OpenAI Chat\n**🧠 Purpose**:\nUses GPT to scan the job title + description and extract a **company name or client’s full name**, if present.\n\n**📚 Why It’s Smart**:\nClients sometimes mention names like “Hi, we at DevSync...” or sign with their name at the bottom. This step grabs that.\n\n**🧠 AI Prompt Tip**:\nUse structured prompts like:\n\n> “Extract a full person or company name from this job description. If not found, say 'none’.”\n\n---\n\n### 🧪 `IF - Name is Found?`\n\n**🔧 Node Type**: IF\n**🧠 Purpose**:\nChecks whether the AI returned a name. If not, it skips that job.\n\n**🛑 `No Name Found - End Early`**\nStops further processing and prevents wasted API calls or errors.\n\n---\n\n## 🧭 **3. AI Classification – Person vs Company**\n\n---\n\n### 🧠 `AI - Is It a Person or Company?`\n\n**🔧 Node Type**: AI Agent\n**🧠 Purpose**:\nClassifies the extracted name as either a **company** or a **person** using simple AI logic.\n\n**🔍 Why It Matters**:\nDepending on what it is, the next step—searching LinkedIn—will differ.\n\n---\n\n### 🔀 `IF - Person or Company?`\n\n**🔧 Node Type**: IF\n**🧠 Purpose**:\nRoutes the flow to two different paths:\n\n* Company → Search company profile\n* Person → Search individual profile"},"typeVersion":1},{"id":"aa30a465-97e4-449f-a0b4-07a97a0f3d2c","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[1880,-1300],"parameters":{"color":5,"width":700,"height":1420,"content":"## 🏢 **4A. Company Path**\n\n---\n\n### 🔍 `Search LinkedIn for Company (Phantombuster)`\n\n**🔧 Node Type**: HTTP Request\n**📡 Purpose**:\nUses [Phantombuster’s LinkedIn Search API](https://phantombuster.com/) to search for the **company name**.\n\n**📦 Input**: `\"DevSync\"`\n**📤 Output**: Company’s LinkedIn URL\n\n---\n\n### 🏭 `Scrape LinkedIn Company Profile`\n\n**🔧 Node Type**: HTTP Request\n**🔍 Purpose**:\nScrapes the company’s LinkedIn page to pull:\n\n* Size\n* Website\n* Industry\n* Location\n* Description\n\n---\n\n### 📬 `Find Company Email (Hunter.io)`\n\n**🔧 Node Type**: HTTP Request\n**🔍 Purpose**:\nUses [Hunter.io](https://hunter.io) to find company-level email addresses like `info@devsync.com`, `hello@devsync.com`, etc.\n\n**📦 Input**: Company’s domain (e.g., `devsync.com`)\n**📤 Output**: Emails + Confidence Score\n\n---\n"},"typeVersion":1},{"id":"7d7ec4da-d52c-4563-94df-3dcf88c85ff0","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[1900,160],"parameters":{"color":6,"width":640,"height":1300,"content":"## 👤 **4B. Person Path**\n\n---\n\n### 🔍 `Search LinkedIn for Person (Phantombuster)`\n\n**🔧 Node Type**: HTTP Request\n**📡 Purpose**:\nSearches for the extracted **person’s name** like \"John Smith\" using Phantombuster.\n\n**📤 Output**: LinkedIn profile URL(s)\n\n---\n\n### 🧑‍💼 `Scrape LinkedIn Person Profile`\n\n**🔧 Node Type**: HTTP Request\n**📄 Purpose**:\nScrapes:\n\n* Name\n* Current Job Title\n* Company\n* Location\n* Education\n* LinkedIn URL\n\n---\n\n### ✉️ `Find Personal Email (Hunter.io)`\n\n**🔧 Node Type**: HTTP Request\n**🔍 Purpose**:\nAttempts to find personal emails using the name + company domain.\n\n**📤 Output**: Email (if public), sometimes with confidence score.\n\n---"},"typeVersion":1},{"id":"46f24197-38da-43a1-ba03-1e394169340a","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[2680,-520],"parameters":{"color":6,"width":260,"height":720,"content":"## 📑 **5. Store Everything in Google Sheets**\n\n---\n\n### 🧾 `Store Results in Google Sheet`\n\n**🔧 Node Type**: Google Sheets (Append Row)\n**🧠 Purpose**:\nSaves:\n\n* Job title\n* Description\n* Client Name\n* Person/Company\n* LinkedIn Profile\n* Scraped Info\n* Emails"},"typeVersion":1}],"active":false,"pinData":{"Find Company Email (Hunter.io)":[{"json":{"data":{"domain":"devsync.io","emails":[{"type":"personal","value":"ali.raza@devsync.io","sources":[{"domain":"devsync.io","extracted_on":"2024-12-01","last_seen_on":"2025-05-30","still_on_page":true}],"linkedin":"https://www.linkedin.com/in/aliraza-devsync","position":"Founder","last_name":"Raza","confidence":95,"department":"Executive","first_name":"Ali"},{"type":"generic","value":"info@devsync.io","confidence":100}],"pattern":"{first}.{last}@devsync.io","webmail":false,"disposable":false,"organization":"DevSync"},"meta":{"limit":100,"offset":0,"results":2}}}],"Scrape LinkedIn Person Profile":[{"json":{"skills":["Python","Distributed Systems","Kubernetes","GCP"],"summary":"Experienced software engineer specializing in backend and distributed systems.","fullName":"John Doe","headline":"Senior Software Engineer at Google","location":"Mountain View, California, United States","education":[{"degree":"B.S. in Computer Science","school":"Stanford University","dateRange":"2012 – 2016"}],"profileUrl":"https://www.linkedin.com/in/john-doe-123456/","connections":"500+ connections","experiences":[{"title":"Senior Software Engineer","company":"Google","location":"Mountain View, CA","dateRange":"Jan 2021 – Present","description":"Working on scalable cloud infrastructure and ML services."},{"title":"Software Engineer","company":"Facebook","location":"Menlo Park, CA","dateRange":"2017 – 2021"}],"profilePictureUrl":"https://media.licdn.com/dms/image/xyz.jpg"}}],"Find Personal Email (Hunter.io)":[{"json":{"data":{"email":"ali.raza@devsync.io","score":93,"domain":"devsync.io","company":"DevSync","twitter":null,"position":"Founder","last_name":"Raza","first_name":"Ali","linkedin_url":"https://www.linkedin.com/in/aliraza-devsync","phone_number":null},"meta":{"confidence":93}}}],"Scrape LinkedIn Company Profile":[{"json":{"name":"DevSync","founded":"2021","website":"https://devsync.io","industry":"Computer Software","followers":248,"companySize":"11-50 employees","description":"DevSync is a real-time collaboration tool for distributed software teams.","linkedinUrl":"https://www.linkedin.com/company/devsync/","specialties":["Collaboration","Remote Work","Agile Tools"],"headquarters":"San Francisco, CA"}}],"Fetch Latest Upwork Jobs (Apify)":[{"json":{"url":"https://www.upwork.com/job/React-developer_~01abcde12345fghij","title":"Looking for a React developer for long-term project","budget":1000,"client":{"country":"United States","feedback":4.9},"category":"Web, Mobile & Software Dev","postedAt":"2025-06-07T12:34:56Z","description":"We are a San Francisco-based startup called DevSync. We're building a real-time collaboration tool for remote teams..."}},{"json":{"url":"https://www.upwork.com/job/AI-ML-Engineer_~01qwerty98765zxcvb","title":"AI/ML Engineer Needed for Predictive Model","budget":2000,"client":{"country":"Canada","feedback":4.7},"category":"Data Science & Analytics","postedAt":"2025-06-07T10:22:00Z","description":"Our company, BrightData Insights, needs help building a predictive model using open datasets..."}}],"Search LinkedIn for Person (Phantombuster)":[{"json":{"name":"John Doe","title":"Senior Software Engineer at Google","location":"Mountain View, California, United States","profileUrl":"https://www.linkedin.com/in/john-doe-123456/","connectionDegree":"2nd","profilePictureUrl":"https://media.licdn.com/dms/image/xyz.jpg"}},{"json":{"name":"Johnathan Doe","title":"AI Researcher at OpenAI","location":"San Francisco Bay Area","profileUrl":"https://www.linkedin.com/in/johnathan-doe-78910/","connectionDegree":"3rd","profilePictureUrl":"https://media.licdn.com/dms/image/abc.jpg"}}],"Search LinkedIn for Company (Phantombuster)":[{"json":{"name":"DevSync","industry":"Computer Software","location":"San Francisco Bay Area","followers":248,"profileUrl":"https://www.linkedin.com/company/devsync/","description":"Real-time collaboration tool for remote teams.","linkedinSalesNavigatorUrl":null}},{"json":{"name":"DevSync Co.","industry":"Information Technology & Services","location":"Toronto, Canada","followers":123,"profileUrl":"https://www.linkedin.com/company/devsync-co/","description":"Cloud-based productivity platform."}}]},"settings":{"executionOrder":"v1"},"versionId":"9c24521c-85cb-4dbe-b671-43cb6e038740","connections":{"Name is Found?":{"main":[[{"node":"Is It a Person or Company?","type":"main","index":0}],[{"node":"No Name Found - End Early","type":"main","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"Extract Company or Person Name from Job","type":"ai_languageModel","index":0},{"node":"Is It a Person or Company?","type":"ai_languageModel","index":0}]]},"Run Every X Hours":{"main":[[{"node":"Fetch Latest Upwork Jobs (Apify)","type":"main","index":0}]]},"Person or Company?":{"main":[[{"node":"Search LinkedIn for Company (Phantombuster)","type":"main","index":0}],[{"node":"Search LinkedIn for Person (Phantombuster)","type":"main","index":0}]]},"Is It a Person or Company?":{"main":[[{"node":"Person or Company?","type":"main","index":0}]]},"Find Company Email (Hunter.io)":{"main":[[{"node":"Store Results in Google Sheet","type":"main","index":0}]]},"Scrape LinkedIn Person Profile":{"main":[[{"node":"Find Personal Email (Hunter.io)","type":"main","index":0}]]},"Find Personal Email (Hunter.io)":{"main":[[{"node":"Store Results in Google Sheet","type":"main","index":0}]]},"Scrape LinkedIn Company Profile":{"main":[[{"node":"Find Company Email (Hunter.io)","type":"main","index":0}]]},"Fetch Latest Upwork Jobs (Apify)":{"main":[[{"node":"Extract Company or Person Name from Job","type":"main","index":0}]]},"Extract Company or Person Name from Job":{"main":[[{"node":"Name is Found?","type":"main","index":0}]]},"Search LinkedIn for Person (Phantombuster)":{"main":[[{"node":"Scrape LinkedIn Person Profile","type":"main","index":0}]]},"Search LinkedIn for Company (Phantombuster)":{"main":[[{"node":"Scrape LinkedIn Company Profile","type":"main","index":0}]]}}}


name: Track US Fintech & Healthtech Funding Rounds: Crunchbase to Google Sheets
author_name: Yaron Been
author_username: yaron-nofluff
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.code"]
categories: []
created_at: 2025-06-08T14:12:37.205Z
updated_at: 2025-06-08T14:12:37.205Z
url: https://n8n.io/workflows/4796
scraped_at: 2025-06-19 22:50:14
description:
  Automatically monitor and track funding rounds in the US Fintech and Healthtech sectors using Crunchbase API, with daily updates pushed to Google Sheets for easy analysis and monitoring.

  🚀 What It Does

  Daily Monitoring**: Automatically checks for new funding rounds every day at 8 AM
  Smart Filtering**: Focuses on US-based Fintech and Healthtech companies
  Data Enrichment**: Extracts and formats key funding information
  Automated Storage**: Pushes data to Google Sheets for easy access and analysis

  🎯 Perfect For

  VC firms tracking investment opportunities
  Startup founders monitoring market activity
  Market researchers analyzing funding trends
  Business analysts tracking competitor funding

  ⚙️ Key Benefits

  ✅ Real-time funding round monitoring  
  ✅ Focused industry tracking (Fintech & Healthtech)  
  ✅ Automated data collection and organization  
  ✅ Structured data output in Google Sheets  
  ✅ Complete funding details including investors and amounts  

  🔧 What You Need

  Crunchbase API key
  Google Sheets account
  n8n instance
  Basic spreadsheet setup

  📊 Data Collected

  Company Name
  Industry
  Funding Round Type
  Announced Date
  Money Raised (USD)
  Investors
  Crunchbase URL

  🛠️ Setup & Support

  Quick Setup

  Deploy in 30 minutes with our step-by-step configuration guide

  📺 Watch Tutorial

  💼 Get Expert Support

  📧 Direct Help



  Stay ahead of market movements with automated funding round tracking. Transform manual research into an efficient, automated process.

workflow_json:
  {"id":"crunchbase-funding-tracker","name":"Crunchbase funding rounds","nodes":[{"id":"b2bee19f-4033-4473-a78c-3463b4b56e79","name":"Daily Check for New Funding Rounds","type":"n8n-nodes-base.scheduleTrigger","position":[-100,0],"parameters":{"rule":{"interval":[{"triggerAtHour":8}]}},"typeVersion":1.2},{"id":"bfeff292-40aa-4a3b-81bf-bd237463abe9","name":"Fetch Crunchbase Funding Rounds","type":"n8n-nodes-base.httpRequest","position":[120,0],"parameters":{"url":"https://api.crunchbase.com/api/v4/entities/funding_rounds","options":{},"sendQuery":true,"sendHeaders":true,"queryParameters":{"parameters":[{"name":"locations","value":"United States"},{"name":"industry","value":"Fintech,Healthtech"},{"name":"sort_order","value":"created_at DESC"},{"name":"page","value":"1"},{"name":"items_per_page","value":"25"}]},"headerParameters":{"parameters":[{"name":"X-cb-user-key","value":"YOUR_API_KEY"}]}},"typeVersion":4.2},{"id":"aaf02cbe-e85d-4575-b570-2758289cbcb9","name":"Extract & Format Funding Data","type":"n8n-nodes-base.code","position":[440,0],"parameters":{"jsCode":"const baseUrl = \"https://www.crunchbase.com/funding-round/\";\n\nconst output = [];\n\nfor (const item of items[0].json.data.entities) {\n  const props = item.properties;\n  const id = item.identifier;\n\n  const companyName = props.funded_organization_identifier?.value || \"N/A\";\n  const industry = props.industry_group_identifiers?.map(ind => ind.value).join(\", \") || \"N/A\";\n  const fundingType = props.funding_type || \"N/A\";\n  const date = props.announced_on || \"N/A\";\n  const amount = props.money_raised_usd || 0;\n  const investors = props.investor_identifiers?.map(inv => inv.value).join(\", \") || \"N/A\";\n  const url = baseUrl + id.permalink;\n\n  output.push({\n    json: {\n      company_name: companyName,\n      industry: industry,\n      funding_round_type: fundingType,\n      announced_date: date,\n      money_raised_usd: amount,\n      investors: investors,\n      crunchbase_url: url\n    }\n  });\n}\n\nreturn output;\n"},"typeVersion":2},{"id":"d8f7e9a0-1f2b-4b8d-8f5e-8e7f6d5c4b3a","name":"Save to Google Sheets","type":"n8n-nodes-base.googleSheets","position":[760,0],"parameters":{"columns":{"value":{"industry":"Industry","investors":"Investors","company_name":"Company Name","announced_date":"Announced Date","crunchbase_url":"Crunchbase URL","money_raised_usd":"Money Raised (USD)","funding_round_type":"Funding Round Type"},"mappingMode":"autoMapInputData"},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0"},"documentId":{"__rl":true,"mode":"list","value":"YOUR_GOOGLE_SHEET_ID"}},"typeVersion":3}],"active":false,"settings":{},"versionId":"1.0.0","connections":{"Extract & Format Funding Data":{"main":[[{"node":"Save to Google Sheets","type":"main","index":0}]]},"Fetch Crunchbase Funding Rounds":{"main":[[{"node":"Extract & Format Funding Data","type":"main","index":0}]]},"Daily Check for New Funding Rounds":{"main":[[{"node":"Fetch Crunchbase Funding Rounds","type":"main","index":0}]]}}}


name: Track CVE Vulnerability Details & History with NVD API and Google Sheets
author_name: Niranjan G
author_username: niranjan
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.code"]
categories: []
created_at: 2025-06-08T15:14:27.731Z
updated_at: 2025-06-08T15:14:27.731Z
url: https://n8n.io/workflows/4797
scraped_at: 2025-06-19 22:49:04
description:
  Who is this for?

  NVD (National Vulnerability Database) data is essential for security analysts, vulnerability managers, and DevSecOps professionals who need to perform both CVE lookups and monitor historical change logs. This workflow helps streamline those efforts by providing structured outputs for audit, triage, or compliance tracking purposes.

  📝 Note: While this example uses Google Sheets as the destination, you can easily modify the final destination node (e.g., send to Slack, email, database, etc.) based on your specific automation needs.?

  What problem is this solving?

  Security teams often manually look up CVE data and track changes across multiple tools. This process is inefficient and error-prone. This workflow automates the CVE lookup and historical change tracking by logging enriched vulnerability data into Google Sheets in real-time.

  What this workflow does

  This workflow is designed for CVE API lookup and change history tracking. In many vulnerability automation pipelines, it is essential to determine not only the metadata of a CVE but also how it has evolved over time. Based on the operational need—whether it's enrichment, risk scoring, or remediation validation—this workflow becomes particularly handy in surfacing both current and historical CVE data. This template performs the following actions:

  Accepts incoming webhook requests containing a CVE ID
  Queries the NVD CVE Lookup API to fetch vulnerability metadata
  Queries the NVD CVE History API to retrieve all historical changes
  Flattens both datasets into a sheet-compatible structure
  Appends vulnerability metadata to one sheet and change history to another within the same Google Spreadsheet

  Setup

  🔑 Request an NVD API Key

  To request an NVD API Key, please provide your organization name, a valid email address, and indicate your organization type at NVD API Key Request. You must scroll to the end of the Terms of Use Agreement and check "I agree to the Terms of Use" to obtain an API Key. After submission, you will receive a single-use hyperlink via email to activate and view your API Key. If not activated within seven days, a new request must be submitted.

  📊 API Rate Limits

  Without an API key, you're limited to 5 requests per 30-second window. With an API key, you’re allowed up to 50 requests in the same period. To prevent request throttling, it's recommended to introduce slight delays between consecutive API calls in production setups.

  Clone or import this workflow into your n8n instance.
  Set up the following credentials:
     Google Sheets OAuth2
     NVD API Key (via HTTP Header Auth)
  The workflow logs data to a Google Sheet titled NVD Database, with Sheet 1 named CVE Lookup and Sheet 2 named CVE History.
  Trigger each workflow using the respective webhook URL, appending ?cveId=CVE-XXXX-XXXX as a query parameter.

  🔍 Example Webhook Request (CVE Change History)

  You can test this workflow with the following example:

  GET https://your-domain.com/webhook/cve-history?cveId=CVE-2023-34362

  How to customize this workflow

  Use the Edit Fields node (optional) to centralize configuration like sheet name or query input
  Extend the CVE flattening logic to include more nested metadata if needed
  Integrate notification systems (e.g., Slack or email) by branching from the processing nodes
  Modify webhook paths for better endpoint organization

  🔐 Production Security Tips

  Use HTTP Header Auth on the webhook for secure access

  &gt; ⚠️ This template uses webhooks and NVD API access with authentication headers.

  This template uses two flows:

  Webhook 1:** NVD CVE Lookup — Lookup CVE vulnerability metadata from NVD and sync to Google Sheet
  Webhook 2:** NVD CVE Change History — Track change history for CVEs via NVD and log each update

  Each flow:

  Hits NVD’s respective endpoint
  Uses custom JS Code node to flatten the nested JSON
  Syncs data to dedicated Google Sheet tabs
  🧩 4 nodes: Webhook → API Call → Parse → Sheet Sync

  Make sure both flows are activated and webhooks exposed for external access. Based on your needs, ensure you have a secure setup—whether hosted internally or in a cloud environment—when running n8n in production.

workflow_json:
  {"id":"YEh1XUHtAwWFvB7z","meta":{"instanceId":"c62c01f3e843893075a10f252ec7d6d69e5ab593af019f50055d506cb3081b99","templateCredsSetupCompleted":true},"name":"Track CVE Details & History from NVD and Sync to Google Sheets","tags":[{"id":"XuoVybTXeUXuim6G","name":"✅ Live","createdAt":"2025-06-08T07:59:43.586Z","updatedAt":"2025-06-08T07:59:43.586Z"},{"id":"MbPHhZHgb39Syuoa","name":"🔐 SecOps","createdAt":"2025-04-20T05:18:20.689Z","updatedAt":"2025-06-08T08:01:56.494Z"}],"nodes":[{"id":"b8e39932-0733-465a-a784-469d36374754","name":"Webhook: Get CVE Details","type":"n8n-nodes-base.webhook","position":[-260,-160],"webhookId":"3a3e9d6c-fbbf-482c-a6e9-88cdd79d404a","parameters":{"path":"3a3e9d6c-fbbf-482c-a6e9-88cdd79d404a","options":{}},"typeVersion":2},{"id":"844af868-d326-4d73-85b8-00de22f2e5ca","name":"Fetch CVE from NVD API","type":"n8n-nodes-base.httpRequest","position":[-40,-160],"parameters":{"url":"https://services.nvd.nist.gov/rest/json/cves/2.0","options":{},"sendQuery":true,"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","queryParameters":{"parameters":[{"name":"cveId","value":"={{ $json.query.cveId }}"}]}},"credentials":{"httpBasicAuth":{"id":"pmJaCcMGEkPDYowB","name":"Basic Auth Webhook credential"},"httpHeaderAuth":{"id":"mHJL7L4nhoBAK9S8","name":"NVD Header Auth account"}},"typeVersion":4.2},{"id":"3ab38c76-33df-44a1-987b-0f668028c4f7","name":"Parse CVE JSON → Flat Format","type":"n8n-nodes-base.code","position":[180,-160],"parameters":{"jsCode":"const results = [];\n\nfor (const item of items) {\n  const vulnerabilities = item.json.vulnerabilities || [];\n\n  for (const vuln of vulnerabilities) {\n    const cve = vuln.cve || {};\n\n    const cvss = cve.metrics?.cvssMetricV31?.[0];\n    const cvssData = cvss?.cvssData || {};\n\n    results.push({\n      json: {\n        CVE_ID: cve.id || '',\n        Source_Identifier: cve.sourceIdentifier || '',\n        Published: cve.published || '',\n        Last_Modified: cve.lastModified || '',\n        Vuln_Status: cve.vulnStatus || '',\n        CVE_Tags: (cve.cveTags || []).join(';'),\n\n        Description: (cve.descriptions || []).find(d => d.lang === 'en')?.value || '',\n\n        CVSS_Version: cvssData.version || '',\n        Vector_String: cvssData.vectorString || '',\n        Base_Severity: cvssData.baseSeverity || '',\n        Base_Score: cvssData.baseScore || '',\n        Attack_Vector: cvssData.attackVector || '',\n        Attack_Complexity: cvssData.attackComplexity || '',\n        Privileges_Required: cvssData.privilegesRequired || '',\n        User_Interaction: cvssData.userInteraction || '',\n        Scope: cvssData.scope || '',\n        Confidentiality_Impact: cvssData.confidentialityImpact || '',\n        Integrity_Impact: cvssData.integrityImpact || '',\n        Availability_Impact: cvssData.availabilityImpact || '',\n        Exploitability_Score: cvss?.exploitabilityScore || '',\n        Impact_Score: cvss?.impactScore || '',\n\n        CWE_ID: cve.weaknesses?.[0]?.description?.[0]?.value || '',\n        Reference_URL: cve.references?.[0]?.url || ''\n      }\n    });\n  }\n}\n\nreturn results;"},"typeVersion":2},{"id":"f96c4bcb-b24e-4e19-9c59-6ed733d0f98b","name":"Log CVE Metadata to Sheet","type":"n8n-nodes-base.googleSheets","position":[400,-160],"parameters":{"columns":{"value":{},"schema":[{"id":"CVE_ID","type":"string","display":true,"removed":false,"required":false,"displayName":"CVE_ID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Raw_CVE_Data","type":"string","display":true,"removed":false,"required":false,"displayName":"Raw_CVE_Data","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"autoMapInputData","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/abc1234567890/edit#gid=0","cachedResultName":"CVE Lookup"},"documentId":{"__rl":true,"mode":"list","value":"abc1234567890","cachedResultUrl":"https://docs.google.com/spreadsheets/d/abc1234567890/edit?usp=drivesdk","cachedResultName":"NVD Database"}},"credentials":{"googleSheetsOAuth2Api":{"id":"W8E4vruWIsUhkTII","name":"Google Sheets account [abc@mail.com]"}},"typeVersion":4.6},{"id":"11bb7c7e-c7e8-4d1f-98c9-c36d59b9b928","name":"Webhook: Get CVE Change History","type":"n8n-nodes-base.webhook","position":[-260,260],"webhookId":"587c86f4-4a3a-4765-b486-4bed8a0ccad3","parameters":{"path":"587c86f4-4a3a-4765-b486-4bed8a0ccad3","options":{}},"typeVersion":2},{"id":"ac9e845b-4905-43d1-971b-9c93c3ef8f9e","name":"Fetch CVE History from NVD API","type":"n8n-nodes-base.httpRequest","position":[-40,260],"parameters":{"url":"https://services.nvd.nist.gov/rest/json/cvehistory/2.0","options":{},"sendQuery":true,"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","queryParameters":{"parameters":[{"name":"cveId","value":"={{ $json.query.cveId }}"}]}},"credentials":{"httpBasicAuth":{"id":"pmJaCcMGEkPDYowB","name":"Basic Auth Webhook credential"},"httpHeaderAuth":{"id":"mHJL7L4nhoBAK9S8","name":"NVD Header Auth account"}},"typeVersion":4.2},{"id":"8a78a501-352d-4e4a-9ff1-3752e7723d65","name":"Parse CVE History JSON → Flat Format","type":"n8n-nodes-base.code","position":[180,260],"parameters":{"jsCode":"const results = [];\n\nfor (const item of items) {\n  const cveChanges = item.json.cveChanges || [];\n\n  for (const changeEntry of cveChanges) {\n    const change = changeEntry.change || {};\n\n    const cveId = change.cveId || '';\n    const changeId = change.cveChangeId || '';\n    const event = change.eventName || '';\n    const source = change.sourceIdentifier || '';\n    const created = change.created || '';\n\n    const details = change.details || [];\n\n    // If there are details, extract each detail into its own row\n    if (details.length > 0) {\n      for (const detail of details) {\n        results.push({\n          json: {\n            CVE_ID: cveId,\n            Change_ID: changeId,\n            Event: event,\n            Source: source,\n            Timestamp: created,\n            Action: detail.action || '',\n            Type: detail.type || '',\n            Old_Value: detail.oldValue || '',\n            New_Value: detail.newValue || ''\n          }\n        });\n      }\n    } else {\n      // If no details present, still add the change entry\n      results.push({\n        json: {\n          CVE_ID: cveId,\n          Change_ID: changeId,\n          Event: event,\n          Source: source,\n          Timestamp: created,\n          Action: '',\n          Type: '',\n          Old_Value: '',\n          New_Value: ''\n        }\n      });\n    }\n  }\n}\n\nreturn results;"},"typeVersion":2},{"id":"885c9eae-cab8-40ba-8eac-2e920370651f","name":"Log CVE History to Sheet","type":"n8n-nodes-base.googleSheets","position":[400,260],"parameters":{"columns":{"value":{},"schema":[{"id":"CVE_ID","type":"string","display":true,"removed":false,"required":false,"displayName":"CVE_ID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Change_ID","type":"string","display":true,"removed":false,"required":false,"displayName":"Change_ID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Event","type":"string","display":true,"removed":false,"required":false,"displayName":"Event","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Source","type":"string","display":true,"removed":false,"required":false,"displayName":"Source","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Timestamp","type":"string","display":true,"removed":false,"required":false,"displayName":"Timestamp","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Action","type":"string","display":true,"removed":false,"required":false,"displayName":"Action","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Type","type":"string","display":true,"removed":false,"required":false,"displayName":"Type","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Old_Value","type":"string","display":true,"removed":false,"required":false,"displayName":"Old_Value","defaultMatch":false,"canBeUsedToMatch":true},{"id":"New_Value","type":"string","display":true,"removed":false,"required":false,"displayName":"New_Value","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"autoMapInputData","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":185619006,"cachedResultUrl":"https://docs.google.com/spreadsheets/d/abc1234567890/edit#gid=185619006","cachedResultName":"CVE History"},"documentId":{"__rl":true,"mode":"list","value":"abc1234567890","cachedResultUrl":"https://docs.google.com/spreadsheets/d/abc1234567890/edit?usp=drivesdk","cachedResultName":"NVD Database"}},"credentials":{"googleSheetsOAuth2Api":{"id":"W8E4vruWIsUhkTII","name":"Google Sheets account [abc@mail.com]"}},"typeVersion":4.6},{"id":"8d8f4db1-f5fd-499c-ace5-eec99ecb6b9e","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-380,-340],"parameters":{"width":1000,"height":360,"content":"## 🔍 Lookup CVE vulnerability metadata from NVD and sync to Google Sheet"},"typeVersion":1},{"id":"854a2420-e22f-4630-8b97-bd1e8f484158","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-380,100],"parameters":{"color":3,"width":1000,"height":360,"content":"## 🕓 Track change history for CVEs via NVD and log each update"},"typeVersion":1},{"id":"71f9bf5e-5ccd-4752-a583-6f751071b239","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-1140,-340],"parameters":{"width":740,"height":800,"content":"# NVD (National Vulnerability Database)\n\n## Setup\n\n- Import this workflow into your n8n instance.\n\n- Set up the following credentials:\n\n-- Google Sheets OAuth2\n\n-- NVD API Key (via HTTP Header Auth)\n\n- The workflow logs data to a Google Sheet titled **NVD Database**, with Sheet 1 named **CVE Lookup** and Sheet 2 named **CVE History**.\n\n- Trigger each workflow using the respective webhook URL, appending ?cveId=CVE-XXXX-XXXX as a query parameter.\n\n## 🔍 Sample Test URL\n\nYou can test this workflow with the following example:\n```\nGET https://your-domain.com/webhook/cve-history?cveId=CVE-2023-34362\n```\n"},"typeVersion":1},{"id":"16151bff-6c9d-441e-9ee5-5c73a2d3135a","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-60,-260],"parameters":{"color":7,"width":150,"height":80,"content":"NVD API Key (via HTTP Header Auth) ⬇️"},"typeVersion":1},{"id":"05222357-d84d-4615-9bfd-635ddc7c68b7","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-60,160],"parameters":{"color":7,"width":150,"height":80,"content":"NVD API Key (via HTTP Header Auth) ⬇️"},"typeVersion":1}],"active":true,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"8c8d7836-7657-435e-bd05-e2223ddc0c1e","connections":{"Fetch CVE from NVD API":{"main":[[{"node":"Parse CVE JSON → Flat Format","type":"main","index":0}]]},"Webhook: Get CVE Details":{"main":[[{"node":"Fetch CVE from NVD API","type":"main","index":0}]]},"Fetch CVE History from NVD API":{"main":[[{"node":"Parse CVE History JSON → Flat Format","type":"main","index":0}]]},"Parse CVE JSON → Flat Format":{"main":[[{"node":"Log CVE Metadata to Sheet","type":"main","index":0}]]},"Webhook: Get CVE Change History":{"main":[[{"node":"Fetch CVE History from NVD API","type":"main","index":0}]]},"Parse CVE History JSON → Flat Format":{"main":[[{"node":"Log CVE History to Sheet","type":"main","index":0}]]}}}


name: Create Character-Consistent Images with FLUX Kontext & Post to Social via Upload Post
author_name: Eduard
author_username: eduard
nodes_used: ["n8n-nodes-base.github","n8n-nodes-base.httpRequest"]
categories: []
created_at: 2025-06-08T15:34:39.639Z
updated_at: 2025-06-08T15:34:39.639Z
url: https://n8n.io/workflows/4798
scraped_at: 2025-06-19 22:49:00
description:
  Create, iterate, and share! Transform a single image through multiple scenes while maintaining consistency.

  ✨ What this workflow does

  This template showcases FLUX.1 Kontext - Black Forest Labs' in-context image generation model that excels at maintaining character features across multiple transformations. Combined with the Upload Post community node for effortless multi-platform social media posting, you can create and share compelling visual stories instantly.

  The workflow demonstrates FLUX Kontext's core strength: character consistency across multiple image generations. Starting with a single input image, it:
  🖼️ Loads an initial character image (example: a cute animal mascot)
  📝 Defines multiple scene transformation prompts 
  🔄 Iteratively generates new scenes while preserving exact character features
  🎯 Maintains visual consistency by reusing binary data from previous generations
  📱 Auto-posts the complete transformation series to multiple social platforms simultaneously

  🚀 Key Features: The Consistency Advantage

  Character Preservation**: FLUX Kontext's signature feature - maintains character features and style across transformations (requires specific prompting techniques)
  Iterative Context Building**: Each generation uses the previous image as context, creating visual continuity
  Binary Data Reuse**: Smart workflow design that feeds output from one generation as input to the next
  Multi-Scene Storytelling**: Transform your character across different environments while keeping them recognizable
  One-Click Multi-Platform Posting*: Upload Post eliminates the tedious process of posting to each platform individually

  📱 Why use Upload Post?

  Posting the same content to TikTok, Instagram, LinkedIn, YouTube, Facebook, X (Twitter), and Threads individually is time-consuming and error-prone. The Upload Post service* simplifies this process:

  ✅ Connect once, post everywhere: Link all your social media accounts to Upload Post  
  ✅ Single API call: Post to multiple platforms with one simple node  
  ✅ No more platform juggling: Skip the endless switching between apps and dashboards  
  ✅ Consistent timing: All platforms get your content simultaneously  
  ✅ Trusted by 3,751+ users: Proven solution for content creators and marketers

  Instead of spending 30+ minutes manually posting to each platform, Upload Post does it all in seconds with a single n8n node!

  🛠️ Prerequisites

  Required Accounts:
  Black Forest Labs API: Create account at dashboard.bfl.ai
     Get your API key for FLUX Kontext Pro access
     
  Upload Post Account: Sign up at upload-post.com*
     Connect your social media profiles (TikTok, Instagram, LinkedIn, YouTube, Facebook, X/Twitter, Threads)
     Get API credentials for automated posting
     Free tier available: 10 uploads/month

  💡 Perfect For:

  Character Designers** maintaining brand character integrity across scenes
  Social Media Managers** creating engaging visual story series without manual posting
  Brand Marketers** ensuring character consistency across campaigns
  Storytellers** building visual narratives with consistent protagonists
  Agencies** managing multiple client accounts efficiently

  🔧 Customization Options:

  Modify transformation prompts** to create your own character journey
  Adjust iteration steps**
  Change initial character image**
  Configure social platform targeting** (choose which platforms to post to)
  Customize post content** and formatting
  Experiment with different consistency scenarios**

  \ Affiliate link*

workflow_json:
  {"id":"AdtCs47Lt1Wtf2Dt","meta":{"instanceId":"fb924c73af8f703905bc09c9ee8076f48c17b596ed05b18c0ff86915ef8a7c4a","templateCredsSetupCompleted":true},"name":"Upload-Post And FLUX Kontext","tags":[],"nodes":[{"id":"ed7d240f-9181-4f23-9e3a-24e7886c7e31","name":"When clicking ‘Execute workflow’","type":"n8n-nodes-base.manualTrigger","position":[-180,0],"parameters":{},"typeVersion":1},{"id":"4656ae65-d58b-4126-ada3-eda97fde5c4e","name":"Is Ready?","type":"n8n-nodes-base.if","position":[500,400],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"or","conditions":[{"id":"3cf5b451-9ff5-4c2a-864f-9aa7d286871a","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.status }}","rightValue":"Ready"},{"id":"a9b6d102-bb38-443f-a204-1c07476cb360","operator":{"type":"number","operation":"gt"},"leftValue":"={{ $runIndex }}","rightValue":5}]}},"typeVersion":2.2},{"id":"f8dbc367-1052-4548-b3b8-33f6ede4d0ba","name":"Check FLUX status","type":"n8n-nodes-base.httpRequest","position":[340,400],"parameters":{"url":"https://api.bfl.ml/v1/get_result","options":{},"sendQuery":true,"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","queryParameters":{"parameters":[{"name":"id","value":"={{ $json.id }}"}]}},"credentials":{"httpHeaderAuth":{"id":"4eQN9wBw8SniKcPw","name":"bfl-FLUX"}},"typeVersion":4.2},{"id":"9624cdc6-1f7b-459f-b16a-eab69d23b45c","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-60,320],"parameters":{"color":7,"width":862,"height":282,"content":"# Image processing part"},"typeVersion":1},{"id":"c6393bc7-6b7a-4a25-a524-8a7bd6b2c781","name":"When Executed by Another Workflow","type":"n8n-nodes-base.executeWorkflowTrigger","position":[-380,400],"parameters":{"inputSource":"passthrough"},"typeVersion":1.1},{"id":"4f3717a6-2580-4664-8182-efa1c8652589","name":"FLUX Kontext","type":"n8n-nodes-base.httpRequest","position":[0,400],"parameters":{"url":"https://api.bfl.ml/v1/flux-kontext-pro","method":"POST","options":{},"sendBody":true,"authentication":"genericCredentialType","bodyParameters":{"parameters":[{"name":"input_image","value":"={{ $json[$('When Executed by Another Workflow').first().json.binaryin] }}"},{"name":"prompt","value":"={{ $('When Executed by Another Workflow').first().json.prompt }}"},{"name":"prompt_upsampling","value":"={{ false }}"},{"name":"output_format","value":"png"},{"name":" aspect_ratio","value":"1:1"}]},"genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"4eQN9wBw8SniKcPw","name":"bfl-FLUX"}},"typeVersion":4.2},{"id":"2a48ecd4-07bc-4202-abe3-3bc0bfbfed6d","name":"Merge","type":"n8n-nodes-base.merge","position":[420,0],"parameters":{"mode":"combine","options":{"includeUnpaired":true},"combineBy":"combineByPosition"},"typeVersion":3.1},{"id":"cc5f96a9-ed87-4526-85c2-074dc5c8e166","name":"Wait 2 sec","type":"n8n-nodes-base.wait","position":[180,400],"webhookId":"3df5a762-edab-49df-ac70-be3b56545212","parameters":{"amount":2},"typeVersion":1.1},{"id":"54cf0d0d-c3a0-4243-b425-ba8cdfaf1063","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-20,-240],"parameters":{"width":380,"height":260,"content":"## Define prompts here\nPrepare an array of prompts that will be used one by one on the next steps. Update limit in the `Number of Steps` node if you need more than 5 iterations."},"typeVersion":1},{"id":"add02353-b31e-4990-83ad-2d936343ab7f","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-20,60],"parameters":{"width":380,"height":220,"content":"## Load the initial image"},"typeVersion":1},{"id":"8367ef9f-cf00-4987-91ec-09fe3ec6918d","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-340,-420],"parameters":{"width":260,"height":400,"content":"## Initial example\n![](https://raw.githubusercontent.com/teds-tech-talks/n8n-community-leaderboard/main/_creators/eduard/mascot.png)"},"typeVersion":1},{"id":"c4a52815-ba73-4f9c-8c44-fca40cab6440","name":"Get File from GitHub","type":"n8n-nodes-base.github","position":[20,120],"webhookId":"e70d0c46-6478-4c11-85a6-8b7e1f9588de","parameters":{"owner":{"__rl":true,"mode":"name","value":"teds-tech-talks"},"filePath":"_creators/eduard/mascot.png","resource":"file","operation":"get","repository":{"__rl":true,"mode":"name","value":"n8n-community-leaderboard"},"authentication":"oAuth2","asBinaryProperty":false,"additionalParameters":{}},"credentials":{"githubOAuth2Api":{"id":"SBUgEkMg70oFZRct","name":"TTT GitHub account"}},"typeVersion":1.1},{"id":"bb48cde8-fc79-407e-8daa-4322398d8385","name":"Download Initial Image","type":"n8n-nodes-base.httpRequest","position":[220,120],"parameters":{"url":"={{ $json.download_url }}","options":{"response":{"response":{"responseFormat":"file","outputPropertyName":"data0"}}}},"typeVersion":4.2},{"id":"ffc484fe-c183-4858-8303-8733596e2afc","name":"If","type":"n8n-nodes-base.if","position":[680,0],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"4d3dcb8f-c435-40fd-aca6-a37647fc3a10","operator":{"type":"number","operation":"lt"},"leftValue":"={{ $runIndex }}","rightValue":"={{ $json.Steps }}"}]}},"typeVersion":2.2},{"id":"6fbd6310-7596-4460-8a85-3cc0b1253509","name":"Number of Steps","type":"n8n-nodes-base.set","position":[220,-120],"parameters":{"options":{},"assignments":{"assignments":[{"id":"9e3d00d0-467a-41c8-aaa1-f1d29694737c","name":"Steps","type":"number","value":"={{ Math.min($json.Prompts.length,5) }}"}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"6bacc1b2-7154-428c-ab0f-76f356c59e35","name":"All Prompts","type":"n8n-nodes-base.set","position":[20,-120],"parameters":{"options":{},"assignments":{"assignments":[{"id":"64e9c28e-a60a-499b-aa89-177bf952959f","name":"Prompts","type":"array","value":"=[\"Make this animal mascot coming out of the builing with wearing an official business suite. Preserve the exact character features and style\",\"Now make this animal mascot sitting in the terrace mediterranian cafe. Preserve the exact character features and style, but wearing hawaii shorts instead of trouses\",\"Now make this animal mascot standing on the beach with a starfish in it's hands, waring only hawaii shorts. Preserve the exact character features and style.\"]"}]}},"typeVersion":3.4},{"id":"913b8c79-e9ed-4221-853a-2ea6071f8c5a","name":"Run FLUX","type":"n8n-nodes-base.executeWorkflow","position":[1120,-100],"parameters":{"options":{},"workflowId":{"__rl":true,"mode":"list","value":"AdtCs47Lt1Wtf2Dt","cachedResultName":"Upload-Post And FLUX Kontext"},"workflowInputs":{"value":{},"schema":[],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":true}},"typeVersion":1.2},{"id":"8c7089e9-45ea-4626-9c7d-01dc9df2137e","name":"Current Step","type":"n8n-nodes-base.set","position":[880,0],"parameters":{"include":"selected","options":{},"assignments":{"assignments":[{"id":"64e9c28e-a60a-499b-aa89-177bf952959f","name":"prompt","type":"string","value":"={{ $json.Prompts[$runIndex] }}"},{"id":"aee3c455-ced2-4520-a088-18ffaf6db11c","name":"binaryin","type":"string","value":"=data{{ $runIndex }}"},{"id":"61cccca2-7b0c-4ea6-82f3-5dc2a377c3cb","name":"binaryout","type":"string","value":"=data{{ Number($runIndex)+1 }}"},{"id":"0cbe4309-e6f0-4c65-87f6-95bf6609aade","name":"currentstep","type":"number","value":"={{ $runIndex }}"}]},"includeFields":"Prompts, Steps","includeOtherFields":true},"typeVersion":3.4},{"id":"8eb4790f-ecf9-4136-813a-a87bd1d40edd","name":"Merge3","type":"n8n-nodes-base.merge","position":[1320,-20],"parameters":{"mode":"combine","options":{},"combineBy":"combineByPosition"},"typeVersion":3.2},{"id":"49eb0be4-4ebc-48bd-a77d-20fb02779ad1","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[620,-200],"parameters":{"width":860,"height":380,"content":"## Iterate over prompts\n- On each step a next prompt it taken from the original array\n- Outputs from the previous FLUX Kontext request are moved forward to the subsequent generation"},"typeVersion":1},{"id":"361cd8ac-29be-40a9-a5f8-d12656373c96","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[1100,220],"parameters":{"color":5,"width":260,"height":280,"content":"## [Post several images via Upload Post](https://www.upload-post.com/?linkId=lp_144414&sourceId=post-now&tenantId=upload-post-app)\n[Click to create your own account](https://www.upload-post.com/?linkId=lp_144414&sourceId=post-now&tenantId=upload-post-app)"},"typeVersion":1},{"id":"af34e5a7-d1cc-446f-a210-5aa96c271640","name":"Upload Post","type":"n8n-nodes-upload-post.uploadPost","position":[1120,340],"parameters":{"user":"Ed","title":"Testing n8n uploads with Upload Post community node hotfix and FLUX1. Kontext","photos":"={{ Array.from({length: $json.Steps}, (_, i) => `data${i + 1}`).join(',') }}","platform":["x"]},"credentials":{"uploadPostApi":{"id":"xLY6thqjSJUCWssD","name":"Upload Post account"}},"typeVersion":1},{"id":"32836601-6a7d-4e1a-9fc4-74d6f5f78187","name":"Image to Base64","type":"n8n-nodes-base.extractFromFile","position":[-200,400],"parameters":{"options":{},"operation":"binaryToPropery","destinationKey":"={{ $('When Executed by Another Workflow').first().json.binaryin }}","binaryPropertyName":"={{ $('When Executed by Another Workflow').first().json.binaryin }}"},"typeVersion":1},{"id":"d40118c7-0ab6-4276-b733-22419e5521d6","name":"Get Image","type":"n8n-nodes-base.httpRequest","position":[680,400],"parameters":{"url":"={{ $json.result.sample }}","options":{"response":{"response":{"responseFormat":"file","outputPropertyName":"={{ $('When Executed by Another Workflow').first().json.binaryout }}"}}}},"typeVersion":4.2},{"id":"e35f7544-b687-4ee5-a59f-3f98d26b1d12","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[620,-620],"parameters":{"width":260,"height":400,"content":"## Step 1\n![](https://pbs.twimg.com/media/Gs7SwU_XYAASZBn?format=jpg&name=medium)"},"typeVersion":1},{"id":"230498f5-69f5-4282-bb25-854720b1d536","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[920,-620],"parameters":{"width":260,"height":400,"content":"## Step 2\n![](https://pbs.twimg.com/media/Gs7SwovWQAAncQT?format=jpg&name=medium)"},"typeVersion":1},{"id":"425c3696-4532-401e-8131-78553358c8c8","name":"Sticky Note8","type":"n8n-nodes-base.stickyNote","position":[1220,-620],"parameters":{"width":260,"height":400,"content":"## Step 3\n![](https://pbs.twimg.com/media/Gs7SxHsXYAAkhPF?format=jpg&name=medium)"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"callerPolicy":"workflowsFromSameOwner","executionOrder":"v1","saveDataSuccessExecution":"all"},"versionId":"94bff334-aee9-4139-acb9-966013fca4ea","connections":{"If":{"main":[[{"node":"Current Step","type":"main","index":0}],[{"node":"Upload Post","type":"main","index":0}]]},"Merge":{"main":[[{"node":"If","type":"main","index":0}]]},"Merge3":{"main":[[{"node":"If","type":"main","index":0}]]},"Run FLUX":{"main":[[{"node":"Merge3","type":"main","index":0}]]},"Is Ready?":{"main":[[{"node":"Get Image","type":"main","index":0}],[{"node":"Wait 2 sec","type":"main","index":0}]]},"Wait 2 sec":{"main":[[{"node":"Check FLUX status","type":"main","index":0}]]},"All Prompts":{"main":[[{"node":"Number of Steps","type":"main","index":0}]]},"Current Step":{"main":[[{"node":"Run FLUX","type":"main","index":0},{"node":"Merge3","type":"main","index":1}]]},"FLUX Kontext":{"main":[[{"node":"Wait 2 sec","type":"main","index":0}]]},"Image to Base64":{"main":[[{"node":"FLUX Kontext","type":"main","index":0}]]},"Number of Steps":{"main":[[{"node":"Merge","type":"main","index":0}]]},"Check FLUX status":{"main":[[{"node":"Is Ready?","type":"main","index":0}]]},"Get File from GitHub":{"main":[[{"node":"Download Initial Image","type":"main","index":0}]]},"Download Initial Image":{"main":[[{"node":"Merge","type":"main","index":1}]]},"When Executed by Another Workflow":{"main":[[{"node":"Image to Base64","type":"main","index":0}]]},"When clicking ‘Execute workflow’":{"main":[[{"node":"Get File from GitHub","type":"main","index":0},{"node":"All Prompts","type":"main","index":0}]]}}}


name: Telegram AI Chatbot with Document-Based Answers using OpenAI and PGVector RAG
author_name: Victor Gold
author_username: victorlucky
categories: []
created_at: 2025-06-08T15:38:16.276Z
updated_at: 2025-06-08T15:38:16.276Z
url: https://n8n.io/workflows/4799
scraped_at: 2025-06-19 22:49:21
description:
  🤖 AI Q&A Chatbot Workflow – Build Your Own AI Agent Trained on Private Documents

  This powerful AI automation add-on upgrades your Telegram Bot Starter Template by integrating a fully functional AI chatbot and a context-aware AI agent that answers user questions using your internal documents.

  Unlike generic bots, this chatbot uses your own data to respond with deeply personalized, context-relevant information — perfect for support, onboarding, internal knowledge access, and client-facing interactions.

  It connects to any PostgreSQL database — including Neon.tech, Supabase, or a self-hosted Postgres setup — allowing you to build custom AI-powered FAQ assistants, internal support bots, or knowledge-based customer service tools.

  🧠 Why It Works: Contextual Retrieval

  The secret is Contextual Retrieval — a powerful technique where your documents are stored in a way that preserves meaning and context. This allows the AI to fetch highly relevant, source-backed responses, eliminating hallucinations and guesswork.

  &gt; Data is embedded, chunked, and saved in a vector database (Postgres + PGVector), enabling smart semantic search tailored to your needs.

  📖 Learn more about this approach in this article by Anthropic →

  ✨ Key Features

  Chat with your internal documents**: Uses your content to answer questions with precision  
  Built-in document vectorization**: Pre-configured Google Drive ingestion flow (Notion, Airtable, Dropbox available separately)  
  Contextual memory**: Past chats stored in PostgreSQL for personalized conversations  
  Plug-and-play architecture**: Connect Supabase, OpenAI, custom APIs via n8n’s interface  

  👤 Who Can Use This Workflow?

  Entrepreneurs & startups** building branded AI chatbots without code  
  Customer support teams** automating answers using documentation  
  Ops teams** creating internal FAQ bots for onboarding and training  
  No-code developers** using n8n to build Telegram bots with AI features  

  ⚙️ Setup Instructions

  You'll find step-by-step instructions inside the workflow.

  Quick Setup Overview:

  Import the workflow into n8n (cloud or self-hosted)  
  Add your Telegram Bot credentials  
  Connect your PostgreSQL DB (Neon, Supabase, etc.)  
  Set up document ingestion from Google Drive  
  Activate the workflow and start chatting  

  🧩 Extensibility

  This workflow is modular and ready to expand. Build powerful assistants by connecting additional workflows:

  Vectorization modules** for Notion, Airtable, Dropbox, and others  
  Any vector DB**: Neon.tech, Supabase, or self-hosted PGVector  
  ✍🏻 Telegram User Registration Module →  
  💵 Telegram Payment, Invoicing & Refund Module →

  🧠 More Smart AI Agents

  Explore more AI workflows and agents on my Gumroad →

  🌐 Agent: Find in the Internet — fetches live info from the web  
  📁 Agent: Search Internal Docs — queries Notion, Google Drive, etc.  
  📦 Agent: Check Order Status — reads status from Airtable or CRM  
  💰 Agent: Calculate Cost or Quote — builds pricing logic from inputs  

  📨 Submit your idea here for a custom AI agent →

nodes_used:
  ["n8n-nodes-base.postgres","n8n-nodes-base.googleDrive","n8n-nodes-base.code","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.chainLlm","@n8n/n8n-nodes-langchain.embeddingsOpenAi","@n8n/n8n-nodes-langchain.lmChatOpenAi","@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter","@n8n/n8n-nodes-langchain.documentDefaultDataLoader","@n8n/n8n-nodes-langchain.memoryPostgresChat","@n8n/n8n-nodes-langchain.vectorStorePGVector"]

workflow_json:
  {"meta":{"instanceId":"1dbc26c48fe55fbd6f6084822260e5ffcc6df7c619b3d6ceeb699da53e67c82c","templateCredsSetupCompleted":true},"nodes":[{"id":"ab11aca6-163b-4995-a2c1-89146aca4d13","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[3100,460],"parameters":{},"typeVersion":1},{"id":"5397732c-4b72-4d67-bc83-d131d6fe6a6a","name":"Default Data Loader","type":"@n8n/n8n-nodes-langchain.documentDefaultDataLoader","position":[2160,1000],"parameters":{},"typeVersion":1},{"id":"15b136fe-d236-4016-82e5-2cd45188cfc3","name":"Embeddings OpenAI1","type":"@n8n/n8n-nodes-langchain.embeddingsOpenAi","position":[2040,1000],"parameters":{},"typeVersion":1},{"id":"67f63eac-3d80-4453-8378-31c245e40158","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-380,160],"parameters":{"content":""},"typeVersion":1},{"id":"96577cfc-9c82-48da-a8bb-6b3c1bafc232","name":"Download File","type":"n8n-nodes-base.googleDrive","position":[560,660],"parameters":{},"executeOnce":true,"typeVersion":3},{"id":"b3805cd6-52e7-462c-9239-a573c8484bf9","name":"File Created","type":"n8n-nodes-base.googleDriveTrigger","position":[-320,660],"parameters":{},"typeVersion":1},{"id":"b6a8743b-1e69-41a4-b410-410943583512","name":"File Updated","type":"n8n-nodes-base.googleDriveTrigger","position":[-320,840],"parameters":{},"typeVersion":1},{"id":"36af5de3-7bfc-473a-a14d-f671a38c8212","name":"Extract Document Text","type":"n8n-nodes-base.extractFromFile","position":[780,660],"parameters":{},"typeVersion":1,"alwaysOutputData":true},{"id":"cb6f5d94-033e-4dd0-a09c-4d92fe07ecb6","name":"Set File ID","type":"n8n-nodes-base.set","position":[120,660],"parameters":{},"typeVersion":3.4},{"id":"23f43960-5c13-43be-9450-af9c82c5f4d2","name":"RAG AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[3140,240],"parameters":{},"typeVersion":1.6},{"id":"a2a4faee-8109-4f55-b30b-6e6294845088","name":"Loop Over Items","type":"n8n-nodes-base.splitInBatches","position":[-100,660],"parameters":{},"typeVersion":3},{"id":"ceef932c-f667-4ed8-8014-b650a3546fb0","name":"Recursive Character Text Splitter","type":"@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter","position":[2160,1160],"parameters":{},"typeVersion":1},{"id":"f59122eb-4e34-4765-90be-86f3507e9a65","name":"When chat message received","type":"@n8n/n8n-nodes-langchain.chatTrigger","disabled":true,"position":[2600,240],"webhookId":"2e7c037a-cf2e-40c5-9bed-e0944cc03cfa","parameters":{},"typeVersion":1.1},{"id":"61852ba7-292a-4b8c-b774-6df4d2d4d7c5","name":"Create Chunks From Doc","type":"n8n-nodes-base.code","position":[1000,660],"parameters":{},"typeVersion":2},{"id":"5231cf12-4061-4793-b918-f02bd021c333","name":"Chunks To List","type":"n8n-nodes-base.splitOut","position":[1220,660],"parameters":{},"typeVersion":1},{"id":"a37aa716-8d50-4ecd-a8de-44ca198386c3","name":"Generate Contextual Text","type":"@n8n/n8n-nodes-langchain.chainLlm","position":[1440,660],"parameters":{},"typeVersion":1.4},{"id":"b053ea08-d6a9-4718-a86b-3d44aa8e19b9","name":"OpenAI Chat Model3","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[1460,820],"parameters":{},"typeVersion":1.2},{"id":"6cf0dbc3-835f-4c99-b3b0-c5db7c379394","name":"Get Values","type":"n8n-nodes-base.set","position":[1820,660],"parameters":{},"typeVersion":3.4},{"id":"05270c8c-a1de-4be9-80ff-84fbf84e8578","name":"Postgres PGVector Store","type":"@n8n/n8n-nodes-langchain.vectorStorePGVector","position":[2060,780],"parameters":{},"typeVersion":1.1},{"id":"71b60f18-4e1c-45bd-840c-5f3f113675f7","name":"Delete Old Doc Records","type":"n8n-nodes-base.postgres","position":[340,660],"parameters":{},"typeVersion":2.5},{"id":"3ff8d9fb-f420-4939-b925-03e8fa7506d7","name":"When Executed by Another Workflow","type":"n8n-nodes-base.executeWorkflowTrigger","position":[2600,400],"parameters":{},"typeVersion":1.1},{"id":"b1d273cb-1730-40eb-93e7-95305e6ce091","name":"Docs RAG Tool","type":"@n8n/n8n-nodes-langchain.vectorStorePGVector","position":[3520,380],"parameters":{},"typeVersion":1.1},{"id":"9609e4cc-6d65-4364-97f8-0e79c0b36a2d","name":"Embeddings","type":"@n8n/n8n-nodes-langchain.embeddingsOpenAi","position":[3520,520],"parameters":{},"typeVersion":1.2},{"id":"df6ee67c-f983-4428-b0b8-cd0522d45298","name":"Chat Memory","type":"@n8n/n8n-nodes-langchain.memoryPostgresChat","position":[3260,460],"parameters":{},"notesInFlow":false,"typeVersion":1},{"id":"6e33fb90-9dd1-4ef8-a5e6-9081aca23ec5","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[2540,160],"parameters":{"content":""},"typeVersion":1},{"id":"0b6cd331-8202-413f-a721-43290d9e51d0","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-380,-1180],"parameters":{"content":""},"typeVersion":1},{"id":"e2d556be-1c64-4834-b6f6-ed469753ce09","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[2540,-740],"parameters":{"content":""},"typeVersion":1},{"id":"e54d26de-fb3e-491d-a23d-3986dfd36a2e","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-380,1380],"parameters":{"content":""},"typeVersion":1},{"id":"5d1a8354-a538-44d8-8d30-fd74084e2ea3","name":"TestData","type":"n8n-nodes-base.set","notes":"You can use it for test workflow without trigger","disabled":true,"position":[2820,400],"parameters":{},"notesInFlow":true,"typeVersion":3.4}],"pinData":{},"connections":{"TestData":{"main":[[{"node":"RAG AI Agent","type":"main","index":0}]]},"Embeddings":{"ai_embedding":[[{"node":"Docs RAG Tool","type":"ai_embedding","index":0}]]},"Get Values":{"main":[[{"node":"Postgres PGVector Store","type":"main","index":0}]]},"Chat Memory":{"ai_memory":[[{"node":"RAG AI Agent","type":"ai_memory","index":0}]]},"Set File ID":{"main":[[{"node":"Delete Old Doc Records","type":"main","index":0}]]},"File Created":{"main":[[{"node":"Loop Over Items","type":"main","index":0}]]},"File Updated":{"main":[[{"node":"Loop Over Items","type":"main","index":0}]]},"Docs RAG Tool":{"ai_tool":[[{"node":"RAG AI Agent","type":"ai_tool","index":0}]]},"Download File":{"main":[[{"node":"Extract Document Text","type":"main","index":0}]]},"Chunks To List":{"main":[[{"node":"Generate Contextual Text","type":"main","index":0}]]},"Loop Over Items":{"main":[[],[{"node":"Set File ID","type":"main","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"RAG AI Agent","type":"ai_languageModel","index":0}]]},"Embeddings OpenAI1":{"ai_embedding":[[{"node":"Postgres PGVector Store","type":"ai_embedding","index":0}]]},"OpenAI Chat Model3":{"ai_languageModel":[[{"node":"Generate Contextual Text","type":"ai_languageModel","index":0}]]},"Default Data Loader":{"ai_document":[[{"node":"Postgres PGVector Store","type":"ai_document","index":0}]]},"Extract Document Text":{"main":[[{"node":"Create Chunks From Doc","type":"main","index":0}]]},"Create Chunks From Doc":{"main":[[{"node":"Chunks To List","type":"main","index":0}]]},"Delete Old Doc Records":{"main":[[{"node":"Download File","type":"main","index":0}]]},"Postgres PGVector Store":{"main":[[{"node":"Loop Over Items","type":"main","index":0}]]},"Generate Contextual Text":{"main":[[{"node":"Get Values","type":"main","index":0}]]},"When chat message received":{"main":[[]]},"Recursive Character Text Splitter":{"ai_textSplitter":[[{"node":"Default Data Loader","type":"ai_textSplitter","index":0}]]},"When Executed by Another Workflow":{"main":[[{"node":"TestData","type":"main","index":0}]]}}}


name: Digest new YouTube videos to Slack with Google Sheets, RapidAPI & GPT-4o-mini
author_name: Naveen Choudhary
author_username: n8nstein
categories: []
created_at: 2025-06-08T19:11:14.172Z
updated_at: 2025-06-08T19:11:14.172Z
url: https://n8n.io/workflows/4801
scraped_at: 2025-06-19 22:49:39
description:
  Who is this for?

  Marketing, content, and enablement teams that need a quick, human-readable summary of every new video published by the YouTube channels they care about—without leaving Slack.

  What problem does this workflow solve?

  Manually checking multiple channels, skimming long videos, and pasting the highlights into Slack wastes time. This template automates the whole loop: detect a fresh upload from your selected channels → pull subtitles → distill the key take-aways with GPT-4o-mini → drop a neatly-formatted digest in Slack.

  What this workflow does

  Schedule Trigger fires every 10 min, then grabs a list of YouTube RSS feeds from a Google Sheet.
  HTTP + XML fetch & parse each feed; only brand-new videos continue.
  YouTube API fetches title/description, RapidAPI grabs English subtitles.
  Code nodes build an AI payload; OpenAI returns a JSON summary + article.
  A formatter turns that JSON into Slack Block Kit, and Slack posts it.
  Processed links are appended back to the “Video Links” sheet to prevent dupes.

  Setup

  Make a copy of this Google Sheet and connect a Google Sheets OAuth2 credential with edit rights.
  Slack App: create → add chat:write, channels:read, app_mention; enable Event Subscriptions; install and store the Bot OAuth token in an n8n Slack credential.
  RapidAPI key for https://yt-api.p.rapidapi.com/subtitles (300 free calls/mo) → save as HTTP Header Auth.
  OpenAI key → save in an OpenAI credential.
  Add your RSS feed URLs to the “RSS Feed URLs” tab; press Execute Workflow.

  How to customise

  Adjust the schedule interval or freshness window in “If newly published”.
  Swap the OpenAI model or prompt for shorter/longer digests.
  Point the Slack node at a different channel or DM.
  Extend the AI payload to include thumbnails or engagement stats.

  Use-case ideas

  Product marketing**: Instantly brief sales & CS teams when a competitor uploads a feature demo.
  Internal learning hub**: Auto-summarise conference talks and share bullet-point notes with engineers.
  Social media managers**: Get ready-to-post captions and key moments for re-purposing across platforms.

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.slack","n8n-nodes-base.youTube","n8n-nodes-base.code","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatOpenAi","@n8n/n8n-nodes-langchain.openAi"]

workflow_json:
  {"id":"Dgu2JgEFyzKDyHqc","meta":{"instanceId":"8d41476c63702cd0f2be55363b48153c5d4820bb18197ca147e7be50ef236112","templateCredsSetupCompleted":true},"name":"YouTube RSS to Slack DIgest","tags":[{"id":"U7yroZQpInqB6NdO","name":"slack","createdAt":"2025-06-07T04:12:43.394Z","updatedAt":"2025-06-07T04:12:43.394Z"},{"id":"wrN9xw9yHvFfa0YA","name":"rapidapi","createdAt":"2025-06-07T04:12:49.808Z","updatedAt":"2025-06-07T04:12:49.808Z"},{"id":"HN4QoMZjexklpkRv","name":"youtube","createdAt":"2025-06-07T04:12:54.514Z","updatedAt":"2025-06-07T04:12:54.514Z"},{"id":"FpF0WUxxGoK09fhl","name":"openai","createdAt":"2025-06-07T04:12:57.942Z","updatedAt":"2025-06-07T04:12:57.942Z"}],"nodes":[{"id":"f539cbde-f850-4d48-b1b9-40b764452b06","name":"Get Subtitles","type":"n8n-nodes-base.httpRequest","position":[-660,100],"parameters":{"url":"={{ $json.url }}","options":{}},"typeVersion":4.2},{"id":"4a38af14-faf0-40f4-a467-e97328c001a1","name":"Get Timestamps","type":"n8n-nodes-base.code","position":[-440,100],"parameters":{"jsCode":"const description = $('Fetch Video Details').first().json.snippet.description\nconst pattern = /(\\d{1,2}:\\d{2})\\s+(.*)/g;\nlet match;\nconst chapters = [];\n\nwhile ((match = pattern.exec(description)) !== null) {\n  chapters.push({\n    time: match[1],\n    title: match[2].replace(/[\\s:]/g, '_')\n  });\n}\n\nreturn chapters.map((chapter, index) => {\n  return {\n    json: {\n      start_time: chapter.time,\n      title: chapter.title,\n      end_time: chapters[index + 1] ? chapters[index + 1].time : null\n    }\n  };\n});\n"},"typeVersion":2,"alwaysOutputData":true},{"id":"92df3a24-985d-48e0-89eb-74beb147b190","name":"Formatted Chapter Text","type":"n8n-nodes-base.code","notes":"Map timestamps to the xml transcript for a merged version to pass into OpenAI API","position":[0,0],"parameters":{"jsCode":"// Retrieve the XML data from the HTTP Request node\nconst transcriptXml = $node[\"Get Subtitles\"].json.data;  // Access the 'data' field\n\n// Clean the XML to ensure proper parsing\nlet cleanXml = transcriptXml.replace(/\\r?\\n|\\r/g, '');  // Remove newlines\ncleanXml = cleanXml.replace(/\\s+/g, ' ');  // Collapse whitespace\ncleanXml = cleanXml.replace(/&amp;/g, '&');  // Convert any encoded ampersands\ncleanXml = cleanXml.replace(/&amp;#39;/g, \"'\");  // Convert encoded apostrophe\ncleanXml = cleanXml.replace(/&#39;/g, \"'\");  // Convert encoded apostrophe\n\n\n// Define the regex to parse the XML content\nconst textRegex = /<text start=\"([\\d.]+)\" dur=\"[\\d.]+\">([^<]+)<\\/text>/g;\nconst transcriptData = [];\nlet match;\n\n// Parse the XML and extract the transcript data\nwhile ((match = textRegex.exec(cleanXml)) !== null) {\n  transcriptData.push({\n    start: parseFloat(match[1]),  // The start time is already in seconds\n    text: match[2]\n  });\n}\n\n// Function to convert minutes to seconds\nfunction minutesToSeconds(time) {\n  const parts = time.split(':');\n  if (parts.length === 2) {\n    return parseInt(parts[0]) * 60 + parseFloat(parts[1]);\n  } else {\n    return parseFloat(parts[0]);\n  }\n}\n\n// Combine chapters and subtitles (assuming chapters are provided by previous step)\nconst chapters = $input.all();\nconst tolerance = 2;  // Allowable tolerance in seconds for nearest match\nconst results = chapters.map((chapter, index) => {\n  const startTime = minutesToSeconds(chapter.json.start_time);  // Convert chapter start time to seconds\n  const endTime = chapter.json.end_time ? minutesToSeconds(chapter.json.end_time) : null;\n  let chapterText = '';\n\n  for (let i = 0; i < transcriptData.length; i++) {\n    const textStart = transcriptData[i].start;\n    \n    // Check if the transcript start time is within the chapter's time range, allowing for tolerance\n    if (textStart >= startTime - tolerance && (!endTime || textStart < endTime + tolerance)) {\n      chapterText += transcriptData[i].text + ' ';\n    } else if (textStart >= endTime) {\n      // Once we reach the start time of the next chapter, break out of the loop\n      break;\n    }\n  }\n\n  // Log the chapter text for each chapter\n  console.log(`Chapter ${index + 1} (${chapter.json.title}):`, chapterText.trim());\n\n  return {\n    chapter_no: index + 1,\n    chapter_name: chapter.json.title,\n    chapter_text: chapterText.trim()\n  };\n});\n\n// Log the final results\nconsole.log('Final Results:', results);\n\nreturn results;\n"},"notesInFlow":true,"typeVersion":2},{"id":"8b713190-5fb5-4aaf-bf93-3ac0b8c9e561","name":"Generate Slack Blocks - Detailed Summary","type":"n8n-nodes-base.code","position":[816,100],"parameters":{"jsCode":"const openAIResponse = $('Generate Summary').item.json.message.content;\n\n// Remove the leading and trailing backticks and \"json\\n\" if present\nconst contentString = openAIResponse.replace(/```json\\n|```/g, '').trim();\n\nlet content;\ntry {\n  content = JSON.parse(contentString);\n  console.log('Parsed JSON:', content);\n\n} catch (error) {\n  console.error('JSON Parsing Error:', error);\n  return [{ json: { error: 'Failed to parse JSON content.' } }];\n}\n\n// Extract the Quick Rundown Summary, Video Title, and Video Description\nconst quickRundownSummary = content.detailed_quick_rundown_summary;\nconst videoTitle = content.video_title;\nconst videoDescription = content.video_description;\n\n// Format the title and description for Slack\nconst titleAndDescription = `*${videoTitle}*\\n${videoDescription}\\n\\n`;\n\n// Join the bullet points into a single string, separated by new lines\nconst slackFormattedMessage = titleAndDescription + quickRundownSummary.join('\\n');\n\n// Log or return the formatted message\nconsole.log(slackFormattedMessage);\n\n// Create a simple text fallback for the Slack message\nconst fallbackText = `${videoTitle}\\n${videoDescription}\\nQuick Rundown:\\n${quickRundownSummary.join('\\n')}`;\n\n// Return the payload with blocks and fallback text\nreturn [\n  {\n    json: {\n      text: fallbackText,\n      blocks: slackFormattedMessage,\n    }\n  }\n];\n"},"typeVersion":2},{"id":"6ef98839-1592-407d-a3d7-c91edbff2f4f","name":"Formatted Transcript w/o Chapters","type":"n8n-nodes-base.code","notes":"Map timestamps to the xml transcript for a merged version to pass into OpenAI API","position":[220,200],"parameters":{"jsCode":"// Retrieve the XML data from the HTTP Request node\nconst transcriptXml = $node[\"Get Subtitles\"].json.data;  // Access the 'data' field\n\n// Clean the XML to ensure proper parsing\nlet cleanXml = transcriptXml.replace(/\\r?\\n|\\r/g, '');  // Remove newlines\ncleanXml = cleanXml.replace(/\\s+/g, ' ');  // Collapse whitespace\ncleanXml = cleanXml.replace(/&amp;/g, '&');  // Convert any encoded ampersands\ncleanXml = cleanXml.replace(/&amp;#39;/g, \"'\");  // Convert encoded apostrophe\ncleanXml = cleanXml.replace(/&#39;/g, \"'\");  // Convert encoded apostrophe\n\n// Define the regex to parse the XML content\nconst textRegex = /<text start=\"([\\d.]+)\" dur=\"[\\d.]+\">([^<]+)<\\/text>/g;\nlet mergedText = '';\nlet match;\n\n// Parse the XML and extract the transcript data\nwhile ((match = textRegex.exec(cleanXml)) !== null) {\n  mergedText += match[2] + ' ';  // Append the text to the merged string\n}\n\n// Trim any extra whitespace\nmergedText = mergedText.trim();\n\n// Create the final JSON structure\nconst finalJson = {\n  video_title: $('Fetch Video Details').first().json.snippet.title,  // Replace with actual video title\n  video_description: $('Fetch Video Details').first().json.snippet.description,  // Replace with actual video description\n  merged_text: mergedText\n};\n\n// Return the final JSON structure\nreturn [\n  {\n    json: finalJson\n  }\n];\n"},"notesInFlow":true,"typeVersion":2},{"id":"6570c170-cd9f-444f-b033-d9417f435967","name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[-3520,500],"parameters":{"rule":{"interval":[{"field":"minutes","minutesInterval":10}]}},"typeVersion":1.2},{"id":"3ea53e09-b01f-47d4-83ca-e82f918e37ca","name":"If newly published","type":"n8n-nodes-base.code","position":[-2420,200],"parameters":{"jsCode":"// Set the interval (in minutes) during which a video is considered \"new\"\nconst runIntervalMinutes = 1000;\n\n// Get the current date/time\nconst currentTime = new Date();\n\n// Calculate the cutoff time by subtracting the run interval\nconst cutoffTime = new Date(currentTime.getTime() - runIntervalMinutes * 60 * 1000);\n\n// Access the feed entries from the first input item\nconst feedEntries = items[0].json.feed.entry || [];\n\n// Process each item passed from the previous node\n// Assumes each item has a `published` field in ISO 8601 format (e.g., \"2025-03-24T12:34:56Z\")\nconst newItems = feedEntries.map(item => {\n  const publishedDate = new Date(item.published);\n  \n  // Check if the video was published after the cutoff time\n  // If so, mark it as new by adding a `newVideo` property set to true\n  item.newVideo = publishedDate >= cutoffTime;\n  \n  // Optionally, attach some time info for debugging\n  item.cutoffTime = cutoffTime.toISOString();\n  item.publishedDateISO = publishedDate.toISOString();\n  \n  // Wrap each item in { json: ... } for n8n output format\n  return { json: item };\n});\n\nreturn newItems[0];\n"},"typeVersion":2},{"id":"dab0151c-c337-41eb-86b3-21e0f6a4ac4f","name":"Check for new videos","type":"n8n-nodes-base.if","position":[-2200,200],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"bffc7ab0-0cf5-47c9-b772-826da21f8b22","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.newVideo }}","rightValue":""}]}},"typeVersion":2.2},{"id":"18d40ceb-bf64-4d44-8ec9-8d27e2b721ab","name":"Get RSS Links","type":"n8n-nodes-base.googleSheets","position":[-3300,500],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":1930937118,"cachedResultUrl":"https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit#gid=1930937118","cachedResultName":"RSS Feed URLs"},"documentId":{"__rl":true,"mode":"list","value":"1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit?usp=drivesdk","cachedResultName":"YouTube RSS Tracker"}},"credentials":{"googleSheetsOAuth2Api":{"id":"V4NHfo08zBK4IW4e","name":"[Naveen]Google Sheets account"}},"typeVersion":4.5},{"id":"8da2db10-d478-42a2-b20b-91c439860d5c","name":"Filter for New Video","type":"n8n-nodes-base.googleSheets","position":[-1980,200],"parameters":{"options":{},"filtersUI":{"values":[{"lookupValue":"={{ $json.link.href }}","lookupColumn":"YouTube Link"}]},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit#gid=0","cachedResultName":"Video Links"},"documentId":{"__rl":true,"mode":"list","value":"1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit?usp=drivesdk","cachedResultName":"YouTube RSS Tracker"}},"credentials":{"googleSheetsOAuth2Api":{"id":"V4NHfo08zBK4IW4e","name":"[Naveen]Google Sheets account"}},"executeOnce":false,"typeVersion":4.4,"alwaysOutputData":true},{"id":"54539bf9-cdf9-49b4-970f-512931619787","name":"Check if the Video Exists","type":"n8n-nodes-base.if","position":[-1760,200],"parameters":{"options":{},"conditions":{"options":{"version":1,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"030ada47-5a56-41dd-8d2a-ff1669a5f310","operator":{"type":"object","operation":"empty","singleValue":true},"leftValue":"={{ $json }}","rightValue":""}]}},"typeVersion":2},{"id":"2eb43d7a-4c7b-4ed0-8039-3c111d25499d","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-3780,280],"parameters":{"color":4,"width":620,"content":"## 1. Trigger & Source\n- **Kick-off every 10 min**  \n  Starts the workflow on a timer so you’re always working with fresh data.\n\n- **Grab feed list from Google Sheet**  \n  Pulls the latest RSS URLs so you can add or remove sources without touching the flow.\n"},"typeVersion":1},{"id":"142c3e97-4ad4-4851-acd9-a4dc6dd93d79","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-2840,520],"parameters":{"color":4,"width":700,"content":"## 2. Fetch & Batch\n- **Process one feed at a time**  \n  Keeps memory low and makes retry logic straightforward.\n\n- **HTTP GET to download each RSS**  \n  Grabs raw XML content for the next step.\n"},"typeVersion":1},{"id":"d037bd15-0f67-4e71-8154-f24ccc3022f6","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-2300,-20],"parameters":{"color":4,"width":640,"content":"## 3. Parse & Filter\n- **Convert XML → JSON**  \n  Translates RSS into clean JSON objects the rest of the flow can read.\n\n- **Keep only brand-new items**  \n  Drops anything older than your freshness window so you never double-post.\n"},"typeVersion":1},{"id":"5c1f7a6d-79c9-4895-921f-825276728637","name":"Batch RSS Items","type":"n8n-nodes-base.splitInBatches","position":[-3080,500],"parameters":{"options":{}},"typeVersion":3},{"id":"c5aeea13-b7ce-47a8-b96f-c2ed5293d216","name":"Fetch RSS Feed","type":"n8n-nodes-base.httpRequest","position":[-2860,200],"parameters":{"url":"={{ $json['RSS URL'] }}","options":{}},"typeVersion":4.2},{"id":"bfdc95a2-cd13-40e5-9602-d22a7910589d","name":"Parse RSS XML","type":"n8n-nodes-base.xml","position":[-2640,200],"parameters":{"options":{}},"typeVersion":1,"alwaysOutputData":true},{"id":"e75818ea-f59e-4331-b4fd-700cb28fc925","name":"Fetch Video Details","type":"n8n-nodes-base.youTube","position":[-1320,100],"parameters":{"options":{},"videoId":"={{ $('Check for new videos').first().json.link.href.split(\"=\")[1] }}","resource":"video","operation":"get"},"credentials":{"youTubeOAuth2Api":{"id":"056bqpBlpOZnUyaJ","name":"YouTube account"}},"typeVersion":1},{"id":"0e35710d-69a5-4f7c-8405-9fef774d8df8","name":"Log New Videos","type":"n8n-nodes-base.googleSheets","position":[-1540,100],"parameters":{"columns":{"value":{"YouTube Link":"={{ $('Check for new videos').item.json.link.href }}"},"schema":[{"id":"YouTube Link","type":"string","display":true,"removed":false,"required":false,"displayName":"YouTube Link","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["YouTube Link"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit#gid=0","cachedResultName":"Video Links"},"documentId":{"__rl":true,"mode":"list","value":"1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit?usp=drivesdk","cachedResultName":"YouTube RSS Tracker"}},"credentials":{"googleSheetsOAuth2Api":{"id":"V4NHfo08zBK4IW4e","name":"[Naveen]Google Sheets account"}},"typeVersion":4.4},{"id":"20e47927-ec86-456e-b26a-c96fda7715e3","name":"Generate Summary","type":"@n8n/n8n-nodes-langchain.openAi","position":[440,100],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4o-mini","cachedResultName":"GPT-4O-MINI"},"options":{},"messages":{"values":[{"content":"=You are an expert writer tasked with summarizing and elaborating on the following content extracted from a YouTube video. Your goal is to create two outputs:\n\nYou are an expert writer tasked with summarizing and elaborating on the following content extracted from a YouTube video. Your goal is to create two outputs in JSON format:\n\n1. A **Detailed Quick Rundown Summary**: This should be a detailed summary of the entire video content, capturing the key points and important excerpts from each chapter. The summary should be structured with bullet points, highlighting the most critical information and providing a comprehensive overview.\n\n2. A **Detailed Article**: This should be a more comprehensive article that expands on each section of the video, providing detailed explanations, insights, and structured content. The article should include titles, descriptions, and bullet points where appropriate.\n\n\n---\n\n### Context:\n- **Video Title**: {{ $json.video_title }}\n- **Video Description**: {{ $json.video_description }}\n\n\n### Segmented Content:\n{{ $json.merged_text }}\n\n\n---\n\n### Task:\n\n1. **Quick Rundown Summary**: Create a concise summary of the entire video content, highlighting the most important points in bullet form or short paragraphs.\n\n2. **Detailed Article**: Write a detailed article based on the segmented content, using proper titles, descriptions, and bullet points where necessary. The article should flow logically from one chapter to the next, providing a comprehensive view of the entire video.\n\n---\n\n**Generate both the Quick Rundown Summary and Detailed Article in the response.**\n\n### Example JSON Structure\n\nHere’s an example of what the output might look like:\n\n```json\n{\n  \"video_title\": \"[Insert Video Title Here]\",\n  \"video_description\": \"[Insert Video Description Here]\",\n  \"detailed_quick_rundown_summary\": [\n    \"• [Bullet point summarizing key information or an important excerpt from the video]\",\n    \"• [Another bullet point with critical content]\",\n    \"• [Continue with detailed points summarizing the entire video content]\"\n  ],\n  \"detailed_article\": {\n    \"chapters\": [\n      {\n        \"chapter_no\": 1,\n        \"chapter_title\": \"[Insert Chapter 1 Title Here]\",\n        \"chapter_summary\": \"[Provide a brief summary of this chapter]\",\n        \"chapter_content\": \"[Insert Chapter 1 Text Here with proper formatting and explanations]\"\n      },\n      {\n        \"chapter_no\": 2,\n        \"chapter_title\": \"[Insert Chapter 2 Title Here]\",\n        \"chapter_summary\": \"[Provide a brief summary of this chapter]\",\n        \"chapter_content\": \"[Insert Chapter 2 Text Here with proper formatting and explanations]\"\n      }\n      // Add more chapters as needed\n    ]\n  }\n}\n"}]}},"credentials":{"openAiApi":{"id":"ByDgQA1p4t7cntsz","name":"OpenAi account"}},"typeVersion":1.4},{"id":"9c0c4eeb-7c96-4d48-a4b0-d74e8282c103","name":"Build AI Payload","type":"n8n-nodes-base.code","position":[220,0],"parameters":{"jsCode":"// Assuming the input contains all 29 JSON objects in the `items` array\nconst items = $input.all(); // Get all incoming JSON objects\n\n// Extract the chapter data from each item and combine them\nconst chapters = items.map((item, index) => {\n  return {\n    chapter_no: index + 1,\n    chapter_name: item.json.chapter_name || `Chapter ${index + 1}`,\n    chapter_text: item.json.chapter_text\n  };\n});\n\n// Create the final JSON structure\nconst finalJson = {\n  video_title: $('Fetch Video Details').first().json.snippet.title,  // Replace with actual video title\n  video_description: $('Fetch Video Details').first().json.snippet.description,  // Replace with actual video description\n  merged_text: chapters\n};\n\n// Return the final JSON structure\nreturn [\n  {\n    json: finalJson\n  }\n];\n"},"typeVersion":2},{"id":"d527709b-9664-448d-9437-e75872fb1e29","name":"Post to Slack","type":"n8n-nodes-base.slack","position":[1036,275],"webhookId":"97a2ae1f-9ef8-488d-abb0-4cc4739d34fd","parameters":{"text":"={{ $json.blocks }}\n\n\nYou can check the full video here 👉 {{ $('Check for new videos').first().json.link.href }}\n","select":"channel","channelId":{"__rl":true,"mode":"list","value":"C0914FVFTDE","cachedResultName":"yt-rss-test-naveen"},"otherOptions":{},"authentication":"oAuth2"},"credentials":{"slackOAuth2Api":{"id":"SHu14u83No77oxGg","name":"Slack account"}},"typeVersion":2.2},{"id":"0024e377-40da-452d-a320-99378c63cc43","name":"Check for Timestamps","type":"n8n-nodes-base.if","position":[-220,100],"parameters":{"options":{},"conditions":{"options":{"version":1,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"d7b2e3b9-2190-4038-876d-9ccefa85718a","operator":{"type":"object","operation":"notEmpty","singleValue":true},"leftValue":"={{ $json }}","rightValue":""}]}},"typeVersion":2},{"id":"59551f76-42f6-4d61-acd5-c046646fa7be","name":"Fetch Subtitles URL","type":"n8n-nodes-base.httpRequest","position":[-1100,100],"parameters":{"url":"https://yt-api.p.rapidapi.com/subtitles","options":{},"sendQuery":true,"sendHeaders":true,"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","queryParameters":{"parameters":[{"name":"id","value":"={{ $json.id }}"}]},"headerParameters":{"parameters":[{"name":"x-rapidapi-host","value":"yt-api.p.rapidapi.com"}]}},"credentials":{"httpHeaderAuth":{"id":"TkaNF3gX6mdxX68v","name":"RapidAPI/YTSubtitles Header Auth"}},"typeVersion":4.2},{"id":"a0ac6aba-fdd6-491c-a50b-11b3c32619ba","name":"Format Response","type":"n8n-nodes-base.code","position":[-880,100],"parameters":{"jsCode":"// Retrieve items from the previous node\nconst items = $input.all();\nlet finalUrl = '';\n\nfor (const item of items) {\n  const subtitles = item.json.subtitles;\n\n  // Prioritize \"English (auto-generated)\"\n  let subtitle = subtitles.find(\n    sub => sub.languageName === 'English (auto-generated)' && sub.languageCode === 'en'\n  );\n\n  // If \"English (auto-generated)\" is not found, fall back to \"English\"\n  if (!subtitle) {\n    subtitle = subtitles.find(\n      sub => sub.languageName === 'English' && sub.languageCode === 'en'\n    );\n  }\n\n  if (subtitle) {\n    // Ensure the URL contains 'fmt=srv1'\n    let url = subtitle.url;\n\n    if (!url.includes('fmt=srv1')) {\n      // If 'fmt=srv1' is not in the URL, add or replace the fmt parameter\n      if (url.includes('fmt=')) {\n        url = url.replace(/fmt=[^&]*/, 'fmt=srv1');\n      } else {\n        url += '&fmt=srv1';\n      }\n    }\n    // Set the final URL\n    finalUrl = url;\n    break; // Stop after finding the first match\n  }\n}\n\n// Return only the final URL\nreturn [{ json: { url: finalUrl } }];\n"},"typeVersion":2},{"id":"91206cd9-4968-4ecc-a973-9588d15bdb50","name":"Link is Processed","type":"n8n-nodes-base.set","position":[-1540,300],"parameters":{"options":{},"assignments":{"assignments":[{"id":"a5950b6a-29fd-4f56-94a9-4706535730cb","name":"Output","type":"string","value":"Link is already processed"}]}},"typeVersion":3.4},{"id":"dbb63f27-9e24-4873-81df-547b56c798cf","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-1220,-100],"parameters":{"color":4,"width":860,"content":"## 4. Enrich & Summarize\n- **Pull video details + subtitles**  \n  Adds title, description, and transcript data for richer context.\n\n- **Send to AI for short summary**  \n  Generates a concise, readable recap ready for sharing.\n"},"typeVersion":1},{"id":"f65d7246-c4b9-4784-a172-09280b0597f1","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[160,500],"parameters":{"color":4,"width":620,"content":"## 5. Log & Notify\n- **Append new videos to sheet**  \n  Records what’s already been handled to prevent duplicates.\n\n- **Post summary to Slack**  \n  Drops the final digest into your channel so the team sees updates in real time.\n"},"typeVersion":1},{"id":"c09c61a3-298d-40bc-bf7d-39cbbbf54fe6","name":"Slack Trigger","type":"n8n-nodes-base.slackTrigger","position":[-3500,1260],"webhookId":"84634578-172b-496b-91fc-17605a878885","parameters":{"options":{},"trigger":["app_mention"],"channelId":{"__rl":true,"mode":"id","value":"C0914FVFTDE"}},"credentials":{"slackApi":{"id":"YRlasKhU6zD9bRT1","name":"Naveen Slack account"}},"typeVersion":1},{"id":"112a34af-2e8a-41dd-9e22-cb02f9ffae1f","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[-2760,1260],"parameters":{"text":"=Check if {{ $json.rss_feed_url }} is already available in the sheets using `Get Rows` Google Sheets tool. If it's there, do nothing. If it's not in the sheet, then based on the user message {{ $('Slack Trigger').item.json.text }} \"add\" or \"remove\" it to the sheets using `Append Row` and `Delete Row` Google Sheets tools accordingly.","options":{"systemMessage":"You are an automation assistant managing RSS feed entries in a Google Sheet.\n\n1. First, check if `{{ $json.rss_feed_url }}` exists in the sheet using the `Get Rows` node.\n2. If the URL **already exists**:\n   - Do **nothing** unless the Slack message contains \"remove\", in which case delete the corresponding row using `Delete Row`.\n3. If the URL **does not exist**:\n   - If the Slack message (`{{ $('Slack Trigger').item.json.text }}`) contains \"add\", use `Append Row` to insert the URL.\n   - If the message contains \"remove\", do **nothing**.\n\nOnly act if the intent (\"add\" or \"remove\") is clearly mentioned in the Slack message.\n"},"promptType":"define"},"typeVersion":1.8},{"id":"8fbe1750-c207-47f3-9a0c-2197febf4558","name":"Get Rows","type":"n8n-nodes-base.googleSheetsTool","position":[-2720,1480],"parameters":{"options":{},"filtersUI":{"values":[{"lookupValue":"={{ $('RSS Feed URL').item.json.rss_feed_url }}","lookupColumn":"RSS URL"}]},"sheetName":{"__rl":true,"mode":"list","value":1930937118,"cachedResultUrl":"https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit#gid=1930937118","cachedResultName":"RSS Feed URLs"},"documentId":{"__rl":true,"mode":"list","value":"1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit?usp=drivesdk","cachedResultName":"YouTube RSS Tracker"}},"credentials":{"googleSheetsOAuth2Api":{"id":"V4NHfo08zBK4IW4e","name":"[Naveen]Google Sheets account"}},"typeVersion":4.5},{"id":"1338c910-b227-4172-bb05-870603d3f57d","name":"Delete Row","type":"n8n-nodes-base.googleSheetsTool","position":[-2600,1480],"parameters":{"operation":"delete","sheetName":{"__rl":true,"mode":"list","value":1930937118,"cachedResultUrl":"https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit#gid=1930937118","cachedResultName":"RSS Feed URLs"},"documentId":{"__rl":true,"mode":"list","value":"1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit?usp=drivesdk","cachedResultName":"YouTube RSS Tracker"},"startIndex":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start_Row_Number', \"Get `row_number` from `Get Rows` to determine which row to delete\", 'number') }}"},"credentials":{"googleSheetsOAuth2Api":{"id":"V4NHfo08zBK4IW4e","name":"[Naveen]Google Sheets account"}},"typeVersion":4.5},{"id":"267d813b-2bb7-43ce-acd3-9089d4e92d2c","name":"Append Row","type":"n8n-nodes-base.googleSheetsTool","position":[-2480,1480],"parameters":{"columns":{"value":{"RSS URL":"={{ $('RSS Feed URL').item.json.rss_feed_url }}","YouTube Channel":"={{ $('Slack Trigger').item.json.attachments[0].from_url }}"},"schema":[{"id":"YouTube Channel","type":"string","display":true,"required":false,"displayName":"YouTube Channel","defaultMatch":false,"canBeUsedToMatch":true},{"id":"RSS URL","type":"string","display":true,"required":false,"displayName":"RSS URL","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":1930937118,"cachedResultUrl":"https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit#gid=1930937118","cachedResultName":"RSS Feed URLs"},"documentId":{"__rl":true,"mode":"list","value":"1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit?usp=drivesdk","cachedResultName":"YouTube RSS Tracker"}},"credentials":{"googleSheetsOAuth2Api":{"id":"V4NHfo08zBK4IW4e","name":"[Naveen]Google Sheets account"}},"typeVersion":4.5},{"id":"86560901-b68c-4d67-9ebd-3294a4ea42f6","name":"Get Channel ID","type":"n8n-nodes-base.httpRequest","position":[-3280,1260],"parameters":{"url":"https://youtube138.p.rapidapi.com/channel/details","options":{},"sendQuery":true,"sendHeaders":true,"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","queryParameters":{"parameters":[{"name":"id","value":"={{ $json.blocks[0].elements[0].elements[2].url || $json.attachments[0].from_url }}"},{"name":"hl","value":"en"},{"name":"gl","value":"US"}]},"headerParameters":{"parameters":[{"name":"x-rapidapi-host","value":"youtube138.p.rapidapi.com"}]}},"credentials":{"httpHeaderAuth":{"id":"TkaNF3gX6mdxX68v","name":"RapidAPI/YTSubtitles Header Auth"}},"typeVersion":4.2},{"id":"4abd10d8-e68e-4729-928d-0e466a00be8b","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[-2840,1480],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"ByDgQA1p4t7cntsz","name":"OpenAi account"}},"typeVersion":1.2},{"id":"4941f63a-3560-4175-9e97-86f9c051ca5c","name":"RSS Feed URL","type":"n8n-nodes-base.set","position":[-3060,1260],"parameters":{"options":{},"assignments":{"assignments":[{"id":"81c9584a-4113-4b60-97e3-dcd8cf39882c","name":"rss_feed_url","type":"string","value":"=https://www.youtube.com/feeds/videos.xml?channel_id={{ $json.channelId }}"}]}},"typeVersion":3.4},{"id":"8901e407-973c-4c25-87ff-61c653448f3a","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-3740,960],"parameters":{"color":5,"width":440,"height":280,"content":"## 1. Slack Event Trigger\n- Kicks off whenever someone @mentions the bot in a channel, capturing the message text and channel context.\n\n### Example:\n\"@yourbotname, add this  `https://www.youtube.com/@mreflow`\"\n\n\"@yourbotname, delete/remove this  `https://www.youtube.com/@mreflow`\""},"typeVersion":1},{"id":"4b0e9642-6db1-4b91-8706-f7b5f2d6ba72","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[-3200,1080],"parameters":{"color":5,"width":800,"height":140,"content":"## 2. Build RSS & Decide Action\n- Extracts the YouTube channel link from the message, converts it into a channel-specific RSS URL, and lets an AI step read the text to decide whether the user wants to **add** or **remove** that feed."},"typeVersion":1},{"id":"347b8f85-700e-4638-a1ce-3d96c754b22a","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-4520,860],"parameters":{"color":5,"width":620,"height":420,"content":"## Setting up Slack OAuth for Posting & Event Listening\n\n1. **Create a Slack App**: `api.slack.com/apps` → **Create New App** → “From scratch.”  \n2. **Add Bot Token Scopes**:  \n   - `chat:write` (post messages)  \n   - `channels:read` & `groups:read` (find channel IDs)  \n3. **Enable Event Subscriptions**:  \n   - Turn on **Event Subscriptions** → set your n8n public webhook URL.  \n   - Subscribe to the **`app_mention`** event so the bot fires when mentioned.  \n4. **Install the App**: Click **Install App**, authorize, and copy the **Bot User OAuth Token** (`xoxb-...`) into an n8n Slack credential.  \n5. **Invite Bot to Channel**: `/invite @YourBot` in the target channel.  \n6. **Test**: Send “`@YourBot add/remove {YouTube Channel link}`” and watch the workflow update the sheet.\n\n*(If you change scopes later, reinstall the app so the token picks up new permissions.)*\n"},"typeVersion":1},{"id":"838fdb84-cbac-4a0f-860a-ea25f1459e58","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[-4500,340],"parameters":{"width":600,"height":420,"content":"## 🔑 Setup & Credentials\n- **Google Sheets Template**  \n  > Make a copy of the master sheet here:  \n  > `https://docs.google.com/spreadsheets/d/1i3jZ_0npsEVtrMUSzGPV3Lbta3q7sArHHeNomlAuSMg/edit?usp=sharing`  \n  > Connect the copy with a **Google Sheets OAuth2** credential that has **edit** access so the workflow can read/write rows.\n\n- **RapidAPI – Subtitles Endpoint**  \n  > Sign up at `https://yt-api.p.rapidapi.com/subtitles` (free 300 calls / month).  \n  > Store your **X-RapidAPI-Key** in an n8n **Header Auth** credential—never hard-code it in the node.\n\n- **OpenAI API Key**  \n  > Create a key at `https://platform.openai.com/account/api-keys` and save it in an n8n **OpenAI** credential.  \n  > Monitor usage; long transcripts can eat tokens quickly.\n"},"typeVersion":1}],"active":true,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"897c96d2-bbec-4446-8150-268049be132c","connections":{"Get Rows":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"Append Row":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"Delete Row":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"RSS Feed URL":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"Get RSS Links":{"main":[[{"node":"Batch RSS Items","type":"main","index":0}]]},"Get Subtitles":{"main":[[{"node":"Get Timestamps","type":"main","index":0}]]},"Parse RSS XML":{"main":[[{"node":"If newly published","type":"main","index":0}]]},"Post to Slack":{"main":[[{"node":"Batch RSS Items","type":"main","index":0}]]},"Slack Trigger":{"main":[[{"node":"Get Channel ID","type":"main","index":0}]]},"Fetch RSS Feed":{"main":[[{"node":"Parse RSS XML","type":"main","index":0}]]},"Get Channel ID":{"main":[[{"node":"RSS Feed URL","type":"main","index":0}]]},"Get Timestamps":{"main":[[{"node":"Check for Timestamps","type":"main","index":0}]]},"Log New Videos":{"main":[[{"node":"Fetch Video Details","type":"main","index":0}]]},"Batch RSS Items":{"main":[[],[{"node":"Fetch RSS Feed","type":"main","index":0}]]},"Format Response":{"main":[[{"node":"Get Subtitles","type":"main","index":0}]]},"Build AI Payload":{"main":[[{"node":"Generate Summary","type":"main","index":0}]]},"Generate Summary":{"main":[[{"node":"Generate Slack Blocks - Detailed Summary","type":"main","index":0}]]},"Schedule Trigger":{"main":[[{"node":"Get RSS Links","type":"main","index":0}]]},"Link is Processed":{"main":[[{"node":"Batch RSS Items","type":"main","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"If newly published":{"main":[[{"node":"Check for new videos","type":"main","index":0}]]},"Fetch Subtitles URL":{"main":[[{"node":"Format Response","type":"main","index":0}]]},"Fetch Video Details":{"main":[[{"node":"Fetch Subtitles URL","type":"main","index":0}]]},"Check for Timestamps":{"main":[[{"node":"Formatted Chapter Text","type":"main","index":0}],[{"node":"Formatted Transcript w/o Chapters","type":"main","index":0}]]},"Check for new videos":{"main":[[{"node":"Filter for New Video","type":"main","index":0}],[{"node":"Batch RSS Items","type":"main","index":0}]]},"Filter for New Video":{"main":[[{"node":"Check if the Video Exists","type":"main","index":0}]]},"Formatted Chapter Text":{"main":[[{"node":"Build AI Payload","type":"main","index":0}]]},"Check if the Video Exists":{"main":[[{"node":"Log New Videos","type":"main","index":0}],[{"node":"Link is Processed","type":"main","index":0}]]},"Formatted Transcript w/o Chapters":{"main":[[{"node":"Generate Summary","type":"main","index":0}]]},"Generate Slack Blocks - Detailed Summary":{"main":[[{"node":"Post to Slack","type":"main","index":0}]]}}}


name: ✍️ Blog Image SEO & Size Auditor with Ghost and Google Sheets
author_name: Samir Saci
author_username: samirsaci
categories: []
created_at: 2025-06-08T19:33:25.096Z
updated_at: 2025-06-08T19:33:25.096Z
url: https://n8n.io/workflows/4802
scraped_at: 2025-06-19 22:49:19
description:
  Tags*: Ghost CMS, SEO Audit, Image Optimisation, Alt Text, Google Sheets, Automation

  Context

  Hi! I’m Samir — a Supply Chain Engineer and Data Scientist based in Paris, and founder of LogiGreen Consulting.

  I help companies and content creators use automation and analytics to improve visibility, enhance performance, and reduce manual work.

  &gt; Let’s use n8n to automate SEO audits to increase your traffic!

  📬 For business inquiries, feel free to connect on LinkedIn

  Who is this template for?

  This workflow is perfect for bloggers, marketers, or content teams using Ghost CMS who want to:

  Extract and review all images from articles  
  Detect missing or short alt texts  
  Check image file size and filename SEO compliance  
  Push the audit results into a Google Sheet

  How does it work?

  This n8n workflow extracts all blog posts from Ghost CMS, scans the HTML to collect all embedded images, then evaluates each image for:

  ✅ Presence and length of alt text  
  📏 File size in kilobytes  
  🔤 Filename SEO quality (e.g. lowercase, hyphenated, no special chars)  

  All findings are written to Google Sheets for further analysis or manual cleanup.

  🧭 Workflow Steps:

  🚀 Trigger the workflow manually or on schedule  
  📰 Extract blog post content from Ghost CMS  
  🖼️ Parse all ` tags with src and alt` attributes  
  📤 Store image metadata in a Google Sheet (step 1)  
  🌐 Download each image using HTTP request  
  🧮 Extract file size, extension, and filename SEO flag  
  📄 Update the audit sheet with size and format insights

  What do I need to get started?

  This workflow requires:

  A Ghost Content API key  
  A Google Sheet (to log audit results)  
  No AI or external APIs required — works fully with built-in nodes

  Next Steps

  🗒️ Follow the sticky notes inside the workflow to:

  Plug in your Ghost blog credentials  
  Select or create a Google Sheet  
  Run the audit and start improving your SEO!

  This template was built using n8n v1.93.0  
  Submitted: June 8, 2025

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.ghost","n8n-nodes-base.code"]

workflow_json:
  {"meta":{"instanceId":"","templateCredsSetupCompleted":true},"nodes":[{"id":"f20cd1d4-671c-420c-a25d-1c9fe05b67d9","name":"When clicking ‘Test workflow’","type":"n8n-nodes-base.manualTrigger","position":[-1000,-1030],"parameters":{},"typeVersion":1},{"id":"edf80cc8-a4b3-42dd-96dc-c729d209aef9","name":"Extract Blog Posts","type":"n8n-nodes-base.ghost","position":[-780,-1030],"parameters":{"limit":1,"options":{},"operation":"getAll"},"credentials":{"ghostContentApi":{"id":"","name":""}},"notesInFlow":true,"typeVersion":1},{"id":"b2f0a448-5b73-499a-a78e-e69b75fc8f9d","name":"Extract Post Content","type":"n8n-nodes-base.set","position":[-560,-1030],"parameters":{"options":{},"assignments":{"assignments":[{"id":"00b337cd-1c61-4f19-8c51-b76f3a8dece1","name":"id","type":"string","value":"={{ $json.id }}"},{"id":"8d38f4bc-bca6-4343-8c5e-5d9fd9cbe178","name":"title","type":"string","value":"={{ $json.title }}"},{"id":"c34ddd76-0db6-4225-82fa-04d5542f9c7c","name":"featured_image","type":"string","value":"={{ $json.feature_image }}"},{"id":"c0f9593c-0d5a-4659-9e25-91b098318bd6","name":"excerpt","type":"string","value":"={{ $json.excerpt }}"},{"id":"0d11d3d5-49f8-473a-8602-b49769f88005","name":"content","type":"string","value":"={{ $json.html }}"},{"id":"ec89a00d-9d76-4594-a8ce-98aa177e6737","name":"link","type":"string","value":"={{ $json.url }}"}]}},"notesInFlow":true,"typeVersion":3.4},{"id":"e80bde5d-28c0-4fa7-a7ff-bff0fcddbf94","name":"Loop Over Items","type":"n8n-nodes-base.splitInBatches","position":[-360,-800],"parameters":{"options":{}},"typeVersion":3},{"id":"1052cc12-c1cd-468f-9cf7-33f73ff43642","name":"Collect All Images","type":"n8n-nodes-base.code","position":[500,-1300],"parameters":{"jsCode":"const results = [];\n\nfor (const item of items) {\n  const articleUrl = item.json.link;\n  const articleTitle = item.json.title;\n  const articleId = item.json.id;\n  const html = item.json.content;\n\n  const imgRegex = /<img[^>]*src=\"([^\"]+)\"[^>]*alt=\"([^\"]*)\"?[^>]*>/g;\n  let match;\n\n  while ((match = imgRegex.exec(html)) !== null) {\n    const imageUrl = match[1];\n    const altText = match[2];\n\n    results.push({\n      json: {\n        articleId: articleId,\n        articleTitle: articleTitle,\n        article_url: articleUrl,\n        image_url: imageUrl,\n        alt_text: altText\n      }\n    });\n  }\n}\n\nreturn results;\n"},"typeVersion":2},{"id":"b2176289-ded3-471c-bc8a-225dacc33aeb","name":"Add Records","type":"n8n-nodes-base.googleSheets","position":[720,-1300],"parameters":{"columns":{"value":{"alt_text":"={{ $json.alt_text }}","articleId":"={{ $json.articleId }}","image_url":"={{ $json.image_url }}","article_url":"={{ $json.article_url }}","articleTitle":"={{ $json.articleTitle }}"},"schema":[{"id":"articleId","type":"string","display":true,"required":false,"displayName":"articleId","defaultMatch":false,"canBeUsedToMatch":true},{"id":"articleTitle","type":"string","display":true,"required":false,"displayName":"articleTitle","defaultMatch":false,"canBeUsedToMatch":true},{"id":"article_url","type":"string","display":true,"required":false,"displayName":"article_url","defaultMatch":false,"canBeUsedToMatch":true},{"id":"image_url","type":"string","display":true,"required":false,"displayName":"image_url","defaultMatch":false,"canBeUsedToMatch":true},{"id":"alt_text","type":"string","display":true,"required":false,"displayName":"alt_text","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":886110184,"cachedResultUrl":"","cachedResultName":""},"documentId":{"__rl":true,"mode":"list","value":"1Nk_2xwvK0ipSjnSbP50AQFc92IlHWaOkSK57-vt_3GY","cachedResultUrl":"","cachedResultName":""}},"credentials":{"googleSheetsOAuth2Api":{"id":"","name":""}},"notesInFlow":true,"typeVersion":4.6},{"id":"cdb245eb-a3e3-45d1-bcce-f1d0ce65297c","name":"Collect Records by Id","type":"n8n-nodes-base.googleSheets","position":[-140,-760],"parameters":{"options":{},"filtersUI":{"values":[{"lookupValue":"={{ $json.id }}","lookupColumn":"articleId"}]},"sheetName":{"__rl":true,"mode":"list","value":886110184,"cachedResultUrl":"","cachedResultName":""},"documentId":{"__rl":true,"mode":"list","value":"1Nk_2xwvK0ipSjnSbP50AQFc92IlHWaOkSK57-vt_3GY","cachedResultUrl":"","cachedResultName":""}},"credentials":{"googleSheetsOAuth2Api":{"id":"ePnaAS4PG1sN2E50","name":"Google Sheets LogiGreenBot"}},"notesInFlow":true,"typeVersion":4.6},{"id":"dbec4c36-c7e3-49ea-976d-cec6dee70f76","name":"Loop Over Items1","type":"n8n-nodes-base.splitInBatches","position":[80,-760],"parameters":{"options":{}},"typeVersion":3},{"id":"0254622b-3593-4ad8-820c-f6e27e31c53c","name":"Get Image","type":"n8n-nodes-base.httpRequest","position":[300,-780],"parameters":{"url":"={{ $json.image_url }}","options":{"response":{"response":{"responseFormat":"file"}}}},"typeVersion":4.2},{"id":"bb2a182b-82ae-4263-b3ab-9a7e30a5b97c","name":"Extract Image Info","type":"n8n-nodes-base.code","position":[520,-780],"parameters":{"mode":"runOnceForEachItem","jsCode":"const base64 = $binary[\"data\"].data;\nconst fileName = $binary[\"data\"].fileName || 'unknown.png';\nconst extension = fileName.split('.').pop().toLowerCase();\nconst fileSizeKB = $binary[\"data\"].fileSize || 'unknown.png';\nconst size_ok = fileSizeKB <= 500 ? true : false;\n\nreturn {\n  json: {\n    file_name: fileName,\n    file_size_kb: fileSizeKB,\n    format: extension,\n    filename_seo: /[a-z0-9-]{3,}/.test(fileName) ? true : false,\n    size_ok: size_ok\n  }\n};\n"},"typeVersion":2},{"id":"871e3d19-87c7-4dd6-a481-d83fc652478b","name":"Results Images","type":"n8n-nodes-base.googleSheets","position":[740,-680],"parameters":{"columns":{"value":{"format":"={{ $json.format }}","size_ok":"={{ $json.size_ok }}","image_url":"={{ $('Get Image').item.json.image_url }}","file_size_kb":"={{ $json.file_size_kb }}","filename_seo":"={{ $json.filename_seo }}"},"schema":[{"id":"articleId","type":"string","display":true,"removed":true,"required":false,"displayName":"articleId","defaultMatch":false,"canBeUsedToMatch":true},{"id":"articleTitle","type":"string","display":true,"removed":true,"required":false,"displayName":"articleTitle","defaultMatch":false,"canBeUsedToMatch":true},{"id":"article_url","type":"string","display":true,"removed":true,"required":false,"displayName":"article_url","defaultMatch":false,"canBeUsedToMatch":true},{"id":"image_url","type":"string","display":true,"removed":false,"required":false,"displayName":"image_url","defaultMatch":false,"canBeUsedToMatch":true},{"id":"alt_text","type":"string","display":true,"removed":true,"required":false,"displayName":"alt_text","defaultMatch":false,"canBeUsedToMatch":true},{"id":"file_size_kb","type":"string","display":true,"required":false,"displayName":"file_size_kb","defaultMatch":false,"canBeUsedToMatch":true},{"id":"format","type":"string","display":true,"required":false,"displayName":"format","defaultMatch":false,"canBeUsedToMatch":true},{"id":"filename_seo","type":"string","display":true,"required":false,"displayName":"filename_seo","defaultMatch":false,"canBeUsedToMatch":true},{"id":"size_ok","type":"string","display":true,"removed":false,"required":false,"displayName":"size_ok","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["image_url"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"appendOrUpdate","sheetName":{"__rl":true,"mode":"list","value":886110184,"cachedResultUrl":"","cachedResultName":""},"documentId":{"__rl":true,"mode":"list","value":"1Nk_2xwvK0ipSjnSbP50AQFc92IlHWaOkSK57-vt_3GY","cachedResultUrl":"","cachedResultName":""}},"credentials":{"googleSheetsOAuth2Api":{"id":"","name":""}},"notesInFlow":true,"typeVersion":4.6},{"id":"ad236989-0707-40ca-885c-c5d5550d7954","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-820,-1380],"parameters":{"color":7,"width":400,"height":520,"content":"### 2. Extract Blog Posts Content\nThe Ghost node extracts all the posts of your blog with content and metadata. In the second node, we extract description, URL, content and features image url.\n\n#### How to setup?\n- **Ghost Account API**:\n   1. Add your Ghost Blog Account Credentials\n   2. Select the number of Blog Posts you want to collect\n  [Learn more about the Ghost Node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.ghost)\n\n"},"typeVersion":1},{"id":"8d296af6-9e32-4669-bacc-decab229847a","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-1040,-1380],"parameters":{"color":7,"width":200,"height":520,"content":"### 1. Workflow Trigger\nThis workflow uses simple trigger.\n\n#### How to setup?\n*Nothing to do.*\n"},"typeVersion":1},{"id":"092719b3-65d7-40b8-af99-36cd3f41ea55","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-400,-1380],"parameters":{"color":7,"width":1360,"height":280,"content":"### 3. First Loop to Collect Images\nWe loop through all the articles extracted by the Ghost Node. For each article, this section will collect all the images of the article with their **image_url** and **alt_text**. The results will be recorded in a **Google Sheet**.\n\n#### How to setup?\n- **Record Long Break in the Google Sheet Node**:\n   1. Add your Google Sheet API credentials to access the Google Sheet file\n   2. Select the file using the list, an URL or an ID\n   3. Select the sheet in which you want to record the images information\n   4. Map the fields: **article_id**, **article_Title**, **article_url**, **image_url**, **alt_text**, **file_size_kb**, **format**, **filename_seo**\n  [Learn more about the Google Sheet Node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets)\n\n\n"},"typeVersion":1},{"id":"71a03b91-fa30-4ede-88f4-f307b5fd7889","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-400,-1080],"parameters":{"color":7,"width":1360,"height":620,"content":"### 4. Second Loop to Extract Image Information\nWe loop through all the images in the article, for each image we **download** the content using the **HTTP request** node to record **image_size** in kilobytes and **image_name** in a Google Sheet. If the image size is higher than **500 kb**, it is flagged as **not ok**.\n#### How to setup?\n- **Record Image File Name and Size**:\n   1. Add your Google Sheet API credentials to access the Google Sheet file\n   2. Select the file using the list, an URL or an ID\n   3. Select the sheet in which you want to record the images information\n  [Learn more about the Google Sheet Node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets)\n\n\n"},"typeVersion":1}],"pinData":{},"connections":{"Get Image":{"main":[[{"node":"Extract Image Info","type":"main","index":0}]]},"Add Records":{"main":[[{"node":"Loop Over Items","type":"main","index":0}]]},"Results Images":{"main":[[{"node":"Loop Over Items1","type":"main","index":0},{"node":"Loop Over Items","type":"main","index":0}]]},"Loop Over Items":{"main":[[],[{"node":"Collect All Images","type":"main","index":0},{"node":"Collect Records by Id","type":"main","index":0}]]},"Loop Over Items1":{"main":[[],[{"node":"Get Image","type":"main","index":0}]]},"Collect All Images":{"main":[[{"node":"Add Records","type":"main","index":0}]]},"Extract Blog Posts":{"main":[[{"node":"Extract Post Content","type":"main","index":0}]]},"Extract Image Info":{"main":[[{"node":"Results Images","type":"main","index":0}]]},"Extract Post Content":{"main":[[{"node":"Loop Over Items","type":"main","index":0}]]},"Collect Records by Id":{"main":[[{"node":"Loop Over Items1","type":"main","index":0}]]},"When clicking ‘Test workflow’":{"main":[[{"node":"Extract Blog Posts","type":"main","index":0}]]}}}


name: Personalized LinkedIn Connection Requests with Apollo, GPT-4, Apify & PhantomBuster
author_name: Nick Saraev
author_username: nicksaraev
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","@n8n/n8n-nodes-langchain.openAi"]
categories: []
created_at: 2025-06-08T19:45:41.004Z
updated_at: 2025-06-08T19:45:41.004Z
url: https://n8n.io/workflows/4803
scraped_at: 2025-06-19 22:49:17
description:
  AI LinkedIn Outreach Automation with Apollo, OpenAI & PhantomBuster
  Categories:*
  Sales Automation
  Lead Generation
  AI Personalization

  This workflow creates a complete LinkedIn outreach automation system that generates targeted lead lists from Apollo using natural language, enriches profiles with AI-personalized icebreakers, and automatically sends connection requests through PhantomBuster. Built by someone who's made over $1 million with AI automation, this system demonstrates the real-world approach to building profitable automation workflows.

  Benefits*
  Natural Language Lead Targeting - Describe your ideal prospects in plain English and automatically generate Apollo search URLs
  AI-Powered Personalization - Creates custom icebreakers based on LinkedIn profile data, employment history, and professional background
  Complete Outreach Pipeline - From lead discovery to personalized connection requests, fully automated end-to-end
  Smart Data Management - Automatically tracks all prospects in Google Sheets with deduplication and status tracking
  Cost-Effective Scraping - Uses Apify to extract Apollo data without expensive subscription costs
  Scalable Architecture - Processes hundreds of leads while respecting LinkedIn's connection limits

  How It Works*
  Natural Language Lead Generation:

  Form input accepts audience descriptions in plain English
  AI converts descriptions into properly formatted Apollo search URLs
  Automatically includes location, company size, job titles, and keyword filters

  Apollo Data Extraction:

  Uses Apify actor to scrape targeted lead lists from Apollo
  Extracts LinkedIn URLs, email addresses, employment history, and profile data
  Processes 500+ leads per run with detailed professional information

  AI Personalization Engine:

  Analyzes LinkedIn profile data including job history and company information
  Generates personalized icebreakers using proven connection request templates
  Creates human-like messages that reference specific career details and achievements

  Google Sheets Integration:

  Automatically stores all lead data in organized spreadsheet format
  Tracks prospect information, contact details, and generated icebreakers
  Provides easy data management and campaign tracking

  PhantomBuster Automation:

  Connects to PhantomBuster API to trigger LinkedIn connection campaigns
  Sends personalized connection requests with custom icebreakers
  Respects LinkedIn's daily limits and mimics human behavior patterns

  Business Use Cases*
  Sales Teams - Automate prospecting for B2B outreach campaigns
  Agencies - Scale client acquisition through targeted LinkedIn outreach
  Recruiters - Find and connect with qualified candidates efficiently
  Entrepreneurs - Build professional networks in specific industries
  Business Development - Generate qualified leads for partnership opportunities
  Revenue Potential
  This system can replace expensive LinkedIn outreach tools that cost $200-500/month. Users typically see:
  400% improvement in response rates through personalization
  10x faster lead generation compared to manual prospecting
  Ability to process 500+ leads per hour vs. 10-20 manually
  Difficulty Level: Intermediate
   Estimated Build Time: 1-2 hours
   Monthly Operating Cost: ~$50 (Apollo + PhantomBuster + AI APIs)

  Watch My Complete 1-Hour Build*
  Want to see exactly how I built this system from scratch? I walk through the entire development process live, including all the debugging, API integrations, and real-world testing that goes into building profitable automation systems.
  🎥 See My Live Build Process: "Build This Automated AI LinkedIn DM System in 1 Hour (N8N)"
  This comprehensive tutorial shows my actual development approach - including the detours, problem-solving, and iterative testing that real automation building involves.

  Required Google Sheets Setup*
  Create a Google Sheet with these exact column headers:

  Essential Lead Columns:
  id - Unique prospect identifier
  first_name - Contact's first name
  last_name - Contact's last name
  name - Full name
  linkedin_url - LinkedIn profile URL
  title - Current job title
  email_status - Email verification status
  photo_url - Profile photo URL
  icebreaker - AI-generated personalized message

  Setup Instructions:
  Create Google Sheet with these headers in row 1
  Connect Google Sheets OAuth in n8n
  Update the document ID in the "Add to Google Sheet" node
  PhantomBuster will read from this sheet for automated outreach

  Set Up Steps*

  Apollo & Apify Configuration:

  Set up Apify account and obtain API credentials
  Configure Apollo scraper actor with proper parameters
  Test lead extraction with sample audience descriptions

  AI Personalization Setup:

  Configure OpenAI API for natural language processing and personalization
  Set up prompt templates for audience targeting and icebreaker generation
  Test personalization quality with sample LinkedIn profiles

  Google Sheets Integration:

  Create lead tracking spreadsheet with proper column structure
  Configure Google Sheets API credentials and permissions
  Set up data mapping for automatic lead storage
  PhantomBuster Connection:

  Set up PhantomBuster account and LinkedIn connection
  Configure LinkedIn auto-connect agent with custom message templates
  Connect API for automated campaign triggering

  Form and Workflow Setup:

  Configure form trigger for audience input collection
  Set up data flow between all components
  Add proper error handling and rate limiting

  Testing and Optimization:

  Start with small batches (5-10 connections daily)
  Monitor LinkedIn account health and response rates
  Optimize icebreaker templates based on performance data

  Important Compliance Notes*
  LinkedIn Limits: Respect 100 connection requests per week limit
  Account Safety: Use PhantomBuster's human-like behavior patterns
  Message Quality: Regularly update templates to avoid automation detection
  Response Management: Monitor and respond to replies within 24 hours

  Advanced Extensions*
  This system can be enhanced with:
  Multi-channel Outreach: Add email sequences for comprehensive campaigns
  A/B Testing: Test different icebreaker templates automatically
  CRM Integration: Connect to Salesforce, HubSpot, or other sales systems
  Response Tracking: Monitor reply rates and optimize messaging
  Explore My Channel*
  For more advanced automation systems that generate real business results, check out my YouTube channel where I share the exact strategies I've used to make over $1 million with AI automation.

workflow_json:
  {"id":"5RFmm8vrn1I8fFGE","meta":{"instanceId":"d7661a849ead114a9aa6d9ceaf4160465aeb79532a35bde62160c840ffba9fc8"},"name":"1. LI Connection Request System: Trigger PhantomBuster Agent","tags":[{"id":"l8MPK4ZirgwFWMno","name":"N8N Course","createdAt":"2025-01-23T18:12:52.273Z","updatedAt":"2025-01-23T18:12:52.273Z"}],"nodes":[{"id":"sticky-note-1","type":"n8n-nodes-base.stickyNote","position":[-20,-280],"parameters":{"width":350,"height":180,"content":"## 🎯 STEP 1: Natural Language Lead Targeting\n\nThis form allows you to describe your ideal prospects in plain English. The AI will automatically convert your description into a properly formatted Apollo search URL.\n\n**Example Input:**\n\"Creative agencies in the US with 1-100 employees, targeting CEOs and founders\"\n\n**Result:** Generates precise Apollo search parameters for lead discovery"},"typeVersion":1},{"id":"sticky-note-2","type":"n8n-nodes-base.stickyNote","position":[200,-320],"parameters":{"width":380,"height":180,"content":"## 🔍 STEP 2: Apollo Lead Extraction\n\nThis section processes your audience and extracts targeted leads:\n\n1. **Generate Search URL**: AI converts plain English to Apollo search parameters\n2. **Run Apify Actor**: Scrapes Apollo for up to 500 leads matching your criteria\n3. **Limit**: Controls batch size for testing (adjust for production)\n\n**Output:** LinkedIn profiles, emails, job titles, and employment history"},"typeVersion":1},{"id":"sticky-note-3","type":"n8n-nodes-base.stickyNote","position":[900,-320],"parameters":{"width":380,"height":180,"content":"## 🧠 STEP 3: AI Personalization Engine\n\nCreates custom icebreakers for each prospect:\n\n**Personalize Outreach**: Analyzes LinkedIn profile data (job history, company, location) and generates human-like connection request messages using proven templates.\n\n**Template:** \"Hey {name}, loved seeing {specific_detail}. I'm also into {relevant_connection}, thought I'd connect.\"\n\n**Key:** Never uses exact LinkedIn data - always paraphrases for authenticity"},"typeVersion":1},{"id":"sticky-note-4","type":"n8n-nodes-base.stickyNote","position":[1400,-320],"parameters":{"width":380,"height":180,"content":"## 📋 STEP 4: Outreach Execution\n\nFinal automation steps:\n\n1. **Add to Google Sheet**: Stores all lead data and icebreakers for tracking\n2. **Aggregate**: Combines individual leads into batch for PhantomBuster\n3. **Trigger PhantomBuster**: Launches LinkedIn connection campaign with personalized messages\n\n**Important:** Start with 5-10 connections daily. LinkedIn limits to ~100/week to avoid restrictions."},"typeVersion":1},{"id":"2419d138-c9f7-494b-b84f-7bd8158aef28","name":"On form submission","type":"n8n-nodes-base.formTrigger","position":[0,0],"webhookId":"ecb5116a-1434-45b5-8f38-31393735a1b8","parameters":{"options":{},"formTitle":"LinkedIn Lead Outreach Trigger","formFields":{"values":[{"fieldType":"textarea","fieldLabel":"Describe your audience in plain English.","placeholder":"Company type, location, etc","requiredField":true}]},"authentication":"basicAuth","formDescription":"Insert an audience for your LinkedIn Outreach Campaign here."},"credentials":{"httpBasicAuth":{"id":"G9fv9EzHaTdmtYXb","name":"Unnamed credential"}},"typeVersion":2.2},{"id":"893e5e59-ddac-480e-9666-cfc4eacf993e","name":"Run Apify Actor & Get Results","type":"n8n-nodes-base.httpRequest","position":[580,0],"parameters":{"url":"https://api.apify.com/v2/acts/jljBwyyQakqrL1wae/run-sync-get-dataset-items","method":"POST","options":{},"jsonBody":"={\n    \"getPersonalEmails\": true,\n    \"getWorkEmails\": true,\n    \"totalRecords\": 500,\n    \"url\": \"{{ $json.message.content.searchUrl }}\"\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Accept","value":"application/json"},{"name":"Authorization","value":"Bearer <your-apify-api-key-here>"}]}},"typeVersion":4.2},{"id":"2050e13d-55be-4669-b805-d2210fb364ba","name":"Generate Search URL","type":"@n8n/n8n-nodes-langchain.openAi","position":[220,0],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4.5-preview","cachedResultName":"GPT-4.5-PREVIEW"},"options":{},"messages":{"values":[{"role":"system","content":"You're a helpful, intelligent sales assistant."},{"content":"Your task is to take as input a natural language description of a prospect audience, and turn that into an Apollo Search URL.\n\nHere's an example of an Apollo Search URL:\n\nhttps://app.apollo.io/#/people?personLocations[]=United%20States&sortAscending=false&sortByField=%5Bnone%5D&personTitles[]=owner&personTitles[]=ceo&personTitles[]=founder&personTitles[]=partner&page=1&qKeywords=creative%20agency&organizationNumEmployeesRanges[]=1%2C200\n\nThis URL describes a search for people that are\n- Located in the United States.\n- Hold the titles: Owner, CEO, Founder, or Partner.\n- Have a keyword association with “creative agency”.\n\nThese are the fields you can change:\n\norganizationLocations[], Keywords, personTitles[], and organizationNumEmployeesRanges[]\n\nDo not add or change any other fields. Use the above template\n\nReturn your response in JSON using this format:\n\n{\"searchUrl\":\"search url goes here\"}"},{"content":"={{ $json['Describe your audience in plain English.'] }}"}]},"jsonOutput":true},"credentials":{"openAiApi":{"id":"kRhXLl2JwVGc05AE","name":"YouTube_Feb 4"}},"typeVersion":1.6},{"id":"97bf46ab-1900-4dc3-be9e-bf4c1a40190a","name":"Limit","type":"n8n-nodes-base.limit","position":[780,0],"parameters":{"maxItems":3},"typeVersion":1},{"id":"1065dcfe-a305-43fe-97e5-7ad2c3bfb163","name":"Trigger PhantomBuster Agent","type":"n8n-nodes-base.httpRequest","position":[1780,0],"parameters":{"url":"https://api.phantombuster.com/api/v2/agents/launch","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"id","value":"4108795702201397"}]},"headerParameters":{"parameters":[{"name":"X-Phantombuster-Key","value":"<your-phantombuster-api-key-here>"}]}},"typeVersion":4.2},{"id":"c407a69a-a9b9-49dd-a5c5-8ca9b530b358","name":"Add to Google Sheet","type":"n8n-nodes-base.googleSheets","position":[1340,0],"parameters":{"columns":{"value":{"id":"={{ $('Limit').item.json.id }}","name":"={{ $('Limit').item.json.name }}","title":"={{ $('Limit').item.json.title }}","last_name":"={{ $('Limit').item.json.last_name }}","photo_url":"={{ $('Limit').item.json.photo_url }}","first_name":"={{ $('Limit').item.json.first_name }}","icebreaker":"={{ $json.message.content.icebreaker }}","email_status":"={{ $('Limit').item.json.email_status }}","linkedin_url":"={{ $('Limit').item.json.linkedin_url }}"},"schema":[{"id":"id","type":"string","display":true,"removed":false,"required":false,"displayName":"id","defaultMatch":true,"canBeUsedToMatch":true},{"id":"first_name","type":"string","display":true,"removed":false,"required":false,"displayName":"first_name","defaultMatch":false,"canBeUsedToMatch":true},{"id":"last_name","type":"string","display":true,"removed":false,"required":false,"displayName":"last_name","defaultMatch":false,"canBeUsedToMatch":true},{"id":"name","type":"string","display":true,"removed":false,"required":false,"displayName":"name","defaultMatch":false,"canBeUsedToMatch":true},{"id":"linkedin_url","type":"string","display":true,"removed":false,"required":false,"displayName":"linkedin_url","defaultMatch":false,"canBeUsedToMatch":true},{"id":"title","type":"string","display":true,"removed":false,"required":false,"displayName":"title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"email_status","type":"string","display":true,"removed":false,"required":false,"displayName":"email_status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"photo_url","type":"string","display":true,"removed":false,"required":false,"displayName":"photo_url","defaultMatch":false,"canBeUsedToMatch":true},{"id":"icebreaker","type":"string","display":true,"removed":false,"required":false,"displayName":"icebreaker","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["id"]},"options":{"useAppend":true},"operation":"appendOrUpdate","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/12VzSF9drN_kWYsGhNjir9hAGCE0k56N7HkfAV8EuI7Q/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"12VzSF9drN_kWYsGhNjir9hAGCE0k56N7HkfAV8EuI7Q","cachedResultUrl":"https://docs.google.com/spreadsheets/d/12VzSF9drN_kWYsGhNjir9hAGCE0k56N7HkfAV8EuI7Q/edit?usp=drivesdk","cachedResultName":"Leads"}},"credentials":{"googleSheetsOAuth2Api":{"id":"EOibXIc4U8wcXyRR","name":"YouTube"}},"typeVersion":4.5},{"id":"04290792-010b-43da-b606-74e15185312d","name":"Personalize Outreach","type":"@n8n/n8n-nodes-langchain.openAi","position":[980,0],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4o","cachedResultName":"GPT-4O"},"options":{},"messages":{"values":[{"role":"system","content":"You are a helpful, intelligent writing assistant."},{"content":"Your task is to take as input a bunch of LinkedIn profile information of a user, and then generate a very short, very punchy icebreaker that I can use as a variable in my connection request.\n\nReturn your results in this format:\n\n{\"icebreaker\":\"Icebreaker goes here\"}\n\nIn order to ensure icebreakers are punchy and high-quality, make them follow this template:\n\nHey {{name}}, loved seeing {{thingAboutThem}}. I'm also into {{plausibleTieIn}}, thought I'd connect.\n\nFor {{thingAboutThem}} and {{plausibleTieIn}}, never use the exact information provided in a LinkedIn field. Instead, always paraphrase. This makes it seem human written, instead of just an automated message. Also, make it super short. Don't say stuff like \"passionate about turning vision into reality\" or anything like that—be extremely laconic and spartan."},{"content":"{\"linkedInFields\":\"Danielle Morgan, Fort Lauderdale, Founder & CEO at DM Creative Agency, previous experience: Regional Sales Director at Out East Eyewear, Account Director at Radancy\"}"},{"role":"assistant","content":"{\n  \"icebreaker\": \"Hey Danielle, loved seeing your creative agency journey. I'm also building brands, thought I'd connect.\"\n}"},{"content":"={\"linkedInFields\":\"{{ $json.first_name }} {{ $json.last_name }}, {{ $json.city }}, {{ $json.title }} at {{ $json.employment_history[0].organization_name }}, previous experience: {{ $json.employment_history[1].title }} at {{ $json.employment_history[1].organization_name }}, {{ $json.employment_history[2].title }} at {{ $json.employment_history[2].organization_name }}\"} "}]},"jsonOutput":true},"credentials":{"openAiApi":{"id":"kRhXLl2JwVGc05AE","name":"YouTube_Feb 4"}},"typeVersion":1.6},{"id":"3e677add-7bee-4fbf-bff1-b7ea9ae51be6","name":"Aggregate","type":"n8n-nodes-base.aggregate","position":[1560,0],"parameters":{"options":{},"aggregate":"aggregateAllItemData"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"801b4eef-45ec-4651-b4cd-b82178d93264","connections":{"Limit":{"main":[[{"node":"Personalize Outreach","type":"main","index":0}]]},"Aggregate":{"main":[[{"node":"Trigger PhantomBuster Agent","type":"main","index":0}]]},"On form submission":{"main":[[{"node":"Generate Search URL","type":"main","index":0}]]},"Add to Google Sheet":{"main":[[{"node":"Aggregate","type":"main","index":0}]]},"Generate Search URL":{"main":[[{"node":"Run Apify Actor & Get Results","type":"main","index":0}]]},"Personalize Outreach":{"main":[[{"node":"Add to Google Sheet","type":"main","index":0}]]},"Run Apify Actor & Get Results":{"main":[[{"node":"Limit","type":"main","index":0}]]}}}


name: AI Premium Proposal Generator with OpenAI, Google Slides & PandaDoc
author_name: Nick Saraev
author_username: nicksaraev
categories: []
created_at: 2025-06-08T21:01:29.966Z
updated_at: 2025-06-08T21:01:29.966Z
url: https://n8n.io/workflows/4804
scraped_at: 2025-06-19 22:48:59
description:
  AI Proposal Generator System

  Categories*
  Sales Automation
  Document Generation
  AI Business Tools

  This workflow creates a complete AI-powered proposal generation system that transforms simple form inputs into professional, personalized proposals in under 30 seconds and can be deployed during live sales calls, allowing you to send polished proposals before the call even ends.

  Benefits*
  Instant Proposal Generation - Convert 30-second form inputs into professional proposals automatically
  High-Value Business Tool - Generates $1,500-$5,000 per client implementation
  Live Sales Integration - Generate and send proposals during active sales calls
  Complete Automation Pipeline - From form submission to email delivery with zero manual work
  Professional Presentation - Produces proposals indistinguishable from manually crafted documents
  Dual Platform Support - Works with both Google Slides (free) and PandaDoc (premium) integration

  How It Works*

  Smart Form Interface:

  Simple N8N form captures essential deal information
  Collects prospect details, problems, solutions, scope, timeline, and budget
  Designed for rapid completion during live sales conversations

  Advanced AI Processing:

  Uses sophisticated GPT-4 prompting with example-based training
  Converts basic form inputs into professionally written proposal sections
  Applies consistent tone, formatting, and business language automatically

  Dynamic Document Generation:

  Creates duplicate proposal templates for each new prospect
  Replaces template variables with AI-generated personalized content
  Maintains professional formatting and visual consistency

  Automated Email Delivery:

  Sends personalized email with proposal link immediately after generation
  Includes professional messaging and clear next steps
  Optionally includes invoice for immediate payment processing

  Premium PandaDoc Integration:

  Advanced version includes built-in payment processing
  Combines proposal, agreement, and invoice in single document
  Enables immediate signature and payment collection

  Business Use Cases*
  Service-Based Businesses - Generate proposals for consulting, agencies, and professional services
  Automation Agencies - Offer proposal generation as a high-value service to clients
  Sales Teams - Accelerate proposal creation and improve close rates
  Freelancers - Professionalize client interactions with instant custom proposals
  Consultants - Streamline business development with automated proposal workflows
  B2B Companies - Scale personalized proposal generation across entire sales organization

  Difficulty Level: Intermediate
  Estimated Build Time: 2-3 hours
  Monthly Operating Cost: $20-150 (depending on Google Slides vs PandaDoc)

  Watch My Complete Live Build*
  Want to see me build this entire $2,485 proposal system from scratch? I walk through every component live - including the AI prompting strategies, form design, Google Slides integration, and the advanced PandaDoc setup that enables payment collection.
  🎥 See My Live Build Process: "I Built A $2,485 AI Proposal Generator In N8N (Copy This)"
  This comprehensive tutorial shows the real development process - including advanced AI prompting, template design, API integrations, and the exact pricing strategy that generates $1,500-$5,000 per client.

  Required Template Setup*
  Google Slides Template: Create a professional proposal template with these variable placeholders (wrapped in double curly braces):
  {{proposalTitle}} - Main proposal heading
  {{descriptionName}} - Project subtitle/description
  {{oneParagraphProblemSummary}} - Problem analysis section
  {{solutionHeadingOne}}, {{solutionHeadingTwo}}, {{solutionHeadingThree}} - Solution titles
  {{shortScopeTitleOne}} through {{shortScopeTitleThree}} - Scope sections
  {{milestoneOneDay}} through {{milestoneFourDay}} - Timeline milestones
  {{cost}} - Project pricing
  Form Field Requirements: The N8N form must include these exact field labels:
  First Name, Last Name, Company Name, Email, Website
  Problem (textarea) - Client's current challenges
  Solution (textarea) - Your proposed approach
  Scope (textarea) - Specific deliverables
  Cost - Project pricing
  How soon? - Timeline expectations
  PandaDoc Setup (Premium): Configure PandaDoc template with token placeholders matching the AI-generated content structure. Template must include pricing tables and signature fields for complete proposal-to-payment automation.

  Set Up Steps*

  Form Design & Integration:

  Create N8N form with optimized fields for proposal generation
  Design form flow for rapid completion during sales calls
  Configure form triggers and data validation

  AI Content Generation Setup:

  Configure OpenAI API for sophisticated proposal writing
  Implement example-based training with input/output pairs
  Set up JSON formatting for structured content generation

  Google Slides Integration (Free Version):

  Create professional proposal templates with variable placeholders
  Set up Google Cloud Console API access and credentials
  Configure template duplication and text replacement workflows

  Email Automation Setup:


  Configure Gmail integration for automated proposal delivery
  Design professional email templates with proposal links
  Set up dynamic content insertion and personalization

  PandaDoc Integration (Premium Version):

  Set up PandaDoc API for advanced document generation
  Configure payment processing and signature collection
  Implement proposal-to-payment automation workflows

  Testing & Quality Control:

  Test complete workflow with various proposal scenarios
  Validate AI output quality and professional presentation
  Optimize form fields and content generation based on results

  Advanced Features*

  Premium system includes:
  Payment Processing Integration: Collect payments immediately after proposal acceptance
  Digital Signature Collection: Streamline agreement execution with electronic signatures
  Custom Branding: Apply company branding and visual identity automatically
  Multi-Template Support: Generate different proposal types based on service offerings
  CRM Integration: Automatically sync proposal data with existing sales systems

  Why This System Works*

  The competitive advantage lies in speed and professionalism:
  30-second generation time vs. hours of manual proposal writing
  Professional presentation that matches or exceeds manual proposals
  Live sales integration - send proposals during active conversations
  Consistent quality - eliminates human error and formatting inconsistencies
  Immediate follow-up - maintain sales momentum with instant delivery

  System Architecture*

  The workflow follows a simple but powerful 6-step process:
  Form Trigger - Captures essential deal information
  AI Processing - Converts inputs to professional content
  Template Duplication - Creates unique document for each prospect
  Content Replacement - Populates template with AI-generated content
  Email Delivery - Sends proposal with professional messaging
  Payment Collection (PandaDoc) - Enables immediate signature and payment

  Check Out My Channel*
  For more high-value automation systems and proven business-building strategies, explore my YouTube channel where I share the exact systems used to build successful automation businesses and scale to $72K+ monthly revenue.

nodes_used:
  ["n8n-nodes-base.httpRequest","n8n-nodes-base.googleDrive","n8n-nodes-base.gmail","n8n-nodes-base.googleSlides","@n8n/n8n-nodes-langchain.openAi"]

workflow_json:
  {"id":"x6UbWXr0iMgy1TEB","meta":{"instanceId":"d7661a849ead114a9aa6d9ceaf4160465aeb79532a35bde62160c840ffba9fc8"},"name":"AI Proposal Generator System","tags":[{"id":"l8MPK4ZirgwFWMno","name":"N8N Course","createdAt":"2025-01-23T18:12:52.273Z","updatedAt":"2025-01-23T18:12:52.273Z"}],"nodes":[{"id":"sticky-note-1","type":"n8n-nodes-base.stickyNote","position":[-60,-200],"parameters":{"width":350,"height":160,"content":"## 🚀 STEP 1: Sales Call Form\n\nCaptures essential deal information in under 30 seconds:\n\n**Form Fields:** Company details, problem description, proposed solution, project scope, timeline, and budget\n\n**Use Case:** Fill out during live sales calls for instant proposal generation\n\n**Result:** Structured data ready for AI processing"},"typeVersion":1},{"id":"sticky-note-2","type":"n8n-nodes-base.stickyNote","position":[120,-280],"parameters":{"width":380,"height":180,"content":"## 🧠 STEP 2: AI Content Generation\n\nTransforms basic form inputs into professional proposal content:\n\n**OpenAI Processing:** Uses sophisticated GPT-4 prompting with example-based training\n**Output:** 20+ proposal sections including titles, problem analysis, solutions, scope, and timelines\n**Quality:** Professional business language with consistent tone and formatting\n\n**Key:** AI converts 30-second inputs into comprehensive proposals"},"typeVersion":1},{"id":"sticky-note-3","type":"n8n-nodes-base.stickyNote","position":[450,-300],"parameters":{"width":400,"height":200,"content":"## 📄 STEP 3: Document Generation\n\n**Google Slides Path (Free):**\n1. **Google Drive:** Copies proposal template\n2. **Replace Text:** Populates template with AI-generated content\n3. **Gmail:** Sends proposal link via email\n\n**PandaDoc Path (Premium):**\n1. **HTTP Request:** Creates PandaDoc with payment integration\n2. **Gmail:** Sends proposal with signature + payment capabilities\n\n**Result:** Professional proposals ready for client review"},"typeVersion":1},{"id":"sticky-note-4","type":"n8n-nodes-base.stickyNote","position":[800,-200],"parameters":{"width":350,"height":160,"content":"## ⚡ WORKFLOW ADVANTAGES\n\n**Speed:** Generate proposals in under 30 seconds during live calls\n**Quality:** AI ensures consistent, professional presentation\n**Dual Options:** Free Google Slides or premium PandaDoc with payments\n**Revenue:** Proven $1,500-$5,000 per implementation\n\n**Business Impact:** Send proposals before competitors even schedule follow-ups"},"typeVersion":1},{"id":"65eec1e0-5e75-4544-b1d2-ee686d419edd","name":"Replace Text","type":"n8n-nodes-base.googleSlides","position":[700,0],"parameters":{"textUi":{"textValues":[{"text":"{{proposalTitle}}","replaceText":"={{ $('OpenAI').item.json.message.content.proposalTitle }}"},{"text":"{{descriptionName}}","replaceText":"={{ $('OpenAI').item.json.message.content.descriptionName }}"},{"text":"{{oneParagraphProblemSummary}}","replaceText":"={{ $('OpenAI').item.json.message.content.oneParagraphProblemSummary }}"},{"text":"{{solutionHeadingOne}}","replaceText":"={{ $('OpenAI').item.json.message.content.solutionHeadingOne }}"},{"text":"{{solutionHeadingTwo}}","replaceText":"={{ $('OpenAI').item.json.message.content.solutionHeadingTwo }}"},{"text":"{{solutionHeadingThree}}","replaceText":"={{ $('OpenAI').item.json.message.content.solutionHeadingThree }}"},{"text":"{{solutionDescriptionOne}}","replaceText":"={{ $('OpenAI').item.json.message.content.solutionDescriptionOne }}"},{"text":"{{solutionDescriptionTwo}}","replaceText":"={{ $('OpenAI').item.json.message.content.solutionDescriptionTwo }}"},{"text":"{{solutionDescriptionThree}}","replaceText":"={{ $('OpenAI').item.json.message.content.solutionDescriptionThree }}"},{"text":"{{shortScopeTitleOne}}","replaceText":"={{ $('OpenAI').item.json.message.content.shortScopeTitleOne }}"},{"text":"{{shortScopeTitleTwo}}","replaceText":"={{ $('OpenAI').item.json.message.content.shortScopeTitleTwo }}"},{"text":"{{shortScopeTitleThree}}","replaceText":"={{ $('OpenAI').item.json.message.content.shortScopeTitleThree }}"},{"text":"{{shortScopeDescriptionOne}}","replaceText":"={{ $('OpenAI').item.json.message.content.shortScopeDescriptionOne }}"},{"text":"{{shortScopeDescriptionTwo}}","replaceText":"={{ $('OpenAI').item.json.message.content.shortScopeDescriptionTwo }}"},{"text":"{{shortScopeDescriptionThree}}","replaceText":"={{ $('OpenAI').item.json.message.content.shortScopeDescriptionThree }}"},{"text":"{{milestoneOneDay}}","replaceText":"={{ $('OpenAI').item.json.message.content.milestoneOneDay }}"},{"text":"{{milestoneTwoDay}}","replaceText":"={{ $('OpenAI').item.json.message.content.milestoneTwoDay }}"},{"text":"{{milestoneThreeDay}}","replaceText":"={{ $('OpenAI').item.json.message.content.milestoneThreeDay }}"},{"text":"{{milestoneFourDay}}","replaceText":"={{ $('OpenAI').item.json.message.content.milestoneFourDay }}"},{"text":"{{milestoneDescriptionOne}}","replaceText":"={{ $('OpenAI').item.json.message.content.milestoneDescriptionOne }}"},{"text":"{{milestoneDescriptionTwo}}","replaceText":"={{ $('OpenAI').item.json.message.content.milestoneDescriptionTwo }}"},{"text":"{{milestoneDescriptionThree}}","replaceText":"={{ $('OpenAI').item.json.message.content.milestoneDescriptionThree }}"},{"text":"{{milestoneDescriptionFour}}","replaceText":"={{ $('OpenAI').item.json.message.content.milestoneDescriptionFour }}"},{"text":"{{cost}}","replaceText":"$1,850"}]},"options":{},"operation":"replaceText","presentationId":"={{ $json.id }}"},"credentials":{"googleSlidesOAuth2Api":{"id":"ie4yCWIQ8AYXFVxa","name":"YouTube"}},"typeVersion":2},{"id":"618c4452-06f4-4f95-8777-a6e6f204bf33","name":"OpenAI","type":"@n8n/n8n-nodes-langchain.openAi","position":[160,0],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4o","cachedResultName":"GPT-4O"},"options":{},"messages":{"values":[{"role":"system","content":"You are a helpful, intelligent writing assistant."},{"content":"Your task is to generate a proposal using input data from a form. This proposal should be highly customized, specific, and high-quality, considering we're going to be sending it immediately after you're done.\n\nContext: we are an automation/no-code agency that develops systems revolving around growth, revenue ops, etc.\n\nThe proposal template we're using has many fields. You must return these fields in one JSON object.\n\nUse this format:\n\n{\n  \"proposalTitle\": \"\",\n  \"descriptionName\": \"\",\n  \"oneParagraphProblemSummary\": \"\",\n  \"solutionHeadingOne\": \"\",\n  \"solutionDescriptionOne\": \"\",\n  \"solutionHeadingTwo\": \"\",\n  \"solutionDescriptionTwo\": \"\",\n  \"solutionHeadingThree\": \"\",\n  \"solutionDescriptionThree\":\"\",\n  \"shortScopeTitleOne\": \"\",\n  \"shortScopeTitleTwo\": \"\",\n  \"shortScopeTitleThree\": \"\",\n  \"shortScopeDescriptionOne\": \"\",\n  \"shortScopeDescriptionTwo\": \"\",\n  \"shortScopeDescriptionThree\": \"\",\n  \"milestoneOneDay\": \"\",\n  \"milestoneTwoDay\": \"\",\n  \"milestoneThreeDay\": \"\",\n  \"milestoneFourDay\": \"\",\n  \"milestoneDescriptionOne\": \"\",\n  \"milestoneDescriptionTwo\": \"\",\n  \"milestoneDescriptionThree\": \"\",\n  \"milestoneDescriptionFour\": \"\"\n}\n\nRules:\n1. Use a spartan, casual tone of voice.\n2. Be to-the-point but professional—assume you're writing to a sophisticated audience.\n3. Ensure that all fields are filled out. Do not miss a field or leave any variables empty.\n4. Keep things short. If a field contains the term \"Description\" it should be no more than fourteen words. For \"descriptionName\" do not use title case."},{"content":"{\n  \"companyName\":\"1SecondCopy\",\n  \"problem\": \"they can't generate leads. everything is referral based rn.\",\n  \"solution\": \"cold email lead gen system, client reactivation system, and best in class sales training for closing\",\n  \"scope\": \"1k/day cold email infra, 30k email leads, 4 weekly zoom sessions for sales training\",\n  \"currentDate\":\"Feb 4 2025\",\n  \"howSoon\": \"two months\",\n  \"depositCost\": \"$1,845\",\n}"},{"role":"assistant","content":"{\n  \"proposalTitle\": \"Lead Gen System for 1SecondCopy\n\",\n  \"descriptionName\": \"A simple, scalable lead generation system built to help grow your content efforts & connect you with the right people.\n\",\n  \"oneParagraphProblemSummary\": \"Right now, 1SecondCopy is struggling with an inability to generate qualified leads. The majority of your new clients are referral-based, which, while always nice to have, is not scalable nor is it reliable. Building an alternative strategy—one that allows you to take leads from cold -> close—is vital to the health and longevity of the company, and it’s what we’re going to help you with.\n\",\n  \"solutionHeadingOne\": \"Cold Outbound Lead Gen\",\n  \"solutionDescriptionOne\": \"We’ll put in place a robust cold-email-based system for you using best practices.\",\n  \"solutionHeadingTwo\": \"Client Reactivation System\",\n  \"solutionDescriptionTwo\": \"We’ll build a simple, but high-ROI reactivation system to let you extract value from pre-existing clients.\",\n  \"solutionHeadingThree\": \"Best-In-Class Sales Training\",\n  \"solutionDescriptionThree\": \"We’ll train your team with world-class setting & closing mechanisms.\",\n  \"shortScopeTitleOne\": Cold email infrastructure that sends ~1K emails/day\",\n  \"shortScopeTitleTwo\": \"30K high-quality scraped email leads (included)\",\n  \"shortScopeTitleThree\": \"Four weekly one-hour sales training sessions over Zoom\",\n  \"shortScopeDescriptionOne\": \"12 domains, 36 mailboxes, DNS optimization, and warmups included.\",\n  \"shortScopeDescriptionTwo\": \"30,000 leads in your target market, delivered by CSV.\",\n  \"shortScopeDescriptionThree\": \"We’ll take your sales team from 0->1.\",\n  \"milestoneOneDay\": \"February 8th, 2025\",\n  \"milestoneTwoDay\": \"February 28th, 2025\",\n  \"milestoneThreeDay\": \"March 10th, 2025\",\n  \"milestoneFourDay\":\"March 17th-April 1st, 2025\",\n  \"milestoneDescriptionOne\": \"Cold email system done & ready for warmup.\",\n  \"milestoneDescriptionTwo\": \"Cold email system fully warmed up & operational.\",\n  \"milestoneDescriptionThree\": \"10,000 outbound emails sent; analysis & training #1.\"\n  \"milestoneDescriptionFour\":\"One sales training per week alongside iteration & handoff.\"\n}"},{"content":"={\n  \"companyName\":\"{{ $json['Company Name'] }}\",\n  \"problem\": \"{{ $json.Problem }}\",\n  \"solution\": \"{{ $json.Solution}}\",\n  \"scope\": \"{{ $json.Scope }}\",\n  \"currentDate\":\"{{ $now.toLocaleString({ dateStyle: 'medium' }) }}\",\n  \"howSoon\": \"{{ $json['How soon?'] }}\",\n  \"depositCost\": \"{{ $json.Cost }}\",\n}"}]},"jsonOutput":true},"credentials":{"openAiApi":{"id":"oLLACDYfGm4C4ouV","name":"YouTube "}},"typeVersion":1.6},{"id":"850e7d84-2001-421f-a8a2-aa9aa64f06b9","name":"Google Drive","type":"n8n-nodes-base.googleDrive","position":[500,0],"parameters":{"name":"={{ $json.message.content.proposalTitle }}","fileId":{"__rl":true,"mode":"id","value":"1fHzjDQtZouAwfv4kn5uvgpTWqwhTAlPrGkdtkbYBkNE"},"options":{"copyRequiresWriterPermission":false},"operation":"copy"},"credentials":{"googleDriveOAuth2Api":{"id":"8R2NiLt8owCA0E2O","name":"Google Drive account"}},"typeVersion":3},{"id":"dda7e0fa-e8cc-40a8-8af5-9f22b70f4752","name":"Gmail","type":"n8n-nodes-base.gmail","position":[900,0],"webhookId":"b989215e-e975-44a7-9dc7-fd51e7310cba","parameters":{"sendTo":"={{ $('On form submission').item.json.Email }}","message":"=Hey Nick,\n\nThanks for the great call earlier. I had a moment after our chat to put together a detailed proposal for you—please take a look at your earliest convenience and let me know your thoughts.\n\nYou'll find it here: https://docs.google.com/presentation/d/{{ $json.presentationId }}/edit\n\nIf you have any questions, just shout. I've also sent over an invoice for the project (just to keep things convenient) and can get started anytime that's sorted.\n\nThanks,\nNick","options":{"appendAttribution":false},"subject":"Re: Proposal for LeftClick","emailType":"text"},"credentials":{"gmailOAuth2":{"id":"YqmvyP5s2u0IHOHB","name":"Gmail account 3"}},"typeVersion":2.1},{"id":"2d9e8695-d112-40a7-810a-94f3b3919382","name":"On form submission","type":"n8n-nodes-base.formTrigger","position":[-20,0],"webhookId":"24fd835d-9132-4faf-b715-755e75aee9be","parameters":{"options":{"appendAttribution":false},"formTitle":"Sales Call Logging Form","formFields":{"values":[{"fieldLabel":"First Name","requiredField":true},{"fieldLabel":"Last Name","requiredField":true},{"fieldLabel":"Company Name","requiredField":true},{"fieldType":"email","fieldLabel":"Email"},{"fieldLabel":"Website","requiredField":true},{"fieldType":"textarea","fieldLabel":"Problem","requiredField":true},{"fieldType":"textarea","fieldLabel":"Solution","requiredField":true},{"fieldType":"textarea","fieldLabel":"Scope","requiredField":true},{"fieldLabel":"Cost","requiredField":true},{"fieldLabel":"How soon?","requiredField":true}]},"formDescription":"This form logs a sales call & automatically generates a proposal."},"typeVersion":2.2},{"id":"bc1bf3dd-7261-4f56-a71b-236fbde109ff","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-60,-100],"parameters":{"width":1220,"height":280,"content":"## Google Slides AI Proposal Generator\n**This flow generates proposals using the free Google Slides solution**."},"typeVersion":1},{"id":"d59a6b99-e112-424c-b6e5-3eeb92a1c784","name":"OpenAI1","type":"@n8n/n8n-nodes-langchain.openAi","position":[160,460],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4o","cachedResultName":"GPT-4O"},"options":{},"messages":{"values":[{"role":"system","content":"You are a helpful, intelligent writing assistant."},{"content":"=Your task is to generate a proposal using input data from a form. This proposal should be highly customized, specific, and high-quality, considering we're going to be sending it immediately after you're done.\n\nContext: we are an automation/no-code agency that develops systems revolving around growth, revenue ops, etc.\n\nThe proposal template we're using has many fields. You must return these fields in one JSON object.\n\nUse this format:\n\n{\n  \"proposalTitle\": \"\",\n  \"descriptionName\": \"\",\n  \"problemTitle\": \"\",\n  \"oneParagraphProblemSummary\": \"\",\n  \"solutionTitle\": \"\",\n  \"solutionText\": \"\",\n  \"scopeOne\": \"\",\n  \"scopeTwo\": \"\",\n  \"scopeThree\": \"\",\n  \"scopeFour\": \"\",\n  \"scopeFive\": \"\",\n  \"timelineOne\": \"\",\n  \"timelineTwo\": \"\",\n  \"timelineThree\": \"\",\n  \"timelineFour\": \"\"\n}\n\nRules:\n1. Use a spartan, casual tone of voice.\n2. Be to-the-point but professional—assume you're writing to a sophisticated audience.\n3. Ensure that all fields are filled out. Do not miss a field or leave any variables empty.\n4. For oneParagraphProblemSummary and solutionText, make sure to number the responses (usually 3, make sure they're inside of the string)."},{"content":"={\n  \"companyName\":\"1SecondCopy\",\n  \"problem\": \"they can't generate leads. everything is referral based rn.\",\n  \"solution\": \"cold email lead gen system, client reactivation system, and best in class sales training for closing\",\n  \"scope\": \"1k/day cold email infra, 30k email leads, 4 weekly zoom sessions for sales training\",\n  \"currentDate\":\"Feb 4 2025\",\n  \"howSoon\": \"two months\",\n  \"depositCost\": \"$1,845\",\n}"},{"role":"assistant","content":"={\n  \"proposalTitle\": \"Lead Gen System for 1SecondCopy\n\",\n  \"descriptionName\": \"A simple, scalable lead generation system built to help grow your content efforts & connect you with the right people.\n\",\n  \"problemTitle\":\"Inability to generate leads\"\n  \"oneParagraphProblemSummary\": \"Right now, 1SecondCopy is struggling with:\\n\\n 1. An inability to generate qualified leads.\\nThe majority of your new clients are referral-based, which, while always nice to have, is not scalable nor is it reliable. Building an alternative strategy—one that allows you to take leads from cold -> close—is vital to the health and longevity of the company, and it’s what we’re going to help you with.\\n\\n 2. No standardized followup mechanism.\\nWithout a way to follow up with leads, you're leaving the majority of the money that one of those leads could produce for you on the table.\n\",\n  \"solutionTitle\": \"Sales & Lead Generation Solutions\",\n  \"solutionText\": \"1. Cold Outbound Lead Gen\\nIn order to generate leads efficiently, we’ll put in place a robust cold-email-based system for you using best practices.\\n\\n2. Client Reactivation System\\nIn order to extract value from pre-existing clients, we’ll build a simple but high-ROI reactivation system.\\n\\n3. Best-In-Class Sales Training\\nIn order to improve conversion rates, we’ll train your team with world-class setting & closing mechanisms.\"\n  \"scopeOne\":\"We'll create a database to store both videos and competitors.\",\n  \"scopeTwo\":\"We'll create a simple form to quickly add competitors to your database.\",\n  \"scopeThree\":\"We'll build a daily flow that automatically generates video outlines based on the scrapes.\",\n  \"scopeFour\":\"We'll record documentation showing you how to manage and update the system.\",\n  \"scopeFive\":\"We'll provide one, two-hour team training session to teach your company how to use the system.\",\n  \"timelineOne\": \"Cold email system done & ready for warmup: February 8th, 2025\",\n  \"timelineTwo\": \"Cold email system fully warmed up & operational: February 28th, 2025\",\n  \"timelineThree\": \"10,000 outbound emails sent; analysis & training #1: March 10th, 2025\",\n  \"timelineFour\":\"One sales training per week alongside iteration & handoff: March 17th-April 1st, 2025\",\n}"},{"content":"={\n  \"companyName\":\"{{ $json['Company Name'] }}\",\n  \"problem\": \"{{ $json.Problem }}\",\n  \"solution\": \"{{ $json.Solution}}\",\n  \"scope\": \"{{ $json.Scope }}\",\n  \"currentDate\":\"{{ $now.toLocaleString({ dateStyle: 'medium' }) }}\",\n  \"howSoon\": \"{{ $json['How soon?'] }}\",\n  \"depositCost\": \"{{ $json.Cost }}\",\n}"}]},"jsonOutput":true},"credentials":{"openAiApi":{"id":"oLLACDYfGm4C4ouV","name":"YouTube "}},"typeVersion":1.6},{"id":"66ec15ea-ba46-4aad-993a-e0b9cefde871","name":"Gmail1","type":"n8n-nodes-base.gmail","position":[740,460],"webhookId":"470caaaa-62ff-4468-973d-4b1082cfe57a","parameters":{"sendTo":"={{ $('On form submission1').item.json.Email }}","message":"=Hey Nick,\n\nThanks for the great call earlier. I had a moment after our chat to put together a detailed proposal for you—please take a look at your earliest convenience and let me know your thoughts.\n\nYou'll find it here: https://docs.google.com/presentation/d/{{ $json.presentationId }}/edit\n\nIf you have any questions, just shout. I've also sent over an invoice for the project (just to keep things convenient) and can get started anytime that's sorted.\n\nThanks,\nNick","options":{"appendAttribution":false},"subject":"Re: Proposal for LeftClick","emailType":"text"},"credentials":{"gmailOAuth2":{"id":"YqmvyP5s2u0IHOHB","name":"Gmail account 3"}},"typeVersion":2.1},{"id":"89833949-672b-4120-94fe-2f5b9b8b21de","name":"On form submission1","type":"n8n-nodes-base.formTrigger","position":[-20,460],"webhookId":"f0e8d4a0-8002-4804-aa90-4566fef26283","parameters":{"options":{"appendAttribution":false},"formTitle":"Sales Call Logging Form","formFields":{"values":[{"fieldLabel":"First Name","requiredField":true},{"fieldLabel":"Last Name","requiredField":true},{"fieldLabel":"Company Name","requiredField":true},{"fieldType":"email","fieldLabel":"Email"},{"fieldLabel":"Website","requiredField":true},{"fieldType":"textarea","fieldLabel":"Problem","requiredField":true},{"fieldType":"textarea","fieldLabel":"Solution","requiredField":true},{"fieldType":"textarea","fieldLabel":"Scope","requiredField":true},{"fieldLabel":"Cost","requiredField":true},{"fieldLabel":"How soon?","requiredField":true}]},"formDescription":"This form logs a sales call & automatically generates a proposal."},"typeVersion":2.2},{"id":"5cf9ca5e-2ffa-492f-899f-4668786dabbd","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-60,360],"parameters":{"width":1220,"height":280,"content":"## PandaDoc AI Proposal Generator\n**This flow generates proposals using the paid PandaDoc solution, and also sends an invoice alongside it**."},"typeVersion":1},{"id":"6b8e90ef-c520-40b6-9ec6-a7d422763d8a","name":"HTTP Request","type":"n8n-nodes-base.httpRequest","position":[520,460],"parameters":{"url":"https://api.pandadoc.com/public/v1/documents/","method":"POST","options":{},"jsonBody":"={\n    \"name\": \"{{ $json.message.content.proposalTitle }}\",\n    \"fields\": {\n        \"Initials\": {\n            \"value\": \"EI\"\n        }\n    },\n    \"tokens\": [\n        {\n            \"name\": \"Client.Email\",\n            \"value\": \"{{ $('On form submission1').item.json.Email }}\"\n        },\n        {\n            \"name\": \"Sender.Email\",\n            \"value\": \"nick@leftclick.ai\"\n        },\n        {\n            \"name\": \"Client.Scope1\",\n            \"value\": \"{{ $json.message.content.scopeOne }}\"\n        },\n        {\n            \"name\": \"Client.Scope2\",\n            \"value\": \"{{ $json.message.content.scopeTwo }}\"\n        },\n        {\n            \"name\": \"Client.Scope3\",\n            \"value\": \"{{ $json.message.content.scopeThree }}\"\n        },\n        {\n            \"name\": \"Client.Scope4\",\n            \"value\": \"{{ $json.message.content.scopeFour }}\"\n        },\n        {\n            \"name\": \"Client.Scope5\",\n            \"value\": \"{{ $json.message.content.scopeFive }}\"\n        },\n        {\n            \"name\": \"Client.Company\",\n            \"value\": \"{{ $('On form submission1').item.json['Company Name'] }}\"\n        },\n        {\n            \"name\": \"Sender.Company\",\n            \"value\": \"WorkflowLoop\"\n        },\n        {\n            \"name\": \"Client.LastName\",\n            \"value\": \"{{ $('On form submission1').item.json['Last Name'] }}\"\n        },\n        {\n            \"name\": \"Sender.LastName\",\n            \"value\": \"Saraev\"\n        },\n        {\n            \"name\": \"Client.FirstName\",\n            \"value\": \"{{ $('On form submission1').item.json['First Name'] }}\"\n        },\n        {\n            \"name\": \"Client.Timeline1\",\n            \"value\": \"{{ $json.message.content.timelineOne }}\"\n        },\n        {\n            \"name\": \"Client.Timeline2\",\n            \"value\": \"{{ $json.message.content.timelineTwo }}\"\n        },\n        {\n            \"name\": \"Client.Timeline3\",\n            \"value\": \"{{ $json.message.content.timelineThree }}\"\n        },\n        {\n            \"name\": \"Client.Timeline4\",\n            \"value\": \"{{ $json.message.content.timelineFour }}\"\n        },\n        {\n            \"name\": \"Sender.FirstName\",\n            \"value\": \"Nick\"\n        },\n        {\n            \"name\": \"Client.ProblemText\",\n            \"value\": \"{{ $json.message.content.oneParagraphProblemSummary }}\"\n        },\n        {\n            \"name\": \"Client.ProblemTitle\",\n            \"value\": \"{{ $json.message.content.problemTitle }}\"\n        },\n        {\n            \"name\": \"Client.SolutionText\",\n            \"value\": {{ JSON.stringify($json.message.content.solutionText) }}\n        },\n        {\n            \"name\": \"Client.ProposalTitle\",\n            \"value\": \"{{ $json.message.content.proposalTitle }}\"\n        },\n        {\n            \"name\": \"Client.SolutionTitle\",\n            \"value\": \"{{ $json.message.content.solutionTitle }}\"\n        }\n    ],\n    \"metadata\": {},\n    \"recipients\": [\n        {\n            \"email\": \"{{ $('On form submission1').item.json.Email }}\",\n            \"role\": \"Client\"\n        },\n        {\n            \"email\": \"nick@leftclick.ai\",\n            \"company\": \"WorkflowLoop\",\n            \"last_name\": \"Saraev\",\n            \"first_name\": \"Nick\",\n            \"role\": \"Sender\"\n        }\n    ],\n    \"template_uuid\": \"yxge9HxfgWhvqKjFXwWEpS\",\n    \"pricing_tables\": [\n        {\n            \"name\": \"Pricing Table 1\",\n            \"options\": {\n                \"currency\": \"USD\"\n            },\n            \"sections\": [\n                {\n                    \"rows\": [\n                        {\n                            \"data\": {\n                                \"qty\": 1,\n                                \"name\": \"{{ $json.message.content.proposalTitle }}\",\n                                \"price\": {{ $('On form submission1').item.json.Cost.replace(\"$\",\"\").replace(\",\",\"\").toNumber() }}\n                            },\n                            \"options\": {\n                                \"optional\": false,\n                                \"qty_editable\": false,\n                                \"optional_selected\": false\n                            }\n                        }\n                    ],\n                    \"title\": \"Pricing Section\",\n                    \"default\": true\n                }\n            ]\n        }\n    ]\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"API-Key {yourApiKeyGoesHere}"},{"name":"accept","value":"application/json"}]}},"typeVersion":4.2}],"active":false,"pinData":{"On form submission1":[{"json":{"Cost":"$3,525","Email":"nickolassaraev@gmail.com","Scope":"form you can fill out with competitors, that adds them to a db. once per day db is scraped and you get however many people are in the Sheet x however many vids they put out","Problem":"they're struggling making YouTube vids. Everything is really time intensive rn, mostly because they don't have scripts.","Website":"https://leftclick.ai","Solution":"AI script writing system, scrapes competitor youtube vids for ideas and rephrases best performing titles, then writes outlines","formMode":"test","How soon?":"two weeks","Last Name":"Saraev","First Name":"Peter","submittedAt":"2025-02-04T16:18:45.810-07:00","Company Name":"LeftCLick"}}]},"settings":{"executionOrder":"v1"},"versionId":"2452f9ed-c796-4e03-89c6-f7c735b77966","connections":{"OpenAI":{"main":[[{"node":"Google Drive","type":"main","index":0}]]},"OpenAI1":{"main":[[{"node":"HTTP Request","type":"main","index":0}]]},"Google Drive":{"main":[[{"node":"Replace Text","type":"main","index":0}]]},"HTTP Request":{"main":[[{"node":"Gmail1","type":"main","index":0}]]},"Replace Text":{"main":[[{"node":"Gmail","type":"main","index":0}]]},"On form submission":{"main":[[]]},"On form submission1":{"main":[[{"node":"OpenAI1","type":"main","index":0}]]}}}


name: Convert Documents to Markdown with MinerU API and GPT-4o-mini
author_name: AdrianWang
author_username: adrian-wang
categories: []
created_at: 2025-06-09T06:31:19.751Z
updated_at: 2025-06-09T06:31:19.751Z
url: https://n8n.io/workflows/4808
scraped_at: 2025-06-19 22:50:03
description:
  How it works
  This workflow automates the conversion of various document formats (such as PDF, Word, and PPT) into Markdown. It connects to the MinerU API service, which leverages OCR, formula, and table recognition to produce high-quality output. Users can initiate the process by simply uploading a document through an n8n chat interface.

  Set up steps

  Ensure you have a local n8n instance running.
  Set up and run the MinerU MCP (MinerU Computing Platform) server locally.
  Import this workflow into your n8n instance.
  Configure your AI model credentials (e.g., for OpenAI, add your API Key and Base URL).
  Click the "Write Files from Disk" node and edit the file path to your desired local save location.
  Click the "MCP Client" node and input your MinerU MCP server address (e.g., http://localhost:8000/sse).
  Click the "Open Chat" button to upload a file, send a message, and test the workflow.

nodes_used:
  ["@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatOpenAi","@n8n/n8n-nodes-langchain.mcpClientTool"]

workflow_json:
  {"id":"DTa0EWl9cqgHmtr0","meta":{"instanceId":"cb6f138be356037cca9c5015c01fbd380ee577d60f6a9a99c5f49d49b784b365"},"name":"Mineu MCP 对话流程展示","tags":[],"nodes":[{"id":"7c2da246-19a8-420f-8cd9-651e00937607","name":"If 还没遍历结束","type":"n8n-nodes-base.if","position":[220,580],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"or","conditions":[{"id":"4893fc89-9a8b-4f8d-8f11-3e937d6f8f3d","operator":{"type":"number","operation":"lt"},"leftValue":"={{ $json.index }}","rightValue":"={{ $('When chat message received').item.binary.values().length}}"}]}},"typeVersion":2.2},{"id":"dae9bcd0-2b1e-4091-bbd4-591af5e26a95","name":"初始化files","type":"n8n-nodes-base.set","position":[0,580],"parameters":{"options":{},"assignments":{"assignments":[{"id":"4ff468f4-ee0a-40c2-af55-43013882284c","name":"files","type":"array","value":"={{ [] }}"},{"id":"7251c904-f32a-486f-9e41-77d76de784ae","name":"index","type":"number","value":0}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"28758f62-e99d-4025-a487-0150ca60e2c7","name":"MCP Client","type":"@n8n/n8n-nodes-langchain.mcpClientTool","position":[600,400],"parameters":{"include":"selected","sseEndpoint":"http://127.0.0.1:8001/sse"},"typeVersion":1},{"id":"2e4a3ba3-a040-4a99-a71f-867c11255a58","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[460,400],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini","cachedResultName":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"FQI5xJxXdkaGofLN","name":"ailab"}},"typeVersion":1.2},{"id":"d2942fd4-d799-47e9-ac24-0eff094c27c2","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[440,180],"parameters":{"text":"=\n---\n以下为用户的对话信息：\n{{ $('When chat message received').item.json.chatInput }}\n\n","options":{"systemMessage":"=你是一个具备文件阅读能力的AI，用户如果请求对于文件进行处理，就请使用系统中已有的文档解析工具进行解析后，按照用户要求进行处理\n---\n下面为用户上传的文件列表：\n{{ $json.files }}"},"promptType":"define"},"typeVersion":1.9},{"id":"895ff140-8a3e-48af-b0bb-d23c8c8d119d","name":"When chat message received","type":"@n8n/n8n-nodes-langchain.chatTrigger","position":[-280,580],"webhookId":"a3b417ce-42b4-43c1-bc53-21bdeed75457","parameters":{"options":{"allowFileUploads":true,"allowedFilesMimeTypes":"*"}},"typeVersion":1.1},{"id":"1e410edb-5434-40ab-8cdd-2a25574fcccc","name":"添加文件路径到","type":"n8n-nodes-base.set","position":[820,660],"parameters":{"options":{},"assignments":{"assignments":[{"id":"232ad617-f398-434f-b138-a76b0adbf55b","name":"files","type":"array","value":"={{ $json.files.append($json.fileName) }}"},{"id":"765fde8c-6212-4a70-9e67-eb1dbb3a152c","name":"index","type":"number","value":"={{ $json.index + 1 }}"}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"ebdf5ef1-45f2-478e-abad-6235b260dee9","name":"文件保存到本地","type":"n8n-nodes-base.readWriteFile","position":[520,580],"parameters":{"options":{},"fileName":"=/Users/adrianwang/Documents/ailab/minerU-mcp/downloads/file_{{$now.toMillis()}}.{{ $('When chat message received').item.binary.values()[$json.index].fileName.split('.').pop()}}","operation":"write","dataPropertyName":"=data{{ $json.index }}"},"notesInFlow":false,"typeVersion":1,"alwaysOutputData":true}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"88a5af39-f11f-4dd1-a374-623a1d4c8f8d","connections":{"MCP Client":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"初始化files":{"main":[[{"node":"If 还没遍历结束","type":"main","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"If 还没遍历结束":{"main":[[{"node":"文件保存到本地","type":"main","index":0}],[{"node":"AI Agent","type":"main","index":0}]]},"文件保存到本地":{"main":[[{"node":"添加文件路径到","type":"main","index":0}]]},"添加文件路径到":{"main":[[{"node":"If 还没遍历结束","type":"main","index":0}]]},"When chat message received":{"main":[[{"node":"初始化files","type":"main","index":0}]]}}}


