Set it up
Step-by-step setup
Work through these steps with the posting workflow still unpublished. The first live post is on the next page.
#Prepare the Google Sheet
- Create a Google Sheet, or make a copy of the template you were given.
- Name the first tab
queue. Row 1, in this order:id, platform, message, image_url, link, scheduled_at, status, post_id, error, posted_atYou can importsample-queue.csv. Delete or rewrite sample rows before you go live; keep the header. - Add a tab
error_logwithtime, workflow, execution_id, execution_url, failed_node, error_message(seeerror-log-header.csv). - If you will use the AI planner, add
planner_log:time, posts_created, notes. - Copy the Sheet ID from
https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/edit. - Share the Sheet (Editor) with the Google account you will use in n8n.
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.
| 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). There is no live Google Sheet screenshot in this kit.
#Connect the Facebook Page in Zernio
The client never creates a Meta developer app.
- In your Zernio account, create an API key (shown once) and a profile for this client.
- Request a Facebook connect URL, for example
GET https://zernio.com/api/v1/connect/facebook?profileId={profileId}&redirect_url=https://your-app/callback. Optional:welcome=trueandbrandName/logoUrl;scopes=postingif you only need publishing now;handoff=truefor a QR code. The link lasts 30 minutes. - The client signs in with Facebook and picks the Page (they must be Admin or Editor). You get back
accountIdandprofileId. - Keep
accountIdfor Configzernio_account_id. Personal profiles cannot post. Meta's consent screen still names the Zernio app.
Official references: Connecting accounts, Create post.
#Import the workflows
- n8n → Create workflow → ⋯ → Import from File… →
workflows/social-posting-error-handler.json→ Save. - Repeat for
workflows/social-posting-zernio.json. - Optional: import
workflows/social-content-ai-planner.json. These files use placeholders such asYOUR_SHEET_IDandYOUR_CREDENTIAL_ID. - All import inactive. Credential badges are expected until the next step.
#Create credentials
#Google Sheets OAuth2 API
- n8n Cloud: Sign in with Google. Allow Sheets and Drive.
- Self-hosted: In Google Cloud Console enable Google Sheets API and Google Drive API. Configure the OAuth consent screen (add your Google account as a test user if the app is External and in Testing). Create a Web application OAuth client and paste the redirect URI from n8n:
https://YOUR-N8N-DOMAIN/rest/oauth2-credential/callback Copy it exactly, including https and any port. Then paste Client ID and Secret into n8n and sign in.
Select this credential on Read Content Queue, Lock Row (publishing), Mark Posted, Mark Failed, and Log Error to Sheet.
#Header Auth: Zernio API
- Credentials → Header Auth, name it Zernio API.
- Name:
Authorization. Value:Bearerplus your Zernio API key (one space afterBearer). - Select it on Publish via Zernio (and on Zernio Presign if you use the planner).
Never put the Zernio API key in a node, the Sheet, or a screenshot.
#Fill in Config
Open Config on the posting workflow and set:
| Field | Example |
|---|---|
client_name |
Your Business |
zernio_account_id |
YOUR_ACCOUNT_ID |
zernio_profile_id |
YOUR_PROFILE_ID |
google_sheet_id |
YOUR_SHEET_ID |
queue_sheet_name |
queue |
max_posts_per_run |
5 |
On Log Error to Sheet in the error handler, paste the same Sheet ID (that node does not read Config). Keep the tab name error_log.
#Publish the error handler and link it
- Open Social Posting – Error Handler and Publish it. It only runs when another workflow fails; it never posts. On n8n 2.47.3 the Error workflow picker greys out unpublished workflows and ones without an Error Trigger.
- Posting workflow → ⋯ → Settings → Error workflow → select it → Save.
The buyer JSON ships with settings.errorWorkflow set to YOUR_ERROR_WORKFLOW_ID. Choosing the published error handler in Settings replaces that placeholder.
When this is done, go to Test and go live for the one-row test post. Leave the posting workflow unpublished until that test succeeds.