Post to social from n8n — with receipts.
Publish, schedule, check account health, and react to delivery alerts from the visual workflows your team already uses.
Install the node from this repository on self-hosted n8n, add a Publishly API key, and choose whether the workflow posts content, checks receipts, watches account health, or reacts to alerts. A public n8n catalog listing is not claimed yet.
Install the Publishly node
The node currently installs from integrations/n8n-nodes-publishly in this repository on self-hosted n8n. A public n8n catalog listing is not claimed yet.
Give it only the access it needs
Add your Publishly address and API key. Limit the key to posting, reading receipts, checking account health, or receiving alerts based on what this workflow does.
Choose what the workflow should do
Publish now, schedule for later, get a delivery receipt, or check which brand, client, or location accounts need attention.
Turn on delivery alerts
The Publishly Trigger securely connects the workflow to delivery, failure, and connection alerts. Turn the trigger off and Publishly removes that connection.
Reject fake or stale alerts
Before a workflow starts, the trigger verifies that the alert came from Publishly and was sent recently.
Act on the real result
Treat confirmed live as success. Send failed posts to the right person using the reason Publishly provides, and use the event ID so one alert never causes the same action twice.
Use the API directly if needed
The node sends this same request. Use it directly when an n8n installation cannot load custom nodes.
curl -X POST https://publishlyapi.com/api/public/v1/posts \
-H 'Authorization: YOUR_API_KEY' \
-H 'Idempotency-Key: campaign-location-2026-08-14' \
-H 'Content-Type: application/json' \
-d '{
"type": "schedule",
"date": "2026-08-14T18:00:00.000Z",
"shortLink": false,
"tags": [],
"posts": [{
"integration": { "id": "connection-id" },
"value": [{ "content": "Launch day.", "image": [] }],
"settings": { "__type": "linkedin" }
}]
}'Verifying the webhook signature
Publishly Trigger performs this check before emitting workflow data. At the wire level, events carry an X-Publishly-Event header and an X-Publishly-Signature header in the form t=<unix-timestamp>,v1=<hex>. Recompute and compare:
const crypto = require('crypto');
const header = $request.headers['x-publishly-signature']; // t=...,v1=...
const parts = Object.fromEntries(
header.split(',').map((p) => p.split('='))
);
const expected = crypto
.createHmac('sha256', YOUR_SIGNING_SECRET)
.update(parts.t + '.' + rawBody)
.digest('hex');
if (expected !== parts.v1) throw new Error('Bad signature');
// Optionally: reject if parts.t is older than a few minutes.Full endpoint and payload reference: API docs. Package and release-status details live in the repository’s distribution guide; no npm or hosted catalog listing is implied.