Package Information
Available Nodes
Documentation generating…
Documentation
n8n-nodes-preflight
n8n nodes for Preflight, the social media scheduler that checks every post against each network's real publishing rules before it goes out.
Use it to validate, schedule, queue or publish posts to YouTube, TikTok, Instagram, Facebook, Threads, LinkedIn, Pinterest, Bluesky, Mastodon, Telegram, Discord and Tumblr from any n8n workflow, and to react when a post is published or fails.
n8n is a fair-code licensed workflow automation platform.
- Installation
- Credentials
- Operations
- Trigger
- Example workflows
- Usage notes
- Compatibility
- Resources
- Version history
Installation
Follow the installation guide in the n8n community nodes documentation and install n8n-nodes-preflight.
The package has no runtime dependencies. Every release is built and published by GitHub Actions with npm provenance.
Credentials
Sign in to Preflight (every plan, Free included, has API access) and connect your social accounts there. Accounts are connected in the Preflight app, not through the API.
Go to Settings → API keys and create a key. Give it the scopes your workflows need:
Scope Needed for posts:readChannels, Get / Get Many posts, queue times, and the credential test posts:writeDrafts, Update and Delete of drafts posts:publishAnything that goes live: scheduling, queueing, publishing now, retrying media:read,media:writeMedia → Upload / Get / Delete webhooks:read,webhooks:writeThe Preflight Trigger In n8n, create a Preflight API credential and paste the key. Leave Base URL as
https://preflight.socialunless you run Preflight somewhere else.
The credential test calls GET /v1/oauth/accounts, so the key needs posts:read for the test to pass.
Operations
Post
| Operation | What it does |
|---|---|
| Validate | Dry-runs the post against every chosen network: text length counted the network's way, hashtags, mentions, links, number and type of files, video length, frame rate and aspect ratio, required options (TikTok privacy, Pinterest board, YouTube title) and your plan's allowance. Returns ok, errorCount, warningCount and issues[]. Turn on Fail on Errors to stop the workflow instead. |
| Create | Creates a post. When: Draft (for a person to review), Scheduled Time, Scheduled Local Time per Channel, Queue (next free slot of each channel's schedule) or Publish Now. Preflight runs the same checks as Validate and refuses a post that would fail. |
| Get | One post with its per-network status, links, errors and figures. |
| Get Many | Posts, newest first, with status and date filters. |
| Update | Text, link, files, time or channels of a post that has not gone out. |
| Delete | Deletes a draft or cancels a scheduled post. Anything already published stays on the networks. |
| Retry | Sends the post again to the channels where it failed, or to one channel by target ID. |
Media
| Operation | What it does |
|---|---|
| Upload | From a public URL (Preflight downloads it; nothing passes through n8n) or from binary data of a previous node (uploaded straight to storage with signed URLs, multipart for files over 16 MB). By default waits until the file is ready and measured. Returns the media ID to use in a post. |
| Get | Status (ingesting, processing, ready, failed), size, dimensions, duration and a short-lived preview link. |
| Delete | Removes the file from the library. |
Channel
| Operation | What it does |
|---|---|
| Get Many | Connected accounts with network, name, time zone, needsReconnect and paused. |
| Get Next Queue Times | When the queue would next post to each channel. |
Choosing channels
Pick channels from the list, or pass them with an expression as a comma-separated string or an array:
bluesky:3f2c9a1e-…: network and channel ID, as the list returns themmastodon: just the network name, when the workspace has one channel there
That makes channels easy to keep in a spreadsheet column such as bluesky, linkedin.
Per-network options
Network Options has fields for the settings people use most (YouTube title, privacy, tags and Short; TikTok privacy and inbox; Instagram placement; Pinterest board and title; first comment). Options JSON takes anything else, keyed by network, and is merged over those fields:
{
"youtube": { "categoryId": "22", "playlistId": "PL…" },
"bluesky": { "caption": "A shorter text just for Bluesky" }
}
The full list is in Preflight's network options documentation.
Trigger
Preflight Trigger starts a workflow on:
post.failed: a channel refused the post and Preflight has stopped retrying. Sent once per channel, witherror,permanentandattempts.post.published: the post is live on a channel, withremoteIdandremoteUrl. Sent once per channel.
Activating the workflow registers a webhook in Preflight. Deactivating it removes the webhook. Every delivery is signed (x-preflight-signature-v2: t=<unix>,v2=<HMAC-SHA256 of "t.body">). The trigger checks the signature against the secret Preflight returned at registration and refuses anything unsigned, tampered with or older than five minutes.
Output:
{
"event": "post.failed",
"deliveryId": "3b9f0c6d-1a2e-4f7b-8c5d-6e4a2b1f9c08",
"createdAt": "2026-10-16T15:50:00.000Z",
"postId": "7c1e4b2a-9d3f-4e8a-b6c5-2f0a1d9e3b47",
"targetId": "5b1e…",
"platform": "pinterest",
"error": "Board not found. Choose another board.",
"permanent": true,
"attempts": 1
}
Preflight only delivers to public https addresses. A self-hosted n8n on localhost needs WEBHOOK_URL (or N8N_WEBHOOK_URL) set to a tunnel such as Cloudflare Tunnel or ngrok. deliveryId stays the same across retries of one event, so you can deduplicate on it.
Example workflows
The templates folder has five ready-to-import workflows. Download the JSON and use Import from File in n8n.
| Template | What it does |
|---|---|
| Blog RSS → AI caption → drafts | New articles get an AI-written caption, Preflight validates it per network, passing posts become drafts. |
| Google Sheets content calendar | Rows marked Ready are validated, scheduled or queued, and written back as Scheduled or Needs fix with the reason. |
| One vertical video → Shorts, Reels, TikTok | Upload through an n8n form; Preflight checks the video rules for all three and queues it. |
| Notion database → Preflight | Same as the sheet, for a Notion content database. |
| Failed post → Slack / Telegram | post.failed becomes an alert with the network, the reason, whether a retry can work and a link to the post. |
Each template has a sticky note explaining its setup. They are generated by templates/build.py; see templates/README.md.
A minimal example
Validate first, then save a draft only if every network accepts it:
Manual Trigger
→ Preflight (Post → Validate, channels: bluesky, mastodon; text: "Hello from n8n")
→ If ({{ $json.ok }} is true)
true → Preflight (Post → Create, When: Draft, same channels and text)
false → (handle {{ $json.issues }})
Usage notes
- Idempotency. Every Create sends an
Idempotency-Key. The default{{ $execution.id }}-{{ $itemIndex }}makes n8n's Retry on Fail safe. For content that may be seen twice (RSS items, sheet rows) use something stable, e.g.{{ 'rss-' + $json.link.hash('sha256') }}: the same key returns the first post instead of creating a second. The same key with different text is refused. - Publish Now needs confirming. Choosing Publish Now also requires Confirm Publish Now, so a test run cannot publish by accident.
- Times. Scheduled Time accepts ISO 8601 with a zone, or a wall-clock time such as
2026-11-02 09:30, which is read in the workflow's time zone. A time more than five minutes in the past is refused by Preflight (scheduled_in_past), so an old item can never go out straight away. - Files must be ready. Upload waits for that by default. If you turn waiting off, check Media → Get before creating the post.
- TikTok never takes links in the text (Preflight refuses them), and needs a privacy level.
- Errors carry Preflight's own code and message (for example
validation_failedwith each issue, orpost_limitwith the plan's allowance), and work with n8n's Continue On Fail. - The action node can be used as a tool by n8n's AI Agent.
Compatibility
- Tested with n8n 2.43.7 (self-hosted, Node.js 24).
- Built with
@n8n/node-cli0.52,n8nNodesApiVersion1, strict mode (n8n Cloud eligible). - Preflight REST API v1 (
https://preflight.social/v1). Get Next Queue Times uses the same API key against Preflight's MCP endpoint (/mcp), because the REST queue endpoint is not yet open to API keys.
Resources
- Preflight API documentation
- OpenAPI schema
- Webhooks · Errors · Network options
- n8n community nodes documentation
- Support: GitHub issues or info@preflight.social
Version history
See CHANGELOG.md.
- 0.1.1: release pipeline only (staged, provenance-signed publishing from GitHub Actions).
- 0.1.0: first release. Preflight node (Post, Media, Channel) and Preflight Trigger (
post.published,post.failed).