AutomationFlowsSlack & Telegram › AI Content Repurposing from URL

AI Content Repurposing from URL

Original n8n title: Ntf 04 - Content Repurposing

NTF 04 - Content Repurposing. Uses httpRequest, lmChatAnthropic, chainLlm, googleDocs. Webhook trigger; 10 nodes.

Webhook trigger★★★★☆ complexityAI-powered10 nodesHTTP RequestAnthropic ChatChain LlmGoogle DocsSlack
Slack & Telegram Trigger: Webhook Nodes: 10 Complexity: ★★★★☆ AI nodes: yes Added:

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

The workflow JSON

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

Download .json
{
  "name": "NTF 04 - Content Repurposing",
  "tags": [
    {
      "name": "NTF-Playbook"
    }
  ],
  "settings": {
    "executionOrder": "v1"
  },
  "nodes": [
    {
      "id": "sticky-readme",
      "name": "README",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -60,
        -520
      ],
      "parameters": {
        "content": "## NTF 04 - Content Repurposing\n\n**Trigger:** Webhook, POST with `{ url: \"https://your-blog-post\" }`\n\n**Flow:**\n1. Receive URL via webhook\n2. Extract full article text via Jina.ai Reader (free)\n3. Claude generates LinkedIn post, newsletter section, tweet thread\n4. All three drafts written to a Google Doc\n5. Slack notification with the doc link\n\n**Setup:**\n- No Jina.ai API key needed (uses public reader endpoint)\n- Connect Google Docs OAuth credential\n- Set your Google Drive folder ID for output docs\n- Edit the Claude prompt voice/tone instructions to match your brand\n- Set your Slack channel ID",
        "height": 360,
        "width": 540,
        "color": 6
      }
    },
    {
      "id": "webhook-trigger",
      "name": "Repurpose URL Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        0
      ],
      "parameters": {
        "httpMethod": "POST",
        "path": "repurpose",
        "responseMode": "responseNode",
        "options": {}
      }
    },
    {
      "id": "extract-url",
      "name": "Extract URL",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        220,
        0
      ],
      "parameters": {
        "mode": "manual",
        "assignments": {
          "assignments": [
            {
              "id": "url",
              "name": "url",
              "value": "={{ $json.body.url }}",
              "type": "string"
            }
          ]
        }
      }
    },
    {
      "id": "jina-fetch",
      "name": "Fetch Article via Jina.ai",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        440,
        0
      ],
      "parameters": {
        "method": "GET",
        "url": "=https://r.jina.ai/{{ $json.url }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "text"
            }
          }
        }
      }
    },
    {
      "id": "claude-llm",
      "name": "Claude - Repurpose Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.3,
      "position": [
        660,
        0
      ],
      "parameters": {
        "model": "claude-sonnet-4-5",
        "options": {
          "maxTokens": 2000
        }
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "id": "repurpose-chain",
      "name": "Generate Repurposed Content",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.4,
      "position": [
        660,
        0
      ],
      "parameters": {
        "promptType": "define",
        "text": "=You are a professional content strategist. Repurpose the article below into three formats.\n\nVOICE INSTRUCTIONS: Direct, professional, no buzzwords, plain English. First person. No em dashes.\n\nReturn a JSON object with these keys:\n- linkedin_post: A LinkedIn post (150-250 words). Hook first line, 3-5 bullet points or short paragraphs, CTA question at end, 5 hashtags at bottom.\n- newsletter_section: A newsletter section (200-300 words). Subheading, intro paragraph, 2-3 key points, link back to the original article.\n- tweet_thread: A tweet thread of 5-7 tweets. Number each tweet (1/, 2/, etc.). First tweet is the hook. Last tweet links to article.\n\nArticle:\n{{ $('Fetch Article via Jina.ai').item.json.data }}\n\nReturn only valid JSON. No markdown fencing."
      }
    },
    {
      "id": "parse-content",
      "name": "Parse Repurposed Content",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        880,
        0
      ],
      "parameters": {
        "jsCode": "const raw = $input.first().json.text || '{}';\nlet parsed = {};\ntry {\n  parsed = JSON.parse(raw.replace(/```json|```/g, '').trim());\n} catch(e) {\n  parsed = { linkedin_post: raw, newsletter_section: '', tweet_thread: '' };\n}\nconst url = $('Extract URL').first().json.url;\nreturn [{ json: { ...parsed, source_url: url, created_at: new Date().toISOString() } }];"
      }
    },
    {
      "id": "create-gdoc",
      "name": "Create Google Doc",
      "type": "n8n-nodes-base.googleDocs",
      "typeVersion": 2,
      "position": [
        1100,
        0
      ],
      "parameters": {
        "operation": "create",
        "title": "=Repurposed Content - {{ $now.format('YYYY-MM-DD') }}",
        "folderId": "YOUR_GOOGLE_DRIVE_FOLDER_ID",
        "content": "=REPURPOSED CONTENT\nSource: {{ $json.source_url }}\nGenerated: {{ $json.created_at }}\n\n---\n\nLINKEDIN POST\n\n{{ $json.linkedin_post }}\n\n---\n\nNEWSLETTER SECTION\n\n{{ $json.newsletter_section }}\n\n---\n\nTWEET THREAD\n\n{{ $json.tweet_thread }}"
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "id": "slack-notify",
      "name": "Slack - Doc Ready",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.3,
      "position": [
        1320,
        0
      ],
      "parameters": {
        "operation": "post",
        "channel": "YOUR_SLACK_CHANNEL_ID",
        "text": "=Content repurposed and ready to review.\nSource: {{ $('Extract URL').item.json.url }}\nDoc: {{ $json.id ? 'https://docs.google.com/document/d/' + $json.id : 'check Google Drive' }}"
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "id": "webhook-response",
      "name": "Webhook Response",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        1320,
        160
      ],
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ received: true, doc_id: $('Create Google Doc').item.json.id }) }}"
      }
    }
  ],
  "connections": {
    "Repurpose URL Webhook": {
      "main": [
        [
          {
            "node": "Extract URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract URL": {
      "main": [
        [
          {
            "node": "Fetch Article via Jina.ai",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Article via Jina.ai": {
      "main": [
        [
          {
            "node": "Generate Repurposed Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude - Repurpose Model": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Repurposed Content",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Generate Repurposed Content": {
      "main": [
        [
          {
            "node": "Parse Repurposed Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Repurposed Content": {
      "main": [
        [
          {
            "node": "Create Google Doc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Google Doc": {
      "main": [
        [
          {
            "node": "Slack - Doc Ready",
            "type": "main",
            "index": 0
          },
          {
            "node": "Webhook Response",
            "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

How this works

Transform long-form articles into engaging social media snippets effortlessly, saving hours of manual rewriting while maintaining your brand's voice. This workflow suits content creators and marketers who publish regularly and need to repurpose blog posts for platforms like Twitter or LinkedIn. It starts with a webhook capturing the source URL, then uses AI from Anthropic's Claude to generate fresh content, culminating in a new Google Doc ready for sharing.

Use this when you have a steady stream of articles to adapt quickly for multichannel distribution, especially if you're already using Google Workspace. Avoid it for highly creative or sensitive topics requiring human oversight, or when the source content is behind paywalls that Jina.ai can't access. Common variations include swapping Claude for another LLM or routing outputs directly to Slack for team review.

About this workflow

NTF 04 - Content Repurposing. Uses httpRequest, lmChatAnthropic, chainLlm, googleDocs. Webhook trigger; 10 nodes.

Source: https://github.com/MinaSaad1/n8n-content-repurposing/blob/main/workflows/01-content-repurposing.json — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

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

Slack & Telegram

Content - Short Form News Script Generator. Uses httpRequest, s3, chainLlm, slack. Scheduled trigger; 45 nodes.

HTTP Request, S3, Chain Llm +4
Slack & Telegram

Story Generation – Your idea is transformed into a narrative split into scenes using DeepSeek LLM. Visuals – Each scene is illustrated with AI images via Replicate, then animated into cinematic video

Lm Chat Deep Seek, Output Parser Structured, Chain Llm +4
Slack & Telegram

Stop finding out about updates after something breaks. Claude reads every changelog and tells you exactly what changed, what might break, and how urgent the update is — with a ready-to-run Docker upda

HTTP Request, Anthropic Chat, Chain Llm +3
Slack & Telegram

The Recap AI - VEO 3 Bigfoot Video. Uses formTrigger, lmChatAnthropic, chainLlm, slack. Event-driven trigger; 26 nodes.

Form Trigger, Anthropic Chat, Chain Llm +4
Slack & Telegram

NTF 06 - Review Monitoring Alert. Uses httpRequest, lmChatAnthropic, chainLlm, slack. Scheduled trigger; 12 nodes.

HTTP Request, Anthropic Chat, Chain Llm +2