Social Posting Kitfor n8n
Get the kit

Social Posting Kit for n8n

Approved rows go live on a Facebook Page. Nothing posts until you say so.

The team fills a Google Sheet content queue. A person sets status = approved. Every 15 minutes, n8n publishes due rows to the Page through Zernio, then writes the post ID back. Clients never create a Meta developer app.

  • About 30 minutes to set up
  • n8n 2.x, Cloud or self-hosted
  • Human approval gate

Google Sheet, queue tabone row

n8n posting workflowlock, then publish

Facebook Pagerow marked posted

What happens to one row

The same path runs on the 15-minute schedule and when you click Execute workflow.

  1. Queued

    Someone adds a caption, optional image URL, and a scheduled_at time, usually as draft or pending_approval.

  2. Approved

    A person reviews it and sets status = approved. Any other status is ignored.

  3. Selected

    The workflow keeps Facebook rows that are approved, due, and under max_posts_per_run (default 5).

  4. Locked

    status becomes publishing so the next run cannot pick the same row.

  5. Published

    One Zernio request creates the Facebook post now. Retries use the row id as Idempotency-Key.

  6. Written back

    Success: posted, post_id, posted_at. Failure: failed plus an error, and the Error Handler can log it.

How the workflows fit together

Two workflows you always import, and an optional planner that only fills the Sheet.

The posting workflow in n8n. Sticky notes on the canvas walk through setup.

What's built in

Human-in-the-loop

Only approved rows that are due are published. Drafts and planner rows stay put.

A spreadsheet the team already knows

The content calendar is a Google Sheet: caption, image, time, status, post id, error.

No Meta app for the client

They connect a Facebook Page through a Zernio link. n8n stores one API key in its credential store.

Double-post protection

The row is locked to publishing first, and the row id is sent as Idempotency-Key on retries.

Failures are visible

Failed rows keep the error in the queue. The Error Handler can append a matching error_log row.

Optional AI drafts

A separate planner can write a week of captions (and images) as pending_approval. A person still approves.

See it working

sample-queue.csv is the starter queue tab (fictional rows only). After a successful post, Mark Posted fills status, post_id, and posted_at on that row. There is no live Google Sheet screenshot in this kit.

idplatformmessageimage_urllinkscheduled_atstatuspost_iderrorposted_at
demo-001facebookHello from our demo Page! This post was published automatically from our content queue. #automation2026-11-11T09:00:00+08:00approved
demo-002facebookNew guide: 5 ways to keep your social calendar on track. Read it here:https://example.com2026-11-12T10:00:00+08:00draft
demo-003facebookBehind the scenes: our team at work. What would you like to see next?https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg2026-11-12T18:00:00+08:00approved

Select Due Approved Posts would keep demo-001 and demo-003 (both approved and due once scheduled_at is in the past) and skip demo-002 (draft).

A successful manual run: Lock Row, Publish via Zernio, Mark Posted.
The post result from Zernio (Post published successfully). Account, post, and platform IDs are boxed. There is no Facebook Page or Sheet “after” screenshot in this kit — confirm write-back in your own queue tab and on the Page.

Verified live

Run on a self-hosted n8n 2.47.3 on 11 November 2026. One manual execution of the posting workflow.

Test postPosted
  • Approved queue row lumora-001
  • Published to the Lumora Coffee Co. Facebook Page through Zernio
  • Every node on the success path succeeded
  • Mark Posted wrote posted, post_id and posted_at
Defaults keptOff
  • AI Caption Polish stayed deactivated, so the original caption was used
  • The posting workflow was left unpublished, so the 15-minute schedule did not start
  • The optional AI planner was not part of this run

A manual run of an approved, due row publishes to the live Page. Use a caption you are happy to have public. The testing page shows the exact checks.

Who it's for

Cafés and restaurants

A weekly menu queue, approved the night before, published on schedule.

Clinics, gyms and salons

Tips and opening-hours posts without someone logging into Facebook at 8 AM.

Real estate and agencies

Listing copy sits in a sheet until a manager approves it. One workflow copy per client.

Schools and coaches

Enrolment-season posts, reviewed once, released through the week.

In-house marketing teams

A shared content calendar everyone already knows how to edit.

Multi-Page brands

Duplicate the workflow, point Config at another Zernio account and Sheet.

What's in the kit

FileWhat it's for
workflows/social-posting-zernio.jsonThe main posting workflow. Import this. It arrives inactive, with placeholders such as YOUR_SHEET_ID.
workflows/social-posting-error-handler.jsonError workflow: appends failed executions to error_log.
workflows/social-content-ai-planner.jsonOptional: fills the queue with pending_approval rows. Never posts.
sample-queue.csv, error-log-header.csvSheet headers and three fictional sample rows.
This guide and the PDFSetup, node reference, troubleshooting, FAQ.

Get the kit

Want this running for your business, or for your clients? Send a message and we'll reply with the files, pricing and a time to set it up together if you'd like help.

Contact us

Contact details are coming soon.

  • Ready-to-import n8n workflows (inactive)
  • Google Sheet headers for queue, error log and planner log
  • A human approval gate, not a firehose
  • This guide, plus a printable PDF
  • Optional AI drafts with OpenRouter, OpenAI or xAI

Social Posting Kit for n8n: a Google Sheet content queue, a human approval gate, and publishing to a Facebook Page through Zernio.

Checked against n8n 2.47.3. n8n, Google Sheets, Facebook, Zernio, OpenAI, xAI and OpenRouter are trademarks of their owners; this kit is not affiliated with them. Sample data is fictional.