n8n Agency Workflows
Pre-built workflow patterns for agencies managing multiple clients' social media publishing at scale with IndReelForge.
Why Agencies Use IndReelForge + n8n
| Problem | Solution |
|---|---|
| Clients send assets over email/Slack | Magic-link ingest workflow auto-imports to their profile |
| Approvals happen in spreadsheets | Notion/Airtable approval workflow gates publishing |
| Long-form content sits unused | Auto-clip workflow creates 60s shorts from long videos |
| Manual thumbnail uploads to YouTube | AI thumbnail workflow generates and attaches automatically |
Workflow 1 — Magic-Link Client Onboarding
Let clients submit content without giving them dashboard access.
Webhook (client submits form) → Validate fields → HTTP Request (IndReelForge /api/upload) → Email confirmation
How it works
- Embed a Typeform/Tally form on the client's site.
- The form webhook fires with
video_url,caption,platforms[], andprofile_name. - n8n calls IndReelForge and writes the
upload_idback to your CRM. - Client receives a confirmation email with the scheduled time.
Key HTTP Request config
{
"url": "https://api.indreelforge.com/api/upload",
"method": "POST",
"headers": { "Authorization": "Apikey YOUR_KEY" },
"body": {
"user": "={{ $json.profile_name }}",
"title": "={{ $json.caption }}",
"video_url": "={{ $json.video_url }}",
"platform[]": "={{ $json.platforms }}",
"add_to_queue": "true"
}
}
Workflow 2 — Bulk Approval Pipeline
Editors queue content; a manager approves with one click before anything goes live.
Google Sheets (status=Ready) → HTTP Request (IndReelForge add_to_queue) → Sheets (mark Scheduled) → Slack (notify manager)
Recommended sheet columns
| Column | Purpose |
|---|---|
Title | Caption text |
Video URL | Public CDN link |
Platforms | Comma-separated: instagram,tiktok |
Profile | IndReelForge profile name |
Status | Draft / Ready / Scheduled / Posted |
Upload ID | Written back by n8n |
Scheduled At | Written back from API response |
n8n steps
- Schedule Trigger — every 30 minutes
- Google Sheets — get rows where Status =
Ready - Split In Batches — process one row at a time
- HTTP Request — POST to IndReelForge with
add_to_queue=true - Google Sheets — update Status →
Scheduled, writeupload_id - Slack — notify
#socialchannel
Workflow 3 — Long-Form → Short Clips
Automatically create platform-optimised clips from long videos using FFmpeg.
YouTube (new video) → Download → FFmpeg (trim 60s) → HTTP Request (IndReelForge /api/upload) → TikTok + Reels
Requirements: IndReelForge paid plan (FFmpeg access enabled).
Steps
- YouTube Trigger — new video published on channel
- HTTP — download MP4 from YouTube
- Execute Command — run FFmpeg to trim highlight clip:
ffmpeg -i input.mp4 -ss 00:01:30 -t 60 -c copy clip.mp4 - HTTP Request — POST
clip.mp4binary to/api/upload - Set node — map platforms to
tiktok,instagram,youtube
You can also pass the YouTube video URL directly to video_url and use IndReelForge's server-side FFmpeg via the /api/ffmpeg endpoint if your plan includes it.
Workflow 4 — YouTube Upload with AI Thumbnails
Generate a thumbnail with DALL-E or Stability AI and attach it to the YouTube upload.
Notion (approved) → GPT-4 (write description) → DALL-E (thumbnail) → HTTP Request (IndReelForge with thumbnail)
Steps
- Notion Trigger — record status changes to
Approved - OpenAI — generate SEO title and description from Notion content
- OpenAI — DALL-E generates a 1280×720 thumbnail image
- HTTP Request — POST to IndReelForge
/api/upload:
user = client-channel
title = {{ GPT title }}
description = {{ GPT description }}
video_url = {{ Notion.video_url }}
thumbnail_url = {{ DALL-E image URL }}
platform[] = youtube
Handling Multiple Clients
Use a single n8n workflow with a Switch node to route to the correct IndReelForge profile per client:
Trigger → Switch (client name) → Set (profile = client-a) → HTTP Request
→ Set (profile = client-b) → HTTP Request
Each client gets their own IndReelForge profile with their connected social accounts. The user field routes the upload to the right profile.
Error Handling & Retries
HTTP Request → IF (success = false) → Wait 5 min → HTTP Request (retry)
→ Slack (alert after 3 retries)
Check the response body's success field:
{
"success": false,
"error": "Platform rate limit exceeded",
"retry_after": 300
}
Use the retry_after value to set the Wait node duration before retrying.