Quick overview
This workflow runs every 15 minutes to read “Ready” rows from a Google Sheets post calendar, validates text, links, and media with Preflight against each network’s rules, and then schedules or queues approved posts while writing status, post IDs, and issues back to the sheet.
How it works
- Runs every 15 minutes on a schedule.
- Reads rows from the Google Sheets “Posts” tab where the Status column is set to
Ready.
- If a Media URL is provided, uploads the file to Preflight and waits for it to be processed.
- Sends the post text, channels, optional link, and uploaded media ID to Preflight to validate the content against each social network’s rules.
- If validation passes, creates a post in Preflight either scheduled for the sheet’s “Publish At” time or queued when “Publish At” is empty, using an idempotency key based on the row number and text hash.
- Updates the Google Sheet row to
Scheduled with the Preflight Post ID when creation succeeds, or to Needs fix/Error with detailed issues when validation or publishing fails.
Setup
- Install the community node
n8n-nodes-preflight and create a Preflight API key with posts:read, posts:write, posts:publish, media:read, and media:write scopes, then add it as a Preflight credential in n8n.
- Add a Google Sheets OAuth2 credential in n8n.
- Create a Google Sheet with a tab named
Posts and columns Text, Channels, Publish At, Media URL, Link, Status, Preflight Post ID, and Issues.
- Update the sheet URL in the workflow configuration (and optionally set defaultChannels) so the workflow reads from and writes to your spreadsheet.
Requirements
- The verified community node Preflight (n8n-nodes-preflight 0.1.1 or later), installed from the nodes panel: https://www.npmjs.com/package/n8n-nodes-preflight
- A Preflight account (the free plan works) with your social accounts connected
- A Google account with edit access to the sheet, for the Google Sheets credential
Customization
- Channels: use network names such as bluesky, linkedin, or platform:channelId for two accounts on one network. An empty cell uses defaultChannels from Configuration.
- Publish At (2026-11-02 09:30) uses the workflow's time zone, set under Workflow settings. An empty cell queues the post for the channel's next free slot.
- Add an e-mail or Slack step after Mark Needs fix and Mark Error if someone should hear about a refused row at once.
Additional info
Tested on n8n Cloud 2.45.7 with n8n-nodes-preflight 0.1.1, with the exact JSON and a real Google Sheet: a scheduled row with an image, a queued row, a row too long for Bluesky, a bad date, a file URL returning 404, a row that is not Ready, a corrected row, and a row set back to Ready, which returned the same post instead of a duplicate. Limitation: a row refused by a network stays Needs fix until someone edits it and sets it to Ready again. Image of the workflow: https://raw.githubusercontent.com/Preflight-Social/n8n-nodes-preflight/main/templates/images/02-google-sheets-calendar.png