AutomationFlowsSocial Media › Automate Blog-to-social Media with Gpt-4 for Linkedin, X, and Reddit

Automate Blog-to-social Media with Gpt-4 for Linkedin, X, and Reddit

ByLe Nguyen @leeseifer on n8n.io

Turn your blog into a set-and-forget content engine: every new article is instantly repurposed into channel-specific social posts with visuals, keeping your brand visible on LinkedIn, X, and Reddit without extra copywriting time. Perfect for lean marketing teams who want…

Event trigger★★★★★ complexityAI-powered51 nodesHTTP RequestOpenAILinkedInTwitterRSS Feed ReadPostgresReddit
Social Media Trigger: Event Nodes: 51 Complexity: ★★★★★ AI nodes: yes Added:

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

This workflow follows the HTTP Request → LinkedIn 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
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "209c18c8-03e4-492b-bc2b-18e345a8cf3a",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1840,
        -112
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "eabdd51c-8553-43b8-95c8-79506a3fc1fe",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1312,
        -1696
      ],
      "parameters": {
        "url": "={{ $json.link }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "5b6efe7e-3020-40eb-9770-7de714fdff42",
      "name": "HTML",
      "type": "n8n-nodes-base.html",
      "position": [
        -1040,
        -1696
      ],
      "parameters": {
        "options": {
          "trimValues": true,
          "cleanUpText": true
        },
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "content",
              "cssSelector": "body"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "9c49c24e-53c5-45e3-8ec1-b65f314fa825",
      "name": "Message a model",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -832,
        -1696
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1",
          "cachedResultName": "GPT-4.1"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "=You are an AI content automation expert specializing in transforming blog articles into multi-platform social media campaigns. Your task is to process a given blog article (via URL, RSS feed, or manual content input), extract key elements, and generate unique social media posts tailored for LinkedIn, X (formerly Twitter), and Reddit. Each post should be original, engaging, and optimized for the platform's audience. Additionally, for each post, suggest a descriptive prompt for AI-generated images (suitable for tools like DALL-E or Midjourney), and include 3-5 relevant hashtags.\nInput:\n\nArticle URL: {{ $('Set Link').item.json.link }}\nArticle Content: {{ $json.content }}\n\nSteps to Process:\n\nIf only URL is provided, fetch and extract the article's full content, title, and a short description (50-100 words summarizing the main topic).\nIdentify the core themes, key ideas, quotes, statistics, and calls-to-action from the article.\nGenerate 1 post per platform:\n\nLinkedIn (Professional tone): Focus on insights, career advice, industry trends. Use confident, clear language with short paragraphs, natural line breaks, 2-4 emojis integrated naturally, 120-220 words per post. Spark networking and discussion.\nX/Twitter (Concise, engaging tone): Keep under 280 characters, witty, provocative, use threads if needed for depth. Include 1-2 emojis, questions to encourage replies/retweets.\nReddit (Conversational, community-focused): Informal, relatable, encourage upvotes/comments. Use storytelling, questions like \"What do you think?\" or \"Has anyone experienced this?\" 100-300 words, with 1-3 emojis.\n\n\nFor each post, create an AI image prompt: A detailed, vivid description (e.g., \"A futuristic cityscape with AI robots collaborating on content creation, in vibrant blues and greens\") to generate a relevant visual.\nAdd 3-5 platform-appropriate hashtags to each post (e.g., #AIContent #SocialMedia for all, but tailor like #LinkedInTips for LinkedIn).\n\n\nOutput strictly in this JSON structure:\n{\n\"title\": \"Extracted article title\",\n\"description\": \"Short 50-100 word summary of the article\",\n\"original_url\": \"The article's URL\",\n\"linkedin_posts\": [\n{\n\"post\": \"Full text of the LinkedIn post with hashtags\",\n\"image_prompt\": \"AI image generation prompt\"\n},\n\n],\n\"x_posts\": [\n{\n\"post\": \"Full text of the X post\",\n\"image_prompt\": \"AI image generation prompt  with hashtags\"\n},\n],\n\"reddit_posts\": [\n{\n\"post\": \"Full text of the Reddit post\",\n\"image_prompt\": \"AI image generation prompt with hashtags\"\n},\n]\n}\nEnsure all posts are unique, avoid repetition, and align with the article's content to drive engagement and traffic back to the original URL. If fetching content, handle errors gracefully by noting \"Content fetch failed; using provided summary.\"\n`"
            }
          ]
        },
        "jsonOutput": true
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "89e1376e-6c91-4861-b09d-b344d2b2cd64",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        -1328,
        -112
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "51c843ac-ee7e-43d0-9832-d80fbd779af8",
              "name": "link",
              "type": "string",
              "value": "https://[article-url]"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "8965425b-8ead-4e04-bd5d-72d128f0d211",
      "name": "Create a post",
      "type": "n8n-nodes-base.linkedIn",
      "position": [
        304,
        -1552
      ],
      "parameters": {
        "text": "={{ $('Message a model').item.json.message.content.linkedin_posts[0].post }}",
        "person": "MTVd0ILGtv",
        "additionalFields": {
          "title": "={{ $('Message a model').item.json.message.content.title }}",
          "visibility": "PUBLIC",
          "description": "={{ $('Message a model').item.json.message.content.description }}",
          "originalUrl": "={{ $('Message a model').item.json.message.content.original_url }}",
          "thumbnailBinaryPropertyName": "=data"
        },
        "shareMediaCategory": "ARTICLE"
      },
      "credentials": {
        "linkedInOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "3652ca16-5f46-44be-8527-694a700d94d1",
      "name": "Create Tweet",
      "type": "n8n-nodes-base.twitter",
      "position": [
        400,
        -1984
      ],
      "parameters": {
        "text": "={{ $('Message a model').item.json.message.content.x_posts[0].post }}",
        "additionalFields": {
          "attachments": "={{ $json.body.data.id }}"
        }
      },
      "credentials": {
        "twitterOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2
    },
    {
      "id": "f21a46f1-9067-42c9-82f7-0aeddea68215",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        -416,
        -1984
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "08873440-4a2b-4177-b36c-52af99c346cf",
      "name": "Twitter Post Media",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        128,
        -1984
      ],
      "parameters": {
        "url": "https://api.twitter.com/2/media/upload",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "fullResponse": true,
              "responseFormat": "json"
            }
          }
        },
        "sendBody": true,
        "contentType": "multipart-form-data",
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "media",
              "parameterType": "formBinaryData",
              "inputDataFieldName": "data"
            },
            {
              "name": "media_category",
              "value": "tweet_image"
            }
          ]
        },
        "nodeCredentialType": "twitterOAuth2Api"
      },
      "credentials": {
        "twitterOAuth1Api": {
          "name": "<your credential>"
        },
        "twitterOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.2
    },
    {
      "id": "3145d7f9-650d-4515-86b2-16f656545990",
      "name": "Generate Image for X",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "maxTries": 5,
      "position": [
        -128,
        -1984
      ],
      "parameters": {
        "prompt": "={{ $json.message.content.x_posts[0].image_prompt }}",
        "options": {},
        "resource": "image"
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 1.8
    },
    {
      "id": "185d4a5c-2a7b-4d10-ae6f-3ff9ca3fefde",
      "name": "Generate an image for LinkedIn",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "maxTries": 5,
      "position": [
        32,
        -1552
      ],
      "parameters": {
        "prompt": "={{ $json.message.content.linkedin_posts[0].image_prompt }}",
        "options": {},
        "resource": "image"
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 1.8
    },
    {
      "id": "e08671a8-5eeb-442c-a6f7-88cd71039fa9",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1856,
        -784
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "1f149eb1-9d76-4477-a1fb-e86f7b0bd321",
      "name": "Pass URL",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -1840,
        -1696
      ],
      "parameters": {
        "path": "6aaea32b-4e6b-47e4-98e0-2a66cb372626",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2.1
    },
    {
      "id": "247bfa59-5494-4a44-8898-508251d49001",
      "name": "RSS Read",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        -1584,
        -784
      ],
      "parameters": {
        "url": "https://lenguyensf.blog/feed/",
        "options": {
          "customFields": ""
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "de98259a-52ae-4a4d-a473-9dc57710a2ba",
      "name": "Execute a SQL query",
      "type": "n8n-nodes-base.postgres",
      "position": [
        -1312,
        -784
      ],
      "parameters": {
        "query": "INSERT INTO rss_items (guid, title, link, published_at)\nVALUES ('{{ $json.guid }}', '{{ $json.title }}','{{ $json.link }}', '{{ $json.pubDate }}')\nON CONFLICT (guid) DO NOTHING\nRETURNING link;",
        "options": {},
        "operation": "executeQuery"
      },
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.6
    },
    {
      "id": "938fb569-7997-4062-a1c4-8e6c469fc984",
      "name": "Set Link",
      "type": "n8n-nodes-base.set",
      "position": [
        -1584,
        -1696
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "51c843ac-ee7e-43d0-9832-d80fbd779af8",
              "name": "link",
              "type": "string",
              "value": "={{ $json.body.link }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "1146c4b9-c9b5-4cae-b812-f4c007b6d655",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        -1056,
        -784
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "c892a170-a37e-495c-b606-2e4f58a935e5",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.success }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "75f2e72f-cc8a-4d03-8aee-1c3f11363a4d",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -752,
        -768
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "e2e58e44-0984-4a75-a665-f7588aced953",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        1200,
        -1488
      ],
      "parameters": {
        "options": {},
        "respondWith": "allIncomingItems"
      },
      "typeVersion": 1.4
    },
    {
      "id": "74ad5974-64d3-495b-8aaa-b07d3e3223c1",
      "name": "Call Post Social",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -464,
        -768
      ],
      "parameters": {
        "url": "https://n8n.crmaiinsight.com/webhook/6aaea32b-4e6b-47e4-98e0-2a66cb372626",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "link",
              "value": "={{ $json.link }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "content-type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "24734c6e-f4b6-432b-a69f-44cdf547c128",
      "name": "Post Social Manual",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -800,
        -112
      ],
      "parameters": {
        "url": "https://n8n.crmaiinsight.com/webhook/6aaea32b-4e6b-47e4-98e0-2a66cb372626",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "link",
              "value": "={{ $json.link }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "content-type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "39b24f1c-daf8-4b2d-95f6-30cedd83e203",
      "name": "Merge Results For Response",
      "type": "n8n-nodes-base.merge",
      "position": [
        880,
        -1504
      ],
      "parameters": {
        "numberInputs": 3
      },
      "typeVersion": 3.2
    },
    {
      "id": "6a0a95fb-6467-4bf1-83fc-c05ca8e767e9",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2560,
        -2368
      ],
      "parameters": {
        "color": 5,
        "width": 544,
        "height": 576,
        "content": "## What this workflow does\n\nThis workflow auto-turns my blog posts into a multi-channel social campaign:\n\n- Source: WordPress RSS feed or a single URL.\n- Dedupes posts via Postgres so each article is processed only once.\n- Fetches the article HTML, extracts content, and sends it to OpenAI.\n- OpenAI returns:\n  - Title + short description\n  - 1 LinkedIn post\n  - 1 X/Twitter post\n  - 1 Reddit post\n  - Image prompts for LinkedIn + X\n- Posts to:\n  - LinkedIn (article share with image)\n  - X (tweet with uploaded image)\n  - Reddit (text post)\n- Returns all results as JSON to the webhook caller (for logs/monitoring).\n\nUse cases:\n- Fully automated RSS \u2192 Social\n- Manual \u201ctest one URL\u201d\n- External apps calling the webhook with a link field."
      },
      "typeVersion": 1
    },
    {
      "id": "dd6825be-0b61-4c98-85dd-dc3bd483bbc3",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2560,
        -1776
      ],
      "parameters": {
        "color": 5,
        "width": 544,
        "height": 832,
        "content": "## Prerequisites & Setup\n\nCredentials needed:\n\n- OpenAI \u2013 for text + image generation (Message a model, Generate Image for X, Generate an image for LinkedIn).\n- Postgres \u2013 for RSS deduplication.\n- LinkedIn OAuth2 \u2013 for the \u201cCreate a post\u201d node.\n- X/Twitter OAuth2 + OAuth1 \u2013 for tweet + media upload (Twitter Post Media, Create Tweet).\n- Reddit OAuth2 \u2013 for Create a post1.\n\nPostgres table (schema):\n\nCREATE TABLE rss_items (\n  guid TEXT PRIMARY KEY,\n  title TEXT,\n  link TEXT,\n  published_at TEXT\n);\n\n- guid must be unique so ON CONFLICT (guid) DO NOTHING works correctly.\n\nBlog & endpoints:\n\n- RSS feed URL set in RSS Read:\n  [RSS Feds URL]\n- Webhook path used by Pass URL and internal HTTP nodes:\n  [Pass URL Webhook]\n\nModel & limits:\n\n- Message a model uses gpt-4.1 with JSON output.\n- Image nodes use the OpenAI image API.\n- Make sure:\n  - API key is valid\n  - Sufficient quota / rate limits\n  - Response respects the JSON schema (title, description, posts, image prompts)."
      },
      "typeVersion": 1
    },
    {
      "id": "862e2ef0-cc10-4467-b6c4-21c1d37e437d",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2560,
        -912
      ],
      "parameters": {
        "color": 4,
        "width": 544,
        "height": 1376,
        "content": "## How to run & test\n\nManual test mode:\n\n1. Open the workflow in n8n.\n2. In Edit Fields, set link to a specific blog post URL.\n3. Execute starting from When clicking \u2018Execute workflow\u2019.\n4. Confirm:\n   - Article is fetched and parsed.\n   - OpenAI returns the correct JSON.\n   - Posts appear on LinkedIn/X/Reddit.\n   - Execution data shows responses from each social node.\n\nScheduled RSS mode:\n\n1. Ensure the Postgres table exists and credentials work.\n2. In Schedule Trigger, set your desired interval (e.g., every hour).\n3. Enable the workflow.\n4. The flow will:\n   - Poll RSS\n   - Insert new items into Postgres\n   - For new posts, call the webhook branch to generate and publish content.\n\nWebhook mode (external caller):\n\n1. Use the Pass URL endpoint:\n   - Method: POST\n   - Path: /webhook/[webhook url]\n2. Send a request with link (this workflow currently uses multipart form-data for body parameters).\n3. Workflow will:\n   - Fetch article\n   - Generate platform-specific posts + images\n   - Publish to LinkedIn, X, Reddit\n   - Return merged JSON via Respond to Webhook.\n\nDebug tips:\n\n- If no posts are created:\n  - Check Message a model output shape (must match JSON structure).\n  - Verify link traverses: Webhook \u2192 Set Link \u2192 HTTP Request \u2192 HTML \u2192 Message a model.\n- If RSS items are skipped:\n  - Inspect SQL node output:\n    - If RETURNING link is empty, the item already exists.\n  - Confirm guid uniqueness in the table.\n- If social posting fails:\n  - Re-check OAuth credentials and token scopes.\n  - For X:\n    - Make sure media upload returns a valid media_id.\n  - For LinkedIn:\n    - Ensure person URN is correct.\n  - For Reddit:\n    - Verify subreddit / user posting permissions."
      },
      "typeVersion": 1
    },
    {
      "id": "360b1646-6f1f-412b-b842-2f6ef6ad496b",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1920,
        -368
      ],
      "parameters": {
        "height": 240,
        "content": "## When clicking \u2018Execute workflow\u2019\n**Purpose:** Manual test entry.  \n**Why:** Lets you verify end-to-end without waiting for RSS/schedules.  \n**What to check:** After run, the `Edit Fields` node must set a valid `link`."
      },
      "typeVersion": 1
    },
    {
      "id": "68af055f-e35e-4c2e-bb15-4baf086f9a5c",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1408,
        -368
      ],
      "parameters": {
        "height": 240,
        "content": "## Edit Fields\n**Purpose:** Inject a test `link` value.  \n**Why:** Guarantees downstream nodes always have a URL during manual tests.  \n**Tip:** Swap the hard-coded URL before each test to avoid re-posting the same article."
      },
      "typeVersion": 1
    },
    {
      "id": "c7587d2c-d108-4b67-ac99-ac8451a83cf5",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -880,
        -368
      ],
      "parameters": {
        "height": 240,
        "content": "## Post Social Manual (HTTP Request)\n**Purpose:** Calls the internal webhook with the test `link`.  \n**Why:** Reuses the exact same posting path as RSS/webhook to keep logic DRY.  \n**I/O:** Sends `link` (multipart form-data) \u2192 triggers the \u201cPass URL\u201d branch."
      },
      "typeVersion": 1
    },
    {
      "id": "69aa7b45-6ba9-4524-9778-8ec36399965d",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1936,
        -1984
      ],
      "parameters": {
        "width": 256,
        "height": 272,
        "content": "## Pass URL (Webhook)\n**Purpose:** External + internal entry point to post a single article.  \n**Why:** Decouples ingestion from posting so other tools/workflows can trigger it.  \n**I/O:** Expects body param `link`. Responds via \u201cRespond to Webhook\u201d at the end."
      },
      "typeVersion": 1
    },
    {
      "id": "b6e59725-df96-48d6-be7c-d3403da0ec00",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1664,
        -1984
      ],
      "parameters": {
        "width": 256,
        "height": 272,
        "content": "## Set Link\n**Purpose:** Normalize incoming data to a `link` field.  \n**Why:** Ensures downstream nodes reference one consistent property.  \n**Tip:** If you change the param name in callers, update this node mapping.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "33bc41fd-0c61-421b-897c-de0b8b5f12b4",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1392,
        -1984
      ],
      "parameters": {
        "width": 256,
        "height": 272,
        "content": "\n## HTTP Request\n**Purpose:** Fetch the article HTML from `{{$json.link}}`.  \n**Why:** Reliable source content beats scraping fragments from RSS.  \n**Failure tips:** 4xx/5xx? Check URL, robots, or add headers (user-agent)."
      },
      "typeVersion": 1
    },
    {
      "id": "23e156b7-26b8-4355-8a0a-6c99c0f77060",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1120,
        -1984
      ],
      "parameters": {
        "width": 256,
        "height": 272,
        "content": "## HTML\n**Purpose:** Extract clean text (`content`) from `<body>`.  \n**Why:** LLMs perform better on de-noised, trimmed input.  \n**Tip:** Adjust selector or cleanup if your site uses heavy wrappers."
      },
      "typeVersion": 1
    },
    {
      "id": "95086bbd-7ba0-4ff9-98a7-0a8e184bae06",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -848,
        -1984
      ],
      "parameters": {
        "width": 256,
        "height": 272,
        "content": "\n## Message a model\n**Purpose:** Turn article into platform-specific posts + image prompts (JSON).  \n**Why:** Single LLM call keeps speed + consistency across channels.  \n**Guardrails:** Enforce JSON output; handle \u201cContent fetch failed\u201d fallback."
      },
      "typeVersion": 1
    },
    {
      "id": "9854689b-e234-4cae-a26b-1b42ecb7b8c6",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -496,
        -2208
      ],
      "parameters": {
        "width": 256,
        "height": 208,
        "content": "## Wait\n**Purpose:** Small delay before image/Twitter media steps.  \n**Why:** Helps avoid rate bursts and sequencing issues.  \n**Tip:** Reduce if your account limits are generous."
      },
      "typeVersion": 1
    },
    {
      "id": "d08c875f-e430-4574-8922-e49e372a7d1c",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -224,
        -2208
      ],
      "parameters": {
        "width": 256,
        "height": 208,
        "content": "## Generate Image for X\n**Purpose:** Create X/Twitter image from the model\u2019s `image_prompt`.  \n**Why:** Visuals lift engagement and CTR on social feeds.  \n**Output:** Binary `data` used by `Twitter Post Media`."
      },
      "typeVersion": 1
    },
    {
      "id": "4bf152bc-7792-4f1a-80d2-8715c2637d2c",
      "name": "Sticky Note14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        48,
        -2208
      ],
      "parameters": {
        "width": 256,
        "height": 208,
        "content": "## Twitter Post Media\n**Purpose:** Upload the generated image to X; returns `media_id`.  \n**Why:** X requires a media upload step before tweeting.  \n**Failure tips:** Ensure OAuth1 is configured and file size limits are respected."
      },
      "typeVersion": 1
    },
    {
      "id": "aca76211-2eff-4602-b2d8-e38dcdd94038",
      "name": "Sticky Note15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        -2192
      ],
      "parameters": {
        "width": 256,
        "height": 192,
        "content": "## Create Tweet\n**Purpose:** Publish the tweet with text + `media_id`.  \n**Why:** Completes the X workflow with visual content.  \n**Tip:** If attachments fail, inspect the previous node\u2019s full response."
      },
      "typeVersion": 1
    },
    {
      "id": "51f13938-6034-48ec-915d-96988a68ce2a",
      "name": "Sticky Note16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -320,
        -1792
      ],
      "parameters": {
        "width": 256,
        "height": 208,
        "content": "## Wait 5s\n**Purpose:** Small delay before LinkedIn image generation.  \n**Why:** Staggers API calls to reduce throttling.  \n**Note:** Tune based on your OpenAI + LinkedIn rate limits."
      },
      "typeVersion": 1
    },
    {
      "id": "28821e4b-e01a-4023-8eb6-57d8de30823a",
      "name": "Sticky Note17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        -1792
      ],
      "parameters": {
        "width": 256,
        "height": 208,
        "content": "## Generate an image for LinkedIn\n**Purpose:** Create LinkedIn thumbnail from its `image_prompt`.  \n**Why:** Rich preview increases dwell time and clicks.  \n**Output:** Binary `data` consumed by LinkedIn post."
      },
      "typeVersion": 1
    },
    {
      "id": "5d029e3c-0d0e-4333-b970-99f959549e8f",
      "name": "Sticky Note18",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        224,
        -1792
      ],
      "parameters": {
        "width": 256,
        "height": 208,
        "content": "## Create a post (LinkedIn)\n**Purpose:** Publish LinkedIn post with text, title, description, link, and thumbnail.  \n**Why:** Drives professional audience back to the article.  \n**Tip:** Verify `person` URN and visibility; failures often come from auth scope."
      },
      "typeVersion": 1
    },
    {
      "id": "d54d2496-4cb5-45fb-8a65-62b6793468ac",
      "name": "Post Reddit",
      "type": "n8n-nodes-base.reddit",
      "position": [
        -48,
        -1088
      ],
      "parameters": {
        "text": "={{ $json.message.content.reddit_posts[0].post }}",
        "title": "={{ $json.message.content.title }}",
        "subreddit": "[subreddit]"
      },
      "credentials": {
        "redditOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f8b8f5b1-d641-4c7b-bcd8-c08641d33c9b",
      "name": "Sticky Note19",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        -1328
      ],
      "parameters": {
        "width": 256,
        "height": 208,
        "content": "\n## Post Reddit (Reddit)\n**Purpose:** Submit the Reddit text post (user profile via `u_leeseifer`).  \n**Why:** Tap into communities for discussion-driven reach.  \n**Tip:** If posting to a subreddit later, ensure rules/permissions first."
      },
      "typeVersion": 1
    },
    {
      "id": "737d66f4-1c6f-4613-b325-3e2580d71aca",
      "name": "Sticky Note20",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        800,
        -1744
      ],
      "parameters": {
        "width": 272,
        "height": 208,
        "content": "\n## Merge Results For Response\n**Purpose:** Consolidate results from X, LinkedIn, and Reddit.  \n**Why:** Single combined payload simplifies logging + responses.  \n**Tip:** If something is missing here, inspect the earlier branch outputs."
      },
      "typeVersion": 1
    },
    {
      "id": "b2f3f28a-b2c6-4af1-9aeb-1b63e91e855b",
      "name": "Sticky Note21",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        -1744
      ],
      "parameters": {
        "width": 272,
        "height": 208,
        "content": "## Respond to Webhook\n**Purpose:** Return merged results to the original webhook caller.  \n**Why:** Provides a consistent, machine-readable completion summary.  \n**Tip:** Great place to capture for monitoring/alerts dashboards."
      },
      "typeVersion": 1
    },
    {
      "id": "bce61052-fe36-484a-903c-f4d2815f5776",
      "name": "Wait 5s",
      "type": "n8n-nodes-base.wait",
      "position": [
        -240,
        -1552
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "6b087fab-389d-4209-bdc5-859faea5714e",
      "name": "Sticky Note22",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1936,
        -1088
      ],
      "parameters": {
        "width": 256,
        "height": 272,
        "content": "## Pass URL (Webhook)\n**Purpose:** External + internal entry point to post a single article.  \n**Why:** Decouples ingestion from posting so other tools/workflows can trigger it.  \n**I/O:** Expects body param `link`. Responds via \u201cRespond to Webhook\u201d at the end."
      },
      "typeVersion": 1
    },
    {
      "id": "bd99d72c-f54d-4c44-93f2-2e7bb0ffa368",
      "name": "Sticky Note23",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1664,
        -1088
      ],
      "parameters": {
        "width": 256,
        "height": 272,
        "content": "## RSS Read\n**Purpose:** Pull recent items from your blog feed.  \n**Why:** Standard, low-friction way to detect new articles.  \n**Output:** Items with `guid`, `title`, `link`, `pubDate` for dedupe."
      },
      "typeVersion": 1
    },
    {
      "id": "d1ac97a2-0f57-4fa8-9628-de66dff6bc70",
      "name": "Sticky Note24",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1392,
        -1088
      ],
      "parameters": {
        "width": 256,
        "height": 272,
        "content": "## Execute a SQL query (Postgres)\n**Purpose:** Insert new RSS items and return `link` for only the new ones.  \n**Why:** `ON CONFLICT (guid) DO NOTHING` guarantees one-time posting.  \n**Schema:** `guid PRIMARY KEY, title, link, published_at`.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "18fc8e47-c007-405f-9335-8071b306958d",
      "name": "Sticky Note25",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1120,
        -1088
      ],
      "parameters": {
        "width": 256,
        "height": 272,
        "content": "## If\n**Purpose:** Route only items where the SQL `RETURNING link` indicates \u201cnew\u201d.  \n**Why:** Prevents duplicates from reaching the posting branch.  \n**Tip:** If all items skip, check table keys and `guid` consistency."
      },
      "typeVersion": 1
    },
    {
      "id": "7369c424-da03-47d6-8461-5a4f599c73a8",
      "name": "Sticky Note26",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -848,
        -1088
      ],
      "parameters": {
        "width": 288,
        "height": 272,
        "content": "## Loop Over Items (Split In Batches)\n**Purpose:** Process new items in manageable batches.  \n**Why:** Controls throughput and avoids API spikes.  \n**Tip:** Adjust batch size/interval for your posting cadence."
      },
      "typeVersion": 1
    },
    {
      "id": "f57b4a17-7014-43e6-b2f7-7ddd1270f42a",
      "name": "Sticky Note27",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -544,
        -1088
      ],
      "parameters": {
        "width": 256,
        "height": 272,
        "content": "## Call Post Social (HTTP Request)\n**Purpose:** For each new RSS item, invoke the same webhook posting path.  \n**Why:** Reuse logic; keep RSS and manual/webhook paths identical.  \n**I/O:** Sends `link` \u2192 flows back into \u201cPass URL\u201d."
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "If": {
      "main": [
        [],
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTML": {
      "main": [
        [
          {
            "node": "Message a model",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Generate Image for X",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 5s": {
      "main": [
        [
          {
            "node": "Generate an image for LinkedIn",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pass URL": {
      "main": [
        [
          {
            "node": "Set Link",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSS Read": {
      "main": [
        [
          {
            "node": "Execute a SQL query",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Link": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Post Social Manual",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post Reddit": {
      "main": [
        [
          {
            "node": "Merge Results For Response",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Create Tweet": {
      "main": [
        [
          {
            "node": "Merge Results For Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create a post": {
      "main": [
        [
          {
            "node": "Merge Results For Response",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Call Post Social",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Message a model": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          },
          {
            "node": "Wait 5s",
            "type": "main",
            "index": 0
          },
          {
            "node": "Post Reddit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Call Post Social": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "RSS Read",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Twitter Post Media": {
      "main": [
        [
          {
            "node": "Create Tweet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute a SQL query": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Image for X": {
      "main": [
        [
          {
            "node": "Twitter Post Media",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Results For Response": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate an image for LinkedIn": {
      "main": [
        [
          {
            "node": "Create a post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "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 your blog into a set-and-forget content engine: every new article is instantly repurposed into channel-specific social posts with visuals, keeping your brand visible on LinkedIn, X, and Reddit without extra copywriting time. Perfect for lean marketing teams who want…

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

More Social Media workflows → · Browse all categories →

Related workflows

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

Social Media

This workflow is built for creators, solopreneurs, SaaS founders, and agencies looking to automate their social media content process from idea to publication. It combines the power of OpenAI, Google

OpenAI Chat, Tool Workflow, Agent +15
Social Media

✨🤖Automated AI Powered Social Media Content Factory for X + Facebook + Instagram + LinkedIn. Uses outputParserStructured, lmChatGoogleGemini, lmChatOpenAi, httpRequest. Event-driven trigger; 57 nodes

Output Parser Structured, Google Gemini Chat, OpenAI Chat +11
Social Media

Social Media Managers and Digital Marketers seeking to streamline content production across 7+ platforms (X/Twitter, Instagram, LinkedIn, Facebook, TikTok, Threads, YouTube Shorts) using AI-powered au

Output Parser Structured, Google Gemini Chat, OpenAI Chat +11
Social Media

Hacker News to Video Template - AlexK1919. Uses manualTrigger, hackerNews, splitInBatches, lmChatOpenAi. Event-driven trigger; 48 nodes.

Hacker News, OpenAI Chat, Tool Http Request +11
Social Media

This workflow converts trending articles from Hacker News into engaging video content. It integrates AI-based tools to analyze, summarize, and generate multimedia content, making it ideal for content

Hacker News, OpenAI Chat, Tool Http Request +11