n8n

Schedule social media posts with n8n. Post to X, LinkedIn, Instagram, TikTok and more, and start workflows when a post publishes or fails.

The Bulkit node lets your n8n workflows create, schedule and publish posts, upload media, and read and reply to comments. The Bulkit Trigger starts a workflow when a post publishes or fails, or when an account needs reconnecting. The Bulkit node also works as a tool for n8n's AI Agent.

Install

On self-hosted n8n:

  1. Go to Settings → Community Nodes → Install.
  2. Enter n8n-nodes-bulkit and confirm.
  3. Search for Bulkit in the nodes panel.

See n8n's community nodes guide for other ways to install.

n8n Cloud: coming soon

The node will also show up in n8n Cloud's nodes panel once n8n has verified it.

Connect

  1. Create an API key in Bulkit, under Developers → API & Webhooks. It's shown once, so copy it straight away.
  2. In n8n, add a Bulkit API credential and paste the key in API Key.
  3. Leave Base URL as it is, unless you run a self-hosted Bulkit.

Start with a test key (bk_test_…). It checks every request like a live key, but never posts and is never billed. Switch to a bk_live_… key when your workflow is ready.

Operations

ResourceOperations
PostCreate (save as draft, schedule, or publish now) · Get · Get Many (filter by status, tag and date) · Publish · Retract · Delete · Get Metrics
MediaUpload (from a binary field) · Get Many · Delete
ChannelGet Many: your connected social accounts
CommentGet Many · Reply
TagGet Many

Post → Publish publishes a draft or scheduled post now, or retries a failed one. Channels that already published are skipped.

Create a post

Use Post → Create and pick a Publish Mode: Schedule (at Scheduled At), Publish Now or Save as Draft. A date without a time zone is read in the workflow's time zone.

Under Channels, add one entry per account you post to. Each entry has its own Text, so LinkedIn can read differently from X. All of them share one post ID and one schedule. Don't use one Bulkit node per channel: that makes separate posts, each with its own schedule.

Each channel entry also has:

FieldWhat it does
Thread PostsMore posts that follow the first one as a thread, in order. Only on platforms with threads, such as X, Threads and Bluesky.
Media IDsMedia for the first post, comma-separated, in order.
TitleFor platforms that have a title, such as YouTube, Reddit or Pinterest.
Post TypeFor platforms with more than one kind of post, for example story on Instagram. Leave it empty for a normal post.
Platform Options (JSON)Fields for this platform only, for example privacy_level on TikTok or link on Pinterest. See Platforms.

Text can be empty when media is attached, but each channel needs one or the other.

To attach media, put a Media → Upload step before Post → Create, and set Media IDs to its ID:

{{ $('Upload').item.json.id }}

Upload reads the file from an input binary field (data by default). See Media for the sizes and types each platform accepts.

Under Additional Fields, Tag Names or IDs adds your workspace's own labels to the post. Tags are never published.

Idempotency Key makes retries safe: sending the same key again returns the first post instead of making a second one. A good value is something unique to the item, like the article's link in an RSS workflow.

Using JSON

For full control, set Define Post to Using JSON and put the POST /posts request body in JSON Body. The body sets everything, including intent and scheduledAt:

JSON Body
{
  "intent": "draft",
  "channels": [
    { "channelId": "chn_x", "blocks": [{ "content": "Hello from n8n" }] }
  ]
}

See Create posts for every field.

Publishing is asynchronous

Publish Now and Post → Publish return as soon as the post is queued, with status publishing. That doesn't mean it's live yet. Use Post → Get or the Bulkit Trigger to find out whether each channel published. See Check the result.

Retract and Delete are different

Retract deletes the published posts from the platforms, with their likes and replies. It can't be undone. Delete only removes the post from Bulkit and leaves it live. See Manage posts.

Bulkit Trigger

The Bulkit Trigger starts a workflow on any of these Events:

EventWhen
Post PublishedA post went live on a channel.
Post FailedA post failed to publish on a channel.
Post Partially FailedPart of a thread published on a channel, then the rest failed.
Channel Needs ReconnectAn account can't publish until someone reconnects it.

Post events fire once per channel. A post sent to three networks triggers the workflow three times.

You don't need to add a webhook in Bulkit yourself. The trigger registers one when you activate the workflow and removes it when you deactivate it. It also checks the Bulkit signature on every request and rejects any request without a valid one.

Bulkit must be able to reach your n8n, so the trigger needs a public https:// URL. An n8n on localhost won't receive events. Use a tunnel or a hosted n8n.

See Webhooks for what each event contains.

Other endpoints

Anything the node doesn't cover works from n8n's HTTP Request node:

  1. Set Authentication to Predefined Credential Type.
  2. Choose Bulkit API.
  3. Call any endpoint under https://api.bulkit.io/public/v1/….

Example workflows

Two ready-made workflows are in the examples folder on GitHub. Import one with Workflows → Import from File:

  • RSS to X and LinkedIn (rss-to-social.json): checks your blog's RSS feed every hour and publishes each new article to X and LinkedIn, with a different text for each. The article's link is the idempotency key, so an article is never posted twice.
  • Email on a failed post (alert-on-failed-post.json): a Bulkit Trigger on Post Failed, Post Partially Failed and Channel Needs Reconnect emails your team what went wrong.

Replace the channel IDs with yours. Channel → Get Many lists them.

Troubleshooting

Bulkit's errors show in n8n as code: message, for example content_too_long: …. See Errors for every code.

The credential test fails, or every request returns 401. The key is wrong, revoked or expired. Paste it again, or create a new one.

A channel shows [needs reconnect] in the list. Posts to it will fail until someone reconnects it in the app. Add a Bulkit Trigger on Channel Needs Reconnect to hear about it right away.

schedule_in_past. Scheduled At is in the past. Check the workflow's time zone in its settings: a date without a time zone is read in it.

content_too_long. The text is longer than the platform allows. Write a shorter text for that channel, or split it into Thread Posts where the platform allows threads.

Next steps

On this page