Knowledge Base
API referenceOpen app
KB-211Updated October 15, 2026

Publishing, and connecting your CMS

Publish inside Letterstory, then to Webflow, Sanity, Contentful, Framer, GitHub, or Google Docs. What each connection needs.

Video walkthroughSpeed

Publishing inside Letterstory

The Publish panel on a post has Publish (or Publish current version if an older version is live) and Unpublish. Publishing snapshots the post as its live version; the phantom site or the API's get_published serves that snapshot until you publish again.

Publishing can be blocked by two things: reviewers who haven't approved ("Publishing is blocked until all reviewers approve. Awaiting: …", see KB-212) and a hold (KB-306).

The top of the panel says where the post is going: Publishing to Sanity. (or Webflow, Contentful, Framer, GitHub, Google Docs, your Letterbrace-hosted site, or your API integration when an API key that can read articles exists). If none of those is set up yet, it says No publish destination is connected. with links to connect one or generate an API key. Publishing works either way; the notice is only telling you whether the post will reach somewhere outside the platform.

Every publish, from the app or the API, also sends an article.published event to any API key that has a webhook destination (KB-401). For the exact payload, headers, and every event a webhook can receive (not just article.published), see /docs/webhooks, a live reference generated from the same schema the delivery code sends.

Set the Live URL on the post if it lives somewhere the platform didn't publish it; performance tracking uses it.

Connecting a CMS

Settings → Integrations shows a card per service: Checking connection… → Connected to X or Connect to X.

ServiceWhat you enter
WebflowSite API token
SanityProject ID, dataset, workspace, an API token with write access, optional project name
ContentfulSpace ID, environment (default master), default locale, a Content Management API token
FramerProject URL, API key, and whether to auto-deploy to production
GitHubA fine-grained personal access token with Contents and Pull requests set to Read and write. Publishing opens a pull request; nothing goes live until you merge it
Google Docs, Slack, Search ConsoleSign in with Google / Slack (OAuth). Search Console then asks you to choose a property.

You can also connect Webflow, Sanity, Contentful, Framer, or GitHub while creating a collection. In the New Collection dialog, choose Import an existing blog, switch the source from Sitemap to Connected CMS, and pick the provider. If it isn't connected yet the dialog asks for the same token, and Connect & import connects it and pulls your existing posts in one step; the field mapping is detected on that first pull. GitHub needs a publish target (below) before it can import.

Field mappings

Under each CMS card, create a mapping: which Letterstory fields go to which CMS fields (title, body, cover, tags, author…). "No field mappings yet" means publishing to that CMS isn't possible until you make one. GitHub has publish targets instead: the repo owner and name, the base branch, and a file path template. Then point a collection at the mapping or target: Control Room → Setup → Publish destination.

Once that's set, the post's Publish panel shows Publish to Webflow (or Sanity, and so on) and one press sends it.

Publish history

Settings → Publish History lists every push to every connector with its status. Over the API: get_publish_status, get_publish_failures.

Over the API

publish_article / unpublish_article, publish_to_connector { article_id, connector, target } (Webflow, Framer, Google Docs, Contentful, GitHub; Sanity publishes from the app; for GitHub it only opens a pull request), list_publish_targets, set_github_publish_target (add or edit a GitHub target). CLI: letterstory posts publish <id>, letterstory connectors publish <id> --to webflow --target <mapping-id>.

The connection itself can be managed the same way: connect_cms { provider, api_token, … } (the other fields depend on the provider, and the credentials are checked against it before they're stored), disconnect_cms, list_cms_connections, list_cms_mappings, bind_collection_cms (point a collection at a mapping), and import_from_cms (pull the posts already in the CMS into a collection). CLI: letterstory connectors connect --provider webflow --token …, connectors disconnect, connectors connections, connectors mappings, connectors bind, connectors pull.

Related