Write once. Ship to every channel your brand lives on.
One piece of content publishes to Facebook, Instagram (single, carousel, link-back), and your headless CMS per brand per environment. Per-channel publish state, engagement counters, sync log. No copy-pasting across five tools.

Copy-paste publishing is how your brand voice drifts.
A blog post starts in WordPress. Then someone retypes the headline (slightly different) into Buffer for Twitter. Then someone else writes a slightly different version for LinkedIn. Then a third version goes into Instagram. Then the Mailchimp announcement uses yet another phrasing. By the end of the day, the same launch has five subtly inconsistent versions and the analytics tracking is split across five systems.
m18t fixes this by treating publish as a property of the content piece, not a separate workflow. One canonical content row. Multiple channel destinations. The text is the same; per-channel platform requirements (character limits, image dimensions) are handled at push-time, not by retyping.
Per-channel state lives on the same row as the content.
Where m18t publishes today.
Native publishing via Graph API. Single images, multi-image carousels (2-10), link-back posts. Auto page-token exchange. Captions from your content body.
Native publishing via Graph API. Single images and carousels with container polling until FINISHED. Carousels (2-10 items) handled correctly.
Strapi (headless CMS)
Push per brand per environment (production + staging). Multi-locale handling correct. Rich text converts to Markdown. Cover images upload to media library. Full SEO component populated.
TikTok / X / LinkedIn / Threads
Not native today. If configured, routes through external webhook automation. Native publishing is real engineering work; priority set by where beta users actually publish.
WordPress / Sanity / Contentful / Payload
On request. The adapter pattern exists; each vendor is real work. Tell us which CMS you're on and we'll prioritize.
Custom webhook
You can register a custom channel and push to any webhook URL. Useful for internal systems or unsupported platforms.
Capabilities
One-click multi-channel push
Select channels, click publish. m18t handles per-channel formatting, image upload, character limits where applicable.
Multi-locale aware CMS push
Sibling content rows in different locales push to the right localization endpoint. Strapi v5 i18n handled correctly.
Calendar view across all content
See scheduled and published content across all channels and all brands on a single calendar. Drag-to-reschedule on the roadmap.
Per-channel publish state on every content row
Each content piece tracks its publish status, post ID, and engagement counters per channel.
Full sync log
Every push captured with request payload, response payload, error message (if any), timestamp.
Per-brand × per-environment integrations
Each brand has its own credentials and its own Strapi instance for production AND staging. No cross-contamination.
Publish doesn't live alone.
The content piece is the source of truth. Publish is the action you take with it.
Generate cover and social graphics for the piece before publishing.
Each brand has its own social accounts and CMS instance. Publish respects the brand context.
Where Publish stands.
Solid today
- — FB + IG native (single, carousel, link-back)
- — Strapi push per brand per environment
- — Multi-locale handling for CMS push
- — Per-channel sync log with full payload
- — Calendar view across all content
Rough today
- — Per-platform preview before publishing (FB vs IG vs Strapi)
- — Per-channel character-limit auto-truncation prompts
- — Engagement metrics sync cadence is manual or cron
Coming
- — TikTok, X, LinkedIn, Threads native
- — WordPress, Sanity, Contentful, Payload adapters (on request)
- — Scheduled auto-publish on status + due-date