CMS Publishing
Once an article finishes generating, SEOLadders ships it directly to your CMS: WordPress (via the plugin or Application Passwords), Ghost, Notion, Webflow, Framer, Shopify, Wix, or a generic webhook. Auto-publish is on from the moment a CMS is connected, and review mode is the switch that holds articles as drafts instead.
Auto-publish is on by default
How publishing works
Article generation and CMS publishing are two decoupled Inngest functions. The first finishes generating the article (the same 13-step pipeline used by the dashboard) and emits an article/generated event. The publishing function listens for that event and runs the push to your CMS — but only if blog_settings.auto_publish is true and a destination is configured.
The decoupling matters: if publishing fails (CMS down, expired credentials, blocked by a security plugin), the article is still fully generated and saved. You retry the publish from the dashboard once the destination is healthy — the article isn't lost.
Supported destinations
- WordPress — connect with the SEOLadders plugin (pair with one code, no passwords) or Application Passwords (the built-in REST API). Publishes the article HTML, uploads the featured image to wp-media, and sets categories. Best for any self-hosted or wordpress.com site.
- Ghost — connect with an Admin API key. Publishes the article HTML, cover image, slug, meta description and keyword tag, and updates the same post when you republish.
- Notion — each article becomes a page in your blog database, with its columns (slug, description, tags, status, date, cover) filled in automatically. For Notion-powered sites and content libraries.
- Webflow: connect with a site API token and pick your blog collection. Each article becomes an item with its title, slug, body, cover image and summary, published live or kept as a draft, and republishing updates the same item.
- Framer: connect with a project API key and the name of your blog collection. Each article becomes an item with its title, slug, content, cover image and summary, and goes live with your site. Republishing updates the same item. Style your article page in Framer once, so links and tables show properly.
- Shopify: connect with a small app you create in Shopify's Dev Dashboard (Client ID and secret). Each article becomes a post in your store's blog with its cover, excerpt and search engine listing, and republishing updates the same post.
- Wix: connect with an API key and your site ID. Each article becomes a Wix Blog post with its images copied into your Media Manager, the cover, excerpt and SEO settings, and republishing updates the same post.
- Webhook — generic POST to your URL with the full article payload (markdown + HTML + JSON-LD + featured image URL). Use this for any custom CMS that can receive an HTTP request.
- MCP + Skill — publish from your AI client with the
publishtool, which drives the same pipeline as the toggle. Use it when an article is sitting as a draft and you want it live without opening the dashboard.
Set the type to 'none' to disable
cms_type = "none" in settings — articles will keep generating but won't be pushed anywhere.When to use which
- WordPress if your site is on WordPress. Native plugin support means featured images upload cleanly, categories map automatically, and you get standard SEO plugin compatibility (Yoast, Rank Math) out of the box.
- Ghost, Notion, Webflow, Framer, Shopify or Wix if your blog runs on one of them: connect once, nothing to build.
- Webhook if you're on anything else — MDX-driven static sites, custom headless CMSes. You receive a structured JSON payload and a signed
X-Webhook-Secretheader; what you do with the payload is your call.
What gets sent
Both destinations receive the full article output. WordPress takes care of the field mapping for you (title → post_title, content_html → post_content, etc.). The webhook destination ships the same data as a JSON payload — see the webhook docs for the full schema.
Common fields across both: title, slug, meta_description, full HTML + Markdown, featured image, JSON-LD structured data (Article, FAQPage, BreadcrumbList, optional HowTo / VideoObject), keyword, article type, word count, and reading time.
Failure handling
- Publish failure — the article stays generated, the publish step gets marked failed. Retry from the dashboard with one click after fixing the destination.
- Auth expired — most common with WordPress application passwords. We surface a clear error in the dashboard; rotate the password and reconnect.
- Webhook timeout — your endpoint must respond within 30 seconds. Long-running publish logic should ack with a 2xx and process async.