# 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.

- Workflow type: code
- Services: Airtable, bundle.social
- Categories: Marketing, Operations
- Published: 2026-08-07

## What it does

- 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 you'll need

- 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

## Prompt

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.

## How to customize

- 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

## FAQ

### Could this ever post the same thing twice?

No. Each scheduled post is tagged with the identity of the calendar row that created it, and the row is only picked up when its status is Approved and its post field is still empty. If the workflow runs twice, or a run is retried after an error, the same row cannot turn into a second post.

### What happens to rows that are still drafts?

Nothing. Only rows marked Approved are touched. Anything still in progress, waiting on review or rejected is left completely alone, which is what makes the calendar safe to use as a working space.

### Which social channels does this work with?

bundle.social publishes to 15 platforms including Instagram, Facebook, LinkedIn, TikTok, YouTube, X, Threads, Pinterest, Reddit and Bluesky. Each calendar row picks its own channels, so one post can go to a single network and the next can go to six.

### Do I have to rebuild my content calendar?

No, but it does need a few specific columns: a status, a publish date and time, a channel picker, an image, and an empty column for the workflow to write back to. Most existing calendars already have the first four.

### What if a row is missing its image or its publish time?

It gets skipped and left as Approved, so nothing incomplete goes out. The row stays visible as still waiting, and it will be scheduled on a later run once someone fills in the missing piece.

### Can my calendar live in Notion instead of Airtable?

Yes. The same pattern works with a Notion database as the source of truth. The calendar just needs the same handful of fields, and approval still drives everything.

Use this prompt in General Input: https://www.generalinput.com/prompts/turn-approved-airtable-calendar-rows-into-scheduled-social-posts