Framer CMS SEO publishing workflow

The Framer adapter uses the Server API and remains beta. It validates one writable Collection without changing it, requires real compatible title and body fields, writes typed content, deploys, and verifies the public canonical page.

Best for: Framer sites with a writable CMS Collection and teams that can test the beta adapter in a controlled Node.js 22+ environment.

Support status: beta
Publisher: framer

How the connection works

Authentication

A Framer API key, complete project URL, and Collection name or ID stored in the tenant-owned server-side publisher environment.

Server-side variables

  • SEO_BLOG_PUBLISH_TOKEN
  • SEO_BLOG_SITE_SLUG
  • SEO_BLOG_CMS_LOCALE
  • FRAMER_API_KEY
  • FRAMER_PROJECT_URL
  • FRAMER_COLLECTION
  • SEO_BLOG_SITE_ORIGIN

Publishing sequence

01

Connect read-only for setup, find the Collection, inspect fields, and always disconnect.

02

Reject read-only Collections, missing targets, incompatible types, and unmapped required fields.

03

Write typed values with a stable item identifier and publish a new deployment.

04

Deploy the returned ID, then verify article identity and the exact public canonical before completion.

Validate and initialize Framer

SEO_BLOG_PUBLISH_TOKEN='<tenant-token>' \
SEO_BLOG_SITE_SLUG='<slug>' \
SEO_BLOG_CMS_LOCALE='<primary-bcp47-locale>' \
FRAMER_API_KEY='<framer-api-key>' \
FRAMER_PROJECT_URL='<framer-project-url>' \
FRAMER_COLLECTION='<framer-collection>' \
SEO_BLOG_SITE_ORIGIN='<origin>' \
npx --yes @wotaso/seo-blog-admin-cli@0.2.2 init-cms --cms framer --site-slug '<slug>' --site-origin '<origin>' --locale '<primary-bcp47-locale>'

init-cms performs the connector's read-only credential, permission, and destination-schema checks first. It writes seo-blog.config.json and the scheduled tenant workflow only after validation passes; review both files, add the named GitHub secrets and variables, then trigger the workflow once manually.

Scheduled runner health heartbeat

SEO_BLOG_PUBLISH_TOKEN='<tenant-token>' \
SEO_BLOG_SITE_SLUG='<slug>' \
SEO_BLOG_CMS_LOCALE='<primary-bcp47-locale>' \
FRAMER_API_KEY='<framer-api-key>' \
FRAMER_PROJECT_URL='<framer-project-url>' \
FRAMER_COLLECTION='<framer-collection>' \
SEO_BLOG_SITE_ORIGIN='<origin>' \
SEO_BLOG_SCHEDULED='true' \
npx --yes @wotaso/seo-blog-admin-cli@0.2.2 health --config seo-blog.config.json --mode cms --site-slug '<slug>' --site-origin '<origin>'

Run this from the real scheduled runner after seo-blog.config.json contains the selected connector configuration and the listed secrets are loaded. CMS health re-runs the remote read-only validation; it still does not create an article. The dashboard expires readiness at the returned deadline, with a 36-hour fallback when no deadline is available.

Fields and data model

  • Title must map to a string field and article body to formattedText
  • Stable item ID or slug prevents accidental duplicates
  • Formatted HTML and Markdown carry the matching Framer content type

Canonical and route

The Framer site and CMS detail template own the route, canonical tag, sitemap, schema, and rendering. The beta adapter writes content and starts deployment, then verifies the public page.

Known limits

  • Requires Node.js 22+ and the optional Framer package.
  • The beta currently supports only the declared primary locale; translated Framer posts fail before connecting.
  • Server API behavior can change while the connector is beta.
  • Unsupported or required unmapped field types block setup rather than risking a partial article.

Recovery

  • Run init-cms again after correcting Collection access or the explicit field map.
  • Map the article body to formattedText and every required field to a supported source.
  • Never mark a failed deployment published manually; rerun with the stable post ID.

Integration questions

Where are credentials stored?

The Framer credentials stay in the managed GitHub App or a tenant-owned CI/server-side secret environment.

Does SEODrafts own the canonical URL?

No. The destination website owns its route, canonical tag, sitemap, rendering, and analytics.

Can the integration be tested before publishing?

The init-cms and health commands validate credentials, permissions, and destination schema without writing; the first manual workflow run then verifies the rendered public page.

Keep the website your team already owns.

Review the opportunity and draft in SEODrafts, then publish approved work through Framer.

Add my website