CMS Publishing

Once an article finishes generating, SEO Ladders can ship it directly to your CMS. Two destinations supported natively — WordPress and a generic webhook — both behind one explicit auto-publish toggle.

Auto-publish is opt-in

With auto-publish off (the default), every finished article lands as a draft for you to review before shipping. With auto-publish on, the article ships to your configured CMS the moment generation completes. Same toggle whether the article was generated from the Article Writer, a batch run, or AutoBlog.

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 — native integration via the WordPress REST API + Application Passwords. Publishes the article HTML, uploads the featured image to wp-media, and sets categories. Best for any self-hosted or wordpress.com site.
  • Webhook — generic POST to your URL with the full article payload (markdown + HTML + JSON-LD + featured image URL). Use this for Webflow, Ghost, Framer, Notion, or any custom CMS that can receive an HTTP request.

Set the type to 'none' to disable

Both destinations live behind one config slot. To stop publishing entirely, set 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.
  • Webhook if you're on anything else — Webflow, Ghost, Framer, Notion, MDX-driven static sites, custom headless CMSes. You receive a structured JSON payload and a signed X-Webhook-Secret header; 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.