No-write payload and mapping preview
SEO_BLOG_PUBLISH_TOKEN='<tenant-token>' \
SEO_BLOG_SITE_SLUG='<slug>' \
CONTENTFUL_MANAGEMENT_TOKEN='<contentful-management-token>' \
CONTENTFUL_SPACE_ID='<contentful-space-id>' \
CONTENTFUL_ENVIRONMENT_ID='<contentful-environment-id>' \
CONTENTFUL_CONTENT_TYPE='<contentful-content-type>' \
SEO_BLOG_SITE_ORIGIN='<origin>' \
npx --yes @wotaso/seo-blog-admin-cli publish-cms --cms contentful --site-slug '<slug>' --site-origin '<origin>' --dry-run
For a currently due approved post, --dry-run builds the destination payload without writing to the provider. It does not contact the provider or prove credentials, remote schema compatibility, deployment, or a live page; when no post is due, provider inputs are not exercised.
Scheduled runner health heartbeat
SEO_BLOG_PUBLISH_TOKEN='<tenant-token>' \
SEO_BLOG_SITE_SLUG='<slug>' \
CONTENTFUL_MANAGEMENT_TOKEN='<contentful-management-token>' \
CONTENTFUL_SPACE_ID='<contentful-space-id>' \
CONTENTFUL_ENVIRONMENT_ID='<contentful-environment-id>' \
CONTENTFUL_CONTENT_TYPE='<contentful-content-type>' \
SEO_BLOG_SITE_ORIGIN='<origin>' \
SEO_BLOG_SCHEDULED='true' \
npx --yes @wotaso/seo-blog-admin-cli 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. It reports configuration readiness, not a live article. The dashboard expires readiness at the returned deadline, with a 36-hour fallback when no deadline is available.
Fields and data model
- Field names can be overridden with an explicit field map
- Localized values use the configured CMS locale
- HTML body, excerpt, metadata, canonical, and social image are available
Canonical and route
The frontend consuming Contentful owns routing, canonical markup, rendering, sitemap output, and deployment. The adapter needs the production site origin because a Contentful entry ID is not a public page URL.
Known limits
- The configured content type must contain compatible fields or an explicit field map.
- The management token needs access to the selected space and environment.
- Publishing an entry does not prove that the frontend deployment has completed.
Recovery
- Start in draft mode and inspect the localized entry fields.
- On version conflicts, reread the current entry instead of retrying with a stale version.
- Verify the frontend route and deployment before accepting the derived public URL.