AutomationFlowsAI & RAG › Generate Linkedin Posts and AI Images From Web Pages with Airtop and Gpt-4

Generate Linkedin Posts and AI Images From Web Pages with Airtop and Gpt-4

ByAirtop @cesar-at-airtop on n8n.io

Turn any web page into a compelling LinkedIn post — complete with an AI-generated image. This automation is ideal for sharing content like blog posts, case studies, or product updates in a polished and engaging format.

Event trigger★★★★☆ complexityAI-powered25 nodesForm TriggerOpenAI ChatOpenAIText ClassifierSlackAirtop
AI & RAG Trigger: Event Nodes: 25 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Form Trigger → OpenAI Chat recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

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

Download .json
{
  "id": "9yTau3SmI0UCovxq",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Generate Linekdin Post from Web Page v5 (revisions)",
  "tags": [],
  "nodes": [
    {
      "id": "e790b122-c9ca-421a-8001-8eaa4e315e85",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -4280,
        1040
      ],
      "parameters": {
        "options": {},
        "formTitle": "LinkedIn Post Generator",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Page URL",
              "placeholder": "https://www.airtop.ai/automations/ai-web-agent-n8n",
              "requiredField": true
            },
            {
              "fieldType": "textarea",
              "fieldLabel": "Instructions"
            }
          ]
        },
        "formDescription": "Fill out these fields and you'll have a full LinkedIn post ready to go in a minute. "
      },
      "typeVersion": 2.2
    },
    {
      "id": "3a34d1e6-85c9-4ae2-924d-0883f8055bc9",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4020,
        820
      ],
      "parameters": {
        "width": 2040,
        "height": 480,
        "content": "# Content Generation & Revisions"
      },
      "typeVersion": 1
    },
    {
      "id": "1bbae834-8dc7-4a55-a0f5-4a85630de0f2",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1920,
        820
      ],
      "parameters": {
        "color": 3,
        "width": 1640,
        "height": 480,
        "content": "# Image Generation & Revisions\n"
      },
      "typeVersion": 1
    },
    {
      "id": "eda10c0b-00e9-459c-a124-b160f246d3c8",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4500,
        820
      ],
      "parameters": {
        "color": 6,
        "width": 440,
        "height": 480,
        "content": "# To generate post and visual - start here!"
      },
      "typeVersion": 1
    },
    {
      "id": "91ea946a-30a8-4d0f-958b-4a1417295363",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -2560,
        1100
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1",
          "cachedResultName": "gpt-4.1"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "e4e324b5-8e0d-41c8-980b-3490501aead5",
      "name": "Set Post",
      "type": "n8n-nodes-base.set",
      "position": [
        -3160,
        920
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "346bd2cf-743b-4b13-a34e-528a95e1a617",
              "name": "URL",
              "type": "string",
              "value": "={{ $('Set Params').item.json.URL }}"
            },
            {
              "id": "8430fd16-f865-4b37-b7bc-7e910badbb19",
              "name": "Instructions",
              "type": "string",
              "value": "= - "
            },
            {
              "id": "35a9e113-ea92-438d-ac25-41ed9a74071f",
              "name": "Post",
              "type": "string",
              "value": "={{ $json.output }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "b6435124-f7d0-466c-9f11-908fddabd9b8",
      "name": "Set Params",
      "type": "n8n-nodes-base.set",
      "position": [
        -3760,
        1040
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "346bd2cf-743b-4b13-a34e-528a95e1a617",
              "name": "URL",
              "type": "string",
              "value": "={{ $('On form submission').item.json['Page URL'] }}"
            },
            {
              "id": "8430fd16-f865-4b37-b7bc-7e910badbb19",
              "name": "Instructions",
              "type": "string",
              "value": "={{ $('On form submission').item.json.Instructions }}"
            },
            {
              "id": "35a9e113-ea92-438d-ac25-41ed9a74071f",
              "name": "Post",
              "type": "string",
              "value": "= - "
            },
            {
              "id": "cd1fac8d-6b57-4072-966f-67e3cf1b9cc4",
              "name": "=Webpage_content",
              "type": "string",
              "value": "={{ $json.data.modelResponse.scrapedContent.text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "b36ddef0-15fe-47b3-ae0b-cf75a7e88695",
      "name": "Set Post1",
      "type": "n8n-nodes-base.set",
      "position": [
        -2280,
        580
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "346bd2cf-743b-4b13-a34e-528a95e1a617",
              "name": "URL",
              "type": "string",
              "value": "={{ $('Set Params').item.json.URL }}"
            },
            {
              "id": "8430fd16-f865-4b37-b7bc-7e910badbb19",
              "name": "Instructions",
              "type": "string",
              "value": "={{ $json.data.text }}"
            },
            {
              "id": "35a9e113-ea92-438d-ac25-41ed9a74071f",
              "name": "Post",
              "type": "string",
              "value": "={{ $('Set Post').item.json.Post }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "77eb23ab-77e5-4ccb-bb51-73afc935f856",
      "name": "Image Prompt Generator",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -1660,
        920
      ],
      "parameters": {
        "text": "=# Overview\nYou are an AI agent that transforms LinkedIn posts into visual prompt descriptions for generating graphic marketing materials. These visuals are designed to be paired with the post on LinkedIn, helping communicate the message in a visually engaging, brand-aligned way.\n\n## Objective:\n- Read and analyze the given LinkedIn post.\n- If Image Prompt and User Instructions are provided. Follow the user instructions closely and modify the image prompt based on those instructions\n- Identify the main message, insight, or takeaway from the post.\n- Create a clear and compelling graphic prompt that can be used with a text-to-image generator.\n- The result should be a marketing-style graphic \u2014 not a literal scene or hyperrealistic photo \u2014 that:\n1) Visually supports or illustrates the key idea of the post\n2) Looks appropriate for use in a professional LinkedIn feed\n3) Feels polished, modern, and engaging\n4) Don't be salesy, Don't say things like \"Save hours weekly \u2014 Grab Your Free Template!\u201d. be more technical, focus on how it works\n\n## Output Instructions:\n- Output only the final image prompt. Do not output quotation marks.\n- Do not repeat or rephrase the LinkedIn post.\n- Do not add any explanations or extra content \u2014 just the image prompt.\n- Never leave things blank like \"Header area reserved for customizable callout text\"\n- Output numeric stats when available in the original post\n\n## Style Guidelines:\n- Think like a brand designer or marketing creative.\n- Visuals may include: text, charts, icons, abstract shapes, overlays, modern illustrations, motion-like effects, bold typography elements (described, not rendered), or metaphorical concepts.\n- You can mention layout suggestions (e.g., \"split screen design,\" \"header with bold title and subtle background illustration\").\n- Assume the output will be generated using AI image tools \u2014 your prompt should guide those tools effectively.\n- When the post is a template giveaway, add small, gentle \"free template\"\nstamp\n\n## Example Prompt Format:\nA modern flat-style graphic showing a human brain connected to mechanical gears, representing the fusion of AI and automation. Minimalist background, soft gradients, clean sans-serif text placement space at the top.\n\n# LINKEDIN POST:\n{{ $json.Post }}\n\n# LATEST IMAGE PROMPT\n{{ $json.Image_prompt }}\n\n# USER IMAGE INSTRUCTIONS\n{{ $json.Image_user_instructions }}\n",
        "prompt": "define",
        "options": {},
        "resource": "assistant",
        "assistantId": {
          "__rl": true,
          "mode": "list",
          "value": "asst_aYEHuzWeFxMBN2qu4FnXRsJ4",
          "cachedResultName": "Social Media Writer"
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "63b748f9-6884-4c37-97cf-00372a8b9653",
      "name": "Set Image Prompt",
      "type": "n8n-nodes-base.set",
      "position": [
        -1860,
        920
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a4111b78-af26-41ca-8a0e-184ebabffe66",
              "name": "Image_prompt",
              "type": "string",
              "value": " "
            },
            {
              "id": "62a444c9-1400-4789-b2d0-a1daeb417e52",
              "name": "Post",
              "type": "string",
              "value": "={{ $json.Post || $('Set Post').item.json.Post}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "51025a08-3034-435c-a3c5-0950cf540d17",
      "name": "Check Post Text Feedback",
      "type": "@n8n/n8n-nodes-langchain.textClassifier",
      "position": [
        -2560,
        920
      ],
      "parameters": {
        "options": {
          "multiClass": false
        },
        "inputText": "={{ $json.data.text }}",
        "categories": {
          "categories": [
            {
              "category": "Edit",
              "description": "The email has been reviewed, but the human requests modifications to the post text before it is sent like tweaks, removing parts, rewording, etc. This could include suggested edits, rewording, or major revisions to the post text. |Example phrases include:\"Can we tweak this part of the post?\"\"Needs some changes to this sentence.\"\"I\u2019d like to reword the post.\"\"Not quite right\u2014let\u2019s revise the text.\"\"Can you adjust the text before sending?\"\"Don't mention Make in the text\"\"change the style of the writing\"\"tone of voice is not consistent with our branding\""
            },
            {
              "category": "Approved",
              "description": "The email has been reviewed and accepted as-is. The human explicitly or implicitly expresses approval, indicating that no changes are needed. |Example phrases include:\"Looks good.\"\"Go ahead and send it.\"\"This works for me.\"\"Approved.\"\"No changes needed.\"\"ok\""
            },
            {
              "category": "Declined",
              "description": "The email has been reviewed, but the human requests not to proceed with the post. |Example phrases include:\"Let's cancel this post.\"\"Don't post\""
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "b59b8989-1e22-4496-a2b9-1803897ba50e",
      "name": "Check Image Feedback",
      "type": "@n8n/n8n-nodes-langchain.textClassifier",
      "position": [
        -680,
        920
      ],
      "parameters": {
        "options": {
          "multiClass": false
        },
        "inputText": "={{ $json.data.text }}",
        "categories": {
          "categories": [
            {
              "category": "Edit",
              "description": "The email has been reviewed, but the human requests modifications to the image prompt before it is sent like tweaks, removing parts, rewording, etc. This could include suggested edits, rewording, or major revisions to the image prompt. |Example phrases include:\"Can we tweak this part of the image?\"\"Needs some changes to the image.\"\"I\u2019d like to reword the image prompt.\"\"Not quite right\u2014let\u2019s revise the visual.\"\"Can you adjust the picture before sending?\"\"Don't display logos in the image\"\"change the image style\"\"image is not consistent with our branding\""
            },
            {
              "category": "Approved",
              "description": "The email has been reviewed and accepted as-is. The human explicitly or implicitly expresses approval, indicating that no changes are needed. |Example phrases include:\"Looks good.\"\"Go ahead and send it.\"\"This works for me.\"\"Approved.\"\"No changes needed.\""
            },
            {
              "category": "Declined",
              "description": "The email has been reviewed, but the human requests not to proceed with the post. |Example phrases include:\"Let's cancel this post.\"\"Don't post\""
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "76323ea2-9c7a-41f7-a9a1-dd375dc3c373",
      "name": "Set Image Prompt1",
      "type": "n8n-nodes-base.set",
      "position": [
        -1300,
        920
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a4111b78-af26-41ca-8a0e-184ebabffe66",
              "name": "Image_prompt",
              "type": "string",
              "value": "={{ $json.output }}"
            },
            {
              "id": "5ed10820-68c9-41fd-9cc6-3f11df89ce7e",
              "name": "Image_id",
              "type": "string",
              "value": ""
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ac381668-70d7-4cd1-9a71-8e0ac55a9f31",
      "name": "Set Image Prompt2",
      "type": "n8n-nodes-base.set",
      "position": [
        -320,
        600
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a4111b78-af26-41ca-8a0e-184ebabffe66",
              "name": "Image_prompt",
              "type": "string",
              "value": "=ORIGINAL IMAGE PROMPT\n{{ $('Set Image Prompt1').item.json.Image_prompt }}\n\nUSER REQUESTED REVISION: \n{{ $json.data.text }}\n  \n"
            },
            {
              "id": "ef6ef374-4efd-4270-a856-2f4b64355909",
              "name": "=Image_id",
              "type": "string",
              "value": "={{ $('Generate on-brand image').item.json.Unbranded_image_id[0] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "e1d23987-51d7-464b-ab1e-974a5ca5285c",
      "name": "OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -680,
        1120
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1",
          "cachedResultName": "gpt-4.1"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "2997f0cb-9554-4c8e-b68c-32add0a9624a",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -220,
        820
      ],
      "parameters": {
        "color": 4,
        "width": 440,
        "height": 480,
        "content": "# Send Final Post and Visual"
      },
      "typeVersion": 1
    },
    {
      "id": "6c0705d9-73a0-4e9c-b1b5-6dd1cdadf24b",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1900,
        280
      ],
      "parameters": {
        "color": 6,
        "width": 440,
        "height": 480,
        "content": "# To generate just a branded visual - start here!"
      },
      "typeVersion": 1
    },
    {
      "id": "54ccdc45-6790-4faa-bbc6-d1cc5299d521",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4500,
        -480
      ],
      "parameters": {
        "color": 5,
        "width": 1060,
        "height": 1140,
        "content": "README\n# Generate LinkedIn Posts from Any Webpage (With Visuals)\n## Use Case\nTurn any web page into a compelling LinkedIn post \u2014 complete with an AI-generated image. This automation is ideal for sharing content like blog posts, case studies, or product updates in a polished and engaging format.\n\n## What This Automation Does\nGiven a page URL and optional user instructions, this automation:\n- Scrapes the content of the webpage\n- Uses AI to write a clear, educational, and LinkedIn-optimized post\n- Generates a brand-aligned visual that matches the content\n- Sends both to Slack for review and approval\n- Handles feedback and revisions via Slack interactions\n\nInput:\n- **Page URL** \u2014 The link to the webpage (required)\n- **Instructions** \u2014 Optional notes on tone, emphasis, or format\n\nOutput:\n- LinkedIn post text\n- AI-generated visual prompt and image\n- Slack message with review/approval options\n\n## How It Works\n1. **Form Submission**: User inputs a web page and optional instructions.\n2. **Web Scraping**: Uses Airtop to extract page content.\n3. **Post Generation**: AI agent writes a post based on the page and instructions.\n4. **Visual Generation**: Another AI model creates an image prompt; this is sent to a sub-workflow for image rendering.\n5. **Slack Review Flow**:\n   - Post and image sent to Slack for feedback\n   - User can approve, request revisions, or decline\n   - Revisions trigger reprocessing steps automatically\n6. **Final Post Delivery**: Approved post and image are sent back to Slack, ready to publish.\n\n## Setup Requirements\n1. Airtop API key\n2. OpenAI credentials for post and image prompt generation\n3. Slack OAuth integration with a review channel\n4. A sub-workflow for branded image generation\n\n## Next Steps\n- **Post Directly**: Add LinkedIn publishing to automate the full content workflow.\n- **Template Variations**: Offer post style presets (e.g., technical, story-driven, short-form).\n- **CRM Sync**: Save approved posts and stats in Airtable or Notion for team use.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "85fcea76-f016-49d2-97fa-d1d5a2652559",
      "name": "Generate on-brand image",
      "type": "n8n-nodes-base.executeWorkflow",
      "position": [
        -1100,
        920
      ],
      "parameters": {
        "mode": "each",
        "options": {
          "waitForSubWorkflow": true
        },
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "hYnqsBhAjnEFvKSk",
          "cachedResultName": "AIRTOP \u2014 Generate and Edit On-Brand Images - V3"
        },
        "workflowInputs": {
          "value": {
            "Prompt": "={{ $json.Image_prompt }}",
            "Image_drive_id": "={{ $json.Image_id }}"
          },
          "schema": [
            {
              "id": "Prompt",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Image_drive_id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Image_drive_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Prompt"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "79c5ba3a-573c-46cc-a592-4dc3c87abb37",
      "name": "Final Version",
      "type": "n8n-nodes-base.slack",
      "position": [
        -40,
        1000
      ],
      "parameters": {
        "text": "=----------------  \nFINAL POST AND VISUAL\n\n{{ $('Set Image Prompt').item.json.Post }}\n\n{{ $('Generate on-brand image').item.json.Branded_view_url[0] }}\n\n",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C08QUB9N5FX",
          "cachedResultName": "gen-social-posts"
        },
        "otherOptions": {
          "unfurl_links": false,
          "unfurl_media": false
        },
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "ac358c88-f9a6-42c0-ba2b-8574a6551047",
      "name": "Generate Image",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -1780,
        500
      ],
      "parameters": {
        "options": {},
        "formTitle": "Generate Image",
        "formFields": {
          "values": [
            {
              "fieldType": "textarea",
              "fieldLabel": "Post",
              "requiredField": true
            }
          ]
        },
        "formDescription": "Start here if you have the post and just want to generate and revise the visual for it"
      },
      "typeVersion": 2.2
    },
    {
      "id": "2e528d15-8d3c-4c1f-884c-570b4133df11",
      "name": "Human Revision of Text",
      "type": "n8n-nodes-base.slack",
      "position": [
        -2860,
        920
      ],
      "parameters": {
        "select": "channel",
        "message": "=----------------\n\n{{ $json.Post }}\n\n-----------------\nBased on: {{ $json.URL }}",
        "options": {
          "limitWaitTime": {
            "values": {
              "resumeUnit": "days",
              "resumeAmount": 3
            }
          },
          "appendAttribution": false,
          "responseFormTitle": "Image Feedback"
        },
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C08QUB9N5FX",
          "cachedResultName": "gen-social-posts"
        },
        "operation": "sendAndWait",
        "responseType": "freeText",
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "1c1cffaf-0ba4-4ef9-9c4b-46cc509360ed",
      "name": "Human Review of Visual",
      "type": "n8n-nodes-base.slack",
      "position": [
        -880,
        920
      ],
      "parameters": {
        "select": "channel",
        "message": "=----------------\nPOST \n\n{{ $('Set Image Prompt').item.json.Post }}\n\nIMAGE PROMPT\n\n{{ $('Set Image Prompt1').item.json.Image_prompt }}\n\nIMAGE\n\n{{ $('Generate on-brand image').item.json.Branded_view_url[0] }}\n\n-----------------\n",
        "options": {
          "limitWaitTime": {
            "values": {
              "resumeUnit": "days",
              "resumeAmount": 3
            }
          },
          "appendAttribution": false,
          "responseFormTitle": "Image Feedback"
        },
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C08QUB9N5FX",
          "cachedResultName": "gen-social-posts"
        },
        "operation": "sendAndWait",
        "responseType": "freeText",
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "f2ac9ab6-d48e-494a-80c1-d79660fedf85",
      "name": "Generate Post Text",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -3540,
        1040
      ],
      "parameters": {
        "text": "=Write a helpful educational, and engaging LinkedIn posts based on a webpage scraped content below or the Post text below and according to the instructions provided by the user.\n\nInstructions: {{ $json.Instructions }}\n\n{{ $json.Post }}\n\n{{ $json.Webpage_content }}",
        "prompt": "define",
        "options": {},
        "resource": "assistant",
        "assistantId": {
          "__rl": true,
          "mode": "list",
          "value": "asst_aYEHuzWeFxMBN2qu4FnXRsJ4",
          "cachedResultName": "Social Media Writer"
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "32074dfb-45bd-4031-b00d-d8da9a95157c",
      "name": "Get Page",
      "type": "n8n-nodes-base.airtop",
      "position": [
        -3980,
        1040
      ],
      "parameters": {
        "url": "={{ $json['Page URL'] }}",
        "resource": "extraction",
        "operation": "scrape",
        "sessionMode": "new"
      },
      "credentials": {
        "airtopApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "aaba088d-91e4-4f56-bc20-7de6db109448",
  "connections": {
    "Get Page": {
      "main": [
        [
          {
            "node": "Set Params",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Post": {
      "main": [
        [
          {
            "node": "Human Revision of Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Post1": {
      "main": [
        [
          {
            "node": "Generate Post Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Params": {
      "main": [
        [
          {
            "node": "Generate Post Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Image": {
      "main": [
        [
          {
            "node": "Set Image Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Image Prompt": {
      "main": [
        [
          {
            "node": "Image Prompt Generator",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Check Post Text Feedback",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Set Image Prompt1": {
      "main": [
        [
          {
            "node": "Generate on-brand image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Image Prompt2": {
      "main": [
        [
          {
            "node": "Generate on-brand image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Post Text": {
      "main": [
        [
          {
            "node": "Set Post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On form submission": {
      "main": [
        [
          {
            "node": "Get Page",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Check Image Feedback",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Check Image Feedback": {
      "main": [
        [
          {
            "node": "Set Image Prompt2",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Final Version",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Human Review of Visual": {
      "main": [
        [
          {
            "node": "Check Image Feedback",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Human Revision of Text": {
      "main": [
        [
          {
            "node": "Check Post Text Feedback",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Image Prompt Generator": {
      "main": [
        [
          {
            "node": "Set Image Prompt1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate on-brand image": {
      "main": [
        [
          {
            "node": "Human Review of Visual",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Post Text Feedback": {
      "main": [
        [
          {
            "node": "Set Post1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set Image Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

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

Pro

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

About this workflow

Turn any web page into a compelling LinkedIn post — complete with an AI-generated image. This automation is ideal for sharing content like blog posts, case studies, or product updates in a polished and engaging format.

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

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

Turn any web page into a compelling LinkedIn post — complete with an AI-generated image. This automation is ideal for sharing content like blog posts, case studies, or product updates in a polished an

Form Trigger, OpenAI Chat, Text Classifier +3
AI & RAG

Email Automation AI-Powered Operations Internal Productivity Tools

Gmail Trigger, Text Classifier, OpenAI Chat +3
AI & RAG

This n8n template demonstrates how to automate email classification, labeling, draft generation, and logging using Gmail, OpenAI, and Google Sheets. Use cases include customer support management, sale

Gmail Trigger, Gmail, Text Classifier +4
AI & RAG

This n8n template uses AI to automatically classify incoming Gmail messages into five categories and route them to the right people or departments. It can also reply automatically and send WhatsApp al

Gmail Trigger, OpenAI Chat, Gmail +3
AI & RAG

Detects new unread Gmail messages Extracts sender name for personalized replies Classifies the email into one of four categories Applies the correct Gmail label and either sends an auto-reply, creates

Gmail Trigger, OpenAI Chat, Gmail +4