We don't just talk about automation — we run on it. This is one of the workflows that posts
our own products' content across 5 platforms every day, with zero human touch on posting day.
We build what we use.
The problem
Posting the same content to Instagram, X, Threads, Bluesky, and TikTok by hand means logging
into five apps, re-formatting for each, and doing it again tomorrow. For anyone running more
than one brand, it's a daily tax that scales linearly with the number of products — and skip a
day, and reach quietly dies.
So we built one pipeline that does it once and fans it out.
The workflow
[ Content pool ] -> [ Render card ] -> [ Fan-out API ] -> [ Verify post URL ]
+ dedupe state PIL 1080x1080 IG / X / Threads status check per channel
Bluesky / TikTok
1. A content pool with dedupe state
Each product keeps a small JSON content pool. A state file tracks what has already been
published, always serves the least-recently-posted item, and recycles once the pool is
exhausted. Result: the feed never repeats back-to-back and never runs dry — without anyone
curating a calendar.
2. Auto-rendered branded card
A Python/PIL step renders a 1080x1080 branded image per post — per-brand color scheme, and for
one product, a required disclaimer is stamped into the footer automatically (compliance you
don't want to rely on a human to remember).
3. One fan-out call
A single post_photos request to the Upload-Post API pushes the card to all connected
channels — Instagram, X, Threads, Bluesky, TikTok — at once. One call, five networks.
4. The part most automations skip: verification
API "success" is not the same as "visible." The publish is asynchronous, so we follow up
with a status/history check (GET /api/uploadposts/status, GET /api/uploadposts/history) to
confirm a real post URL per channel.
This is not theoretical. In one run, two videos came back with no post URL — silently blocked
on a single platform. A fire-and-forget script would have reported "done" and moved on. The
verification step is the difference between "the job ran" and "the post is actually live."
5. Rate-limit safety
When several brands share one posting account, a hard per-channel daily cap stops one brand
from burning the quota and starving the others. We learned this the hard way — by hitting a
10/10 daily cap once.
The result
- 5 channels published from 1 trigger, no human touch on posting day.
- The same engine is reused across 4 separate products, on a staggered daily schedule, with no per-brand posting code.
- Adding a new brand to the rotation = drop in a content pool + a card template. That's it.
Stack
Python · PIL for card rendering · Upload-Post API (post_photos + status/history) · a JSON
content pool + state file for dedupe · a scheduler for the daily trigger.
The takeaway
If you run more than one brand, or cross-post the same announcement to several networks, this
is the workflow that gives you the reach of a daily social team without the headcount. And the
lesson worth stealing even if you build your own: always verify the post actually went live.
The most expensive automation bugs are the ones that still report success.
We build automation systems like this for businesses drowning in repetitive busywork —
content, reporting, customer replies, lead follow-up. If a daily task is eating your team's
hours, that's usually a one-time build away from running itself.
Top comments (0)