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.
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.
- Queued
Someone adds a caption, optional image URL, and a
scheduled_attime, usually asdraftorpending_approval. - Approved
A person reviews it and sets
status = approved. Any other status is ignored. - Selected
The workflow keeps Facebook rows that are approved, due, and under
max_posts_per_run(default 5). - Locked
statusbecomespublishingso the next run cannot pick the same row. - Published
One Zernio request creates the Facebook post now. Retries use the row
idasIdempotency-Key. - Written back
Success:
posted,post_id,posted_at. Failure:failedplus anerror, 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.
Start
Choose
Publish
Record
failed, then Stop and Error so the Error Handler appends error_log.
Optional AI plannerAppends pending_approval rows only. It never posts.
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.
| id | platform | message | image_url | link | scheduled_at | status | post_id | error | posted_at |
|---|---|---|---|---|---|---|---|---|---|
| demo-001 | Hello from our demo Page! This post was published automatically from our content queue. #automation | 2026-11-11T09:00:00+08:00 | approved | ||||||
| demo-002 | New guide: 5 ways to keep your social calendar on track. Read it here: | https://example.com | 2026-11-12T10:00:00+08:00 | draft | |||||
| demo-003 | Behind the scenes: our team at work. What would you like to see next? | https://upload.wikimedia.org/wikipedia/commons/a/a9/Example.jpg | 2026-11-12T18:00:00+08:00 | approved |
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).
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.
- 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_idandposted_at
- 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
A weekly menu queue, approved the night before, published on schedule.
Tips and opening-hours posts without someone logging into Facebook at 8 AM.
Listing copy sits in a sheet until a manager approves it. One workflow copy per client.
Enrolment-season posts, reviewed once, released through the week.
A shared content calendar everyone already knows how to edit.
Duplicate the workflow, point Config at another Zernio account and Sheet.
What's in the kit
| File | What it's for |
|---|---|
workflows/social-posting-zernio.json | The main posting workflow. Import this. It arrives inactive, with placeholders such as YOUR_SHEET_ID. |
workflows/social-posting-error-handler.json | Error workflow: appends failed executions to error_log. |
workflows/social-content-ai-planner.json | Optional: fills the queue with pending_approval rows. Never posts. |
sample-queue.csv, error-log-header.csv | Sheet headers and three fictional sample rows. |
| This guide and the PDF | Setup, 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 usContact 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