Automated Instagram Reels posting from Airtable content calendar
Needs changesNeeds changes. This template uses 1 thing(s) that n8n 3.0 removes: Cron. 1 breaking item(s) found. Static check, last run 2026-10-19.
What to replace before upgrading
| Removed in 3.0 | Replace with |
|---|---|
| Cron Cron Trigger | Schedule Trigger |
Nodes used (6)
- Cron
n8n-nodes-base.cron - Airtable
n8n-nodes-base.airtable - Split Out
n8n-nodes-base.splitOut - Edit Fields (Set)
n8n-nodes-base.set - HTTP Request
n8n-nodes-base.httpRequest - Wait
n8n-nodes-base.wait
What it does
A guide to understand, operate, and extend the workflow. --- 1) What this workflow does (and why it’s useful) Goal: Turn a simple Airtable sheet into a content calendar that automatically publishes Instagram Reels via the Instagram Graph API, on a schedule you control in n8n. Why this matters: - Your team plans everything in Airtable (user-friendly, collaborative). - n8n posts for you at the right time, every time. - You keep full control (no third-party SaaS lock-in, no manual uploads). - Later, you can reuse the same queue to post YouTube Shorts / TikTok (omnichannel). Core flow (one row = one post): 1. Cron starts the workflow at a set time. 2. Airtable – Search grabs due rows: status = "To Post" AND scheduledat <= NOW() AND platform = "IG". 3. Split Out processes each row individually. 4. Set (Map fields) normalizes Airtable fields → videourl, caption, recordId. 5. IG: Create Media Container registers your video as REEL. 6. Wait 90s lets IG process the video. 7. IG: Publish Reel publishes the container. 8. Airtable – Update marks the row as Posted, stores igmediaid, and timestamp. --- 2) Architecture at a glance Cron → Airtable: Search records → Split Out: records → Set: Map fields → IG: Create Media Container → Wait 90s → IG: Publish Reel → Airtable: Update record Sticky Notes inside the workflow explain each step (they’re rendered from parameters.content with Markdown). --- 3) Airtable schema (recommended) Create a table (e.g., Posts) with these fields: | Field | Type | Purpose | |---------------|-----------------|-------------------------------------------------------| | videourl | URL or Text | Directly accessible (public) URL to your MP4 | | caption | Long text | Final caption (hashtags, line breaks, emojis) | | platform | Single select | Set IG for this workflow | | status | Single select | To Post → will be picked up; Posted later | | scheduledat| Date/Time (UTC) | When to post | | igmediaid | Text (optional) | Filled by n8n after publishing | | postedat | Date/Time | Filled by n8n after publishing | Filter used in the Airtable “Search records” node: AND({status}='To Post', {scheduledat}<=NOW(), {platform}='IG') > Tip: If you localize/rename fields, update the filter accordingly. --- 4) Prerequisites & credentials - Instagram Business/Creator account connected to a Facebook Page. - IG User ID for the connected account. - Long-lived IG Access Token with permissions to create and publish content. - n8n environment variables (Settings → Environments): - IGAPIVERSION (e.g., v21.0) - IGUSERID - IGACCESSTOKEN - Airtable credential in n8n using a Personal Access Token (as in your example). - A publicly accessible videourl (e.g., S3/GCS signed URL, public CDN, Drive/Dropbox direct link). The API pulls from your URL; it cannot fetch files behind logins. --- 5) Node-by-node deep dive (what each node expects/returns) A) Cron Trigger - What it does: Starts the workflow on a schedule (daily at 09:00 in the template). - How to use: Adjust hours/minutes to your cadence (hourly, twice a day, etc.). B) Airtable: Search records - Operation: search - Base/Table: Select from dropdowns (matches your account). - Options → filterByFormula: AND({status}='To Post', {scheduledat}<=NOW(), {platform}='IG') - Return: An array under records. Each record has id and fields. C) Split Out: records - What it does: Turns the records array into individual items. - Why: Downstream steps can then act on each post separately. D) Set: Map fields - What it does: Normalizes data to predictable keys and keeps the recordId. - Outputs: - recordId = {{$json.id}} - videourl = {{$json.fields.videourl}} - caption = {{$json.fields.caption}} - scheduledat = {{$json.fields.scheduledat}} E) IG: Create Media Container (REELS) - Endpoint: POST https://graph.facebook.com/{v}/{ig-user-id}/media - Body params: - videourl = {{$json.videourl}} - caption = {{$json.caption}} - mediatype=REELS - sharetofeed=true (optional) - accesstoken=${IGACCESSTOKEN} - Return: JSO