Skip to content
Integrations · n8n

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.

Quick answer

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.

01

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.

02

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.

03

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.

04

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.

05

Reject fake or stale alerts

Before a workflow starts, the trigger verifies that the alert came from Publishly and was sent recently.

06

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 — schedule a post
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:

n8n Code node — verify HMAC
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.