Turn approved Airtable calendar rows into scheduled social posts
Mark a row Approved in your content calendar and the post is scheduled on every channel you picked, at the time you picked, with no copy pasting.
Every 15 minutes, sync my Airtable content calendar into bundle.social so that approved posts get scheduled automatically and nobody has to copy paste between the two tools. Build this as a code workflow on a cron trigger. Every step is deterministic, so there is no drafting or judgement involved.
Start with Airtable List Records against my content calendar table, filtering for rows where Status is Approved and the bundle.social post id field is still empty. That pair of conditions is what makes the run safe: a row is only eligible if a human approved it and it has not already been scheduled. List Records paginates, so follow the offset until every matching row has been collected before processing any of them.
For each matching row, pull the image across first. Take the URL of the image attachment on the row and call bundle.social Create upload from URL to add it to the team media library. bundle.social posts reference an uploadId rather than a raw file or an external URL, so this upload has to happen before the post is created, and the returned uploadId is what gets attached to the post.
Then call bundle.social Create post to schedule it. Set the scheduled time from the row's Publish At field, converting to UTC. Target the platforms named in the row's multi select field, mapping each one to the bundle.social platform value such as INSTAGRAM, FACEBOOK, LINKEDIN, TWITTER, TIKTOK, YOUTUBE or THREADS. Attach the uploadId from the previous step and use the row's copy as the post text. Set referenceKey on the post to the Airtable record id. referenceKey is a caller supplied idempotency key that can be looked up afterwards with Get post by reference key, so if a run is retried, or one run overlaps the next, the same row can never become two posts.
Finally, write the result back to Airtable with Update Record on the same record id: store the returned bundle.social post id in the post id field, and flip Status from Approved to Scheduled. That write back is what stops the next run 15 minutes later from picking the same row up again, so it has to happen for every row that was scheduled successfully. Airtable Update Record is a PATCH, so only those two fields change and everything else the team put in the row is left untouched.
A few constraints to respect. Airtable create and update operations cap at 10 records per batch, so chunk the write backs rather than sending them all at once. bundle.social counts scheduled posts against the plan quota at scheduling time in UTC and drafts are exempt, so each row must be scheduled exactly once. If a row has no Publish At time, no platforms selected, or no image attachment, skip it and leave its Status as Approved rather than scheduling something incomplete. If Create post fails for a row, do not write back to Airtable for that row, so it stays eligible and the next run retries it.
What does this prompt do?
- Checks your Airtable content calendar every 15 minutes for rows that have been approved but not yet scheduled
- Sends the row's image and copy to bundle.social and schedules the post for the publish time on the row, across every channel the row lists
- Writes the result back to the calendar row and flips its status to Scheduled, so the team can see at a glance what is already booked
- Uses the calendar row itself as the identity of the post, so a retry or an overlapping run can never double post the same content
What do I need to use this?
- An Airtable base with a content calendar table, one row per planned post
- A bundle.social account with your social channels already connected
- A status field on the calendar with Approved and Scheduled as options, so approval is what releases a post
- A publish date and time field, a multi select field listing the channels for each post, and an image attachment field
- One empty text field on the calendar where the workflow can record the scheduled post it created
How can I customize it?
- Change how often it runs. Every 15 minutes suits a busy calendar, but hourly is plenty for most teams
- Rename the trigger status if your team uses something other than Approved, such as Ready or Signed off
- Add extra conditions before a row qualifies, for example only rows for a specific client, brand or campaign
- Skip the image step entirely if your calendar is text only, or require an image so nothing goes out bare
FAQs
Could this ever post the same thing twice?
What happens to rows that are still drafts?
Which social channels does this work with?
Do I have to rebuild my content calendar?
What if a row is missing its image or its publish time?
Can my calendar live in Notion instead of Airtable?
Related templates
Every Thursday, rank your team's upcoming flights by how likely they are to run late, and email the fixes while changes are still cheap.
When a content calendar row is approved, each network gets its own version of the copy, scheduled to the right connected social profiles.
Every weekday we find your newly published articles, write separate LinkedIn, X, Instagram, and Threads posts, and schedule them across the day.
When a scheduled social post fails to go out, retry it if it was a blip and ping your marketing channel when an account needs reconnecting.
Every Monday, see which posts actually worked across every social platform, what the winners have in common, and what to publish more of this week.
Every new community post, review or job listing gets scored against your policy, labeled by topic, and only the risky ones ever reach your team.
Stop copy pasting your content calendar into a scheduler.
Approve the row, and the post is already booked on every channel it needs to hit.