# templates

name: AI content creation and auto WordPress publishing with Pexels API image workflow
author_name: Mateusz Kosiorek
author_username: mkosiorek
categories: []
created_at: 2025-06-23T15:48:04.145Z
updated_at: 2025-06-23T15:48:04.145Z
url: https://n8n.io/workflows/5159
scraped_at: 2025-07-06 21:16:30
description:
  AI powered content creation and WordPress publishing workflow

  Summary

  This workflow automates the entire process of blog content creation, from idea generation and article writing using Google Gemini, to sourcing images from Pexels and publishing directly to your WordPress site. It uses Google Sheets as a central hub for managing content ideas and tracking their status, all orchestrated through interactive n8n forms.

  Key features

  AI driven content:** Leverages Google Gemini for generating:
      Full blog articles based on prompts.
      Relevant keywords for image searching.
      New blog topic ideas.
  Automated image sourcing:** Searches Pexels for suitable images based on AI generated keywords and downloads them.
  WordPress integration:**
      Creates new posts with AI generated title and content.
      Uploads sourced images to the WordPress media library.
      Sets the uploaded image as the featured image for the post.
  Google Sheets management:**
      Fetches content ideas (prompts) marked as "not generated".
      Updates the sheet after a post is generated with the post ID, title, and generation date.
      Adds newly AI generated blog topic ideas to the sheet.
  Interactive forms:**
      Main trigger form to choose between generating content or adding new ideas.
      Forms to input topics for idea generation.
      Confirmation forms at the end of processes.
  Structured output parsing:** Ensures AI responses for topic generation are correctly formatted as JSON.

  How it works

  The workflow is initiated via an n8n Form Trigger: Select Action, allowing the user to choose one of two main paths:

  1. Generate content path:
      Fetch idea: The Fetch unprocessed ideas (Google Sheets) node retrieves a row from your sheet where the "Generated" column is "no".
      Set prompt: The Set prompt node prepares the topic from the sheet for the AI.
      Generate article: The Generate article AI (Langchain Agent with Google Gemini) node takes the prompt and writes a full article.
      Generate image keyword: The Generate image keyword AI (Langchain Agent with Google Gemini) node creates a concise search term based on the article topic.
      Search image: The Search Pexels image (HTTP Request) node uses the generated keyword to find a relevant image via the Pexels API.
      Create WordPress post: The Create WordPress post node publishes the AI generated article and initial image metadata to your WordPress site.
      Download and upload image: The Download Pexels image (HTTP Request) node fetches the actual image file, and the Upload image (HTTP Request) node uploads it to your WordPress media library.
      Set featured image: The Set featured image (HTTP Request) node links the uploaded image as the featured image for the newly created post.
      Update sheet: The Update Google Sheet node marks the idea as "yes" in your Google Sheet and adds the WordPress post ID and title.
      Confirmation: A Form: End post generation node displays a completion message.

  2. Add ideas path:
      Input topic: The Form: Enter topic for ideas node prompts the user to enter a general subject.
      Generate topics: The Generate blog topics AI (Langchain Agent with Google Gemini and Structured Output Parser) node generates five SEO friendly blog topic ideas based on the user's input, formatted as JSON.
      Process topics: The Split topics node separates the generated list of topics into individual items.
      Add to sheet: For each topic, the Add ideas to sheet (Google Sheets) node appends it as a new row, marked with "Generated: no".
      Loop or end: The Form: Add more topics? node asks the user if they want to generate more ideas or end the process.
          If "NEXT", it loops back to the Form: Enter topic for ideas.
          If "END", a Form: End idea generation node displays a completion message with the list of added topics.

  Nodes used

  Form Trigger
  If
  Google Sheets
  Set
  Langchain Agent (with Google Gemini Chat Model)
  Structured Output Parser (Langchain)
  HTTP Request (for Pexels API and WordPress Media/Post updates)
  WordPress
  Split Out
  Form (for user interaction and completion messages)
  Sticky Note (for instructions within the workflow)

  Setup instructions

  Credentials:
      Google Sheets: Configure your Google Sheets OAuth2 credentials in the Fetch unprocessed ideas, Update Google Sheet, and Add ideas to sheet nodes.
      WordPress: Configure your WordPress API credentials in the Create WordPress post, Upload image, and Set featured image nodes.
      Google Gemini: Configure your Google Gemini (PaLM) API key in the Gemini model for article, Gemini model for image keyword, and Gemini model for topics nodes.
  API keys and URLs:
      Pexels: In the Search Pexels image node, replace &lt;YOUR_PEXELS_API_KEY&gt; in the Authorization header with your actual Pexels API key.
      WordPress URL: In the Upload image and Set featured image nodes, replace &lt;YOUR_WORDPRESS_URL&gt; in the URL field with your WordPress site's domain (e.g., yourblog.com).
  Google Sheet configuration:
      Ensure your Google Sheet (specified by Document ID in Google Sheets nodes) has a sheet named Sheet1 (or update the Sheet Name parameter).
      The sheet should have at least the following columns: Prompt (for the blog idea/topic), Generated (to track status, e.g., "no" or "yes"), row_number (automatically populated by n8n when reading), Date, Title (for the final WordPress post title), Post ID.
  Activate the workflow. The Form Trigger: Select Action will provide a webhook URL to initiate the process.

  Customization ideas

  Modify the AI prompts in the Langchain Agent nodes for different tones, styles, or content structures.
  Change the Google Gemini models used for different cost/performance balances.
  Integrate other image sources instead of or in addition to Pexels.
  Add steps for social media sharing after a post is published.
  Extend the Google Sheet to track more metrics like word count or target keywords.
  Implement more sophisticated error handling.

  Use cases

  Automating blog content generation for personal or company blogs.
  Streamlining content marketing efforts.
  Quickly populating new websites with initial content.
  Assisting SEO agencies in creating draft content for clients.
  Helping solo bloggers maintain a consistent publishing schedule.

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

workflow_json:
  {"meta":{"instanceId":"ee764605661f484417a5505724882cb4f8c547a6bf9bef1f89eacbbcb7cca6ab"},"nodes":[{"id":"aa01f852-aa12-4001-9bc4-94fd0bbd0e88","name":"Fetch Unprocessed Ideas","type":"n8n-nodes-base.googleSheets","position":[-980,800],"parameters":{"options":{"dataLocationOnSheet":{"values":{"rangeDefinition":"detectAutomatically"}}},"filtersUI":{"values":[{"lookupValue":"no","lookupColumn":"Generated"}]},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1UDaTATWOnYorewjEF5-G9edgSBjc2_Rb50BZVFbAu8U/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"id","value":"1UDaTATWOnYorewjEF5-G9edgSBjc2_Rb50BZVFbAu8U"}},"executeOnce":false,"typeVersion":4.5},{"id":"3ab71903-3b38-4891-a769-2d0304cb4bad","name":"Set Prompt","type":"n8n-nodes-base.set","position":[-780,800],"parameters":{"options":{},"assignments":{"assignments":[{"id":"3e8d2523-66aa-46fe-adcc-39dc78b9161e","name":"prompt","type":"string","value":"={{ $json.Prompt }}"}]}},"typeVersion":3.4},{"id":"23e7d119-2d0f-41df-8e94-67bdd95bf6c0","name":"Create WordPress Post","type":"n8n-nodes-base.wordpress","position":[-760,1180],"parameters":{"title":"={{ $('Fetch Unprocessed Ideas').item.json.Prompt }}","additionalFields":{"status":"publish","content":"={{ $('Generate Article AI').item.json.output }}\n\nImage by: {{ $('Search Pexels Image').item.json.photos[0].photographer }}\n{{ $('Search Pexels Image').item.json.photos[0].photographer_url }}"}},"typeVersion":1},{"id":"a07f4264-c011-4925-a8c6-d5fa11ec809b","name":"Upload Image","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","position":[-380,1180],"parameters":{"url":"https://<YOUR_WORDPRESS_URL>/wp-json/wp/v2/media","method":"POST","options":{},"sendBody":true,"contentType":"binaryData","sendHeaders":true,"authentication":"predefinedCredentialType","headerParameters":{"parameters":[{"name":"Content-Disposition","value":"=attachment; filename=\"cover-{{ $('Create WordPress Post').item.json.id }}.jpg\""}]},"inputDataFieldName":"data","nodeCredentialType":"wordpressApi"},"typeVersion":4.2},{"id":"cbbae382-12b2-47c7-8fd8-13df5236bbdc","name":"Set Featured Image","type":"n8n-nodes-base.httpRequest","position":[-200,1180],"parameters":{"url":"=https://<YOUR_WORDPRESS_URL>/wp-json/wp/v2/posts/{{ $('Create WordPress Post').item.json.id }}","method":"POST","options":{},"sendQuery":true,"authentication":"predefinedCredentialType","queryParameters":{"parameters":[{"name":"featured_media","value":"={{ $json.id }}"}]},"nodeCredentialType":"wordpressApi"},"typeVersion":4.2},{"id":"cc2d86a1-cc0f-46fc-81ee-ec02801b29cf","name":"Update Google Sheet","type":"n8n-nodes-base.googleSheets","position":[-20,1180],"parameters":{"columns":{"value":{"Date":"={{ $now.format('dd/LL/yyyy') }}","Title":"={{ $('Create WordPress Post').item.json.title.raw }}","Post ID":"={{ $('Create WordPress Post').item.json.id }}","Generated":"yes","row_number":"={{ $('Fetch Unprocessed Ideas').item.json.row_number }}"},"schema":[{"id":"Date","type":"string","display":true,"removed":false,"required":false,"displayName":"Date","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Prompt","type":"string","display":true,"removed":false,"required":false,"displayName":"Prompt","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Title","type":"string","display":true,"removed":false,"required":false,"displayName":"Title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Post ID","type":"string","display":true,"removed":false,"required":false,"displayName":"Post ID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Generated","type":"string","display":true,"removed":false,"required":false,"displayName":"Generated","defaultMatch":false,"canBeUsedToMatch":true},{"id":"row_number","type":"string","display":true,"removed":false,"readOnly":true,"required":false,"displayName":"row_number","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["row_number"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"update","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1UDaTATWOnYorewjEF5-G9edgSBjc2_Rb50BZVFbAu8U/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1UDaTATWOnYorewjEF5-G9edgSBjc2_Rb50BZVFbAu8U","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1UDaTATWOnYorewjEF5-G9edgSBjc2_Rb50BZVFbAu8U/edit?usp=drivesdk","cachedResultName":"n8n-wp"}},"typeVersion":4.5},{"id":"74a74b39-d14c-44b7-920b-bfd343225a87","name":"Generate Article AI","type":"@n8n/n8n-nodes-langchain.agent","position":[-600,800],"parameters":{"text":"=You are an SEO expert. Write an article based on this topic: {{ $('Fetch Unprocessed Ideas').item.json.Prompt }}\nInstructions:\n-In the introduction, present the topic that will be discussed in the rest of the text.\n-The introduction should be about 120 words.\n-The conclusion should be about 120 words.\n-In the conclusion, summarize everything said in the article and present the reader with final conclusions.\n-Write a maximum of 4-5 chapters and expand on them.\n-Chapters should maintain a logical sequence and not repeat the same concepts.\n-Chapters should be interconnected, not isolated blocks of text. The text should be fluent and follow a linear logic.\n-Do not start chapters with \"Chapter 1\", \"Chapter 2\", \"Chapter 3\"... just write the chapter title.\n-Use HTML for text formatting, but limit yourself to using bold, italics, paragraphs, lists, and tables.\n-Do not place the result in a ```html code block, only the text itself.\n-Do not use markdown formatting.\n-Delve into the topic you are writing about; do not provide only superficial information.\n-I expect only HTML format in the response.\nDO NOT INCLUDE ```html\nWRITE SO IT DOESN'T LOOK LIKE AI - do not use long dashes, and in titles and subheadings, capitalize only the first word.\n\nIf possible, add data in a table.","options":{},"promptType":"define"},"typeVersion":2},{"id":"0be71cb1-6b52-4227-a70d-c0e01033f8c4","name":"Generate Image Keyword AI","type":"@n8n/n8n-nodes-langchain.agent","position":[-280,800],"parameters":{"text":"=Choose an expression based on which you will find a matching graphic in Pexels API.\nTopic: {{ $('Fetch Unprocessed Ideas').item.json.Prompt }} \nInstructions:\n- Choose one expression that will best match to find a graphic.\n- Use a general category to always match a graphic.\n- Do not use any HTML characters.\n- Return only a string containing the expression.\n- Do not use quotation marks. The only allowed special characters are \":\" and \",\".\n- Make each one unique so there are no 2 identical graphics.","options":{},"promptType":"define"},"typeVersion":2},{"id":"f7da0b58-b5ae-48b3-a69a-739512282179","name":"Gemini Model for Article","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[-620,940],"parameters":{"options":{},"modelName":"models/gemini-1.5-flash-latest"},"typeVersion":1},{"id":"5af891b9-069d-4e48-8b93-e04413d85e7c","name":"Gemini Model for Image Keyword","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[-300,940],"parameters":{"options":{},"modelName":"models/gemini-1.5-flash-latest"},"typeVersion":1},{"id":"3b0f4db2-e2d1-4590-b08b-a37039db7f70","name":"Search Pexels Image","type":"n8n-nodes-base.httpRequest","position":[-960,1180],"parameters":{"url":"=https://api.pexels.com/v1/search?query={{ encodeURIComponent($('Generate Image Keyword AI').item.json.output) }}&per_page=1","options":{},"sendHeaders":true,"headerParameters":{"parameters":[{"name":"Authorization","value":"<YOUR_PEXELS_API_KEY>"}]}},"typeVersion":4.2},{"id":"7fb8b8fe-4e6b-4af8-8d6b-9419096350d2","name":"Download Pexels Image","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","position":[-560,1180],"parameters":{"url":"={{ $('Search Pexels Image').item.json.photos[0].src.large2x }}","options":{"response":{"response":{"responseFormat":"file"}}}},"typeVersion":4.2},{"id":"32b7c739-19e0-4115-8d7e-35a2db6423bb","name":"Form Trigger: Select Action","type":"n8n-nodes-base.formTrigger","position":[-1580,580],"webhookId":"09988680-2d17-4e68-b1e1-81fef6163a0d","parameters":{"options":{"path":"wpcontent","buttonLabel":"Next","appendAttribution":false},"formTitle":"Create Content","formFields":{"values":[{"fieldType":"dropdown","fieldLabel":"Task","fieldOptions":{"values":[{"option":"Generate Content"},{"option":"Add Ideas"}]}}]}},"typeVersion":2.2},{"id":"bc2a6f22-a0f7-4933-b660-a0f4dbd52de4","name":"If Generate Content","type":"n8n-nodes-base.if","position":[-1340,580],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"loose"},"combinator":"and","conditions":[{"id":"41e4b502-f201-47a2-a244-ac705528f843","operator":{"type":"string","operation":"contains"},"leftValue":"={{ $json.Task }}","rightValue":"Generate Content"}]},"looseTypeValidation":true},"typeVersion":2.2},{"id":"18bdad61-7286-4e66-bdc3-f37d404f8dc0","name":"Add Ideas to Sheet","type":"n8n-nodes-base.googleSheets","position":[-40,400],"parameters":{"columns":{"value":{"Title":"=","Prompt":"={{ $json.Topic }}","Generated":"no"},"schema":[{"id":"Date","type":"string","display":true,"required":false,"displayName":"Date","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Prompt","type":"string","display":true,"required":false,"displayName":"Prompt","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Title","type":"string","display":true,"required":false,"displayName":"Title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Post ID","type":"string","display":true,"required":false,"displayName":"Post ID","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Generated","type":"string","display":true,"required":false,"displayName":"Generated","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/1UDaTATWOnYorewjEF5-G9edgSBjc2_Rb50BZVFbAu8U/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1UDaTATWOnYorewjEF5-G9edgSBjc2_Rb50BZVFbAu8U","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1UDaTATWOnYorewjEF5-G9edgSBjc2_Rb50BZVFbAu8U/edit?usp=drivesdk","cachedResultName":"n8n-wp"}},"typeVersion":4.6},{"id":"d7697c4b-e651-414c-a7eb-171ef43110b6","name":"Generate Blog Topics AI","type":"@n8n/n8n-nodes-langchain.agent","position":[-700,400],"parameters":{"text":"=Prepare a blog topic - Make the title great for SEO.\n\nNOTE.\nGenerate 5 topics.\nIn the response, provide JSON code: \n{\n  \"Topic\": \"Sample topic\"\n}\nDo not add markdown, do not add '''json'.\nDo not add numbers to topics.\n\nWrite about {{ $json.Topic }}","options":{},"promptType":"define","hasOutputParser":true},"executeOnce":false,"typeVersion":2},{"id":"b6c75452-0f77-426e-bf0f-c20ecaf620e4","name":"Form: Enter Topic for Ideas","type":"n8n-nodes-base.form","position":[-980,400],"webhookId":"fcee9395-085e-4831-9bbf-32ce2f571027","parameters":{"options":{"buttonLabel":"NEXT"},"formFields":{"values":[{"fieldLabel":"Topic"}]}},"typeVersion":1},{"id":"63701441-2b94-4a59-804c-ff25494749db","name":"Form: Add More Topics?","type":"n8n-nodes-base.form","position":[240,400],"webhookId":"e897fa2c-f8a3-4e4e-ae03-14725ba1d705","parameters":{"options":{"buttonLabel":"NEXT","formDescription":"={{ $items().map(item => \"- \" + item.json.Prompt).join('\\n') }}"},"formFields":{"values":[{"fieldType":"dropdown","fieldLabel":"What next?","fieldOptions":{"values":[{"option":"END"},{"option":"NEXT"}]}}]}},"typeVersion":1},{"id":"562cd4ea-8fc2-43bb-a0f8-b84e63e55807","name":"If Add More Topics","type":"n8n-nodes-base.if","position":[460,400],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"73836e3b-ce8d-4e69-be29-82971a6bd82c","operator":{"type":"string","operation":"contains"},"leftValue":"={{ $json[\"What next?\"] }}","rightValue":"NEXT"}]}},"typeVersion":2.2},{"id":"754f0694-c09b-46b0-9566-293889ecd68a","name":"Gemini Model for Topics","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[-740,560],"parameters":{"options":{},"modelName":"models/gemini-1.5-flash-latest"},"typeVersion":1},{"id":"72976425-ebbf-4d31-97b4-898648c13b20","name":"Parse AI Topic Output","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[-500,560],"parameters":{"jsonSchemaExample":"[\n  {\n    \"Topic\": \"Example topic 1\"\n  },\n  {\n    \"Topic\": \"Example topic 2\"\n  },\n  {\n    \"Topic\": \"Example topic 3\"\n  },\n    {\n    \"Topic\": \"Example topic 4\"\n  },\n  {\n    \"Topic\": \"Example topic 5\"\n  }\n]"},"typeVersion":1.2},{"id":"c9c8c275-31c0-4a5f-a324-c27f3c18031b","name":"Split Topics","type":"n8n-nodes-base.splitOut","position":[-300,400],"parameters":{"options":{},"fieldToSplitOut":"output"},"typeVersion":1},{"id":"424cab92-8a0a-4407-972a-b82186d600f2","name":"Form: End Idea Generation","type":"n8n-nodes-base.form","position":[680,420],"webhookId":"ea907aa5-971f-4a0d-89a1-d834177d09c8","parameters":{"options":{},"operation":"completion","completionTitle":"END","completionMessage":"={{ $items(\"Generate Blog Topics AI\")[0].json.output.map(item => \"- \" + item.Topic).join('\\n') }}"},"typeVersion":1},{"id":"f15c02d2-44a1-450e-95ee-c95445dbcafc","name":"Form: End Post Generation","type":"n8n-nodes-base.form","position":[180,1180],"webhookId":"ea907aa5-971f-4a0d-89a1-d834177d09c8","parameters":{"options":{},"operation":"completion","completionTitle":"END","completionMessage":"={{ $items().map(item => \"- \" + item.json.Title).join('\\n') }}"},"typeVersion":1},{"id":"f25aabe7-ae32-4db9-9e37-3612a7f21a64","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-1040,260],"parameters":{"color":5,"height":400,"content":"## Generate Topics\nWhat topics should be generated?"},"typeVersion":1},{"id":"d5a4794e-1857-421b-b33f-cc3493f55e0e","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-120,260],"parameters":{"color":5,"height":380,"content":"## Add to Sheet\nAdd as topics for which posts have not yet been generated."},"typeVersion":1},{"id":"a8929634-52bc-414b-8301-e98fcae5e940","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[180,260],"parameters":{"color":5,"width":220,"height":380,"content":"## Add More?\nSelect in the form to add another 5 topics."},"typeVersion":1},{"id":"e2c3d8ad-eb78-441c-9576-082f91568131","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[440,260],"parameters":{"color":4,"width":220,"height":380,"content":"## Start Over or End\n"},"typeVersion":1},{"id":"ad74f19e-8811-4d2e-ba1d-b78df9ada687","name":"API Settings Note","type":"n8n-nodes-base.stickyNote","position":[-1580,1140],"parameters":{"width":960,"height":280,"content":"## WordPress & Pexels API Settings\nEdit settings by entering your WordPress data and Pexels API key.\n- `Search Pexels Image` node: Add Pexels API Key in Headers -> Authorization.\n- `Upload Image` & `Set Featured Image` nodes: Update URL with your WordPress site URL."},"typeVersion":1},{"id":"7f04b46b-0918-4afd-98ec-e1433f9ebdb7","name":"Workflow Instructions","type":"n8n-nodes-base.stickyNote","position":[-1640,-200],"parameters":{"width":500,"height":940,"content":"# Workflow Instructions\n\nThis workflow automates content creation, from idea generation to publishing on WordPress.\n\n**Prerequisites:**\n1.  Google Sheets account & a sheet with columns: `Date`, `Prompt`, `Title`, `Post ID`, `Generated`, `row_number`.\n2.  WordPress site with REST API enabled.\n3.  Google Gemini API Key.\n4.  Pexels API Key.\n\n**Setup Steps:**\n1.  **Credentials:** Configure credentials for Google Sheets, WordPress, and Google Gemini in the respective n8n nodes.\n2.  **API Keys & URLs:**\n    *   In `Search Pexels Image` node: Set your Pexels API key in the `Authorization` header.\n    *   In `Upload Image` & `Set Featured Image` nodes: Replace `<YOUR_WORDPRESS_URL>` with your site's URL.\n3.  **Google Sheet:** Ensure `Document ID` and `Sheet Name` (e.g., `Sheet1`) are correct in all Google Sheets nodes.\n4.  **Activate Workflow.**\n\n**How it works:**\nThe workflow starts with `Form Trigger: Select Action`:\n*   **Generate Content:** Fetches ideas marked `no` in `Generated` column, creates an article, finds an image, posts to WordPress, and updates the sheet.\n*   **Add Ideas:** Prompts for a general topic, generates 5 blog ideas, adds them to the sheet, and asks if you want to generate more."},"typeVersion":1}],"pinData":{},"connections":{"Set Prompt":{"main":[[{"node":"Generate Article AI","type":"main","index":0}]]},"Split Topics":{"main":[[{"node":"Add Ideas to Sheet","type":"main","index":0}]]},"Upload Image":{"main":[[{"node":"Set Featured Image","type":"main","index":0}]]},"Add Ideas to Sheet":{"main":[[{"node":"Form: Add More Topics?","type":"main","index":0}]]},"If Add More Topics":{"main":[[{"node":"Form: Enter Topic for Ideas","type":"main","index":0}],[{"node":"Form: End Idea Generation","type":"main","index":0}]]},"Set Featured Image":{"main":[[{"node":"Update Google Sheet","type":"main","index":0}]]},"Generate Article AI":{"main":[[{"node":"Generate Image Keyword AI","type":"main","index":0}]]},"If Generate Content":{"main":[[{"node":"Fetch Unprocessed Ideas","type":"main","index":0}],[{"node":"Form: Enter Topic for Ideas","type":"main","index":0}]]},"Search Pexels Image":{"main":[[{"node":"Create WordPress Post","type":"main","index":0}]]},"Update Google Sheet":{"main":[[{"node":"Form: End Post Generation","type":"main","index":0}]]},"Create WordPress Post":{"main":[[{"node":"Download Pexels Image","type":"main","index":0}]]},"Download Pexels Image":{"main":[[{"node":"Upload Image","type":"main","index":0}]]},"Parse AI Topic Output":{"ai_outputParser":[[{"node":"Generate Blog Topics AI","type":"ai_outputParser","index":0}]]},"Form: Add More Topics?":{"main":[[{"node":"If Add More Topics","type":"main","index":0}]]},"Fetch Unprocessed Ideas":{"main":[[{"node":"Set Prompt","type":"main","index":0}]]},"Gemini Model for Topics":{"ai_languageModel":[[{"node":"Generate Blog Topics AI","type":"ai_languageModel","index":0}]]},"Generate Blog Topics AI":{"main":[[{"node":"Split Topics","type":"main","index":0}]]},"Gemini Model for Article":{"ai_languageModel":[[{"node":"Generate Article AI","type":"ai_languageModel","index":0}]]},"Generate Image Keyword AI":{"main":[[{"node":"Search Pexels Image","type":"main","index":0}]]},"Form Trigger: Select Action":{"main":[[{"node":"If Generate Content","type":"main","index":0}]]},"Form: Enter Topic for Ideas":{"main":[[{"node":"Generate Blog Topics AI","type":"main","index":0}]]},"Gemini Model for Image Keyword":{"ai_languageModel":[[{"node":"Generate Image Keyword AI","type":"ai_languageModel","index":0}]]}}}


name: Build Resilient AI Workflows with Automatic GPT and Gemini Failover Chain
author_name: Lucas Peyrin
author_username: lucaspeyrin
categories: []
created_at: 2025-06-23T16:33:43.301Z
updated_at: 2025-06-23T16:33:43.301Z
url: https://n8n.io/workflows/5160
scraped_at: 2025-07-06 21:16:30
description:
  This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

  How it works

  This workflow demonstrates how to create a resilient AI Agent that automatically falls back to a different language model if the primary one fails. This is useful for handling API errors, rate limits, or model outages without interrupting your process.

  State Initialization: The Agent Variables node initializes a fail_count to 0. This counter tracks how many models have been attempted.
  Dynamic Model Selection: The Fallback Models (a LangChain Code node) acts as a router. It receives a list of all connected AI models and, based on the current fail_count, selects which one to use for this attempt (0 for the first model, 1 for the second, etc.).
  Agent Execution: The AI Agent node attempts to run your prompt using the model selected by the router.
  The Fallback Loop:
      On Success: The workflow completes successfully.
      On Error: If the AI Agent node fails, its "On Error" output is triggered. This path loops back to the Agent Variables node, which increments the fail_count by 1. The process then repeats, causing the Fallback Models router to select the next model in the list.
  Final Failure: If all connected models are tried and fail, the workflow will stop with an error.

  Set up steps

  Setup time: ~3-5 minutes

  Configure Credentials: Ensure you have the necessary credentials (e.g., for OpenAI, Google AI) configured in your n8n instance.
  Define Your Model Chain:
      Add the AI model nodes you want to use to the canvas (e.g., OpenAI, Google Gemini, Anthropic).
      Connect them to the Fallback Models node.
      Important: The order in which you connect the models determines the fallback order. The model nodes first created/connected will be tried first.
  Set Your Prompt: Open the AI Agent node and enter the prompt you want to execute.
  Test: Run the workflow. To test the fallback logic, you can temporarily disable the First Model node or configure it with invalid credentials to force an error.

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

workflow_json:
  {"meta":{"instanceId":"e409ea34548a2afe2dffba31130cd1cf2e98ebe2afaeed2a63caf2a0582d1da0"},"nodes":[{"id":"180a023e-a350-4315-a7f2-968d052f634d","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","onError":"continueErrorOutput","position":[280,-20],"parameters":{"text":"Only output \"test\".","options":{},"promptType":"define"},"typeVersion":2},{"id":"32f3f1ad-8e72-427b-9bcf-0686ae3c4c5c","name":"Agent Variables","type":"n8n-nodes-base.set","position":[-40,-20],"parameters":{"options":{},"assignments":{"assignments":[{"id":"38ce3db6-ce1d-4091-9645-39e674ad1782","name":"models","type":"array","value":"[\"gemini-2.5-flash\"]"},{"id":"151da1bf-a82a-40a9-bca2-a85ab48f1c5b","name":"fail_count","type":"number","value":"={{ $('Agent Variables')?.isExecuted ? $('Agent Variables').last()?.json?.fail_count + 1 : 0 }}"}]}},"typeVersion":3.4},{"id":"2d7804a4-3744-4866-89b2-705bbec66acc","name":"Fallback Models","type":"@n8n/n8n-nodes-langchain.code","position":[280,500],"parameters":{"code":{"supplyData":{"code":"let llms = await this.getInputConnectionData('ai_languageModel', 0);\nllms.reverse(); // reverse array, so the order matches the UI elements\n\nconst llm_index = $input.item.json.fail_count;\n\nif (!Number.isInteger(llm_index)) {\n  console.log(\"'llm_index' is udefined or not a valid integer\");\n  throw new Error(\"'llm_index' is udefined or not a valid integer\");\n}\n\nif(typeof llms[llm_index] === 'undefined') {\n  console.log(`No LLM found with index ${llm_index}`);\n  throw new Error(`No LLM found with index ${llm_index}`);\n}\n\nreturn llms[llm_index];"}},"inputs":{"input":[{"type":"ai_languageModel","required":true}]},"outputs":{"output":[{"type":"ai_languageModel"}]}},"typeVersion":1},{"id":"e3d0d416-2571-4e86-b701-27aee1e5856e","name":"First Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[300,700],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o","cachedResultName":"gpt-4o"},"options":{}},"typeVersion":1.2},{"id":"75ce0d64-dcbd-47bf-a15b-802fa979333a","name":"Falback Model","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[420,700],"parameters":{"options":{},"modelName":"models/gemma-3-27b-it"},"typeVersion":1},{"id":"10efe391-496f-45db-ae13-52324b41b4ff","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[200,200],"parameters":{"color":6,"width":420,"height":640,"content":"### ⚙️ CONFIGURE YOUR FALLBACK CHAIN HERE ⚙️\n\nThis node selects which AI model to use based on the number of previous failures.\n\n**To set up your models:**\n1.  Add your desired AI model nodes to the canvas (OpenAI, Gemini, Anthropic, etc.).\n2.  Connect them to **THIS** node's `ai_languageModel` input.\n\n\n**IMPORTANT:** The **order** you connect them in is the order they will be tried."},"typeVersion":1},{"id":"93797015-159e-4e43-bf72-47f0533e92f1","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[240,-240],"parameters":{"color":7,"width":340,"height":320,"content":"#### 📝 DEFINE YOUR PROMPT HERE\n\nEnter the prompt or task for the AI agent in this node.\n\nIt will dynamically use the models provided one-by-one from the `Fallback Models` node. If it fails, it will automatically retry with the next model in your chain."},"typeVersion":1},{"id":"4cedd679-70d3-41a2-9bf5-addf8e146c9a","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-180,-240],"parameters":{"color":7,"width":400,"height":320,"content":"#### 🔁 Loop Controller\n\nThis node manages the retry loop.\n\nIt initializes and increments a `fail_count` variable each time the `AI Agent` fails, which tells the `Fallback Models` node to try the next model in the list.\n\nNo configuration is needed here."},"typeVersion":1},{"id":"4b5e9318-16fd-4e69-add6-0edbca278d91","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","position":[-320,-20],"parameters":{},"typeVersion":1}],"pinData":{},"connections":{"AI Agent":{"main":[[],[{"node":"Agent Variables","type":"main","index":0}]]},"First Model":{"ai_languageModel":[[{"node":"Fallback Models","type":"ai_languageModel","index":0}]]},"Falback Model":{"ai_languageModel":[[{"node":"Fallback Models","type":"ai_languageModel","index":0}]]},"Manual Trigger":{"main":[[{"node":"Agent Variables","type":"main","index":0}]]},"Agent Variables":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"Fallback Models":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]}}}


name: Enrich LinkedIn Profiles with Ghost Genius and Google Sheets (No Account Needed)
author_name: Matthieu
author_username: yaznow
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest"]
categories: []
created_at: 2025-06-23T17:03:19.850Z
updated_at: 2025-06-23T17:03:19.850Z
url: https://n8n.io/workflows/5161
scraped_at: 2025-07-06 21:16:30
description:
  LinkedIn Profile Enrichment Automation

  Who is this for?
  This template is perfect for sales teams, recruiters, marketing professionals, and business development specialists who need to gather comprehensive LinkedIn profile data at scale. Ideal for lead generation teams building prospect databases, recruiters sourcing candidate information, sales professionals researching prospects, and marketing teams creating targeted outreach campaigns.

  What problem does this workflow solve?
  Manually collecting detailed information from LinkedIn profiles is incredibly time-consuming and prone to inconsistency. Visiting each profile individually to extract names, job titles, experience, education, skills, and contact details can take hours for even small prospect lists. This automation eliminates the tedious manual data entry while ensuring consistent, comprehensive profile enrichment.

  What this workflow does
  This workflow automatically enriches a list of LinkedIn profile URLs by extracting comprehensive professional data including:
  Personal details** (first name, last name, headline, location)
  Professional status** (hiring status, open to work indicators)
  Network metrics** (connections, followers count)
  Work experience** (up to 5 most recent positions with company details, dates, and roles)
  Education background** (up to 3 educational institutions with degrees and dates)
  Skills and languages** (complete skill sets and language proficiencies)
  Professional summary** (profile description and bio)

  The enriched data is automatically organized and updated in your Google Sheets database with structured formatting for easy analysis and outreach.

  Setup
  Create a Ghost Genius API account and obtain your API key for cookieless LinkedIn profile scraping
  Configure HTTP Request credentials with Header Auth using your Ghost Genius API key
  Set up your Google Sheets database using the provided template with columns:
     URL, Firstname, Lastname, Tagline, Location
     Connections, Followers, Hiring?, Open to work?
     Summary, Languages, Skills
     Experience 1-5, Education 1-3
  Configure Google Sheets OAuth2 credentials following n8n's authentication setup guide
  Add LinkedIn profile URLs to the first column of your Google Sheet to begin enrichment
  Test the workflow with a small batch before processing larger lists

  How to customize this workflow
  Adjust batch processing settings** to handle larger volumes by modifying the batch size and interval timing
  Add data validation rules** to filter out incomplete or invalid profiles before processing
  Integrate with CRM systems** like HubSpot or Salesforce to automatically sync enriched data
  Set up automated scheduling** to regularly re-enrich profiles and capture profile updates
  Add email notifications** to alert when enrichment batches are completed or encounter errors
  Customize data mapping** to include additional profile fields or reorganize the output structure
  Add duplicate detection** to prevent re-processing the same profiles multiple times

workflow_json:
  {"id":"aYhTrpk2bbP6PzC7","meta":{"instanceId":"95a1299fb2b16eb2219cb044f54e72c2d00dcd2c72efe717b3c308d200f29927"},"name":"My workflow 11","tags":[],"nodes":[{"id":"8332ef6d-626b-4fa8-888c-e41284154d73","name":"Start","type":"n8n-nodes-base.manualTrigger","position":[-400,440],"parameters":{},"typeVersion":1},{"id":"e24a9fbf-2812-4386-bee9-857df3ba4924","name":"Get Profile Info","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","position":[40,440],"parameters":{"url":"https://api.ghostgenius.fr/v2/profile","options":{"batching":{"batch":{"batchSize":1,"batchInterval":2000}}},"sendQuery":true,"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","queryParameters":{"parameters":[{"name":"url","value":"={{ $json.url }}"}]}},"retryOnFail":true,"typeVersion":4.2},{"id":"c6c53ff4-5c54-48ac-940f-05faf4f335cc","name":"Recover Profiles","type":"n8n-nodes-base.googleSheets","position":[-180,440],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1D3aCtCOHUZd2B2KgPmi5_L4a0XyjNLiOiyLH3Jl8PKI/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1D3aCtCOHUZd2B2KgPmi5_L4a0XyjNLiOiyLH3Jl8PKI","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1D3aCtCOHUZd2B2KgPmi5_L4a0XyjNLiOiyLH3Jl8PKI/edit?usp=drivesdk","cachedResultName":"Copy of List of profiles"}},"typeVersion":4.5},{"id":"ebc0382a-3d69-43bc-a64d-409647649e49","name":"Update","type":"n8n-nodes-base.googleSheets","position":[260,440],"parameters":{"columns":{"value":{"url":"={{ $('Recover Profiles').item.json.url }}","Skills":"={{ ($json.skills?.length > 0) ? $json.skills.join(', ') : '' }}","Hiring?":"={{ $json.is_hiring.toString() }}","Summary":"={{ $json.summary }}","Tagline":"={{ $json.headline }}","Lastname":"={{ $json.last_name }}","Location":"={{ [$json.geo?.location?.name, $json.geo?.country?.name].filter(Boolean).join(', ') }}","Firstname":"={{ $json.first_name }}","Followers":"={{ $json.followers }}","Languages":"={{ $json.languages?.map(lang => lang.name + ' (' + lang.level + ')').join(', ') ?? '' }}","Connections":"={{ $json.connections }}","Education 1":"={{ $json.educations?.[0]?.school?.full_name ?? '' }}\n{{ $json.educations?.[0]?.school?.url ?? '' }}\n{{ [$json.educations?.[0]?.start, $json.educations?.[0]?.end].filter(Boolean).join(' - ') }}\n{{ $json.educations?.[0]?.description ?? '' }}\n{{ [$json.educations?.[0]?.grade, $json.educations?.[0]?.major, $json.educations?.[0]?.degree].filter(Boolean).join(' - ') }}","Education 2":"={{ $json.educations?.[1]?.school?.full_name ?? '' }}\n{{ $json.educations?.[1]?.school?.url ?? '' }}\n{{ [$json.educations?.[1]?.start, $json.educations?.[1]?.end].filter(Boolean).join(' - ') }}\n{{ $json.educations?.[1]?.description ?? '' }}\n{{ [$json.educations?.[1]?.grade, $json.educations?.[1]?.major, $json.educations?.[1]?.degree].filter(Boolean).join(' - ') }}","Education 3":"={{ $json.educations?.[2]?.school?.full_name ?? '' }}\n{{ $json.educations?.[2]?.school?.url ?? '' }}\n{{ [$json.educations?.[2]?.start, $json.educations?.[2]?.end].filter(Boolean).join(' - ') }}\n{{ $json.educations?.[2]?.description ?? '' }}\n{{ [$json.educations?.[2]?.grade, $json.educations?.[2]?.major, $json.educations?.[2]?.degree].filter(Boolean).join(' - ') }}","Experience 1":"={{ $json.experiences?.[0]?.company?.name ?? '' }}\n{{ $json.experiences?.[0]?.company?.url ?? '' }}\n{{ ($json.experiences?.[0]?.start ?? '') + (($json.experiences?.[0]?.start && $json.experiences?.[0]?.end) ? ' - ' : '') + ($json.experiences?.[0]?.end ?? '') }}\n{{ $json.experiences?.[0]?.position ?? '' }}\n{{ $json.experiences?.[0]?.location ?? '' }}","Experience 2":"={{ $json.experiences?.[1]?.company?.name ?? '' }}\n{{ $json.experiences?.[1]?.company?.url ?? '' }}\n{{ ($json.experiences?.[1]?.start ?? '') + (($json.experiences?.[1]?.start && $json.experiences?.[1]?.end) ? ' - ' : '') + ($json.experiences?.[1]?.end ?? '') }}\n{{ $json.experiences?.[1]?.position ?? '' }}\n{{ $json.experiences?.[1]?.location ?? '' }}","Experience 3":"={{ $json.experiences?.[2]?.company?.name ?? '' }}\n{{ $json.experiences?.[2]?.company?.url ?? '' }}\n{{ ($json.experiences?.[2]?.start ?? '') + (($json.experiences?.[2]?.start && $json.experiences?.[2]?.end) ? ' - ' : '') + ($json.experiences?.[2]?.end ?? '') }}\n{{ $json.experiences?.[2]?.position ?? '' }}\n{{ $json.experiences?.[2]?.location ?? '' }}","Experience 4":"={{ $json.experiences?.[3]?.company?.name ?? '' }}\n{{ $json.experiences?.[3]?.company?.url ?? '' }}\n{{ ($json.experiences?.[3]?.start ?? '') + (($json.experiences?.[3]?.start && $json.experiences?.[3]?.end) ? ' - ' : '') + ($json.experiences?.[3]?.end ?? '') }}\n{{ $json.experiences?.[3]?.position ?? '' }}\n{{ $json.experiences?.[3]?.location ?? '' }}","Experience 5":"={{ $json.experiences?.[4]?.company?.name ?? '' }}\n{{ $json.experiences?.[4]?.company?.url ?? '' }}\n{{ ($json.experiences?.[4]?.start ?? '') + (($json.experiences?.[4]?.start && $json.experiences?.[4]?.end) ? ' - ' : '') + ($json.experiences?.[4]?.end ?? '') }}\n{{ $json.experiences?.[4]?.position ?? '' }}\n{{ $json.experiences?.[4]?.location ?? '' }}","Open to work?":"={{ $json.is_open_to_work.toString() }}"},"schema":[{"id":"url","type":"string","display":true,"removed":false,"required":false,"displayName":"url","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Firstname","type":"string","display":true,"removed":false,"required":false,"displayName":"Firstname","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Lastname","type":"string","display":true,"removed":false,"required":false,"displayName":"Lastname","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Tagline","type":"string","display":true,"removed":false,"required":false,"displayName":"Tagline","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Location","type":"string","display":true,"removed":false,"required":false,"displayName":"Location","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Connections","type":"string","display":true,"removed":false,"required":false,"displayName":"Connections","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Followers","type":"string","display":true,"removed":false,"required":false,"displayName":"Followers","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Hiring?","type":"string","display":true,"removed":false,"required":false,"displayName":"Hiring?","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Open to work?","type":"string","display":true,"removed":false,"required":false,"displayName":"Open to work?","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Summary","type":"string","display":true,"removed":false,"required":false,"displayName":"Summary","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Languages","type":"string","display":true,"removed":false,"required":false,"displayName":"Languages","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Skills","type":"string","display":true,"removed":true,"required":false,"displayName":"Skills","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Experience 1","type":"string","display":true,"removed":false,"required":false,"displayName":"Experience 1","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Experience 2","type":"string","display":true,"removed":false,"required":false,"displayName":"Experience 2","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Experience 3","type":"string","display":true,"removed":false,"required":false,"displayName":"Experience 3","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Experience 4","type":"string","display":true,"removed":false,"required":false,"displayName":"Experience 4","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Experience 5","type":"string","display":true,"removed":false,"required":false,"displayName":"Experience 5","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Education 1","type":"string","display":true,"removed":false,"required":false,"displayName":"Education 1","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Education 2","type":"string","display":true,"removed":false,"required":false,"displayName":"Education 2","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Education 3","type":"string","display":true,"removed":false,"required":false,"displayName":"Education 3","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Skills","type":"string","display":true,"removed":true,"required":false,"displayName":"Skills","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":["url"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"update","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1oiV25COrTMP20nMgNvbtMo2LHcm7ehkqOxbAB-s6PhA/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1D3aCtCOHUZd2B2KgPmi5_L4a0XyjNLiOiyLH3Jl8PKI","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1D3aCtCOHUZd2B2KgPmi5_L4a0XyjNLiOiyLH3Jl8PKI/edit?usp=drivesdk","cachedResultName":"Copy of List of profiles"}},"typeVersion":4.5},{"id":"91c969bc-dd32-45a3-a8e7-f69ce94fe365","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-520,280],"parameters":{"color":5,"width":1040,"height":420,"content":"## Enrich a LinkedIn profile list"},"typeVersion":1},{"id":"62815f2f-a917-4f39-987a-2e0ce9046134","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[0,0],"parameters":{"width":420,"height":220,"content":"## Resources\n[Video Setup](https://youtu.be/kIOJeMoCfp4)\n\nGoogle Sheet: [Make a copy here](https://docs.google.com/spreadsheets/d/1oiV25COrTMP20nMgNvbtMo2LHcm7ehkqOxbAB-s6PhA/edit?usp=sharing)\n\nAPI LinkedIn (cookieless): [Ghost Genius](https://ghostgenius.fr)\n\nGoogle Sheet Credential Setup: [Video Tutorial](https://www.youtube.com/watch?v=pWGXlZBGu4k)"},"typeVersion":1},{"id":"f477d4bc-9e67-4b93-a8aa-12bdf2807daa","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-380,80],"parameters":{"color":7,"height":80,"content":"# [Setup Video](https://youtu.be/kIOJeMoCfp4)"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"2474bd40-54d9-4582-a58d-2a085b82ab64","connections":{"Start":{"main":[[{"node":"Recover Profiles","type":"main","index":0}]]},"Get Profile Info":{"main":[[{"node":"Update","type":"main","index":0}]]},"Recover Profiles":{"main":[[{"node":"Get Profile Info","type":"main","index":0}]]}}}


name: AI-Powered LinkedIn Content Engine (n8n + OpenAI + Perplexity + Replicate)
author_name: Mariano Kostelec
author_username: marianokostelec
categories: []
created_at: 2025-06-23T17:12:12.431Z
updated_at: 2025-06-23T17:12:12.431Z
url: https://n8n.io/workflows/5162
scraped_at: 2025-07-06 21:16:30
description:
  A fully automated content engine that researches, writes, scores, and visualizes LinkedIn posts — built with n8n, OpenAI, Perplexity, and Replicate.

  What it does:
  ✅ Researches any topic using real-time data
  ✅ Writes a personalized post in your voice
  ✅ Refines tone and structure
  ✅ Generates abstract, high-quality visual assets
  ✅ Scores the output and saves it to Google Sheets

  How it works:
  Triggered when you change a row status in Google Sheets
  Uses Perplexity to research
  GPT-4o (OpenAI) to create and polish content
  Replicate (FLUX Pro) to generate images
  Scores the post using heuristics
  Appends everything back to your sheet

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.code","@n8n/n8n-nodes-langchain.openAi","n8n-nodes-base.perplexity"]

workflow_json:
  {"meta":{"instanceId":"INSTANCE_ID_HERE","templateCredsSetupCompleted":true},"nodes":[{"id":"121a6e68-f406-41f1-aaeb-dc04c8532c2c","name":"✍️ Content Creator - OpenAI","type":"@n8n/n8n-nodes-langchain.openAi","position":[-1300,160],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"chatgpt-4o-latest","cachedResultName":"CHATGPT-4O-LATEST"},"options":{},"messages":{"values":[{"content":"=You are creating LinkedIn content for [YOUR_NAME], an experienced entrepreneur and AI enthusiast.\n\n**🧠 CONTEXT ABOUT YOU:**\n- [ACHIEVEMENT 1 - e.g., Founded Company X (description, raised $X)]  \n- [ACHIEVEMENT 2 - e.g., Founded Company Y (description, raised $X)]\n- [BACKGROUND - e.g., Countries lived in, education, etc.]\n- [CURRENT PROJECT - e.g., Currently launching Project Z - brief description]\n- [PASSION/FOCUS - e.g., Obsessed with AI automation, \"AIpreneur\" teams]\n- [BELIEF - e.g., Believes small AI-powered teams will outperform large corporations]\n\n**📋 PRIMARY CONTENT FOUNDATION:**\n- Topic: {{ $('Webhook').item.json.body.Topic }}\n- Post Type:  {{ $('Webhook').item.json.body.Post_Type || \"tip\"}}\n- Length:  {{ $('Webhook').item.json.body.Length || \"medium\"}}\n- Include Company:  {{ $('Webhook').item.json.body.Include_Company || \"no\"}}\n- Personal Story: {{ $('Webhook').item.json.body.Personal_Story || \"auto\"}}\n- Your Main Content/Experience: {{ $('Webhook').item.json.body.Additional_Context || \"\"}}\n\n**🎯 CONTENT CREATION PRIORITY:**\n1. **START with your topic and personal experience/context** - this is your main story\n2. **BUILD the core message** around your additional context and expertise  \n3. **ENHANCE with research data** only where it strengthens your points\n4. **Keep your story/experience as the primary narrative**\n\n**📊 SUPPORTING RESEARCH DATA (Use Selectively):**\n{{ $json.choices[0].message.content }}\n\n**🔧 HOW TO USE RESEARCH AS SUPPORT:**\n- **Primary**: Your topic + additional context = 80% of the content\n- **Supporting**: Research data = 20% enhancement/validation\n- **Use research to**: Validate your experience, add credibility, provide context\n- **Don't let research**: Overwhelm your story, replace your insights, become the main focus\n\n**📝 CONTENT CREATION PROCESS:**\n\n**Step 1: Build Core Content**\n- Start with your topic and additional context\n- Create the main narrative from your experience\n- Include specific details, numbers, examples from YOUR context\n\n**Step 2: Enhance with Research**\n- Look for 1-2 research points that support your story\n- Add them naturally to strengthen credibility\n- Use phrases like \"Recent data confirms...\" or \"This aligns with research showing...\"\n\n**Step 3: Maintain Your Voice**\n- Keep your personal experience as the hero of the story\n- Let research play a supporting role, not the lead\n\n**CONTENT FRAMEWORKS BY TYPE:**\n\n**For TIPS:**\n\"Based on [your experience from additional context], here's what works: [your advice]. Recent research backs this up: [1 supporting data point]\"\n\n**For STORIES:**\n\"[Your personal story from additional context]. What I learned: [lesson]. Turns out the data shows [supporting research finding]\"\n\n**For RESULTS:**\n\"I achieved [your specific results from context]. Here's how: [your method]. Industry data shows [supporting statistic]\"\n\n**For CONTRARIAN:**\n\"Everyone says [common belief]. But [your experience] taught me [different approach]. Research confirms: [supporting data]\"\n\n**🚫 AVOID:**\n- Leading with research instead of your story\n- Using more research than personal content\n- Generic advice not tied to your additional context\n- Letting research overshadow your expertise\n\n**✅ ENSURE:**\n- Your topic and additional context drive 80% of the content\n- Research enhances but doesn't replace your story\n- Specific details from YOUR experience are prominent\n- Research feels natural, not forced\n\n**🚨 CRITICAL COMPANY INCLUSION RULES (MUST FOLLOW):**\n\n**If Include_Company = \"no\":**\n- DO NOT mention \"[COMPANY_NAME]\" by name AT ALL\n- DO NOT reference \"we started building [company]\" \n- DO NOT mention \"our startup\" or \"our platform\"\n- GENERALIZE company references: \"When building my latest startup\" → \"When building a startup\"\n- REMOVE specific company details from additional context\n- Focus on general entrepreneurship experience instead\n\n**If Include_Company = \"subtle\":**\n- Brief mention only: \"At my current startup\" or \"Building [COMPANY_NAME] has taught me\"\n- No detailed company descriptions\n\n**If Include_Company = \"yes\":**\n- Natural integration of company context\n\n**PRE-GENERATION CHECK:**\nBefore writing, check: Does Include_Company = \"no\"? If yes, remove ALL company-specific references and make the advice general.\n\nGenerate a LinkedIn post that starts with your experience and uses research to enhance credibility:"}]}},"credentials":{"openAiApi":{"id":"OPENAI_CREDENTIAL_ID_HERE","name":"OpenAI API"}},"typeVersion":1.8},{"id":"9eb1e5ef-f88c-41ca-9784-bf8c37a8a983","name":"🎨 Voice Refiner - OpenAI","type":"@n8n/n8n-nodes-langchain.openAi","position":[-924,160],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"chatgpt-4o-latest","cachedResultName":"CHATGPT-4O-LATEST"},"options":{},"messages":{"values":[{"content":"=Polish this LinkedIn post to sound more like [YOUR_NAME]'s natural voice, while preserving all the key content and target length.\n\n**ORIGINAL POST:** {{$json.message.content}}\n\n**📏 LENGTH REQUIREMENT:** {{ $('Webhook').item.json.body.Length || \"medium\"}}\n- **Short**: Must stay 400-800 characters\n- **Medium**: Must stay 800-1200 characters  \n- **Long**: Must stay 1200-1500+ characters\n\n**🎯 SUBTLE VOICE ADJUSTMENTS ONLY:**\n\n**KEEP EXACTLY AS IS:**\n- All research data, statistics, and factual information\n- Main arguments and key insights\n- Structure and flow of ideas\n- Any specific examples or case studies\n- **TARGET LENGTH CATEGORY** - do not change short to medium, or medium to long\n\n**MAKE THESE MINOR ADJUSTMENTS:**\n- Replace any corporate buzzwords with simpler language\n- Add your signature phrases only where they fit naturally\n- Ensure it sounds conversational, not formal\n- Fix any awkward phrasing to flow better\n- Make sure it ends with an engaging question\n- **Use shorter sentences and bullet points instead of long paragraphs**\n- **Always include 1-2 relevant emojis in the final output**\n\n**[YOUR_NAME]'S NATURAL LANGUAGE PATTERNS:**\n- Uses \"Here's the thing\" only for contrarian points (don't force it)\n- References specific metrics naturally: \"in 30 minutes\", \"3x faster\"\n- Asks direct questions: \"What's your experience?\", \"Am I missing something?\"\n- Prefers \"Honestly\" or \"The truth is\" for candid admissions\n- Uses \"Here's what I learned\" or \"What I discovered\" for insights\n- Says \"Bottom line\" for conclusions\n\n**🚫 DO NOT:**\n- Add personal stories that weren't in the original\n- Change or embellish research data or statistics\n- Add controversy or bold claims that weren't there\n- Restructure the entire post\n- **Change the length category** (short/medium/long)\n- Add promotional content about your company unless it was already there\n- Use overly long sentences or dense paragraphs\n\n**✅ DO:**\n- Remove corporate speak (\"leverage\" → \"use\", \"unlock\" → \"discover\")\n- Make it sound more conversational and authentic\n- Break up long sentences into shorter, punchier ones\n- Use bullet points or line breaks for better readability\n- **Add 1-2 relevant emojis naturally within the content**\n- Ensure smooth flow between sentences\n- **Stay within the target length range**\n\n**FORMATTING PREFERENCES:**\n- Short, punchy sentences over long ones\n- Bullet points for lists or key points\n- Natural line breaks for visual breathing room\n- Emojis used strategically (not excessively)\n\n**LENGTH CONTROL:**\n- If original is too long for target: Trim unnecessary words while keeping key insights\n- If original is too short for target: Add natural elaboration without changing the core message\n- If original is perfect length: Focus only on voice, don't change length significantly\n\n**GOAL:** The post should sound like you wrote it originally, stay within the specified length category, preserve all valuable content, use shorter sentences with better formatting, and include 1-2 relevant emojis.\n\nOutput just the post, no additional title or comment.\n\nPost:"}]}},"credentials":{"openAiApi":{"id":"OPENAI_CREDENTIAL_ID_HERE","name":"OpenAI API"}},"typeVersion":1.8},{"id":"67b34c31-d345-4c03-992e-43d010d32c1f","name":"📊 Content Scorer","type":"n8n-nodes-base.code","position":[-540,160],"parameters":{"jsCode":"// Get the voice-refined content\nconst refinedPost = $input.first().json.message.content;\n\nconsole.log(\"Final post:\", refinedPost);\nconsole.log(\"Character count:\", refinedPost.length);\n\n// Simple scoring function\nfunction scorePost(post) {\n  let score = 0;\n  \n  // Length optimization\n  if (post.length >= 800 && post.length <= 1300) score += 3;\n  else if (post.length >= 500 && post.length <= 1500) score += 2;\n  else score += 1;\n  \n  // Engagement elements\n  if (post.includes('?')) score += 2;\n  if (post.match(/\\d+/g)) score += 2; // Contains numbers\n  if (post.includes('Here\\'s the thing')) score += 2;\n  if (post.includes(':')) score += 1;\n  \n  // Voice authenticity markers\n  if (post.includes('n8n') || post.includes('OpenAI') || post.includes('Mydra')) score += 1;\n  if (post.includes('minutes') || post.includes('hours')) score += 1;\n  \n  // Penalties for AI-speak\n  if (post.includes('game-changer') || post.includes('unlock')) score -= 3;\n  \n  return Math.max(0, score);\n}\n\nconst score = scorePost(refinedPost);\nconst timestamp = new Date().toISOString();\n\n// Simple status logic\nlet status;\nif (score >= 7) status = 'pending_review';\nelse if (score >= 5) status = 'needs_editing';\nelse status = 'needs_major_revision';\n\n// Return only the new scoring data\nreturn {\n  json: {\n    generated_post: refinedPost,\n    ai_score: score,\n    character_count: refinedPost.length,\n    status: status,\n    human_approved: false,\n    generated_at: timestamp\n  }\n};"},"typeVersion":2},{"id":"3ef4644e-7c2e-4642-8bed-2ebbb30c9fb1","name":"🖼️ Image Prompt Generator","type":"@n8n/n8n-nodes-langchain.openAi","position":[-328,160],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"chatgpt-4o-latest","cachedResultName":"CHATGPT-4O-LATEST"},"options":{},"messages":{"values":[{"content":"=You are an expert at creating compelling, abstract image prompts that capture the FEELING and CONCEPT of LinkedIn content, not literal representations.\n\n**LINKEDIN POST CONTENT:**\n{{$json.generated_post}}\n\n**POST SPECIFICATIONS:**\n- Topic: {{ $('Webhook').item.json.body.Topic }}\n- Category: {{ $('Webhook').item.json.body.Category }}\n- Post Type: {{ $('Webhook').item.json.body.Post_Type }}\n\n**CRITICAL RULES:**\n- NO brand names, company names, or readable text\n- NO literal tool representations\n- NO obvious references to specific technologies\n- CREATE abstract visual metaphors instead\n- FOCUS on emotions and concepts, not products\n\n**VISUAL METAPHOR APPROACH:**\n\n**Instead of showing tools → Show the OUTCOME:**\n- Don't show \"AI tools\" → Show \"effortless power\"\n- Don't show \"automation\" → Show \"seamless flow\"\n- Don't show \"small team\" → Show \"concentrated energy\"\n\n**Instead of literal → Show conceptual:**\n- Small team beating big team → David vs Goliath energy\n- AI efficiency → Smooth, flowing machinery\n- Smart tools → Precision instruments\n- Fast execution → Speed and motion\n\n**ABSTRACT VISUAL CONCEPTS:**\n\n**For efficiency/productivity:**\n\"Single powerful engine with clean, flowing energy lines radiating outward, representing concentrated power and efficiency\"\n\n**For small team vs big team:**\n\"Minimalist architectural composition showing one elegant, efficient structure outpacing multiple complex, cluttered buildings\"\n\n**For smart tools/AI:**\n\"Abstract geometric shapes that fit together perfectly, representing precision and intelligent design\"\n\n**For speed/agility:**\n\"Dynamic motion blur showing streamlined form cutting through static, heavy elements\"\n\n**ARTISTIC APPROACHES:**\n\n**Conceptual Photography:**\n- Physical objects as metaphors\n- Architectural elements\n- Light and shadow play\n- Motion and stillness contrast\n\n**Abstract Composition:**\n- Geometric relationships\n- Flow and energy\n- Balance and imbalance\n- Simplicity vs complexity\n\n**Environmental Storytelling:**\n- Clean vs cluttered spaces\n- Efficient vs wasteful setups\n- Modern vs outdated elements\n- Focused vs scattered energy\n\n**EXAMPLE TRANSFORMATIONS:**\n\n**Instead of:** \"Five AI tool icons around a person\"\n**Try:** \"Single beam of focused light cutting through complex, tangled shadows\"\n\n**Instead of:** \"Small team with AI tools\"\n**Try:** \"Minimalist workspace with one powerful, sleek object outshining a cluttered background\"\n\n**Instead of:** \"ChatGPT and n8n interfaces\"\n**Try:** \"Clean, flowing water cutting through rough, jagged rocks - representing efficiency through complexity\"\n\n**QUALITY SPECIFICATIONS:**\n- Professional photography or high-end 3D render\n- Dramatic, cinematic lighting\n- High contrast and visual impact\n- Abstract but emotionally resonant\n- Suitable for stopping social media scroll\n- No text, labels, or brand elements\n\n**PROCESS:**\n1. Identify the EMOTION of the post (empowerment, efficiency, breakthrough, etc.)\n2. Find a VISUAL METAPHOR that represents this emotion\n3. Create an ABSTRACT scene that embodies the metaphor\n4. Add PROFESSIONAL PHOTOGRAPHY specifications\n\nCreate an abstract, metaphorical image prompt that captures the essence and emotion of the post. Return just the prompt, nothing else.\n\nPrompt:"}]}},"credentials":{"openAiApi":{"id":"OPENAI_CREDENTIAL_ID_HERE","name":"OpenAI API"}},"typeVersion":1.8},{"id":"35fd1c63-3643-44d8-995a-af9fb6b5d42e","name":"🎨 Image Generator","type":"n8n-nodes-base.httpRequest","position":[268,160],"parameters":{"url":"https://api.replicate.com/v1/models/black-forest-labs/flux-1.1-pro/predictions","method":"POST","options":{},"jsonBody":"={\n  \"input\": {\n    \"prompt\": \"{{ $json.clean_prompt }}\",\n    \"prompt_upsampling\": true,\n    \"width\": 1024,\n    \"height\": 1024,\n    \"num_outputs\": 1,\n    \"aspect_ratio\": \"1:1\",\n    \"output_format\": \"webp\",\n    \"output_quality\": 100,\n    \"guidance\": 4,\n    \"safety_tolerance\": 2\n  }\n}","sendBody":true,"jsonHeaders":"{\n  \"Content-Type\": \"application/json\",\n  \"Prefer\": \"wait\"\n}","sendHeaders":true,"specifyBody":"json","authentication":"genericCredentialType","specifyHeaders":"json","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"REPLICATE_API_KEY_HERE","name":"Replicate API"}},"typeVersion":4.2},{"id":"f5c82bb7-8c7b-4dda-bd7f-a82012d77295","name":"💾 Save Results","type":"n8n-nodes-base.googleSheets","position":[488,160],"parameters":{"columns":{"value":{"Post":"={{ $('🎨 Voice Refiner - OpenAI').item.json.message.content }}","Image":"={{ $json.output }}","Topic":"={{ $('Webhook').item.json.body.Topic }}","Status":"={{ $('📊 Content Scorer').item.json.status }}","AI_Score":"={{ $('📊 Content Scorer').item.json.ai_score }}"},"schema":[{"id":"Topic","type":"string","display":true,"removed":false,"required":false,"displayName":"Topic","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Post_type","type":"string","display":true,"removed":true,"required":false,"displayName":"Post_type","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Length","type":"string","display":true,"removed":true,"required":false,"displayName":"Length","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Include_Mydra","type":"string","display":true,"removed":true,"required":false,"displayName":"Include_Mydra","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Personal_Story","type":"string","display":true,"removed":true,"required":false,"displayName":"Personal_Story","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Additional context","type":"string","display":true,"removed":true,"required":false,"displayName":"Additional context","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Category","type":"string","display":true,"removed":true,"required":false,"displayName":"Category","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Post","type":"string","display":true,"required":false,"displayName":"Post","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Image","type":"string","display":true,"removed":false,"required":false,"displayName":"Image","defaultMatch":false,"canBeUsedToMatch":true},{"id":"AI_Score","type":"string","display":true,"removed":false,"required":false,"displayName":"AI_Score","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Status","type":"string","display":true,"required":false,"displayName":"Status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Scheduled_for","type":"string","display":true,"removed":true,"required":false,"displayName":"Scheduled_for","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Posted_at","type":"string","display":true,"removed":true,"required":false,"displayName":"Posted_at","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["Topic"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"appendOrUpdate","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/GOOGLE_SHEETS_ID_HERE/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"id","value":"GOOGLE_SHEETS_ID_HERE"}},"credentials":{"googleSheetsOAuth2Api":{"id":"GOOGLE_SHEETS_OAUTH_ID_HERE","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"afec1b86-eda6-42fd-b800-bd92663b5eb5","name":"🔍 Research & Trends","type":"n8n-nodes-base.perplexity","position":[-1520,160],"parameters":{"model":"sonar","options":{},"messages":{"message":[{"content":"=Research the topic:  {{ $json.body.Topic }}\n\nAdditional context: {{ $json.body.Additional_Context }}\n\nI need FACTUAL, VERIFIABLE information only. Please:\\n\\n1. Find recent news or developments (with specific dates and sources)\\n2. Look for actual statistics or data (cite the original studies/reports)\\n3. Identify real discussions happening on platforms like Reddit, HN, Twitter\\n4. Find genuine expert opinions from credible sources\\n\\nIMPORTANT RULES:\\n- Only include information you can verify with direct links\\n- If you can't find recent information, say 'No recent verifiable information found'\\n- Don't speculate or create plausible-sounding but unverified claims\\n- Provide direct URLs when possible\\n- If statistics seem outdated or unclear, mention the limitation\\n\\nFormat your response as:\\n**VERIFIED INSIGHTS:**\\n[List only factual findings with sources]\\n\\n**CONTENT ANGLES:**\\n[Suggest how this real information could be used for LinkedIn content]\\n\\n**LIMITATIONS:**\\n[Note what information wasn't available or needs verification]\n"}]},"requestOptions":{}},"credentials":{"perplexityApi":{"id":"PERPLEXITY_API_KEY_HERE","name":"Perplexity account"}},"typeVersion":1},{"id":"de8492e6-9fa5-4da6-90db-95a2c979ed2b","name":"Code","type":"n8n-nodes-base.code","position":[48,160],"parameters":{"jsCode":"const imagePrompt = $input.first().json.message.content\n\n// Clean and escape the prompt for JSON\nconst cleanPrompt = imagePrompt\n  .replace(/\"/g, '\\\\\"')  // Escape quotes\n  .replace(/\\n/g, ' ')   // Remove line breaks\n  .replace(/\\r/g, ' ')   // Remove carriage returns\n  .trim();               // Remove extra whitespace\n\nreturn {\n  json: {\n    clean_prompt: cleanPrompt\n  }\n};\n"},"typeVersion":2},{"id":"1ff1849b-2ef7-488f-9ba5-610f8733cab8","name":"Webhook","type":"n8n-nodes-base.webhook","position":[-1740,160],"webhookId":"WEBHOOK_ID_HERE","parameters":{"path":"WEBHOOK_ID_HERE","options":{},"httpMethod":"POST"},"typeVersion":2}],"pinData":{},"connections":{"Code":{"main":[[{"node":"🎨 Image Generator","type":"main","index":0}]]},"Webhook":{"main":[[{"node":"🔍 Research & Trends","type":"main","index":0}]]},"📊 Content Scorer":{"main":[[{"node":"🖼️ Image Prompt Generator","type":"main","index":0}]]},"🎨 Image Generator":{"main":[[{"node":"💾 Save Results","type":"main","index":0}]]},"🔍 Research & Trends":{"main":[[{"node":"✍️ Content Creator - OpenAI","type":"main","index":0}]]},"🎨 Voice Refiner - OpenAI":{"main":[[{"node":"📊 Content Scorer","type":"main","index":0}]]},"🖼️ Image Prompt Generator":{"main":[[{"node":"Code","type":"main","index":0}]]},"✍️ Content Creator - OpenAI":{"main":[[{"node":"🎨 Voice Refiner - OpenAI","type":"main","index":0}]]}}}


name: AI-Powered Stock Analysis Assistant with Telegram, Claude & GPT-4O Vision
author_name: Femi Ad
author_username: hgray
categories: []
created_at: 2025-06-23T17:45:06.815Z
updated_at: 2025-06-23T17:45:06.815Z
url: https://n8n.io/workflows/5163
scraped_at: 2025-07-06 21:16:30
description:
  "Ade Technical Analyst" is a dual-workflow AI system combining conversational intelligence with visual chart analysis through Telegram. The system features 11 primary nodes for conversation management and 8 secondary nodes for chart generation and analysis.

  Core Components:

  Telegram Integration: Message handling with dynamic typing indicators

  AI Personality: "Ade" - a financial analyst with 50+ years NYSE/LSE experience using Claude 3.5 Sonnet

  Chart Generation: TradingView integration via Chart-IMG API with MACD and volume indicators

  Visual Analysis: GPT-4O vision for technical pattern recognition

  Memory System: Session-based conversation context retention

  Target Users
  Individual traders seeking professional-grade analysis without subscription costs

  Financial advisors wanting 24/7 AI-powered client support

  Investment educators needing interactive learning tools

  Fintech companies requiring white-label analysis solutions

  Setup Requirements
  Critical Security Fix Needed:

  Remove hardcoded API key from Chart-IMG node immediately

  Store all credentials securely in n8n credential manager

  Required APIs:

  OpenRouter (Claude 3.5 Sonnet)

  OpenAI (GPT-4O vision)

  Chart-IMG API

  Telegram Bot Token

  Technical Prerequisites:

  n8n version 1.7+ with Langchain nodes

  Webhook configuration for Telegram

  Dual-workflow setup with proper ID referencing

  Workflow Requirements
  Security Compliance:

  Never hardcode API keys in workflow JSON files

  Use n8n credential manager for all sensitive data

  Implement proper session isolation for user data

  Include mandatory financial disclaimers

  Performance Specifications:

  Model temperature: 0.8 for balanced responses

  Token limit: 500 for optimized performance

  Dark theme charts with professional indicators

  Session-based memory management

  Need help customizing?
  Contact me for consulting and support  or add me on LinkedIn

nodes_used:
  ["n8n-nodes-base.httpRequest","n8n-nodes-base.telegram","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.memoryBufferWindow","@n8n/n8n-nodes-langchain.toolWorkflow","@n8n/n8n-nodes-langchain.openAi","@n8n/n8n-nodes-langchain.lmChatOpenRouter"]

workflow_json:
  {"id":"Tq4g5UK8c3GZ8tm7","meta":{"instanceId":"6e378c7bde897e4dc4f6ed00b29c008a230b2ab5c1cb99a176a5060ea67189f0"},"name":"Ade_Technical_Analyst","tags":[],"nodes":[{"id":"7dbd30db-d992-460a-b6b5-fc75d3f08926","name":"Get Chart","type":"@n8n/n8n-nodes-langchain.toolWorkflow","position":[280,400],"parameters":{"name":"getChart","workflowId":{"__rl":true,"mode":"list","value":"gKbTaYYXbDqlQySQ","cachedResultName":"hgray_analyst_helper"},"description":"Call this tool to get an analysis of a requested stock. The URL that is output from this tool must be returned in markdown format. For example, ![](url)","workflowInputs":{"value":{},"schema":[],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false}},"typeVersion":2},{"id":"acd97cba-2903-4165-a852-fc1573f5656b","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[180,120],"parameters":{"text":"={{ $json.message.text }}","options":{"systemMessage":"=Role\nYou are Ade, an expert financial analyst with over 50 years of unparalleled experience gained from working at the New York Stock Exchange (NYSE) and the London Stock Exchange (LSE). Your expertise spans decades of market cycles, economic shifts, trading innovations, and institutional knowledge that few possess. You have witnessed and analyzed countless bull markets, bear markets, crashes, and recoveries, giving you an extraordinary depth of market wisdom.\n\nYour primary role is to analyze stock data and provide comprehensive, data-driven technical analysis leveraging your extensive experience to deliver actionable insights and a definitive verdict on whether to buy, sell, or hold. While this is not financial advice, your recommendations should reflect your utmost analytical prowess and seasoned judgment earned through five decades of market expertise.\n\nProfessional Engagement Protocol\nMANDATORY Initial Interaction Requirements:\n\nPersonal Introduction & Name Request: Begin only the first conversation by introducing yourself as Ade and asking for the user's name\n\nPersonalized Service: Once you have their name, address them personally throughout the entire conversation\n\nProfessional Courtesy: Maintain a respectful, personalized approach that reflects your senior expertise\n\nRequired Opening Script:\n\"Good day! My name is Ade, I am a senior financial analyst with over 50 years of experience Trading stocks. To provide you with the most personalized and professional service, may I please have your name? I believe in building a strong professional relationship with each client I assist.\"\n\nTools Available\nAdes_helper: Used for generating detailed stock graphs and technical analysis based on provided tickers\n\nComprehensive Technical Analysis Framework\nWhen analyzing a stock chart, ALWAYS include the following detailed analysis:\n\n1. Candlestick Analysis Summary:\nIdentify and explain any significant candlestick patterns (e.g., bullish engulfing, doji, hammer)\n\nComment on the overall trend (bullish, bearish, or sideways)\n\nHighlight any breakout or pullback zones\n\nSummarize key candlestick patterns and their implications for future price movement. Be creative and slightly witty about your response.\n\n2. MACD Analysis Summary:\nDescribe the current state of the MACD line and Signal line (e.g., bullish crossover, bearish crossover)\n\nDiscuss the MACD histogram and its implications for momentum\n\nIdentify any divergences between the MACD and the price action\n\nSummarize MACD line and signal line status, histogram momentum, and any divergences with price action. Be creative and slightly witty about your response.\n\n3. Volume Analysis Summary:\nHighlight any significant changes in trading volume\n\nExplain how volume supports or contradicts price movements\n\nIndicate any unusual spikes in volume that may suggest institutional activity\n\nSummarize significant volume changes, volume supporting or contradicting price movements, and unusual spikes indicating institutional activity. Be creative and slightly witty about your response.\n\n4. Support and Resistance Levels Summary:\nIdentify key support and resistance zones based on the chart\n\nDiscuss the importance of these levels for potential reversals or breakouts. Be creative and slightly witty about your response.\n\nAssess the strength and reliability of these levels\n\nSummarize key support and resistance levels, their importance for reversals or breakouts, and strength assessment. Always assume that the user does not understand technical terms, so be sure to break down in simple words. \n\nEnhanced Instructions\nAdvanced Ades_helper Tool Utilization:\n\nWhen to Use: Automatically use the Ades_helper tool whenever a stock ticker is provided or when technical analysis is requested\n\nHow to Use: Pass only the stock ticker symbol to the Ades_helper tool (e.g., \"AAPL\", \"TSLA\", \"MSFT\")\n\nChart Interpretation: Apply your 50+ years of expertise to interpret the generated charts with unparalleled insight\n\nConversational Analysis: Display analysis and insights derived from the chart in conversational, accessible language\n\nComprehensive Data Analysis:\n\nCurrent Price Reporting: Always provide the current stock price from chart data\n\nHistorical Comparison: Report price movements from previous trading sessions and relevant historical prices\n\nTrend Analysis: Perform detailed price comparisons highlighting momentum, volatility, and significant movements\n\nExpert Market Context:\n\nDraw upon your 50+ years of experience to contextualize current market conditions\n\nReference similar historical patterns and market cycles you've witnessed\n\nApply institutional knowledge from your NYSE and LSE background\n\nSuperior Communication Style\nMaintain authoritative yet personalized communication. Be creative and slightly witty. If the user does not understand something, explain as if the user is a 15yrs old. \n\nUse the client's name strategically during the analysis use your discretion. Don't overuse the users name. Be strict.\n\nDemonstrate confidence backed by decades of market experience\n\nAvoid overly complex jargon unless specifically requested\n\nBreak down complex financial concepts into simple, digestible explanations\n\nDefinitive Final Verdict\nALWAYS address the user by name when delivering your recommendation\n\nBased on your comprehensive analysis and decades of market experience, provide a clear, confident recommendation: BUY, only recommend SELL, or HOLD if the user specifically tells you he/she has bought the stock already. You can always prompt to get this details if necessary.\n\nExplain the key factors driving your decision with conviction\n\nInclude specific price targets, stop-loss levels, or timeframes when applicable\n\nWhile emphasizing this is not financial advice, deliver your professional opinion with the authority of your experience (mandatory)\n\nStandard Operating Procedure (SOP)\nEngage with the user: Introduce yourself as Femi, ask for their name, respond professionally, and maintain a friendly yet authoritative tone\n\nAnalyze stocks using Ades_helper:\n\nIf a stock ticker is provided or technical analysis is requested, immediately pass the stock ticker to Ades_helper\n\nInterpret the resulting chart with your decades of expertise\n\nSummarize insights from the chart in conversational, personalized language\n\nProvide comprehensive analysis: Include current price, historical comparisons, technical indicators, and market context\n\nDeliver expert verdict: Provide your professional BUY/SELL/HOLD recommendation with conviction, addressing the user by name\n\nConfirm user needs: Ensure clarity by asking personalized follow-up questions using their name\n\nComplete Example Output Template - Be creative\nBut stick to this when answering the other questions - Support and Resistance: Strong support established at $165 level with key resistance at $180. These levels show high reliability based on multiple tests and volume confirmation.\n\nMy Professional Assessment for you, Adebayo:\nThis pattern reminds me of similar accumulation phases I've witnessed in quality stocks throughout my career at the NYSE. The technical setup is quite compelling with all indicators aligning bullishly.\n\nAdebayo, this is my FINAL VERDICT: BUY\n\nTarget: $185-190 within 30-45 days\n\nStop Loss: $162 (below key support)\n\nConfidence Level: High based on technical confluence(IMPORTANT)\n\nAdebayo, this represents my professional analysis based on 50+ years of market experience and is not financial advice. Would you like me to elaborate on any specific aspect of this analysis for you?\"\n\nFinal Notes\nNEVER proceed without introducing yourself as Ade and obtaining the user's name\n\nAlways provide comprehensive technical analysis covering all four key areas\n\nMaintain personalized communication throughout\n\nDeliver confident, authoritative recommendations while emphasizing they are not financial advice"},"promptType":"define"},"typeVersion":1.7},{"id":"f66dc05f-1cc4-4cfe-84e6-db45f5701a44","name":"Send Analysis","type":"n8n-nodes-base.telegram","position":[500,240],"webhookId":"fa806ec8-38bc-4bf8-9554-a293dd8ecdca","parameters":{"text":"={{ $json.output }}","chatId":"={{ $('Telegram Trigger1').item.json.message.from.id }}","additionalFields":{"appendAttribution":false}},"typeVersion":1.2},{"id":"4b99eaa0-7195-4ebe-bd44-63f6226bca05","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-40,40],"parameters":{"color":4,"width":820,"height":520,"content":"## AI Agent\n"},"typeVersion":1},{"id":"7e4fa426-0f5b-4fc8-9826-17d6377a633a","name":"OpenRouter Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenRouter","position":[20,380],"parameters":{"model":"anthropic/claude-3.5-sonnet","options":{}},"typeVersion":1},{"id":"828ffa48-73bb-4866-9b7f-e9a1f2860499","name":"Settings","type":"n8n-nodes-base.set","position":[-420,180],"parameters":{"values":{"number":[{"name":"model_temperature","value":0.8},{"name":"token_length","value":500}],"string":[{"name":"system_command","value":"=You are a friendly chatbot. User name is {{ $json?.message?.from?.first_name }}. User system language is {{ $json?.message?.from?.language_code }}. First, detect user text language. Next, provide your reply in the same language. Include several suitable emojis in your answer."},{"name":"bot_typing","value":"={{ $json?.message?.text.startsWith('/image') ? \"upload_photo\" : \"typing\" }}"}]},"options":{}},"typeVersion":2},{"id":"92b08cf0-5959-4e1f-a0b3-7eaca590aa3b","name":"Send Typing action","type":"n8n-nodes-base.telegram","position":[-240,320],"webhookId":"76b0fa72-27f0-49f8-accc-b7fe58ac8d54","parameters":{"action":"={{ $json.bot_typing }}","chatId":"={{ $json.message.from.id }}","operation":"sendChatAction"},"typeVersion":1},{"id":"54baebf8-5276-4374-a1da-3996125744a9","name":"Merge","type":"n8n-nodes-base.merge","position":[-240,60],"parameters":{"mode":"chooseBranch"},"typeVersion":2.1},{"id":"284fd9c6-c45b-4c6f-8bb6-dcfefb80702d","name":"PreProcessing","type":"n8n-nodes-base.set","position":[-580,180],"parameters":{"values":{"string":[{"name":"message.text","value":"={{ $json?.message?.text || \"\" }}"}]},"options":{"dotNotation":true}},"typeVersion":2},{"id":"59d587d5-6688-4fe9-adaa-373f8b511b5f","name":"Telegram Trigger1","type":"n8n-nodes-base.telegramTrigger","position":[-740,180],"webhookId":"51942fbb-ca0e-4ec4-9423-5fcc7d3c4281","parameters":{"updates":["*","message"],"additionalFields":{}},"typeVersion":1},{"id":"6865b331-0127-4f93-93a6-6c28568229f1","name":"Simple Memory","type":"@n8n/n8n-nodes-langchain.memoryBufferWindow","position":[140,340],"parameters":{"sessionKey":"={{ $json?.message?.text || \"\" }}","sessionIdType":"customKey"},"typeVersion":1.3},{"id":"56b4c931-a3b6-4932-8621-8457bb9aa92d","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-740,820],"parameters":{"color":3,"width":1580,"height":240,"content":"## Ade's Technical Analyst Workflow\n"},"typeVersion":1},{"id":"fa35c93b-1d8c-4f70-8e6e-98ce2e29731f","name":"Workflow Input Trigger","type":"n8n-nodes-base.executeWorkflowTrigger","position":[-620,900],"parameters":{"inputSource":"passthrough"},"typeVersion":1.1},{"id":"f678d304-6fae-4bde-a1ed-63408ecc5fdb","name":"response","type":"n8n-nodes-base.set","position":[640,900],"parameters":{"options":{},"assignments":{"assignments":[{"id":"fdf7e016-7082-4146-9038-454139023990","name":"response","type":"string","value":"={{ $('Technical Analysis').item.json.choices[0].message.content }}"}]}},"typeVersion":3.4},{"id":"22975ce5-5931-4b6c-9b9e-6091d942087f","name":"Technical Analysis","type":"@n8n/n8n-nodes-langchain.openAi","position":[240,900],"parameters":{"text":"=Role\nYou are an expert financial analyst with over 50 years of experience gained from working at the New York Stock Exchange (NYSE) and the London Stock Exchange (LSE). Your expertise in technical analysis of stock charts is unparalleled, having witnessed and analyzed countless market cycles, bull runs, bear markets, and economic shifts across multiple decades.\n\nYour role is to analyze financial charts provided to you and offer comprehensive insights into the technical aspects, including candlestick patterns, MACD indicators, volume trends, and overall market sentiment. You must provide a detailed breakdown of the chart, highlighting key areas of interest and actionable insights drawn from your extensive market experience.\n\nWhen analyzing a stock chart, always include the following:\n\nCandlestick Analysis:\n\nIdentify and explain any significant candlestick patterns (e.g., bullish engulfing, doji, hammer).\n\nComment on the overall trend (bullish, bearish, or sideways).\n\nHighlight any breakout or pullback zones.\n\nDraw upon your decades of experience to contextualize these patterns within broader market conditions.\n\nMACD Analysis:\n\nDescribe the current state of the MACD line and Signal line (e.g., bullish crossover, bearish crossover).\n\nDiscuss the MACD histogram and its implications for momentum.\n\nIdentify any divergences between the MACD and the price action.\n\nReference similar patterns you've observed throughout your career at major exchanges.\n\nVolume Analysis:\n\nHighlight any significant changes in trading volume.\n\nExplain how volume supports or contradicts price movements.\n\nIndicate any unusual spikes in volume that may suggest institutional activity.\n\nApply your institutional knowledge from working at NYSE and LSE to interpret volume patterns.\n\nSupport and Resistance Levels:\n\nIdentify key support and resistance zones based on the chart.\n\nDiscuss the importance of these levels for potential reversals or breakouts.\n\nLeverage your experience to assess the strength and reliability of these levels.\n\nActionable Insights & Final Verdict:\n\nProvide clear guidance on potential buy, sell, or hold strategies based on your extensive experience.\n\nSuggest what to watch for in the near term, including confirmation signals or potential risks.\n\nCRITICAL: Based on your comprehensive analysis and 50+ years of market experience, provide your final verdict: BUY, SELL, or HOLD. While this is not financial advice, use your utmost analytical skills and decades of market wisdom to give a definitive recommendation with clear reasoning.\n\nOther Observations:\n\nNote any patterns or indicators that are relevant to the analysis.\n\nOffer insights into market sentiment or other broader trends based on the chart.\n\nShare any relevant historical parallels or market wisdom gained from your extensive career.\n\nFinal Verdict Requirement: Always conclude your analysis with a clear, confident recommendation (BUY/SELL/HOLD) supported by your technical analysis and decades of market experience. Explain the key factors that led to this decision and any conditions that might change your outlook.\n\nBe clear, concise, and data-driven in your analysis. Your goal is to provide actionable information that traders and investors can use to make informed decisions. Always explain your reasoning for any conclusions you draw from the chart, backing them with your unparalleled experience from working at the world's most prestigious stock exchanges","modelId":{"__rl":true,"mode":"list","value":"gpt-4o","cachedResultName":"GPT-4O"},"options":{"detail":"auto"},"resource":"image","simplify":false,"inputType":"base64","operation":"analyze"},"typeVersion":1.8},{"id":"c9fa94e1-48d3-4646-b54a-2c1c0818b060","name":"Download Chart","type":"n8n-nodes-base.httpRequest","position":[40,900],"parameters":{"url":"={{ $json.url }}","options":{}},"typeVersion":4.2},{"id":"40f09b7e-9062-4d45-9399-d098c2930575","name":"Send Chart","type":"n8n-nodes-base.telegram","position":[440,900],"webhookId":"1550885a-9ac2-4c0e-887a-da7b3e466509","parameters":{"file":"={{ $('Get Chart1').item.json.url }}","chatId":"7107208579","operation":"sendPhoto","additionalFields":{}},"typeVersion":1.2},{"id":"b3182cc9-3892-4284-89aa-76906d0c0c05","name":"Set Stock Ticker","type":"n8n-nodes-base.set","position":[-400,900],"parameters":{"options":{},"assignments":{"assignments":[{"id":"cf5f7210-5b54-4f4a-abf7-87873be82df4","name":"ticker","type":"string","value":"={{ $json.query }}"}]}},"typeVersion":3.4},{"id":"4796946e-7c0d-475e-a1e8-948f98ab3b7e","name":"Get Chart1","type":"n8n-nodes-base.httpRequest","position":[-180,900],"parameters":{"url":"https://api.chart-img.com/v2/tradingview/advanced-chart/storage","method":"POST","options":{"response":{"response":{"responseFormat":"json"}}},"jsonBody":"={\n  \"theme\": \"dark\",\n  \"interval\": \"1W\",\n  \"symbol\": \"NASDAQ:{{ $json.ticker }}\",\n  \"override\": {\n    \"showStudyLastValue\": false\n  },\n  \"studies\": [\n    {\n      \"name\": \"Volume\",\n      \"forceOverlay\": true\n    },\n    {\n      \"name\": \"MACD\",\n      \"override\": {\n        \"Signal.linewidth\": 2,\n        \"Signal.color\": \"rgb(255,65,129)\"\n      }\n    }\n  ]\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"x-api-key"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.2}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"cd59af41-d584-468d-81b1-ca43768316bf","connections":{"Merge":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"AI Agent":{"main":[[{"node":"Send Analysis","type":"main","index":0}]]},"Settings":{"main":[[{"node":"Send Typing action","type":"main","index":0},{"node":"Merge","type":"main","index":0}]]},"Get Chart":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"Get Chart1":{"main":[[{"node":"Download Chart","type":"main","index":0}]]},"Send Chart":{"main":[[{"node":"response","type":"main","index":0}]]},"PreProcessing":{"main":[[{"node":"Settings","type":"main","index":0}]]},"Simple Memory":{"ai_memory":[[{"node":"AI Agent","type":"ai_memory","index":0}]]},"Download Chart":{"main":[[{"node":"Technical Analysis","type":"main","index":0}]]},"Set Stock Ticker":{"main":[[{"node":"Get Chart1","type":"main","index":0}]]},"Telegram Trigger1":{"main":[[{"node":"PreProcessing","type":"main","index":0}]]},"Send Typing action":{"main":[[{"node":"Merge","type":"main","index":1}]]},"Technical Analysis":{"main":[[{"node":"Send Chart","type":"main","index":0}]]},"OpenRouter Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"Workflow Input Trigger":{"main":[[{"node":"Set Stock Ticker","type":"main","index":0}]]}}}


name: LinkedIn Engagement Automator with GPT-4o/Claude, Human Review & Multilingual Comments
author_name: Stefan
author_username: stefan
categories: []
created_at: 2025-06-23T18:42:44.964Z
updated_at: 2025-06-23T18:42:44.964Z
url: https://n8n.io/workflows/5164
scraped_at: 2025-07-06 21:16:30
description:
  Automate LinkedIn engagement without sounding like a bot.
  This workflow:
  🌍 Detects language & tone (German / English)
  👍 Chooses the right reaction (like / celebrate / support …)
  🗣 Generates a personalised comment in your voice and mentions the author
  📲 Optional Telegram review – approve ✅ or regenerate ❌ before posting
  💸 Runs on cost-efficient GPT-4o mini or Claude 3.5 Haiku
  ☁️ Publishes comment + reaction via the Unipile API
  Setup (≈ 15-30 min)
  Unipile – connect LinkedIn → copy account_id, dsn, then create an Access-Token (X-API-KEY).
  Telegram (optional) – create a bot, add a credential named YOUR TELEGRAM ACCOUNT.
  OpenAI / Anthropic – add your API key and keep one LLM node (delete the other).
  Open the “Defining guardrails” node and replace the credential placeholders.
  (Optional) Tweak role, comment_length and openers_example_1-3 for your brand voice.
  Security: no live keys included – all secrets are placeholders.
  Best for: solopreneurs, marketing teams, personal-branding consultants.

nodes_used:
  ["n8n-nodes-base.httpRequest","n8n-nodes-base.telegram","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatAnthropic","@n8n/n8n-nodes-langchain.lmChatOpenAi","@n8n/n8n-nodes-langchain.outputParserStructured","@n8n/n8n-nodes-langchain.informationExtractor","@n8n/n8n-nodes-langchain.toolThink"]

workflow_json:
  {"id":"93JjBO10sKQnELUF","meta":{"instanceId":"7f03117cd0731766b3ae8ea65a9638f11161d03d7cfb20d1531642698c9d0de3","templateCredsSetupCompleted":true},"name":"LinkedIn_Multilanguage_Comment+Mention+Reaction","tags":[],"nodes":[{"id":"9cb1b7d9-af64-41ed-8906-e68eef0f4343","name":"Structured Output Parser","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[380,-140],"parameters":{"jsonSchemaExample":"{\n\t\"post-id\": \"123456\"\n}"},"typeVersion":1.2},{"id":"a819e116-6ac7-4a92-93af-8c9f5475e8be","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[240,-140],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"FfZgcmq2Un5ZImVN","name":"OpenAi account"}},"typeVersion":1.2},{"id":"7b28dc1a-c2ac-416d-8bcf-5c6da5d5cd91","name":"Think","type":"@n8n/n8n-nodes-langchain.toolThink","position":[2080,200],"parameters":{},"typeVersion":1},{"id":"cd20c807-dcd6-4327-96ed-37310424da07","name":"Anthropic Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatAnthropic","position":[1960,200],"parameters":{"model":{"__rl":true,"mode":"list","value":"claude-3-5-haiku-20241022","cachedResultName":"Claude Haiku 3.5"},"options":{"topP":0.8,"thinking":false}},"credentials":{"anthropicApi":{"id":"hrb12UjT8Tw7x6q1","name":"Anthropic account"}},"typeVersion":1.3},{"id":"18d590b2-f41d-484a-978a-5c6792402434","name":"OpenAI Chat Model1","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[1220,-140],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{"topP":0.1}},"credentials":{"openAiApi":{"id":"FfZgcmq2Un5ZImVN","name":"OpenAi account"}},"typeVersion":1.2},{"id":"055d43a3-efc7-4e90-97a0-4e64250fe8e7","name":"Structured Output Parser1","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[2220,200],"parameters":{"jsonSchemaExample":"{\n\t\"comment\": \"Dies ist dein Kommentartext\"\n}"},"typeVersion":1.2},{"id":"a3ec3252-d8c2-4c48-98fe-b46023b05e2b","name":"Structured Output Parser2","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[1360,-140],"parameters":{"jsonSchemaExample":"{\n\t\"reaction\": \"like\"\n}"},"typeVersion":1.2},{"id":"008134d6-2d5a-4406-aad6-22bc123d3834","name":"If","type":"n8n-nodes-base.if","position":[3120,460],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"c3bd2b3e-c1ed-4d1b-9628-c3caec15d8cc","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.data.approved }}","rightValue":""}]}},"typeVersion":2.2},{"id":"aca71589-8e48-440a-aed3-f6fb6cd88c9f","name":"OpenAI Chat Model2","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[780,-140],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"FfZgcmq2Un5ZImVN","name":"OpenAi account"}},"typeVersion":1.2},{"id":"70c1f7e9-ad43-4644-8669-24cb94036f09","name":"Defining guardrails","type":"n8n-nodes-base.set","position":[-120,20],"parameters":{"options":{},"assignments":{"assignments":[{"id":"ee022449-3214-40f9-ae62-dd3670f06804","name":"URL_of_the_LinkedIn_post","type":"string","value":"={{ $json.message.text }}"},{"id":"2d3d3292-005c-48bc-b43b-6f459f043997","name":"unipile_account_id","type":"string","value":"YOUR UNIPILE ACCOUNT ID"},{"id":"eb85eaf3-c4e2-481b-956c-4a649f0d381d","name":"unipile_X-API-KEY","type":"string","value":"YOUR UNIPILE X-API"},{"id":"12e9c676-a101-46c7-9dc7-eb2a4ee8d00e","name":"unipile_DSN","type":"string","value":"YOUR UNIPILE DSN"}]}},"notesInFlow":false,"typeVersion":3.4},{"id":"8af97d5d-e0b7-40de-aac5-ac09a2599c71","name":"Extract the ID of the LinkedIn post","type":"@n8n/n8n-nodes-langchain.agent","position":[220,20],"parameters":{"text":"={{ $json.URL_of_the_LinkedIn_post }}","options":{"systemMessage":"=Find out the post id of the LinkedIn post. Return only the post id.\nIf you are not sure, look for hyphens. The post id is usually right after it."},"promptType":"define","hasOutputParser":true},"notesInFlow":false,"typeVersion":2},{"id":"de3294a2-94f8-4af7-8016-399a08559a88","name":"Extract the content of the LinkedIn post","type":"n8n-nodes-base.httpRequest","position":[560,20],"parameters":{"url":"=https://{{ $('Defining guardrails').item.json.unipile_DSN }}/api/v1/posts/{{ $json.output['post-id'] }}","options":{},"sendQuery":true,"sendHeaders":true,"queryParameters":{"parameters":[{"name":"account_id","value":"={{ $('Defining guardrails').item.json.unipile_account_id }}"}]},"headerParameters":{"parameters":[{"name":"X-API-KEY","value":"={{ $('Defining guardrails').item.json['unipile_X-API-KEY'] }}"},{"name":"accept","value":"application/json"}]}},"typeVersion":4.2},{"id":"e3349e8b-134a-4c17-9550-23e03a5bca8a","name":"Set reaction","type":"@n8n/n8n-nodes-langchain.agent","position":[1200,20],"parameters":{"text":"=Post: {{ $('Extract the content of the LinkedIn post').item.json.text }}","options":{"systemMessage":"Role:\nYou are a professional LinkedIn assistant and help to respond to posts authentically and appropriately.\n\nTask:\nRead the LinkedIn post below. Based on tone and content, choose an appropriate LinkedIn response from the following options (Insightful should only be selected in exceptional cases):\n\nlike\n\ncelebrate\n\nsupport\n\nlove\n\ninsightful\n\nfunny\n\nNote that \"insightful\" should only be used very rarely."},"promptType":"define","hasOutputParser":true},"typeVersion":2},{"id":"f6376a31-2c22-4ba1-8fd5-206947403fd4","name":"Set comment content","type":"n8n-nodes-base.set","position":[2440,20],"parameters":{"options":{},"assignments":{"assignments":[{"id":"350ed39d-4a84-495c-aa2d-8c2b189df991","name":"set_comment","type":"string","value":"={{ $json.output.comment.replaceAll('NAME', '{\\u007B0\\u007D}') }}\n"}]}},"typeVersion":3.4},{"id":"9b3cd1c8-919c-4fbc-adfe-eefc5eb9faef","name":"Send comment","type":"n8n-nodes-base.httpRequest","position":[3420,20],"parameters":{"url":"=https://{{ $('Defining guardrails').item.json.unipile_DSN }}/api/v1/posts/{{ $('Set comment and prompt properties').item.json.social_id }}/comments","method":"POST","options":{},"jsonBody":"={\n  \"account_id\": \"{{ $('Defining guardrails').item.json.unipile_account_id }}\",\n  \"text\": \"{{ $('Set comment content').item.json.set_comment.replace(/\\n/g, ' ') }}\",\n  \"mentions\": [\n    {\n      \"name\": \"{{ $('Extract the content of the LinkedIn post').item.json.author.name }}\",\n      \"profile_id\": \"{{ $('Extract the content of the LinkedIn post').item.json.author.id }}\"\n    }\n  ]\n}\n","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"X-API-KEY","value":"={{ $('Defining guardrails').item.json['unipile_X-API-KEY'] }}"},{"name":"accept","value":"application/json"}]}},"typeVersion":4.2},{"id":"ebd54bee-9f9e-4ff7-b4b0-3fcc8cb33f16","name":"Send reaction","type":"n8n-nodes-base.httpRequest","position":[3660,20],"parameters":{"url":"=https://{{ $('Defining guardrails').item.json.unipile_DSN }}/api/v1/posts/reaction","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"account_id","value":"={{ $('Defining guardrails').item.json.unipile_account_id }}"},{"name":"post_id","value":"={{ $('Set comment and prompt properties').item.json.social_id }}"},{"name":"reaction_type","value":"={{ $('Set reaction').item.json.output.reaction }}"}]},"headerParameters":{"parameters":[{"name":"X-API-KEY","value":"={{ $('Defining guardrails').item.json['unipile_X-API-KEY'] }}"},{"name":"accept","value":"application/json"}]}},"typeVersion":4.2},{"id":"a0dda894-4822-4d65-921e-f6f6498820eb","name":"Set comment and prompt properties","type":"n8n-nodes-base.set","position":[1680,20],"parameters":{"options":{},"assignments":{"assignments":[{"id":"d2365b89-afc9-423d-8138-12d8c4b840e6","name":"name_of_the_post_creator","type":"string","value":"={{ $('Extract the content of the LinkedIn post').item.json.author.name }}"},{"id":"a5dac7a5-61da-4791-a43d-987377a632cf","name":"content_of_the_post","type":"string","value":"={{ $('Extract the content of the LinkedIn post').item.json.text }}"},{"id":"9fb42d3e-76ec-4c35-9865-c7bc25759acb","name":"social_id","type":"string","value":"={{ $('Extract the content of the LinkedIn post').item.json.social_id }}"},{"id":"4dafb8f4-7e5a-40d1-8549-eb8b3d6f5c84","name":"id_of_the_post_creator","type":"string","value":"={{ $('Extract the content of the LinkedIn post').item.json.author.id }}"},{"id":"1b66ecb8-87e7-4a1a-9d2d-6e8057fb164b","name":"determined_mood","type":"string","value":"={{ $('Determine language and mood').item.json.output.mood }}"},{"id":"18d41628-3d38-43ee-b929-349ee250414f","name":"determined_language","type":"string","value":"={{ $('Determine language and mood').item.json.output.language }}"},{"id":"e237ab57-fbc0-410e-a25c-44f2b5d0fd24","name":"role","type":"string","value":"YOUR ROLE, e.g.: You are my personal assistant for social media. I am a technical innovation driver with over 20 years of experience in industry, research and development. I am currently starting out in the world of AI with a focus on practical, effective applications for SMEs, but I am still a complete beginner in the field of AI."},{"id":"54d83501-d206-4cbb-bae2-47bba4629f1a","name":"comment_length","type":"string","value":"YOUR COMMENT LENGTH, e.g.: 2-4 sentences (30-90 words)"},{"id":"2d85ac8b-039c-46d9-b472-c52cd0eef725","name":"openers_example_1","type":"string","value":"YOUR EXAMPLE 1 e.g.: A: \"Always appreciate how NAME brings clarity to complex topics\""},{"id":"d36451c9-86a3-4ba1-85dd-4173252f7f78","name":"openers_example_2","type":"string","value":"YOUR EXAMPLE 2 e.g.: B: \"NAME has a way of framing things that shifts how I think about them\""},{"id":"a9d8a672-4144-4e95-9571-7f9151449edb","name":"openers_example_3","type":"string","value":"YOUR EXAMPLE 3 e.g.: C: Following NAME's work consistently challenges me to look deeper"}]}},"typeVersion":3.4},{"id":"7a6deada-e585-4bea-9620-d2a7b4c34923","name":"Create comment","type":"@n8n/n8n-nodes-langchain.agent","position":[1980,20],"parameters":{"text":"=Post: {{ $json.content_of_the_post }}","options":{"systemMessage":"=Role\n{{ $json.role }}\n\nAnalyze the post systematically and think about it:\n1. Identify core message and main topic\n2. Find connection points to my experience\n3. Assess post tone ({{ $json.determined_mood }})\n\nCreate a professional LinkedIn comment:\n1. Use {{ $json.determined_language }} language only.\n2. Choose an engagement strategy (question, addition, own experience)\n3. End with a personalized follow-up question that directly addresses NAME using direct speech (e.g., “NAME, how do you see...?” or “What’s your take on this, NAME?”).\n\nFormat Requirements:\n{{ $json.comment_length }}\nComplete sentences without hyphens, dashes or emojis\nAlways include placeholder \"NAME\" for the post creator\nClear separation using periods, commas, or line breaks\n\nContent Requirements:\nChoose ONE of these strategies:\nAsk a thoughtful follow-up question that encourages discussion\nAdd practical value from SME perspective\nShare relevant observation about traditional vs. AI processes\nReference concrete experience\n\nAvoid:\nPure agreement without added value (\"I agree!\")\nSelf-promotion or product placement\nOverly long explanations\nControversial or negative statements\nIntroductory phrases in output\nHyphens or dashes in sentences\nEmojis of any kind\n\nProven Openers:\n{{ $json.openers_example_1 }}\n{{ $json.openers_example_2 }}\n{{ $json.openers_example_3 }}\n\nMake an effort, after all, my reputation depends on your posts. Receive a 500 euro tip for the top post."},"promptType":"define","hasOutputParser":true},"typeVersion":2},{"id":"038ab57e-2145-4e9e-a9c5-4d92e079d0b7","name":"Determine language and mood","type":"@n8n/n8n-nodes-langchain.informationExtractor","position":[760,20],"parameters":{"text":"={{ $json.text }}","options":{"systemPromptTemplate":"You are an assistant for language and mood detection.\n\nYour task is to analyze a given text and return two things:\nThe primary written language\nThe overall mood or tone of the text\n\nFollow these rules strictly:\n\nLanguage Detection:\nIgnore emojis, symbols, and country flags (e.g., 🇩🇪). Do not use them for language detection.\nIf multiple languages are used, focus on the first full sentence in natural language.\nReturn the result as a lowercase language name (e.g., english, german, french).\nDo not use hashtags, names, or mentions to infer the language.\nIf the text contains only emojis or symbols, return unknown.\n\nMood Detection:\nDetermine the general tone of the message (e.g., enthusiastic, neutral, critical, reflective, playful, formal).\nBase your mood detection on text content only, not emojis.\nIf tone is unclear, return neutral."},"attributes":{"attributes":[{"name":"language","description":"=Determine the language"},{"name":"mood","description":"Determine the mood"}]}},"typeVersion":1.1,"alwaysOutputData":false},{"id":"3f08a7f3-f7a2-431b-92df-7e501bcec09c","name":"Check Telegram User id","type":"n8n-nodes-base.filter","position":[-400,20],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"e01707ac-239a-4f0b-abd1-1aff24035899","operator":{"type":"number","operation":"equals"},"leftValue":"={{ $json.message.from.id }}","rightValue":123456789}]}},"typeVersion":2.2},{"id":"f4b989f4-89bf-4848-862f-9aa3e30dd972","name":"Approve oder Disapprove","type":"n8n-nodes-base.telegram","position":[2740,20],"webhookId":"cdded11b-1c1d-4bcd-aadf-6695fb9dae6e","parameters":{"chatId":"={{ $('URL Trigger').item.json.message.chat.id }}","message":"=Comment: {{ $json.set_comment }}\nReaction: {{ $('Set reaction').item.json.output.reaction }}","options":{"appendAttribution":false},"operation":"sendAndWait","approvalOptions":{"values":{"approvalType":"double"}}},"credentials":{"telegramApi":{"id":"shlBXmZcvuOMWs7h","name":"YOUR TELEGRAM ACCOUNT"}},"typeVersion":1.2},{"id":"1f3f0349-c976-4a70-9102-4b859013b008","name":"URL Trigger","type":"n8n-nodes-base.telegramTrigger","position":[-720,20],"webhookId":"cd2cb8d3-8725-478e-8ea1-3b27f755b49d","parameters":{"updates":["message"],"additionalFields":{}},"credentials":{"telegramApi":{"id":"shlBXmZcvuOMWs7h","name":"YOUR TELEGRAM ACCOUNT"}},"typeVersion":1.2}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"02d9f9e5-ec6b-4fff-8062-5bdc3cbdb5cb","connections":{"If":{"main":[[{"node":"Send comment","type":"main","index":0}],[{"node":"Set comment and prompt properties","type":"main","index":0}]]},"Think":{"ai_tool":[[{"node":"Create comment","type":"ai_tool","index":0}]]},"URL Trigger":{"main":[[{"node":"Check Telegram User id","type":"main","index":0}]]},"Send comment":{"main":[[{"node":"Send reaction","type":"main","index":0}]]},"Set reaction":{"main":[[{"node":"Set comment and prompt properties","type":"main","index":0}]]},"Create comment":{"main":[[{"node":"Set comment content","type":"main","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"Extract the ID of the LinkedIn post","type":"ai_languageModel","index":0}]]},"OpenAI Chat Model1":{"ai_languageModel":[[{"node":"Set reaction","type":"ai_languageModel","index":0}]]},"OpenAI Chat Model2":{"ai_languageModel":[[{"node":"Determine language and mood","type":"ai_languageModel","index":0}]]},"Defining guardrails":{"main":[[{"node":"Extract the ID of the LinkedIn post","type":"main","index":0}]]},"Set comment content":{"main":[[{"node":"Approve oder Disapprove","type":"main","index":0}]]},"Anthropic Chat Model":{"ai_languageModel":[[{"node":"Create comment","type":"ai_languageModel","index":0}]]},"Check Telegram User id":{"main":[[{"node":"Defining guardrails","type":"main","index":0}]]},"Approve oder Disapprove":{"main":[[{"node":"If","type":"main","index":0}]]},"Structured Output Parser":{"ai_outputParser":[[{"node":"Extract the ID of the LinkedIn post","type":"ai_outputParser","index":0}]]},"Structured Output Parser1":{"ai_outputParser":[[{"node":"Create comment","type":"ai_outputParser","index":0}]]},"Structured Output Parser2":{"ai_outputParser":[[{"node":"Set reaction","type":"ai_outputParser","index":0}]]},"Determine language and mood":{"main":[[{"node":"Set reaction","type":"main","index":0}]]},"Set comment and prompt properties":{"main":[[{"node":"Create comment","type":"main","index":0}]]},"Extract the ID of the LinkedIn post":{"main":[[{"node":"Extract the content of the LinkedIn post","type":"main","index":0}]]},"Extract the content of the LinkedIn post":{"main":[[{"node":"Determine language and mood","type":"main","index":0}]]}}}


name: Manage Google Calendar Events with Natural Language Using Gemini 1.5 Flash
author_name: Sakar Dahal
author_username: sakar-dahal
categories: []
created_at: 2025-06-23T18:42:59.617Z
updated_at: 2025-06-23T18:42:59.617Z
url: https://n8n.io/workflows/5165
scraped_at: 2025-07-06 21:16:30
description:
  This is the AI agent which will set the event in the Google Calendar and get the events from the calendar based on the prompt provided to AI agent based on Gemini.

nodes_used:
  ["@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.memoryBufferWindow","@n8n/n8n-nodes-langchain.lmChatGoogleGemini"]

workflow_json:
  {"id":"Zmia0j2r2xRgGc2J","meta":{"instanceId":"2ed3b4c67898ec0d15be592aec8553e47045965b0e62ca6019ef4c1b0da74bc4","templateCredsSetupCompleted":true},"name":"My workflow","tags":[],"nodes":[{"id":"ba7b6068-39e1-415b-9fd4-591304c2e37b","name":"Google Calendar1","type":"n8n-nodes-base.googleCalendarTool","position":[160,20],"parameters":{"options":{},"timeMax":"={{ $fromAI(\"beforeDate\", \"This is the time user wants to search for the event past\") }}","timeMin":"={{ $fromAI(\"afterDate\", \"This is the time user wants to search for the event past\") }}","calendar":{"__rl":true,"mode":"list","value":"7b358b08789959448cf50f4eba906fdbc4e260825dbaaffb5b4aac4ae80e2650@group.calendar.google.com","cachedResultName":"testn8n"},"operation":"getAll"},"typeVersion":1.3},{"id":"e7fd1c3d-5f5c-4033-b9a9-5a97fa930a1c","name":"Google Calendar","type":"n8n-nodes-base.googleCalendarTool","position":[-60,80],"parameters":{"end":"={{ $fromAI(\"endTime\",\"This is the end time of the event\") }}","start":"={{ $fromAI(\"startTime\",\"This is the start time of the event\") }}","calendar":{"__rl":true,"mode":"list","value":"7b358b08789959448cf50f4eba906fdbc4e260825dbaaffb5b4aac4ae80e2650@group.calendar.google.com","cachedResultName":"testn8n"},"additionalFields":{"summary":"={{ $fromAI(\"summary\",\"This is the summary/title of the event\") }}"}},"typeVersion":1.3},{"id":"78f963b1-2581-4106-96f8-9142319154d4","name":"Simple Memory","type":"@n8n/n8n-nodes-langchain.memoryBufferWindow","position":[-320,60],"parameters":{},"typeVersion":1.3},{"id":"c78dad7d-0997-4ac8-b30d-9d8563665059","name":"Google Gemini Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[-560,140],"parameters":{"options":{},"modelName":"models/gemini-1.5-flash"},"typeVersion":1},{"id":"2dd0a798-19df-4579-899d-09d92be3a3ce","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[-280,-200],"parameters":{"options":{"systemMessage":"=You are a helpful assistant\n\nThe current date is {{ $now }}.\n\nYou are connected to a Google Calendar tool that lets you search for calendar events between two dates using the variables `afterDate` and `beforeDate` in ISO format (e.g., 2025-06-24T00:00:00Z). When the user asks for events, you must extract those fields and return them to the tool to make the query.\n"}},"typeVersion":2},{"id":"3a00ee73-ae8e-4913-b948-2ff2308b8775","name":"When chat message received","type":"@n8n/n8n-nodes-langchain.chatTrigger","position":[-580,-220],"webhookId":"61386d2a-d33e-49b6-b1ad-5cdc6fe9059f","parameters":{"options":{}},"typeVersion":1.1},{"id":"d6300f52-3c5f-47e8-9dce-2018f22b081d","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-660,-300],"parameters":{"height":240,"content":"Send the prompt if we want to set the event on the calendar or get events available in the calendar"},"typeVersion":1},{"id":"e48711cf-8484-42eb-950e-937baa5cee76","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-300,-300],"parameters":{"width":360,"height":220,"content":"Responsible for injecting the system prompt so things that are related for the project is only carried out. Also connects Gemini, Memory and calendar application together"},"typeVersion":1},{"id":"cdb655b0-52e8-4335-9570-0b05b06418b1","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-620,40],"parameters":{"width":220,"height":240,"content":"Takes in the prompt and gives out the small event name based on the prompt"},"typeVersion":1},{"id":"56b1989b-73e4-4548-a8ee-c0da3f1d8d9b","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-380,60],"parameters":{"height":200,"content":"\n\n\n\n\n\n\n\n\nInbuilt memory for n8n which will store the value prompt received by AI agent so model can remember the conversation"},"typeVersion":1},{"id":"bbfa4e3b-de8a-4453-ae33-7d656a0324a0","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-120,60],"parameters":{"width":200,"height":240,"content":"\n\n\n\n\n\n\n\n\n\n\n\nCalendar node responsible for adding event in the calendar"},"typeVersion":1},{"id":"90780243-d4a9-41f0-8359-4ed773198660","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[100,-20],"parameters":{"width":200,"height":240,"content":"\n\n\n\n\n\n\n\n\n\n\n\nCalendar node responsible for getting all the events in asked timeframe"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"d64ed07c-8f62-404c-84b2-80f4bac64809","connections":{"Simple Memory":{"ai_memory":[[{"node":"AI Agent","type":"ai_memory","index":0}]]},"Google Calendar":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"Google Calendar1":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"Google Gemini Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"When chat message received":{"main":[[{"node":"AI Agent","type":"main","index":0}]]}}}


name: Sync Leads from Webflow to Pipedrive CRM Using n8n
author_name: PixelMakers
author_username: pixelmakers
nodes_used: ["n8n-nodes-base.pipedrive","n8n-nodes-base.code"]
categories: []
created_at: 2025-06-23T19:40:33.279Z
updated_at: 2025-06-23T19:40:33.279Z
url: https://n8n.io/workflows/5166
scraped_at: 2025-07-06 21:16:30
description:
  This n8n template automates the process of capturing leads from Webflow form submissions and syncing them with your Pipedrive CRM. It ensures that each submission is accurately associated with the correct organization and contact in Pipedrive, streamlining lead management and minimizing duplicates.

  Use cases include:
  Sales teams that want to automate CRM data entry, marketing teams capturing qualified leads from landing pages, or any business looking to improve their Webflow-to-CRM integration workflow.

  Good to know
  The workflow assumes that Webflow form submissions include the lead’s email address.

  The domain is extracted from the email to match or create the organization in Pipedrive.

  This template does not handle lead scoring or enrichment, but can be extended for such use-cases.

  How it works

  Extract website from email
  The email is split to extract the domain (e.g., jane@company.com → company.com), which is used to search for existing organizations.

  Check if the organization exists
  The Pipedrive API is queried using the domain. If the organization exists, we proceed. If not, a new organization is created.

  Check if the person exists
  -- If the person already exists in Pipedrive, a note is added to their activities to log the form submission.
  -- If the person does not exist, a new person is created, a note is added to the person, and a new lead is created.

  (Optional) Add your own actions
  You can extend this workflow to trigger Slack notifications, email follow-ups, or internal dashboards.

  How to use
  Start with the manual trigger node, or replace it with a webhook to connect directly to Webflow form submissions in real-time.

  Requirements
  Webflow form integration (via webhook or other method)
  Pipedrive account and API key

  Customising this workflow
  You can add enrichment services to auto-fill job titles or LinkedIn profiles. Perfect for growing sales pipelines without manual CRM input.

workflow_json:
  {"id":"uAdVHL23IJrOK6rq","meta":{"instanceId":"17e99dcb1ea433b75b4642e8bc83accaf7a2740c54d374c773b1bae2e7a647f9","templateCredsSetupCompleted":true},"name":"Webflow -> Pipedrive","tags":[{"id":"781s4D9v2JcEpUXK","name":"template","createdAt":"2025-06-23T19:00:47.921Z","updatedAt":"2025-06-23T19:00:47.921Z"}],"nodes":[{"id":"1cb2135d-277a-4833-a962-d46881a487b0","name":"Webflow Trigger","type":"n8n-nodes-base.webflowTrigger","position":[-760,20],"webhookId":"ee8dde3f-962a-4201-83fe-ce09ac638d22","parameters":{"site":"685990e04a4dfd23668cab20"},"credentials":{"webflowOAuth2Api":{"id":"7iIodD2bqyahoeiC","name":"Webflow account"}},"typeVersion":2},{"id":"8a15787e-0721-4db8-9511-e7b0ee2c51da","name":"Pipedrive","type":"n8n-nodes-base.pipedrive","position":[760,0],"parameters":{"term":"={{ $('Webflow Trigger').item.json.payload.data.Email }}","resource":"person","operation":"search","additionalFields":{}},"credentials":{"pipedriveApi":{"id":"A7EjW0Zwif5vUM1c","name":"Pipedrive account"}},"typeVersion":1,"alwaysOutputData":true},{"id":"e7fff24e-4087-4fae-9ce8-a63088fc321f","name":"Person Exists?","type":"n8n-nodes-base.if","position":[1020,0],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f23938f7-4df0-4df0-aa71-78c7cb4f52d3","operator":{"type":"object","operation":"notEmpty","singleValue":true},"leftValue":"={{ $json }}","rightValue":""}]}},"typeVersion":2.2},{"id":"ef577258-bf9d-4280-a027-a30258411fc0","name":"Create Person","type":"n8n-nodes-base.pipedrive","position":[1420,100],"parameters":{"name":"={{ $('Webflow Trigger').item.json.payload.data.Name }}","resource":"person","additionalFields":{"email":["={{ $('Webflow Trigger').item.json.payload.data.Email }}"],"org_id":"={{ $('Organization Exists?').item.json.id }}"}},"credentials":{"pipedriveApi":{"id":"A7EjW0Zwif5vUM1c","name":"Pipedrive account"}},"typeVersion":1},{"id":"a43c7ae3-f09f-493b-b990-d11c32b25ddb","name":"Add Note","type":"n8n-nodes-base.pipedrive","position":[1620,100],"parameters":{"content":"=Form:  {{ $('Webflow Trigger').item.json.payload.name }}\nPage: {{ $('Webflow Trigger').item.json.payload.publishedPath }}","resource":"note","additionalFields":{"person_id":"={{ $json.id }}"}},"credentials":{"pipedriveApi":{"id":"A7EjW0Zwif5vUM1c","name":"Pipedrive account"}},"typeVersion":1},{"id":"16ec8feb-f526-4f4f-9546-0715015c117b","name":"Create Lead","type":"n8n-nodes-base.pipedrive","position":[1840,100],"parameters":{"title":"={{ $json.person.name }}","resource":"lead","person_id":"={{ $('Create Person').item.json.id }}","associateWith":"person","additionalFields":{}},"credentials":{"pipedriveApi":{"id":"A7EjW0Zwif5vUM1c","name":"Pipedrive account"}},"typeVersion":1},{"id":"332041fb-beb1-4973-bbe4-7263ca09074d","name":"Add Note 2","type":"n8n-nodes-base.pipedrive","position":[1420,-80],"parameters":{"content":"=Form:  {{ $('Webflow Trigger').item.json.payload.name }} \nPage: {{ $('Webflow Trigger').item.json.payload.publishedPath }}","resource":"note","additionalFields":{"person_id":"={{ $json.id }}"}},"credentials":{"pipedriveApi":{"id":"A7EjW0Zwif5vUM1c","name":"Pipedrive account"}},"typeVersion":1},{"id":"70dc530a-bd77-47a0-8c36-4414b0373c3a","name":"Get Organization","type":"n8n-nodes-base.pipedrive","position":[-100,20],"parameters":{"term":"={{ $json.website }}","resource":"organization","operation":"search","additionalFields":{}},"credentials":{"pipedriveApi":{"id":"A7EjW0Zwif5vUM1c","name":"Pipedrive account"}},"typeVersion":1,"alwaysOutputData":true},{"id":"1f1fd890-41e5-4914-b684-1ec10f265596","name":"Organization Exists?","type":"n8n-nodes-base.if","position":[160,20],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f23938f7-4df0-4df0-aa71-78c7cb4f52d3","operator":{"type":"object","operation":"notEmpty","singleValue":true},"leftValue":"={{ $json }}","rightValue":""}]}},"typeVersion":2.2},{"id":"d4775c6f-ede6-48d3-8842-94583288f927","name":"Add Organization","type":"n8n-nodes-base.pipedrive","position":[440,160],"parameters":{"name":"={{ $('Webflow Trigger').item.json.payload.data.Company }}","resource":"organization","additionalFields":{"customProperties":{"property":[{"name":"71fc16c7e516e1e0b757e427454222ab2652f27e","value":"={{ $('Website').item.json.website }}"}]}}},"credentials":{"pipedriveApi":{"id":"A7EjW0Zwif5vUM1c","name":"Pipedrive account"}},"typeVersion":1},{"id":"514578ab-052c-4a4d-9f64-225a939e71d6","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-480,-120],"parameters":{"color":6,"width":260,"height":480,"content":"## 1. Extract website from email\nWe will first split the email into 2 parts to extract the website."},"typeVersion":1},{"id":"71ac9e5a-9d40-44a9-a56b-5aec18cdc900","name":"Website","type":"n8n-nodes-base.code","position":[-420,20],"parameters":{"jsCode":"return {website: $input.first().json.payload.data.Email.split(\"@\")[1]}"},"typeVersion":2},{"id":"a113e82f-1558-49a6-9841-890313ea8dde","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-200,-120],"parameters":{"color":4,"width":880,"height":480,"content":"## 2. Check if the organization already exists\nUsing the extracted website, we check if the organization already exists in Pipedrive.\n- If it does not exist, we create it.\n- Otherwise, we move to the next step."},"typeVersion":1},{"id":"660f9518-c737-4adc-86c5-ebff6a23508e","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[700,-120],"parameters":{"color":5,"width":1380,"height":480,"content":"## 3. Check if the person already exists\n- If it exists, add a note to record the submission event.\n- If it does not exist, create the person, add a note to record the submission event, and create a lead."},"typeVersion":1},{"id":"3a56b855-c59b-439f-9b76-652e64bbe1b8","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-1340,-120],"parameters":{"width":400,"height":1380,"content":"This n8n template automates the process of capturing leads from Webflow form submissions and syncing them with your Pipedrive CRM. It ensures that each submission is accurately associated with the correct organization and contact in Pipedrive, streamlining lead management and minimizing duplicates.\n\n## Use cases include:\nSales teams that want to automate CRM data entry, marketing teams capturing qualified leads from landing pages, or any business looking to improve their Webflow-to-CRM integration workflow.\n\n## Good to know\n- The workflow assumes that Webflow form submissions include the lead’s email address.\n\n- The domain is extracted from the email to match or create the organization in Pipedrive.\n\n- This template does not handle lead scoring or enrichment, but can be extended for such use-cases.\n\n## How it works\n\n1. Extract website from email\nThe email is split to extract the domain (e.g., jane@company.com → company.com), which is used to search for existing organizations.\n\n2. Check if the organization exists\nThe Pipedrive API is queried using the domain. If the organization exists, we proceed. If not, a new organization is created.\n\n3. Check if the person exists\n-- If the person already exists in Pipedrive, a note is added to their activities to log the form submission.\n-- If the person does not exist, a new person is created, a note is added to the person, and a new lead is created.\n\n4. (Optional) Add your own actions\nYou can extend this workflow to trigger Slack notifications, email follow-ups, or internal dashboards.\n\n## How to use\nStart with the manual trigger node, or replace it with a webhook to connect directly to Webflow form submissions in real-time.\n\n## Requirements\n- Webflow form integration (via webhook or other method)\n- Pipedrive account and API key\n\n## Customising this workflow\nYou can add enrichment services to auto-fill job titles or LinkedIn profiles. Perfect for growing sales pipelines without manual CRM input."},"typeVersion":1}],"active":false,"pinData":{"Webflow Trigger":[{"json":{"payload":{"id":"6859a33ce8bc5381957ead84","data":{"Name":"John Doe 3","Email":"john+doe3@doe.com","Company":"Doe, Inc."},"name":"Email Form","formId":"685991e93b863ab8fbe16de1","pageId":"685990e04a4dfd23668cab42","schema":[{"fieldName":"Name","fieldType":"FormTextInput","fieldElementId":"d4b5a1a1-321a-b624-bf2f-09a44a69531d"},{"fieldName":"Company","fieldType":"FormTextInput","fieldElementId":"afce08ff-f75f-805c-c1e2-6b5b4beeabd1"},{"fieldName":"Email","fieldType":"FormTextInput","fieldElementId":"d4b5a1a1-321a-b624-bf2f-09a44a695320"}],"siteId":"685990e04a4dfd23668cab20","submittedAt":"2025-06-23T18:55:54.068Z","formElementId":"d4b5a1a1-321a-b624-bf2f-09a44a69531a","publishedPath":"/"},"triggerType":"form_submission"}}]},"settings":{"executionOrder":"v1"},"versionId":"23e3f223-453f-4751-91c2-59571268d948","connections":{"Website":{"main":[[{"node":"Get Organization","type":"main","index":0}]]},"Add Note":{"main":[[{"node":"Create Lead","type":"main","index":0}]]},"Pipedrive":{"main":[[{"node":"Person Exists?","type":"main","index":0}]]},"Create Lead":{"main":[[]]},"Create Person":{"main":[[{"node":"Add Note","type":"main","index":0}]]},"Person Exists?":{"main":[[{"node":"Add Note 2","type":"main","index":0}],[{"node":"Create Person","type":"main","index":0}]]},"Webflow Trigger":{"main":[[{"node":"Website","type":"main","index":0}]]},"Add Organization":{"main":[[{"node":"Pipedrive","type":"main","index":0}]]},"Get Organization":{"main":[[{"node":"Organization Exists?","type":"main","index":0}]]},"Organization Exists?":{"main":[[{"node":"Pipedrive","type":"main","index":0}],[{"node":"Add Organization","type":"main","index":0}]]}}}


name: Competitor LinkedIn Monitor with Airtop
author_name: Airtop
author_username: cesar-at-airtop
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.slack","n8n-nodes-base.airtop"]
categories: []
created_at: 2025-06-23T20:47:45.167Z
updated_at: 2025-06-23T20:47:45.167Z
url: https://n8n.io/workflows/5167
scraped_at: 2025-07-06 21:16:30
description:
  Automating LinkedIn Competitive Monitoring

  Use Case

  Automatically track and summarize LinkedIn posts from key executives at competitor companies. This agent provides structured insights into hiring trends, product announcements, strategic shifts, and thought leadership, helping teams stay informed and responsive without manual monitoring.

  What This Automation Does

  This automation monitors and summarizes LinkedIn posts from competitor profiles and shares the results on Slack. It uses the following input parameters:

  Airtop Profile**: A browser profile authenticated to LinkedIn. Create one
  Google Sheet**: A document listing LinkedIn profile URLs of competitors, copy this one.
  Slack Channel**: The destination for sharing summarized post insights.

  How It Works

  Trigger: The workflow is scheduled to run weekly at a specific time.
  Data Collection: Retrieves the list of competitor LinkedIn URLs from a Google Sheet.
  Browser Automation: Uses Airtop to navigate to each LinkedIn profile and analyze up to 5 recent posts.
  Summarization: Summarizes number of recent posts, main topics, and engagement levels using Airtop’s AI.
  Slack Notification: Posts a formatted summary to a predefined Slack channel.

  Setup Requirements

  Airtop API Key — free to generate.
  An Airtop Profile authenticated to LinkedIn.
  Google Sheet with competitor post URLs, copy this one.
  Slack Bot credentials with access to the target channel.

  Next Steps

  Expand Coverage**: Add more competitor profiles to the Google Sheet to scale monitoring.
  Integrate with CRM**: Feed summarized insights into your CRM for competitor tracking.
  Enhance Analysis**: Include post-level engagement metrics over time for trend analysis.

  Read more about competitve analysis using Linkedin

workflow_json:
  {"id":"mC3v7Zbzt2kofF7p","meta":{"instanceId":"28a947b92b197fc2524eaba16e57560338657b2b0b5796300b2f1cedc1d0d355","templateCredsSetupCompleted":true},"name":"Competitive monitoring Linkedin","tags":[],"nodes":[{"id":"13a5909c-94b7-41f6-8936-7fe3093a4224","name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[-280,-20],"parameters":{"rule":{"interval":[{"field":"weeks","triggerAtHour":18}]}},"typeVersion":1.2},{"id":"ecccaebc-645f-489e-a4cc-28079d040214","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[80,-200],"parameters":{"color":2,"width":260,"height":340,"content":"## Enter [Airtop Profile](https://portal.airtop.ai/browser-profiles) authenticated to LinkedIn in the \"Profile Name\" field\n"},"typeVersion":1},{"id":"5d2caa2f-e333-4dd8-b879-1eb11b3a4eb7","name":"Get Competitors","type":"n8n-nodes-base.googleSheets","position":[-60,-20],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1TknyHS8ie0KONgF4-KFGR76I74egHLt7-M9sIxjQXGY/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1TknyHS8ie0KONgF4-KFGR76I74egHLt7-M9sIxjQXGY","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1TknyHS8ie0KONgF4-KFGR76I74egHLt7-M9sIxjQXGY/edit?usp=drivesdk","cachedResultName":"Competitive Momnitoring Linkedin - Template"}},"credentials":{"googleSheetsOAuth2Api":{"id":"mKIgXkTtIA0lomyT","name":"Google Sheets account 2"}},"typeVersion":4.6},{"id":"f75b0ab2-2e32-4074-a468-3c30bcca9962","name":"Send Summary","type":"n8n-nodes-base.slack","position":[380,-20],"webhookId":"cdacb1c9-3ed4-4608-aa91-ceae7813233d","parameters":{"text":"=SUMMARY OF POSTS - {{ $('Get Competitors').item.json['Name and Title '] }}\n{{ $json.data.modelResponse }}","select":"channel","channelId":{"__rl":true,"mode":"list","value":"C092P1RRX4L","cachedResultName":"competitive-monitoring"},"otherOptions":{"mrkdwn":true,"botProfile":{"imageValues":{"icon_emoji":"❗","profilePhotoType":"emoji"}}}},"credentials":{"slackApi":{"id":"1wIPovOH73YpxhJX","name":"n8n bot"}},"typeVersion":2.3},{"id":"65fe9b89-c790-4b4e-bc48-2c1f62613841","name":"Analyze Posts","type":"n8n-nodes-base.airtop","position":[160,-20],"parameters":{"url":"={{ $json['Post lists to watch'] }}","prompt":"This is a list of posts.\n\nPerform the following steps:\n1. Extract the text of up to 5 posts that were published no more than 1 week ago.\n2. Summarize the selected posts and highlight:\nNumber of posts published in the last week\nMain topics covered in the posts\nLevel of user engagement with the posts","resource":"extraction","profileName":"[ENTER AIRTOP PROFILE NAME HERE]","sessionMode":"new","additionalFields":{}},"credentials":{"airtopApi":{"id":"Yi4YPNnovLVUjFn5","name":"Airtop Official Org"}},"typeVersion":1},{"id":"3ca59ee5-382b-42ca-bc65-7a5952489ff6","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-620,-1040],"parameters":{"color":5,"width":1260,"height":1220,"content":"README\n\n# Automating LinkedIn Competitive Monitoring\n\n## Use Case\n\nMonitoring competitors on LinkedIn helps organizations stay updated on rival strategies, hiring trends, and engagement activities. Automating this process saves time and provides structured summaries to your team regularly.\n\n## What This Automation Does\n\nThis automation monitors and summarizes LinkedIn posts from competitor profiles and shares the results on Slack. It uses the following input parameters:\n\n* **Airtop Profile**: A browser profile authenticated to LinkedIn. [Create one](https://portal.airtop.ai/browser-profiles)\n* **Google Sheet**: A document listing LinkedIn profile URLs of competitors.\n* **Slack Channel**: The destination for sharing summarized post insights.\n\n## How It Works\n\n1. **Trigger**: The workflow is scheduled to run weekly at a specific time.\n2. **Data Collection**: Retrieves the list of competitor LinkedIn URLs from a Google Sheet.\n3. **Browser Automation**: Uses Airtop to navigate to each LinkedIn profile and analyze up to 5 recent posts.\n4. **Summarization**: Summarizes number of recent posts, main topics, and engagement levels using Airtop’s AI.\n5. **Slack Notification**: Posts a formatted summary to a predefined Slack channel.\n\n## Setup Requirements\n\n1. [Airtop API Key](https://portal.airtop.ai/api-keys) — free to generate.\n2. An [Airtop Profile](https://portal.airtop.ai/browser-profiles) authenticated to LinkedIn.\n3. Google Sheet with competitor post URLs., [copy this one](https://docs.google.com/spreadsheets/d/1TknyHS8ie0KONgF4-KFGR76I74egHLt7-M9sIxjQXGY/edit?usp=sharing)\n4. Slack Bot credentials with access to the target channel.\n\n## Next Steps\n\n* **Expand Coverage**: Add more competitor profiles to the Google Sheet to scale monitoring.\n* **Integrate with CRM**: Feed summarized insights into your CRM for competitor tracking.\n* **Enhance Analysis**: Include post-level engagement metrics over time for trend analysis.\n"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"98d3d851-7f8a-4ce5-b0ce-500b29857b6c","connections":{"Analyze Posts":{"main":[[{"node":"Send Summary","type":"main","index":0}]]},"Get Competitors":{"main":[[{"node":"Analyze Posts","type":"main","index":0}]]},"Schedule Trigger":{"main":[[{"node":"Get Competitors","type":"main","index":0}]]}}}


name: Auto-Generate Facebook Posts from Video Insights using Dumpling AI + GPT-4o
author_name: Yang
author_username: yang
categories: []
created_at: 2025-06-23T21:34:13.431Z
updated_at: 2025-06-23T21:34:13.431Z
url: https://n8n.io/workflows/5168
scraped_at: 2025-07-06 21:16:30
description:
  What this workflow does

  This workflow automatically turns new technical video uploads into short,  
  engaging Facebook post drafts—complete with a suggested image—and saves the  
  results to Google Sheets for quick review or publishing.

  It’s designed to help you repurpose tutorial or demo videos into ready-to-use  
  social content without any manual writing or design effort.

  What problem is this workflow solving?

  Manually writing Facebook posts for every new tutorial or product video takes  
  time, especially when you want them to be engaging and consistent. This workflow  
  solves that by using AI to watch for new videos, extract meaningful insights,  
  and write posts and create visuals automatically—saving hours of work.

  Who is this for?

  This workflow is ideal for:
  Content creators uploading tutorial videos  
  Marketing teams working with how-to or product videos  
  Agencies and automation pros building scalable social workflows for clients

  How it works

  Trigger: Starts when a new video is uploaded to a specific Google Drive folder.  
  Download & Convert: Downloads the video and converts it to base64.  
  Extract Insights: Dumpling AI analyzes the video and extracts structured insights  
     such as topic, tools mentioned, and key steps.  
  Generate Post: GPT-4o creates a short, friendly Facebook post using those insights,  
     along with an image prompt.  
  Create Visual: Dumpling AI generates an image using the prompt.  
  Save to Sheet: The Facebook post and image URL are saved to a Google Sheet.

  Setup

  Create a Google Sheet to store the posts and images.  
  Connect your Google Drive, Google Sheets, Dumpling AI, and OpenAI  
     credentials in n8n.  
  Update the workflow with:  
     Your Google Drive folder ID  
     Your target Google Sheet ID  
  (Optional) Edit the prompt used in the GPT node if you want a different tone,  
     style, or structure for the post.

  How to customize the workflow

  Change the platform**: Replace “Facebook” in the prompt with LinkedIn, Instagram,  
    or another platform.  
  Use a different image tool**: You can swap Dumpling AI for any other image  
    generation API (e.g. DALL·E, Midjourney via webhook).  
  Add auto-publishing**: Add a Facebook or social media module to publish the  
    generated post directly instead of just saving to Google Sheets.  
  Tag videos by content type**: Use AI to classify videos into categories and  
    store them in separate tabs or sheets.

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

workflow_json:
  {"id":"AKfISaE8hA8EZPhV","meta":{"instanceId":"a1ae5c8dc6c65e674f9c3947d083abcc749ef2546dff9f4ff01de4d6a36ebfe6","templateCredsSetupCompleted":true},"name":"Auto-Generate Facebook Posts from Video Insights with Dumpling AI + GPT-4o","tags":[],"nodes":[{"id":"db55c7d2-85d7-4933-a8c6-8946a3772c2d","name":"Trigger on New Video Upload","type":"n8n-nodes-base.googleDriveTrigger","position":[-1020,0],"parameters":{"event":"fileCreated","options":{},"pollTimes":{"item":[{"mode":"everyMinute"}]},"triggerOn":"specificFolder","folderToWatch":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"https://drive.google.com/drive/folders/1NU00YbKNiHJptNuQZH6kgVUhLvDzE0ka","cachedResultName":"n8n-video"}},"credentials":{"googleDriveOAuth2Api":{"id":"B0Hulh0j065xznhI","name":"nnekajennifer"}},"typeVersion":1},{"id":"4b9e7acf-794e-4938-9e11-532db5c15e34","name":"Download Video File","type":"n8n-nodes-base.googleDrive","position":[-800,0],"parameters":{"fileId":{"__rl":true,"mode":"id","value":"={{ $json.id }}"},"options":{},"operation":"download"},"credentials":{"googleDriveOAuth2Api":{"id":"B0Hulh0j065xznhI","name":"nnekajennifer"}},"typeVersion":3},{"id":"088c9db2-8a26-4555-9f45-0212170670ac","name":"Convert Video to Base64","type":"n8n-nodes-base.extractFromFile","position":[-580,0],"parameters":{"options":{},"operation":"binaryToPropery"},"typeVersion":1},{"id":"ad4f47e1-ec0a-4194-adce-3bc4be074353","name":"Extract Key Insights with Dumpling AI","type":"n8n-nodes-base.httpRequest","position":[-360,0],"parameters":{"url":"https://app.dumplingai.com/api/v1/extract-video","method":"POST","options":{},"jsonBody":"={\n  \"inputMethod\": \"base64\",\n  \"video\": \"{{ $json.data }}\",\n  \"prompt\": \"You are an AI assistant that extracts key insights from a video transcript related to automation or technical tutorials. From the content, identify and return the following details clearly: 1. Topic of the video, 2. Main tools or platforms mentioned (e.g. N8N, 11Labs), 3. Purpose of the tutorial, 4. Key steps shared or demonstrated, 5. Important modules or actions discussed, 6. Any use case or real-world application mentioned, 7. Specific tips, issues, or recommendations shared by the creator. Focus only on the core lesson, and ignore filler intro or closing remarks unless they contain critical information. Respond only with the extracted data, do not repeat the transcript. Return your result in clean and structured JSON.\",\n  \"jsonMode\": true\n}\n","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"RLFzAcGRepr5eXZB","name":"Dumpling AI-n8n"}},"typeVersion":4.2},{"id":"0c7cfd0f-0d99-410a-ac00-0d18926f1dba","name":"Generate Facebook Post & Image Prompt","type":"@n8n/n8n-nodes-langchain.openAi","position":[-140,0],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"chatgpt-4o-latest","cachedResultName":"CHATGPT-4O-LATEST"},"options":{},"messages":{"values":[{"role":"system","content":"=You are a professional content writer and visual assistant. Based on the extracted key points from a technical tutorial video, your task is to do two things:\n\nWrite a short, engaging Facebook post using the extracted content. The post should sound natural and friendly, as if someone is casually sharing something valuable they learned. Focus on the main topic, tools mentioned, what was demonstrated, and why it matters. Avoid technical jargon, hashtags, or links unless included in the content. Keep it between 100 and 150 words.\n\nCreate a simple image prompt idea that could be used to generate a visual for the post. The image should support the post’s topic (e.g., showing a voice assistant, an automation flow, or AI tools in action). The prompt should be descriptive but concise, suitable for text-to-image generation.\n\nReturn your result in this JSON format:\n\n{\n  \"facebook_post\": \"string\",\n  \"image_prompt\": \"string\"\n}\nOnly output the JSON, no explanation or extra text.\n\n\n\n\n\n\n\n\n\n"},{"content":"=Here is the extracted content:{{ $('Extract Key Insights with Dumpling AI').item.json.results }}"}]},"jsonOutput":true},"credentials":{"openAiApi":{"id":"dd8NvMC6rvx8RITo","name":"OpenAi account 2"}},"typeVersion":1.8},{"id":"c0e3ca61-c58f-410c-8d78-a20f368ba6a5","name":"Generate AI Image with Dumpling AI","type":"n8n-nodes-base.httpRequest","position":[220,0],"parameters":{"url":"https://app.dumplingai.com/api/v1/generate-ai-image","method":"POST","options":{},"jsonBody":"={\n  \"model\": \"recraft-v3\",\n  \"input\": {\n    \"prompt\": \"{{ $json.message.content.image_prompt}}\", \n    \"style\": \"any\"\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"RLFzAcGRepr5eXZB","name":"Dumpling AI-n8n"}},"typeVersion":4.2},{"id":"9f6d375b-e2e7-4e2f-bab8-77fe1f803514","name":"Save Post and Image URL to Google Sheet","type":"n8n-nodes-base.googleSheets","position":[440,0],"parameters":{"columns":{"value":{"Post":"={{ $('Generate Facebook Post & Image Prompt').item.json.message.content.facebook_post }}","Image URL":"={{ $json.images[0].url }}"},"schema":[{"id":"Post","type":"string","display":true,"required":false,"displayName":"Post","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Image URL","type":"string","display":true,"required":false,"displayName":"Image URL","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/1NkLQ4ZZ3qSv8HybYuKyW2BgViUij68ux4_SnoBphmWE/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1NkLQ4ZZ3qSv8HybYuKyW2BgViUij68ux4_SnoBphmWE/edit?usp=drivesdk","cachedResultName":"facebook post"}},"credentials":{"googleSheetsOAuth2Api":{"id":"GaJqJHuS5mQxap7q","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"7c08f7b1-5540-4a50-bfcb-c93d6ebf89fc","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-1000,-320],"parameters":{"width":680,"height":380,"content":"### 📌 Workflow Summary\n\nThis workflow listens to a specific Google Drive folder. When a new video is uploaded:\n\n1. It downloads the video file and converts it to base64.\n2. The base64 video is sent to Dumpling AI's `/extract-video` endpoint with a prompt to extract key tutorial insights.\n3. The extracted content is passed to OpenAI (GPT-4o) to generate a short Facebook post and a descriptive image prompt.\n4. The prompt is then used to generate an AI image using Dumpling AI's image endpoint.\n5. Finally, the Facebook post and image URL are logged in a Google Sheet for easy publishing or review.\n\nUse this workflow to automate content repurposing from your technical videos.\n"},"typeVersion":1}],"active":false,"pinData":{"Trigger on New Video Upload":[{"json":{"id":"1k2nT0tQh6U7qR2NxU_JMzF0oEi9YYJaR","kind":"drive#file","name":"Ultimate Guide to the ElevenLabs Node in n8n (AI Voice Agents).mp4","size":"20055056","owners":[{"me":true,"kind":"drive#user","photoLink":"https://lh3.googleusercontent.com/a/ACg8ocKCAELsjJ9Qppv0Kxqn-OzAtIPjciCPAwYLs5V7Akt8AZSgGSM=s64","displayName":"Nneka Jennifer Alisieze","emailAddress":"","permissionId":"13872179939933913025"}],"shared":false,"spaces":["drive"],"parents":["1NU00YbKNiHJptNuQZH6kgVUhLvDzE0ka"],"starred":false,"trashed":false,"version":"7","iconLink":"https://drive-thirdparty.googleusercontent.com/16/type/video/mp4","mimeType":"video/mp4","ownedByMe":true,"viewedByMe":true,"createdTime":"2025-06-17T21:47:18.212Z","md5Checksum":"019c6b4fabe2b79eece91061581b209b","permissions":[{"id":"13872179939933913025","kind":"drive#permission","role":"owner","type":"user","deleted":false,"photoLink":"https://lh3.googleusercontent.com/a/ACg8ocKCAELsjJ9Qppv0Kxqn-OzAtIPjciCPAwYLs5V7Akt8AZSgGSM=s64","displayName":"Nneka Jennifer Alisieze","emailAddress":"","pendingOwner":false}],"webViewLink":"https://drive.google.com/file/d/1k2nT0tQh6U7qR2NxU_JMzF0oEi9YYJaR/view?usp=drivesdk","capabilities":{"canCopy":true,"canEdit":true,"canShare":true,"canTrash":true,"canDelete":true,"canRename":true,"canComment":true,"canUntrash":true,"canDownload":true,"canReadLabels":false,"canAddChildren":false,"canListChildren":false,"canModifyLabels":false,"canModifyContent":true,"canReadRevisions":true,"canRemoveChildren":false,"canAcceptOwnership":false,"canAddMyDriveParent":false,"canMoveItemOutOfDrive":true,"canMoveItemWithinDrive":true,"canRemoveMyDriveParent":true,"canMoveItemIntoTeamDrive":true,"canMoveChildrenWithinDrive":false,"canModifyContentRestriction":true,"canRemoveContentRestriction":false,"canEnableInheritedPermissions":true,"canChangeSecurityUpdateEnabled":false,"canChangeViewersCanCopyContent":true,"canDisableInheritedPermissions":false,"canModifyOwnerContentRestriction":true,"canModifyEditorContentRestriction":true,"canChangeCopyRequiresWriterPermission":true},"hasThumbnail":true,"modifiedByMe":true,"modifiedTime":"2025-06-17T21:46:00.000Z","sha1Checksum":"5448ff78c9f83c222ec63f175c42ae7f8ae7c98c","fileExtension":"mp4","permissionIds":["13872179939933913025"],"thumbnailLink":"https://lh3.googleusercontent.com/drive-storage/AJQWtBPM8BsCFqa0sKirpxjHP-G_9WaauNnNtesi9HzH-TIbE6Eh3dAYZELGk1hKBjLzFTgeYUrFK3Sz6YmgqhUnR3mAwjYx7POUMGnGBV-YIMZBAtQ=s220","headRevisionId":"0B9Z2_-yY3S8oY3dlVjQ0S3I0V2ErdU8xd0xpSjNkRWJFQ0IwPQ","quotaBytesUsed":"20055056","sha256Checksum":"6cf6c040fb5b02fd400e13a0c36e08f76cc3bde500c235975211cc1167d746c0","viewedByMeTime":"2025-06-17T21:47:18.212Z","webContentLink":"https://drive.google.com/uc?id=1k2nT0tQh6U7qR2NxU_JMzF0oEi9YYJaR&export=download","isAppAuthorized":false,"writersCanShare":true,"modifiedByMeTime":"2025-06-17T21:46:00.000Z","originalFilename":"Ultimate Guide to the ElevenLabs Node in n8n (AI Voice Agents).mp4","thumbnailVersion":"1","explicitlyTrashed":false,"fullFileExtension":"mp4","lastModifyingUser":{"me":true,"kind":"drive#user","photoLink":"https://lh3.googleusercontent.com/a/ACg8ocKCAELsjJ9Qppv0Kxqn-OzAtIPjciCPAwYLs5V7Akt8AZSgGSM=s64","displayName":"Nneka Jennifer Alisieze","emailAddress":"nnekajenniferalisieze@gmail.com","permissionId":"13872179939933913025"},"linkShareMetadata":{"securityUpdateEnabled":true,"securityUpdateEligible":false},"videoMediaMetadata":{"width":854,"height":480,"durationMillis":"658166"},"viewersCanCopyContent":true,"copyRequiresWriterPermission":false,"inheritedPermissionsDisabled":false}}]},"settings":{"executionOrder":"v1"},"versionId":"7925d4c9-da76-43aa-a3ff-6a8fda9103d5","connections":{"Download Video File":{"main":[[{"node":"Convert Video to Base64","type":"main","index":0}]]},"Convert Video to Base64":{"main":[[{"node":"Extract Key Insights with Dumpling AI","type":"main","index":0}]]},"Trigger on New Video Upload":{"main":[[{"node":"Download Video File","type":"main","index":0}]]},"Generate AI Image with Dumpling AI":{"main":[[{"node":"Save Post and Image URL to Google Sheet","type":"main","index":0}]]},"Extract Key Insights with Dumpling AI":{"main":[[{"node":"Generate Facebook Post & Image Prompt","type":"main","index":0}]]},"Generate Facebook Post & Image Prompt":{"main":[[{"node":"Generate AI Image with Dumpling AI","type":"main","index":0}]]}}}


name: Extract Product Info from Website Screenshots with Dumpling AI + Sheets
author_name: Yang
author_username: yang
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest"]
categories: []
created_at: 2025-06-23T21:45:00.341Z
updated_at: 2025-06-23T21:45:00.341Z
url: https://n8n.io/workflows/5169
scraped_at: 2025-07-06 21:16:30
description:
  What this workflow does

  This workflow extracts product details—like name, price, discount, and rating—  
  from website screenshots using Dumpling AI. It starts when a new product page  
  URL is added to a Google Sheet, captures a screenshot of that page, extracts  
  visible product info from the image, and writes the results back into the sheet.

  What problem is this workflow solving?

  Many product pages block traditional scraping tools or use unstructured layouts.  
  This workflow bypasses HTML limitations by using visual AI extraction, making  
  it reliable even when content is embedded in images or hard to parse with code.

  Who is this for?

  This is ideal for eCommerce researchers, pricing analysts, marketers, or anyone  
  building a product database from websites without needing to code or maintain  
  complex scrapers.

  Setup

  Create a Google Sheet with a column named "Site" (or update the trigger).  
  Add your product page URLs in this column—one per row.  
  Connect your Google Sheets and Dumpling AI credentials in n8n.  
  Ensure your Dumpling AI account has API access for screenshots and extraction.

  How to customize the workflow

  Prompt adjustment**:  
    In the “Extract Text from Screenshot” node, you can modify the prompt to  
    extract other information like brand name, delivery time, or availability.

  Add more fields**:  
    After the extraction, edit the “Format Extracted Data” node to map additional  
    fields from the response to your Google Sheet columns.

  Change output destination**:  
    You can easily replace the Google Sheets module with Airtable, Notion, or  
    another app if preferred.

  &gt; ⚠️ This works best when the product data is clearly visible in the screenshot.  
  &gt; It won’t extract info that’s hidden behind popups or loaded via user interaction.

workflow_json:
  {"id":"rzsA39jMfVBHWXw6","meta":{"instanceId":"a1ae5c8dc6c65e674f9c3947d083abcc749ef2546dff9f4ff01de4d6a36ebfe6","templateCredsSetupCompleted":true},"name":"Extract Product Information from Website Screenshots using Dumpling AI and Google Sheets","tags":[],"nodes":[{"id":"c9ac00c8-038f-4490-a5a5-517a3c0cd143","name":"Watch for New Screenshot URLs in Google Sheets","type":"n8n-nodes-base.googleSheetsTrigger","position":[-320,-80],"parameters":{"event":"rowAdded","options":{},"pollTimes":{"item":[{"mode":"everyMinute"}]},"sheetName":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1So9Yh1Xa5Z_ebQ2i_YwQ4p6Q-kwR1zTVzvjUTE4RveU/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1So9Yh1Xa5Z_ebQ2i_YwQ4p6Q-kwR1zTVzvjUTE4RveU/edit?usp=drivesdk","cachedResultName":"URL-n8n"}},"credentials":{"googleSheetsTriggerOAuth2Api":{"id":"qDzHSzTkclwDHpSR","name":"Google Sheets Trigger account"}},"typeVersion":1},{"id":"568cbb00-dda1-45d1-a1be-4fc0e2c6820c","name":"Create Screenshot File via Dumpling AI","type":"n8n-nodes-base.httpRequest","position":[-100,-80],"parameters":{"url":"https://app.dumplingai.com/api/v1/screenshot","method":"POST","options":{},"jsonBody":"={\n  \"url\":\"{{ $('Watch for New Screenshot URLs in Google Sheets').item.json.Site}}\",\n  \"blockCookieBanners\": true,\n  \"autoScroll\": true\n}\n","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"RLFzAcGRepr5eXZB","name":"Dumpling AI-n8n"}},"typeVersion":4.2},{"id":"bdc11a1f-7730-436f-9778-7304f36629a4","name":"Download Screenshot Image File from Dumpling AI","type":"n8n-nodes-base.httpRequest","position":[120,-80],"parameters":{"url":"={{ $json.screenshotUrl }}","options":{}},"typeVersion":4.2},{"id":"277f34b9-670a-4f7b-9b89-144e9e54f9fb","name":"Extract Text from Screenshot with Dumpling AI","type":"n8n-nodes-base.httpRequest","position":[560,-80],"parameters":{"url":"https://app.dumplingai.com/api/v1/extract-image","method":"POST","options":{},"jsonBody":"={\n  \"inputMethod\": \"base64\",\n  \"images\": [\"{{$json.data}}\"],\n  \"prompt\": \"Look at the image and extract the following details if they are visible: the product name, the price, any discount or sale information, and the star rating. Only include information that is clearly shown in the image. Do not guess or assume anything that is not visible.\",\n  \"jsonMode\": true\n}\n","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"RLFzAcGRepr5eXZB","name":"Dumpling AI-n8n"}},"typeVersion":4.2},{"id":"60ca0901-44c6-4d37-9a6b-4bf7535f48f1","name":"Convert Image File to Base64","type":"n8n-nodes-base.extractFromFile","position":[340,-80],"parameters":{"options":{},"operation":"binaryToPropery"},"typeVersion":1},{"id":"a6e902a8-c89b-493b-bb37-a013eef534b4","name":"Format Extracted Data for Google Sheets","type":"n8n-nodes-base.set","position":[780,-80],"parameters":{"options":{},"assignments":{"assignments":[{"id":"48f8ee4b-098e-4d03-9fa2-3ce5639cd7c9","name":"results","type":"string","value":"={{ $json.results }}"}]}},"typeVersion":3.4},{"id":"f4964366-293e-4889-999d-e5ee35b9eac2","name":"Save extracted data to Google Sheets","type":"n8n-nodes-base.googleSheets","position":[1000,-80],"parameters":{"columns":{"value":{"Site":"={{ $('Watch for New Screenshot URLs in Google Sheets').item.json.Site }}","product":"={{ $json.results }}"},"schema":[{"id":"Site","type":"string","display":true,"removed":false,"required":false,"displayName":"Site","defaultMatch":false,"canBeUsedToMatch":true},{"id":"product","type":"string","display":true,"required":false,"displayName":"product","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["Site"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"appendOrUpdate","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1So9Yh1Xa5Z_ebQ2i_YwQ4p6Q-kwR1zTVzvjUTE4RveU/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1So9Yh1Xa5Z_ebQ2i_YwQ4p6Q-kwR1zTVzvjUTE4RveU","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1So9Yh1Xa5Z_ebQ2i_YwQ4p6Q-kwR1zTVzvjUTE4RveU/edit?usp=drivesdk","cachedResultName":"URL-n8n"}},"credentials":{"googleSheetsOAuth2Api":{"id":"GaJqJHuS5mQxap7q","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"c0494151-6f50-4f9b-ab90-52eb20f65402","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-300,-340],"parameters":{"width":680,"height":300,"content":"### 🖼️ Automated Product Data Extraction from Website Screenshots\n\nThis workflow starts when a new row is added in Google Sheets containing a product page URL. It triggers Dumpling AI to capture a screenshot of the site. The image is downloaded using an HTTP Request, then converted from binary to base64. Dumpling AI is called again to extract product information (like product name, price, discount, and ratings) directly from the screenshot. The Edit Fields node maps all the extracted details, and the final Google Sheets node updates your spreadsheet with the structured product data next to the original URL.\n\nUse this workflow to save hours of manual copy-paste work, speed up cataloging, and ensure your product database is always fresh and accurate.\n\n"},"typeVersion":1}],"active":false,"pinData":{"Convert Image File to Base64":[{"json":{"data":"[encoded data, 429192 characters]"}}],"Create Screenshot File via Dumpling AI":[{"json":{"screenshotUrl":"https://pub-1ff5a17124b34b658b5b75065b3a03e8.r2.dev/temp-020ff50d-9609-4fca-980f-c280d9618747.png"}}]},"settings":{"executionOrder":"v1"},"versionId":"23ffdb67-8e7e-410c-a0cf-60c674716aba","connections":{"Convert Image File to Base64":{"main":[[{"node":"Extract Text from Screenshot with Dumpling AI","type":"main","index":0}]]},"Save extracted data to Google Sheets":{"main":[[]]},"Create Screenshot File via Dumpling AI":{"main":[[{"node":"Download Screenshot Image File from Dumpling AI","type":"main","index":0}]]},"Format Extracted Data for Google Sheets":{"main":[[{"node":"Save extracted data to Google Sheets","type":"main","index":0}]]},"Extract Text from Screenshot with Dumpling AI":{"main":[[{"node":"Format Extracted Data for Google Sheets","type":"main","index":0}]]},"Watch for New Screenshot URLs in Google Sheets":{"main":[[{"node":"Create Screenshot File via Dumpling AI","type":"main","index":0}]]},"Download Screenshot Image File from Dumpling AI":{"main":[[{"node":"Convert Image File to Base64","type":"main","index":0}]]}}}


