How to Automate Social Media Posting Across Platforms with n8n (2025)

Posting the same idea to LinkedIn, X, Facebook, Instagram, and Threads by hand is a tax on your week. Each platform wants a different length, tone, hashtag style, and image ratio, so a single announcement becomes five copy-paste jobs plus five uploads. With n8n you can build one workflow that pulls a piece of content from a queue, rewrites it into platform-native variants with AI, waits for a one-tap human approval, and then fires it out everywhere on schedule. This guide walks through a concrete build you can replicate today, including the realistic API and access-token requirements each network imposes.

The architecture at a glance

The workflow has seven stages: a content queue, a schedule trigger, an AI adaptation step, media handling, an approval gate, the per-platform posting nodes, and a logging layer that also prevents duplicate posts. Keep them as distinct sections in your canvas so you can debug one stage without touching the rest.

  1. Content queue — Google Sheets, Airtable, or Notion holds rows of "master" content.
  2. Schedule Trigger — n8n wakes up on a cron and grabs the next ready row.
  3. AI adaptation — one master post becomes five native variants.
  4. Media handling — resize or fetch the image/video per platform.
  5. Approval gate — Slack or Telegram asks a human to confirm.
  6. Posting — native nodes or HTTP Request calls to each API.
  7. Logging & dedupe — write results back and mark the row as posted.

Step 1 — Build the content queue

Use whichever store your team already lives in. A minimal schema works well: id, master_text, image_url, publish_at, status (draft / ready / approved / posted / error), and one boolean column per platform so you can opt a post out of, say, Instagram. Airtable and Notion give you a friendlier UI for non-technical contributors; Google Sheets is the fastest to wire up. Whatever you pick, the status column is what makes the whole thing idempotent — it is your source of truth for what has already gone out.

Step 2 — Trigger and fetch the next item

Add a Schedule Trigger set to run every 15–30 minutes. Follow it with a query node (Google Sheets "Get Rows", Airtable "Search", or Notion "Get Database Pages") filtered to status = ready AND publish_at <= now. Cap it to one row per run to keep rate limits sane. If no row matches, an IF node ends the execution quietly.

Skip the plumbing and start posting today. The Content Repurposing Agent turns one article into 10 platform-native formats in 60 seconds — the exact AI adaptation engine this workflow is built around, ready to import into n8n.

Step 3 — Adapt content with an AI node

This is the heart of the automation. Feed the master_text into an AI Agent or a basic LLM node (OpenAI, Anthropic, or any model via the HTTP Request node) and ask it to return structured JSON with one field per platform. A prompt that specifies the rules for each network keeps output predictable:

  • LinkedIn — professional tone, 1–3 short paragraphs, 3 hashtags max, no clickbait.
  • X/Twitter — under 280 characters, punchy hook, one link, 1–2 hashtags.
  • Facebook — conversational, a question to drive comments, emoji allowed.
  • Instagram — caption-first, up to 30 hashtags in a block, strong first line.
  • Threads — casual and native, under 500 characters, minimal hashtags.

Force the model to return valid JSON (use a "respond in JSON" instruction plus a Structured Output Parser) so downstream nodes can read {{$json.linkedin}}, {{$json.x}}, and so on without string wrangling.

Step 4 — Handle images and media

Different networks want different aspect ratios: Instagram favors 1:1 or 4:5, X and LinkedIn are happy with 16:9, and Threads mirrors Instagram. If you keep a single source image in the queue, add an image-processing step — the Edit Image node for simple crops, or an HTTP Request to a service like Cloudinary for on-the-fly resizing. Download the binary once, then pass the correct rendition into each platform branch. For most APIs you either upload the binary as multipart form-data or first register the media and then reference the returned media ID in the post call.

Step 5 — Human approval before anything goes live

Never let AI-written copy publish unreviewed. Insert an approval gate using Slack or Telegram. The cleanest pattern is n8n's Send and Wait for Response operation: it posts the five drafts into a channel with Approve / Reject buttons and pauses the execution until someone clicks. On approve, the flow continues; on reject, set the row status back to draft and stop. This single step is what makes the system safe to run unattended overnight.

Step 6 — Post to each platform

Branch the flow after approval. Each branch either uses a dedicated node or an HTTP Request to the platform API. Here is the realistic access picture in 2025:

  • LinkedIn — requires an app with the Community Management or Share API and a user/organization OAuth token; posts go to the ugcPosts or posts endpoint.
  • X/Twitter — needs a developer account and OAuth 2.0; free tier allows limited writes via the v2 tweets endpoint, so check your monthly cap.
  • Facebook Pages — a Meta app, a Page access token, and the /{page-id}/feed or /photos Graph API endpoints.
  • Instagram — only Business/Creator accounts via the Instagram Graph API; publishing is two calls (create a media container, then publish it).
  • Threads — the official Threads API also uses a create-then-publish container flow with a Meta access token.

Wrap each posting node's branch in n8n's error handling so one failing network never blocks the others. Set the node to Continue On Fail, and capture the response so you know exactly which platform succeeded.

Step 7 — Log results, handle errors, and avoid duplicates

After the branches converge, write the outcome back to the queue: store each returned post ID or URL, set status = posted, and stamp posted_at. The status update is your duplicate guard — because Step 2 only fetches ready rows, a post that reached posted can never be picked up twice, even if the schedule fires again mid-run. For extra safety on flaky APIs, key each post on a deterministic ID (row id + platform) so a retry updates rather than re-creates.

Attach an Error Trigger workflow that catches any unhandled failure, writes status = error with the error message, and pings your Slack channel. That way a broken token surfaces immediately instead of silently skipping a day of posts.

Putting it together

The finished workflow reads like a sentence: every half hour, take the next approved-and-due piece of content, let AI shape it for each network, resize the image, ask a human for one tap, publish everywhere, and log what happened. Start with two platforms to validate your tokens, then add the rest one branch at a time. The AI adaptation step is where quality lives — invest your prompt-engineering effort there, because native-feeling copy is what turns cross-posting from spam into reach.

Ready to automate? Stop rewriting the same post five times and let the proven repurposing engine do it in 60 seconds. Get this template on Gumroad →