YouTube + SocialBu: publish everywhere, no extra work
Your video goes live on YouTube… and then the tedious part starts. Copy the link, rewrite captions for each platform, hunt for a thumbnail, upload it again, and hope you didn’t forget LinkedIn (again).
This is where YouTube SocialBu automation pays off fast. Marketing managers trying to keep a content calendar consistent feel it first, but solo creators and small teams doing client work get buried by it too.
This workflow watches for new YouTube uploads, generates fresh post copy and branded visuals, publishes through SocialBu, then confirms in Discord so you’re not guessing. You’ll see how it works, what you need, and what to tweak.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: YouTube + SocialBu: publish everywhere, no extra work
flowchart LR
subgraph sg0["Run every 10 minutes Flow"]
direction LR
n7@{ icon: "mdi:play-circle", form: "rounded", label: "Run every 10 minutes", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Fetch Youtube Channel Videos", pos: "b", h: 48 }
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Organize Items"]
n10@{ icon: "mdi:cog", form: "rounded", label: "Stop", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If new video", pos: "b", h: 48 }
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Destroy Access Token"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Accounts"]
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Upload URL"]
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Upload PDF"]
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Download Image"]
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge"]
n19["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/discord.svg' width='40' height='40' /></div><br/>Success Message"]
n20@{ icon: "mdi:location-exit", form: "rounded", label: "Stop and Error", pos: "b", h: 48 }
n22["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Organaize Output"]
n23@{ icon: "mdi:cog", form: "rounded", label: "Content drips Create Image", pos: "b", h: 48 }
n24["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>SocialBu Access Token"]
n25["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Check if Image Uploaded"]
n26@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Image Uploaded", pos: "b", h: 48 }
n27["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Organize Object"]
n28["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Post to SocialBu Connected A.."]
n29@{ icon: "mdi:robot", form: "rounded", label: "Generate Description", pos: "b", h: 48 }
n17 --> n27
n13 --> n17
n11 --> n29
n11 --> n10
n16 --> n15
n14 --> n16
n14 --> n25
n26 --> n17
n26 --> n20
n9 --> n11
n27 --> n28
n22 --> n23
n12 --> n19
n29 --> n22
n7 --> n8
n24 --> n13
n24 --> n14
n25 --> n26
n23 --> n24
n8 --> n9
n28 --> n12
end
subgraph sg1["Flow 2"]
direction LR
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>🎣 YouTube Webhook Listener"]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>✅ Send Verification Response"]
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>🔐 Validate Security Token"]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Log Response"]
n4 --> n3
n2 --> n4
n2 --> n6
end
subgraph sg2["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>📡 Subscribe to YouTube Notif.."]
n5@{ icon: "mdi:play-circle", form: "rounded", label: "Trigger every 5 days", pos: "b", h: 48 }
n5 --> n1
n0 --> n1
end
subgraph sg3["Error Flow"]
direction LR
n18["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/discord.svg' width='40' height='40' /></div><br/>Error Message"]
n21@{ icon: "mdi:play-circle", form: "rounded", label: "Error Trigger", pos: "b", h: 48 }
n21 --> n18
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n7,n0,n5,n21 trigger
class n29 ai
class n11,n26 decision
class n12,n13,n14,n15,n16,n24,n28,n2,n3,n1 api
class n9,n22,n25,n27,n4,n6 code
class n2 disabled
class n3 disabled
class n4 disabled
class n6 disabled
class n0 disabled
class n1 disabled
class n5 disabled
classDef customIcon fill:none,stroke:none
class n9,n12,n13,n14,n15,n16,n17,n19,n22,n24,n25,n27,n28,n2,n3,n4,n6,n1,n18 customIcon
The Challenge: Posting Everywhere Without Losing Hours
Repurposing a YouTube upload sounds simple until you do it every week. Each platform wants a slightly different caption, a different image size, a different tone, and it always happens when you’re already busy. One missed post becomes “we’ll do it tomorrow,” then tomorrow becomes next week, and suddenly your cross-platform reach is an accident instead of a system. Worse, manual posting is error-prone: wrong link, stale caption, missing hashtags, or a post that never actually published because an integration timed out.
It adds up fast. Here’s where it usually breaks down.
- You end up rewriting the same post 6 times, which quietly drains your creative energy before you even start the next video.
- Brand consistency slips because thumbnails, colors, and hooks get “close enough” when you’re rushing.
- Manual uploads create gaps in distribution, so the video performs well on YouTube but never gets momentum on LinkedIn, X, or Instagram.
- You don’t have a reliable confirmation loop, so you only discover failures after the day is gone.
The Fix: Auto-Repurpose YouTube Uploads and Publish via SocialBu
This workflow turns your YouTube channel into the trigger for your entire social distribution. It checks your channel’s RSS feed every 10 minutes, identifies the newest video, and confirms it hasn’t already been processed. Once a fresh upload is detected, Gemini generates platform-ready copy based on the video details, then the workflow structures that output into something you can reliably publish. Next, ContentDrips creates a branded promotional image using your thumbnail and the generated description. Finally, n8n hands everything to SocialBu, which posts across your connected platforms from one place, and sends a Discord message when the run succeeds (or when something breaks).
The workflow starts with YouTube detection (RSS plus a “new video” check). Then AI generates the caption and ContentDrips builds the visual. SocialBu receives the payload, publishes the draft, and Discord confirms the outcome so you can move on.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you publish one YouTube video each week and you want it to hit 8 SocialBu-connected platforms (LinkedIn, X, Instagram, Facebook, TikTok, Threads, Pinterest, and a second page). If manual posting takes maybe 10 minutes per platform once you include rewriting captions and uploading an image, that’s about 80 minutes per video, every week, plus check-ins to confirm it all worked. With this workflow, the “work” is basically zero after setup: the RSS check runs automatically, AI generates copy, ContentDrips produces the graphic, and SocialBu publishes while you get a Discord confirmation. Most weeks, you’ll spend your time reviewing output, not doing uploads.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- YouTube channel RSS feed to detect new uploads.
- SocialBu to publish to all connected platforms.
- ContentDrips API key (get it from your ContentDrips dashboard) to generate branded images.
- Google Gemini API access (set up in Google AI Studio or Google Cloud) for caption generation.
- Discord webhook or OAuth credentials (create it in Discord Developer Portal or channel settings) for confirmations.
Skill level: Intermediate. You’ll connect accounts, add API keys, and paste an RSS feed URL, but you won’t be writing an app.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A scheduled YouTube check runs automatically. Every 10 minutes, n8n reads your YouTube channel RSS feed and normalizes the newest item so it’s consistent for downstream steps.
A “new video” guard prevents duplicates. The workflow compares the latest video ID against the last saved one (stored via Google Sheets in this build), and it halts quietly when there’s nothing new.
AI writes the post, then the workflow shapes it. Gemini 2.5 Flash generates a fresh description, and a code step structures the output so SocialBu gets clean fields instead of messy text blobs.
A branded image is generated and uploaded. ContentDrips creates the graphic asset from your template, then n8n requests a SocialBu upload URL, fetches the image file, uploads it, and verifies the upload actually completed.
SocialBu publishes, Discord confirms. n8n pulls your connected social accounts, prepares the post payload, publishes a SocialBu draft, revokes the access token, and posts a success (or error) notice to Discord.
You can easily modify the caption style and the ContentDrips template to match each campaign, or even route different videos to different platform groups. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Trigger Type
This workflow uses both scheduled polling and webhook-based triggers to detect new YouTube videos and manage alert subscriptions.
- Open Ten Minute Schedule and set the rule to run every
10minutes (interval is already configured). - Open Five Day Scheduler and confirm the interval is
5days for renewing subscriptions. - Open Manual Launch Trigger for manual subscription testing (this node is disabled by default; enable it when needed).
- Open YouTube Webhook Receiver and confirm the Path is set to
youtube-triggerand Response Mode isresponseNode.
Step 2: Connect YouTube Alert Subscription and Verification
These nodes subscribe your channel to PubSubHubBub and validate the security token for the webhook callback.
- Open Subscribe to YouTube Alerts and set URL to
https://pubsubhubbub.appspot.com/subscribe. - In Subscribe to YouTube Alerts, set form body parameters like hub.callback to
https://your-domain/webhook/youtube-triggerand hub.topic tohttps://www.youtube.com/feeds/videos.xml?channel_id=[YOUR_ID]. - Set hub.verify_token and hub.secret to your shared secret (currently
[CONFIGURE_YOUR_TOKEN]). - Open Verify Security Token and replace
[CONFIGURE_YOUR_TOKEN]inside the code with the same secret used above. - Open Return Verification Reply and keep Response Body as
{{ $json.challenge }}so YouTube receives the correct challenge response.
Step 3: Set Up RSS Polling and New Video Detection
This path checks the channel RSS feed, normalizes the latest video, and routes only when a new video appears.
- Open Retrieve Channel RSS and set URL to
https://www.youtube.com/feeds/videos.xml?channel_id=[YOUR_ID]. - Open Normalize Video Item and keep the static data logic that stores
lastVideoIdfor de-duplication. - Open Check New Video and confirm the condition uses
{{ $json.new }}set to true. - Leave Log Webhook Payload enabled if you want to inspect incoming webhook payloads for debugging.
Step 4: Configure AI Summary and Graphic Generation
The workflow summarizes the new video with Gemini and generates a branded image using Contentdrips.
- Open Compose Video Summary and keep the prompt that formats the response as JSON. Credential Required: Connect your
googlePalmApicredentials. - Open Structure AI Output to parse the JSON response from Gemini, retaining the fallback error object.
- Open Generate Graphic Asset and set Template ID to
[YOUR_ID]. Credential Required: Connect yourcontentdripsApicredentials. - In Generate Graphic Asset, keep the image input expression
{{ $('Normalize Video Item').item.json.item.thumbnail }}and the text input{{ $json.short_description }}.
Step 5: Configure SocialBu Upload, Accounts, and Post Draft
This section uploads the generated image, verifies it, and creates a SocialBu draft post. Two parallel branches are used for speed.
- Open Request SocialBu Token and set the JSON body to your credentials:
{ "email": "[YOUR_EMAIL]", "password": "[CONFIGURE_YOUR_PASSWORD]" }. - Request SocialBu Token outputs to both Retrieve Social Accounts and Request Upload URL in parallel.
- Open Request Upload URL and keep the Authorization header as
Bearer {{ $json.authToken }}. - Request Upload URL outputs to both Fetch Generated Image and Verify Upload Status in parallel.
- Open Fetch Generated Image and keep the URL expression set to
{{ $('Generate Graphic Asset').item.json.export_url }}. - Open Upload Image File and keep Content-Type as
image/pngand Input Data Field Name asimage.png. - Open Verify Upload Status and keep the retry logic (4 retries with 5-second delay).
- Open Upload Success Check and verify it checks
{{ $json.success }}equals true. - Open Combine Streams and keep it merging the upload status and accounts list.
- Open Prepare Post Payload and retain the
publish_atlogic that schedules for current UTC + 1 minute. - Open Publish SocialBu Draft and keep the JSON body with expressions like
{{ $('Structure AI Output').first().json.post_text }}and{{ $json.attachment }}. - Open Revoke Access Token and leave the Authorization header as
Bearer {{ $('Request SocialBu Token').first().json.authToken }}. - Open Send Success Notice. Credential Required: Connect your
discordOAuth2Apicredentials.
Step 6: Add Error Handling
The workflow includes a dedicated error trigger that posts failures to Discord.
- Open Error Handler Trigger to verify it is set as the workflow error trigger in workflow settings.
- Open Send Error Alert and keep the message template referencing
{{ $json.execution.error.message }}. Credential Required: Connect yourdiscordOAuth2Apicredentials. - Review Abort With Error to ensure the error message
Could not Upload Image to Social BU after 4 retriesis acceptable for your reporting.
Step 7: Test and Activate Your Workflow
Run a full manual test to confirm data flow, then activate the schedules for production.
- Manually execute Manual Launch Trigger to test the subscription request from Subscribe to YouTube Alerts.
- Manually execute Ten Minute Schedule (or run Retrieve Channel RSS) and confirm Check New Video routes to Compose Video Summary when a new video is detected.
- Verify that Publish SocialBu Draft completes successfully and that Send Success Notice posts to your Discord channel.
- If errors occur, ensure Error Handler Trigger sends a Discord alert and inspect the error details.
- Activate the workflow once testing is successful to enable scheduled polling and subscriptions.
Watch Out For
- SocialBu credentials can expire or need specific permissions. If things break, check the token request and connected account access inside SocialBu first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Common Questions
About an hour if your accounts and API keys are ready.
Yes, but you’ll want one person comfortable with API keys and testing runs. Once credentials are connected, day-to-day use is hands-off.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Gemini API usage and any ContentDrips/SocialBu plan costs.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
You can swap the “Compose Video Summary (Gemini)” prompt to match your brand voice, add separate caption variations per platform, or change the ContentDrips template ID to fit different series. If you don’t want Google Sheets for tracking, replace the “Check New Video” storage logic with Airtable or a simple database. Many teams also customize the “Send Success Notice (Discord)” message to include the SocialBu post URLs for quick review.
Usually it’s an expired or revoked token from the “Request SocialBu Token” step. Reconnect SocialBu, then confirm your SocialBu workspace still has the social accounts attached. If failures happen only on busy days, it can also be rate limits or a file upload issue, so check the “Upload Image File” response and the “Upload Success Check” branch.
On a typical n8n Cloud plan you can run plenty of checks per day, and self-hosting removes execution caps entirely.
Often, yes, because this flow has a lot of moving parts: RSS polling, duplicate detection, AI generation, image rendering, multi-step uploads, and branching for error handling. Zapier and Make can do pieces of this, but multi-step file handling and “verify then continue” logic tends to get awkward (and pricey) as it grows. n8n also gives you full control over the payload you send into SocialBu, which matters if you want consistent formatting across platforms. The honest caveat: if you only want “YouTube upload → send a Slack message,” Zapier is simpler. Talk to an automation expert if you’re not sure which fits.
Once this is running, your YouTube upload becomes the starting gun for your entire distribution loop. Less busywork, fewer missed posts, and a Discord message that tells you it’s actually done.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.