Skip to main content

n8n Agency Workflows

Pre-built workflow patterns for agencies managing multiple clients' social media publishing at scale with IndReelForge.

Why Agencies Use IndReelForge + n8n​

ProblemSolution
Clients send assets over email/SlackMagic-link ingest workflow auto-imports to their profile
Approvals happen in spreadsheetsNotion/Airtable approval workflow gates publishing
Long-form content sits unusedAuto-clip workflow creates 60s shorts from long videos
Manual thumbnail uploads to YouTubeAI thumbnail workflow generates and attaches automatically

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

  1. Embed a Typeform/Tally form on the client's site.
  2. The form webhook fires with video_url, caption, platforms[], and profile_name.
  3. n8n calls IndReelForge and writes the upload_id back to your CRM.
  4. 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

ColumnPurpose
TitleCaption text
Video URLPublic CDN link
PlatformsComma-separated: instagram,tiktok
ProfileIndReelForge profile name
StatusDraft / Ready / Scheduled / Posted
Upload IDWritten back by n8n
Scheduled AtWritten back from API response

n8n steps

  1. Schedule Trigger — every 30 minutes
  2. Google Sheets — get rows where Status = Ready
  3. Split In Batches — process one row at a time
  4. HTTP Request — POST to IndReelForge with add_to_queue=true
  5. Google Sheets — update Status → Scheduled, write upload_id
  6. Slack — notify #social channel

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

  1. YouTube Trigger — new video published on channel
  2. HTTP — download MP4 from YouTube
  3. Execute Command — run FFmpeg to trim highlight clip:
    ffmpeg -i input.mp4 -ss 00:01:30 -t 60 -c copy clip.mp4
  4. HTTP Request — POST clip.mp4 binary to /api/upload
  5. Set node — map platforms to tiktok, instagram, youtube
info

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

  1. Notion Trigger — record status changes to Approved
  2. OpenAI — generate SEO title and description from Notion content
  3. OpenAI — DALL-E generates a 1280×720 thumbnail image
  4. 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.