Schedule and Auto-Publish Instagram Posts from an Airtable Calendar
An n8n workflow that reads a content calendar in Airtable, finds posts whose scheduled time has arrived, and publishes them to Instagram via the Graph API — turning a simple spreadsheet-style calendar into a free, self-hosted Instagram scheduler your whole team can plan in.
- 1
Poll the Airtable calendar
A
Schedule Triggerruns every 15 minutes. AnAirtablenode lists records with a filter formulaAND({status}='Scheduled', {scheduled_at} <= NOW())so you only pull posts that are due right now. - 2
Create the media container
For each due row, an
HTTP RequestPOSTs tohttps://graph.facebook.com/v19.0/YOUR_IG_USER_ID/mediawithimage_url(the Airtable attachment URL) and thecaption. Instagram returns a container ID that represents the unpublished post. - 3
Publish the container
A second
HTTP RequestPOSTs tohttps://graph.facebook.com/v19.0/YOUR_IG_USER_ID/media_publishwith thecreation_idfrom the previous step. This is the call that actually makes the post appear on your profile. - 4
Mark the row as posted
An
Airtableupdate node setsstatustoPostedand writes the returned media ID back to the row. Flipping status is what prevents the same post from publishing twice on the next poll. - 5
Handle failures gracefully
Enable
Continue on Failon the publish nodes and add anIFthat, on error, sets the AirtablestatustoFailedand posts the row link to Slack. Instagram containers can take a moment to process, so a failed row just gets retried or fixed — never silently lost.
Frequently asked questions
How does Instagram publishing actually work via the API?
It's a two-step process: first create a media container (POST the image URL and caption to `/media`), then publish that container (POST its ID to `/media_publish`). The workflow does both in sequence. Your image must be hosted at a public URL — Airtable attachment URLs work, or point to your own CDN.
What does the Airtable calendar need?
A table with columns for the image attachment (or URL), the caption, a `scheduled_at` datetime, and a `status` single-select (Scheduled / Posted / Failed). The workflow queries rows where status is Scheduled and scheduled_at is in the past, publishes them, then flips status to Posted so they never double-post.
Can the team collaborate without touching n8n?
That's the whole appeal. Everyone plans in Airtable — a familiar, visual calendar with grid and calendar views — while n8n runs quietly in the background. Marketers add rows, set the time, and the automation handles publishing. No one needs n8n access to schedule content.