What this workflow does
- Every 15 minutes starts a run.
- Find briefs ready to draft searches the Airtable calendar for rows with status Ready to Draft that are not paused.
- Draft captions and alt text sends each brief to Claude with your voice guide and per-network rules. A strict JSON schema returns a caption per selected network, alt text and an optional first comment.
- Validate drafts checks every caption against network character limits, confirms the link is present where it should be, checks the image aspect ratio from the Airtable attachment, and requires alt text. Failures, refusals, truncated replies and responses with no text block go to Slack with the reason.
- Save drafts for approval writes the captions to the row and sets status to Needs Approval.
- Loop Over Items handles one post at a time.
- Request approval in Slack posts a preview with Approve and queue and Request changes buttons, and waits up to 24 hours.
- Approved? sends approved posts to Queue in scheduler, which POSTs to your scheduler’s API using the Airtable record ID as an idempotency key. Mark scheduled stores the returned post ID.
- Rejected or expired approvals go to Mark changes requested, which sets the status to Changes Requested or Approval Expired. Scheduler errors go to Mark queue failed and to the alert channel.
No post reaches a network without a person approving it.
Before you import
- A current n8n version, cloud or self-hosted.
- An Airtable base with the fields listed in the template’s note, and a personal access token with read and write access to it.
- A scheduler whose plan includes API access for the networks you post to, such as Buffer or Hootsuite, or a platform API you already use. Some schedulers restrict new API applications, so confirm this first.
- An Anthropic API key and a Slack app that can post to your approval and alert channels. By default the approval buttons open an n8n confirmation page, so Slack interactivity is not required.
Setup
- Build the Calendar table from the field list in the yellow note.
- Import the JSON and attach credentials: Airtable on the five Airtable nodes, Anthropic on the Claude node, Slack on both Slack nodes, and a Header Auth credential (your scheduler’s API key) on Queue in scheduler.
- Replace
REPLACE_WITH_AIRTABLE_BASE_IDandREPLACE_WITH_AIRTABLE_TABLE_ID. - Replace
REPLACE_WITH_APPROVAL_CHANNELandREPLACE_WITH_ALERTS_CHANNEL. - Replace
REPLACE_WITH_SCHEDULER_API_URLand reshape the JSON body to match your scheduler’s documented request format. - Put your voice guide in the Claude system prompt.
Test it
Add one brief for LinkedIn and X with a 1080 by 1350 image and a link, then set it to Ready to Draft. Run the workflow. The row should fill with captions and move to Needs Approval, and a Slack preview should appear. Click Request changes and check the status. Repeat, approve, and confirm the scheduler shows a queued post and the row has a post ID. Point the URL at a test endpoint first if you do not want a real post queued.
Make it production-ready
- Pause switch. Add a workflow that unschedules every pending post through the scheduler API when a global Paused flag is set.
- Error workflow. Attach an n8n error workflow, because a failure mid-loop stops the remaining approvals for that run.
- Logging. Record approver and approval time on the row for audit.
- Rate limits. Scheduler APIs limit requests per profile; keep the retry wait and batch size of one.
- Engagement. Fetch post metrics back into the row once the scheduler exposes them.
Read the social media scheduling guide for the full calendar design and approval rules. For help connecting your scheduler, talk to us.