SOP — Zernio Publishing
Goal: get finished posts from the vault onto Instagram and TikTok reliably, on schedule, with a human approval gate before anything goes live. This SOP is the publishing leg of SOP — Content Publishing and the Workflow — Content Production Pipeline.
Tool: Zernio (one API for 14+ platforms). Toolkit lives in Automation/Zernio/ (publish.mjs, accounts.mjs, posts.json). Docs: https://docs.zernio.com.
Cadence: batch weekly. Schedule 7 days ahead. Keep the 2:1:1 pillar ratio (education-or-proof : product : promo).
Mental model
Zernio publishes media + a caption to accounts you’ve connected. It does not design the creative — the vault does that. The flow is always: finished art (_assets/) + caption (POST note) → posts.json → Zernio draft → human review → schedule/publish.
Key objects: Profile (a brand container — we use one: “Indexa”) → Accounts (the connected IG + TikTok) → Posts (what we schedule).
One-time setup
- Create a Zernio account; create a Profile named
Indexa. - Connect Instagram and TikTok to that profile (dashboard OAuth). Note: Instagram must be a Business/Creator account.
- Dashboard → Settings → API Keys → Create API Key (shown once). Save it in
Automation/Zernio/.env(copy from.env.example). Never commit it. - Run
node accounts.mjsand paste the real IG + TikTokaccountIds intoposts.json.
Weekly run
- Confirm the week’s posts are
scheduledin the vault (notes exist, art rendered in_assets/, captions final, guardrail boxes checked). - Update
posts.json— one entry per post:id,caption,scheduledFor(localYYYY-MM-DDTHH:mm:ss),platforms[],media[](paths, in carousel order). - Dry-run:
node publish.mjs --dry-run— confirms files resolve and limits are sane (IG ≤10 images, TikTok ≤35 photos / 1 video). - Create drafts:
node publish.mjs(default mode = draft). - Review in the Zernio dashboard — preview each platform’s render. Fix art/caption if needed and re-run.
- Schedule:
node publish.mjs --mode=schedule. (Or--mode=nowto publish immediately;--only=POST-…for a single post.) - Back-fill the vault: once live, paste each post’s
linkinto its note and setstatus: published. - Hand off demand: any DMs/comments that signal intent → create
#leadnotes (see SOP — Lead to Sale).
Posting times (Malaysia / Asia/Kuala_Lumpur)
Default slots: TikTok 20:00, Instagram 19:00. Adjust from analytics after 2–3 weeks. The Reta/promo posts go out separately under SOP — Campaign Launch.
Guardrails (non-negotiable)
- Research-use framing only. No human dosing, no “treats/cures/prevents”, no medical before/after. COA and process content is encouraged. A post that fails this does not ship — full stop (it’s what keeps the brand alive).
- Disclaimer present on-image and in caption.
- Approval gate: posts are created as drafts first; a human schedules/publishes. The script refuses to run with placeholder account IDs.
- TikTok comment hygiene: block/limit off-topic spam comments early (build-journal policy).
- Threads is different — do not publish to Threads as INDEXA from this pipeline. Threads runs disposable alias-brand accounts (see Content — Playbook / content-threads memory). This SOP covers IG + TikTok only.
Definition of done
Every planned post is live, each vault note has its link and status: published, and inbound interest is captured as leads.
Troubleshooting
- 401 / auth error → key missing or wrong; re-export
.env. - accountId placeholder error → run
node accounts.mjs, updateposts.json. - Upload/PUT failed → file too big or wrong type (images: JPG/PNG/GIF/WebP; video: MP4/MOV/WebM).
- Platform rejected media → check per-platform limits in
README.md; resize (IG 1080×1350, TikTok 1080×1920). - Error envelope reference: https://docs.zernio.com/guides/error-handling.