Turn Blog Posts and Changelogs into Social Posts with n8n and Zabio
Set up an n8n workflow that drafts posts for X, LinkedIn, Threads, Bluesky, Facebook, Instagram and TikTok from your feed, changelog or any URL, sends you a WhatsApp review link and publishes through Upload-Post or Blotato.
Updated November 2026
This template turns what you already publish into social posts. It reads your blog feed and your changelog every 2 hours, or takes any URL you paste in a form. For each new item, Zabio writes a post for every network you use and draws an image when one is needed.
Nothing goes out on its own. You get a WhatsApp message with a link to a review page: every post in an editable box, the image, the networks to tick, and three choices: publish now, schedule, or don’t publish. Upload-Post or Blotato does the publishing, and the page shows the result for each network.
How it works
| Part | What it does |
|---|---|
| Sources | Each row in social_sources is an RSS or Atom feed, a changelog page or a single page, with its brand, language and networks. |
| New items | Feeds give one item per entry. Changelog pages give one item per h2 heading (or per ## heading in plain Markdown). The first run of a source drafts only the newest item and marks the rest as seen. Each source keeps its own history, so two brands reading the same feed each get their own draft. |
| Drafting | Each item runs as its own execution. The workflow reads the full article, and Zabio writes every format in one structured call. |
| Clean-up | Code replaces em and en dashes, removes markdown bold, trims each text to its network’s limit and adds the link where the network shows it. |
| Image | Zabio draws one image, without text or logos, when Instagram or TikTok are on, or for every post if image_mode is all. |
| Review | A WhatsApp template message brings the review link. The page waits 48 hours, then the draft is marked expired. |
| Publishing | Upload-Post or Blotato, chosen per source. Results and links are saved in social_posts. |
| Network | What it drafts | Link |
|---|---|---|
| X | A post of up to 280 characters, and a thread of 3 to 5 posts | At the end of the post, and of the thread’s last post |
| 500 to 1200 characters in short paragraphs | At the end, with a link preview | |
| Threads | Up to 500 characters | At the end |
| Bluesky | Up to 300 characters | At the end, with a link preview |
| 200 to 500 characters | At the end, with a link preview | |
| A caption and the image | None, since links in captions don’t open | |
| TikTok | A photo post with the image, a title and a caption | None |
What you need
| Item | Where | Notes |
|---|---|---|
| n8n | Your own n8n, or n8n on a RemarkableCloud AI server | Built-in nodes only. It must be reachable from the internet, because the review page and the image link run on it. |
| A Zabio API key | zabio.ai | Writes the posts and draws the images. |
| Upload-Post or Blotato | upload-post.com or blotato.com | Connects your social accounts and publishes. You need one of them. |
| WhatsApp Cloud API | Meta | Sends you the review link. The WhatsApp assistant guide explains how to get a number and its credential. |
Step 1: Import the template
Download the workflow file from the template page. In n8n, open Workflows, choose Import from File and select it. It arrives inactive, with empty credentials.
Step 2: Create the data tables
In n8n, go to Data tables and create two tables with exactly these names.
social_sources, one row per feed, changelog or page:
| Column | Type | What goes in it |
|---|---|---|
source_id | String | A short name, like blog or changelog. |
active | Boolean | false pauses the source. |
type | String | rss, changelog or page. |
url | String | The feed, the changelog page, or the page. |
brand | String | The name the posts speak for, like Acme Plumbing. |
language | String | en or es: the language of the posts, the review page and the results. |
platforms | String | A JSON list of networks: ["x", "linkedin", "threads", "bluesky", "facebook", "instagram", "tiktok"]. |
x_format | String | post or thread: which X version the review page selects first. |
voice | String | How the brand writes, in a sentence or two. Leave it empty for direct, plain copy. |
hashtags | String | Hashtags you like to use, like #plumbing #miami. |
image_style | String | The look of the images, like flat illustration, navy and light blue. |
image_mode | String | visual (images for Instagram and TikTok only), all or none. |
publisher | String | upload-post or blotato. |
upload_post_user | String | Your Upload-Post profile name. |
blotato_accounts | String | A JSON object with Blotato account IDs, like {"x": "1234", "linkedin": "5678"}. |
facebook_page_id | String | The Facebook page to post on. Required for Blotato. |
linkedin_page_id | String | A LinkedIn company page ID. Empty posts to the personal profile. |
approver_whatsapp | String | The number that reviews, with country code. |
max_new | Number | How many new items to draft per run. 1 is a good start. |
social_posts, filled in by the workflow: post_id, token, source_id, item_key, item_title, item_url, item_text, status, drafts, image_b64, image_prompt, results, created_at, decided_at (all String) and cost_micros (Number).
Tip: A changelog works best when each release has its own
h2heading with anid, like most documentation tools produce. The workflow posts each new heading once.
Step 3: Connect your social accounts
Upload-Post
- In Upload-Post, create a profile and connect the social accounts to it. Its name goes in
upload_post_user. - Copy your API key.
- In n8n, create a Header Auth credential: Name
Authorization, ValueApikey YOUR_UPLOAD_POST_KEY. - Select it in Post Text (Upload-Post) and Post Image (Upload-Post).
Blotato
- In Blotato, connect the social accounts and copy your API key.
- Copy the ID of each connected account into
blotato_accounts, using the keysx,linkedin,threads,bluesky,facebook,instagramandtiktok. Blotato’s API docs show where to find them. - In n8n, create a Header Auth credential: Name
blotato-api-key, Value your key. - Select it in Host Image On Blotato and Post (Blotato).
Step 4: Create the WhatsApp template
WhatsApp only lets a business message someone first with an approved template.
- In WhatsApp Manager, create a Utility template named
content_review, with this body: “New posts for {{1}} are ready: {{2}}. Review and publish here: {{3}}” - Wait for Meta to approve it.
- Select your WhatsApp credential in Send Review Link.
For a Spanish template, use language es and set wa_template to content_review|es in the next step.
Step 5: Credentials and settings
Select the Zabio credential (Header Auth: Name Authorization, Value Bearer YOUR_ZABIO_KEY) in Write Posts With Zabio and Draw Image With Zabio. Then open Social Settings:
| Field | Default | What it does |
|---|---|---|
n8n_url | Your n8n address, like https://n8n.yourcompany.com. The review page and Blotato load the image from it. | |
zabio_model | auto/balanced | The model that writes the posts. |
image_model | auto | The image model. auto picks the lowest-priced model that makes the size. |
image_size | 1024x1024 | Square works on every network. |
wa_phone_number_id | Your WhatsApp phone number ID. | |
wa_template | content_review|en | The template name and language. |
review_hours | 48 | How long a draft waits for you. |
timezone | America/New_York | The time zone of the times you type when scheduling. |
Step 6: Activate and try it
- Activate the workflow. The image link and the review page answer only while it is active.
- Open the Post From a URL trigger, copy its production URL and open it in a browser.
- Paste the address of one of your pages and the
source_idof a row, and submit. - A minute or two later, the WhatsApp message arrives. Open the link, check the posts and submit.
From then on, the feeds and changelogs are read every 2 hours.
The review page
- What to do: publish now, schedule, or don’t publish.
- Publish at: the date and time for scheduled posts, like
2026-11-05 09:30, in the time zone of Social Settings. - Publish on: the networks. Untick any you don’t want this time.
- On X, publish: the single post or the thread. In the thread box, each paragraph is one post.
- Image: adds the image to the text posts too, when
image_modeisvisual. - One box per network, already filled in. Whatever you change is what gets posted.
After you submit, the same page shows each network’s result, with a link where the network returns one, and what the post cost in AI.
What it costs
The template is free. Zabio bills each post’s text and image at its own prices: one call writes every format, and the image is most of the cost. Each result page shows the exact amount. Upload-Post and Blotato charge for their plans, and Meta charges for template messages at its own rates.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| No WhatsApp message | The template isn’t approved, or approver_whatsapp is wrong | Check the template status in WhatsApp Manager and the number’s country code. Open Send Review Link in the execution for Meta’s error. |
| The review page shows no image | n8n_url is wrong, or the workflow isn’t active | Set n8n_url to the address you use to open n8n, and activate the workflow. |
| Nothing drafted from a feed | The first run only records what is there | Wait for the next new item, or paste a URL in the form. |
| Every changelog entry looks new | The headings have no id and their text changes | Give each release heading a stable id. |
| “no account ID for x in blotato_accounts” | The JSON is missing that network | Add the key, like "x": "1234". |
| “facebook_page_id is empty” | Blotato needs the page | Add the numeric page ID to the source. |
| Instagram or TikTok skipped | No image was made | Check Draw Image With Zabio in the execution. 402 insufficient_credits means the Zabio balance is empty. |
| A network shows “Failed” | The account was disconnected at Upload-Post or Blotato | Reconnect it there and publish again from their dashboard. |
Still stuck? Open a ticket. If your n8n runs on a RemarkableCloud server, an engineer can look at the workflow with you.