Clients & integrations

n8n

Install the Postdot node and prepare a draft from an n8n workflow.

Use the Postdot node to create an unscheduled draft for review in Studio. It also lists projects and channels and reads saved publication state.

The package is an alpha release for self-hosted n8n, tested with n8n 2.45.6. It is available on npm's alpha tag and is not verified for n8n Cloud.

Install the package

You need a Postdot instance that your n8n runtime can reach. As the n8n runtime user, install the package in n8n's persistent nodes directory:

mkdir -p ~/.n8n/nodes
cd ~/.n8n/nodes
npm install --omit=dev @postdot/n8n-nodes-postdot

Restart n8n, then search for Postdot in the node picker. If you set N8N_USER_FOLDER, use the .n8n/nodes directory under that location instead. For Docker, run the installation in the container with a persisted n8n user directory. Installing in an unrelated host directory does not install the node in the container.

You can also install from Settings > Community Nodes > Install in n8n by entering @postdot/n8n-nodes-postdot as the package name. See n8n's community node installation guide.

The npm package includes the example workflow.

Give n8n draft access

In Postdot Studio, open Settings, then API keys. Create a key limited to the project you want to use and these actions:

  • project:read
  • publication:manage

Leave publication:dispatch out. The key cannot grant access beyond its owner's current project permissions. See API authentication.

In n8n, add a Postdot API credential:

FieldValue
Postdot URLYour instance origin, such as https://postdot.example, without /api
API KeyThe Postdot key secret

Store the key in this credential, outside workflow parameters and shared exports. The credential test reads your accessible projects and sends no publication.

Use an address reachable from the n8n process. Inside a container, localhost refers to that container, not the host or a separate Postdot container. Keep TLS certificate verification enabled when connecting over HTTPS.

Prepare a draft

Import the example workflow from the source checkout, or add a Postdot node with Resource: Post and Operation: Create Draft.

Select your Postdot credential on both Postdot nodes in the example. In Draft settings, replace projectId and channelId with IDs from your instance and enter the text you want to prepare. You can find IDs using the node's Project / Get Many and Channel / Get Many operations. When configuring a Postdot node directly, its project and channel fields also offer lists of accessible choices.

Use Automatic for a connected publishing destination, or Manual for a channel you publish yourself. This selects the eventual delivery method. Both choices save an unscheduled draft.

Run the workflow once. Create Postdot draft returns the source post and its publications; Read saved publication uses the returned publication ID to read its saved state. Check publication.state, publication.scheduledAt and the draft's validation results. A saved draft can require editing for the destination, particularly when that destination requires media. HTTP success does not mean that a social network received a publication.

Open Queue in Studio to review the draft. This first operation prepares plain text for one destination. It does not upload media, connect provider accounts or schedule delivery.

Handle errors before repeating a write

Keep Retry On Fail disabled on Create Draft, as it is in the example. Postdot may save the draft even when n8n loses the response. Inspect Queue or the API's publication list before running the creation again. A fresh run creates a new post; the node does not deduplicate source items. Several input items also create several posts.

An invalid or revoked key returns 401. A request outside the key's actions or its owner's permissions may return 403; a project outside the key's scope can return 404. Correct the credential or selection rather than granting broader access without identifying the refusal.

You can use Publication / Get to inspect a known publication later. Its state and recorded outcome come from Postdot; it does not trigger a new delivery.

Was this page helpful?

On this page