> ## Documentation Index
> Fetch the complete documentation index at: https://docs.weelkit.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Publishing integrations overview

> How Weelkit sends articles to a CMS destination or an API webhook, how an article's status follows the CMS, and what happens with no destination at all.

Weelkit generates every article against a **versioned article output contract**. The contract determines exactly which fields the generator must produce, and the destination determines what happens to the finished article. Weelkit supports three publishing-contract modes.

> **[Schema-backed destination](#mode-a-schema-backed-destination)**
>
> WordPress, WordPress.com, Sanity, Ghost and Custom API. Weelkit discovers the remote schema and publishes into it.

> **[API webhook destination](#mode-b-api-webhook-destination)**
>
> No remote schema. Weelkit signs and delivers the persisted article version to your endpoint.

> **[No destination](#mode-c-no-destination)**
>
> The same organization contract, with no external dispatch.

## Providers

Connect a CMS in **Organization settings → CMS**: [**WordPress**](https://docs.weelkit.com/integrations/wordpress/setup.md) (self-hosted, with the Weelkit Plugin), [**WordPress.com**](https://docs.weelkit.com/integrations/wordpress-com/setup.md), [**Sanity**](https://docs.weelkit.com/integrations/sanity/setup.md), [**Ghost**](https://docs.weelkit.com/integrations/ghost/setup.md) or a [**Custom API**](https://docs.weelkit.com/integrations/custom-api/overview.md). Managing Editors open the CMS connection from **Organization settings → Integration**. The **API webhook** is set up in **Organization settings → Integrations → API Webhook** for Admins. A connection to a provider Weelkit no longer offers shows **Provider unavailable**; you can only disconnect it, and the content it published stays where it is.

## Mode A: schema-backed destination

Use this mode when the destination exposes a content schema Weelkit can discover: WordPress, WordPress.com, Sanity, Ghost, or a [Custom API](https://docs.weelkit.com/integrations/custom-api/overview.md) that implements the Weelkit custom publishing protocol.

Setup runs in a fixed order. Nothing is sent before an administrator has saved the mapping that defines what Weelkit writes.

**1. Connect**

In **Organization settings → CMS**, choose **Connect CMS** and the provider. Then authenticate: the **Weelkit Plugin token** for WordPress, sign-in with WordPress.com, the **API token** for Sanity, the **Admin API key** for Ghost, or the **API key** for a Custom API.

**2. Choose the destination**

Pick what Weelkit publishes into: the site (WordPress.com), and the post, document or content type.

**3. Review the field mapping**

Weelkit discovers the destination's fields and suggests how Weelkit's article fields and your organization's custom fields map onto them. Review and adjust every suggestion, then choose **Save mapping**. Only the saved mapping, never the raw discovery, decides what Weelkit generates and sends.

**4. Choose publishing defaults**

Set the **Default status** (**Draft** or **Published**) and what happens **When the article already exists**: **Ask before updating**, **Always update existing** or **Always create a new item**. Changing the mapping or the defaults means verifying again.

**5. Verify a test draft**

Choose **Verify test draft**. Weelkit uses the saved mapping to publish a draft and read it back, and shows the result field by field. You can inspect the draft in your CMS, or choose **Delete draft**.

**6. Send articles**

The connection is ready. In the editor, the CMS button sends the current article with the saved default: **Send draft to CMS** or **Publish to CMS**. See [Send to your CMS](https://docs.weelkit.com/articles/checks-and-publishing.md#send-to-your-cms).

Every send keeps its original request identity and saved article version. If Weelkit can't confirm whether your CMS received it, choose **Check original CMS send** before starting another send. **Retry saved CMS send** checks or retries that original request according to the destination's capabilities.

With **Ask before updating**, sending an article already in your CMS opens a confirmation. Choose **Update article** to update that item with the saved version prepared for this send, or **Cancel** to leave it unchanged. Later edits need another send. The result says **Updating…** while sending, then **Updated** after success. See [Send to your CMS](https://docs.weelkit.com/articles/checks-and-publishing.md#send-to-your-cms).

A new send follows the saved create/update choice even if the content is unchanged. Checking the original send returns its original result rather than creating another item.

> [!WARNING]
>
> Discovered fields are **suggestions only**. They never enter what Weelkit generates until an administrator saves the mapping. Likewise, organization custom fields never reach a CMS unless an administrator has explicitly mapped them.

### Defaults and choices

In the mapping, use **Default value** to set a value of the field's actual type. Numbers, booleans, arrays and objects keep their types; `0` and `false` are valid defaults. **Clear default value** returns the field to **No default**. In a JSON editor, text includes quotes: `"3"` is text and `3` is a number.

Choose **Value list** for a schema-declared list. Its members must match the CMS field: text, numbers, integers, booleans or the declared combination. An empty list stays `[]`; the CMS decides whether it is valid. Custom API lists contain text only.

A required value can be empty only when its declared minimum allows it. This includes intentional empty alternative text for a decorative image. Missing required values still block sending.

For a custom choice field, **Allowed options (JSON)** uses text values, for example `[{"label":"News","value":"news"}]`. The label is optional. Defaults and choices must fit every selected CMS field's constraints. Invalid JSON or incompatible values prevent the mapping from being saved.

Mappings keep exact field paths, including letter case. WordPress refuses a send when its storage cannot keep the selected keys distinct.

If a numeric input says **Weelkit cannot preserve this number exactly.**, the value is not saved. Correct it only if another value is acceptable, or change the destination field to text when the exact digits must be kept. Weelkit does not round it for you.

If the same error appears after **Saved** or **Mapping saved.**, the save remains accepted. Further edits and CMS sends wait for a safe read; use **Retry** when the mapping offers it.

Choice labels gain **(text)**, **(number)**, **(boolean)** or **(null)** when identical labels would hide different value types. Distinct CMS labels stay unchanged.

AI cannot preserve an object key named `__proto__`. It stops and asks you to set the value manually in the article editor's JSON field; it does not save an object with that key missing.

## After you send

An article's status in Weelkit follows the CMS. You publish, schedule or unpublish in your CMS, and Weelkit picks up the change:

| In the CMS | In Weelkit |
| - | - |
| Published (live) | **Published** |
| Draft, scheduled, pending review, private, in the trash, or deleted | **Draft** |
| Can't be checked (for example, the CMS is unreachable) | No change |

**Archived** is a Weelkit-only status: the CMS never changes it, and a restored article takes its status from the CMS again.

Weelkit checks an article's status when someone opens it, and keeps checking in the background: every few minutes right after a send, then less often as the article gets older, down to once a day for published articles. A scheduled post is checked again when it's due to go live. There's no button to refresh the status.

When an article is live, Weelkit records its public address. Edit, preview and admin links are never used as the address. Your sitemap (**Organization settings → Organization → Public Website Index**) confirms the address, and gives it for Sanity and Custom API items that don't report one.

> [!TIP]
>
> For WordPress, update the Weelkit Plugin to version 0.6.0 or later. It lets Weelkit check many posts in one request, so status changes show up sooner. Older versions with a compatible publishing contract are checked one post at a time, less often. If setup asks you to update the plugin, update it before continuing.

## Reconnect or disconnect

When a CMS connection needs fresh authorization, choose **Reconnect**. Reauthorizing the same destination preserves its saved mapping and published links. Choose **Test connection** to check a key that was changed in the CMS.

**Disconnect** removes the local credentials and setup; it does not delete posts in your CMS. Resolve any pending or unconfirmed send or test-draft cleanup before disconnecting. A different site, dataset or destination needs its own connection and mapping review.

## Mode B: API webhook destination

Use this mode when you want the article delivered to your own system without a remote schema. There is nothing to discover: the contract is the canonical Weelkit article fields plus your organization's active [custom fields](https://docs.weelkit.com/integrations/organization-article-fields.md).

**1. Generate**

Weelkit generates the article against the organization contract.

**2. Validate**

The output is validated against the contract before anything is stored.

**3. Persist the article version**

The validated article is persisted as an immutable article version.

**4. Signed delivery**

Weelkit delivers the authoritative persisted version — not a re-rendering — to your endpoint with an HMAC signature. See [Webhook payload](https://docs.weelkit.com/integrations/webhook/payload.md).

**5. Typed receipt**

Your response is interpreted under strict, typed receipt semantics. See [Receipts and retries](https://docs.weelkit.com/integrations/webhook/receipts-and-retries.md).

## Mode C: no destination

Articles are generated and persisted against the same organization contract as mode B — canonical fields plus active organization custom fields — but Weelkit performs no external dispatch. Use this mode when Weelkit is the system of record, or before you have decided on a destination.

## Where to go next

> **[Organization article fields](https://docs.weelkit.com/integrations/organization-article-fields.md)**
>
> Extend the canonical article contract with your own governed fields.

> **[Testing integrations](https://docs.weelkit.com/integrations/testing-integrations.md)**
>
> Verify a destination safely before real content flows through it.

> **[Set up an API webhook](https://docs.weelkit.com/integrations/webhook/setup.md)**
>
> Deliver signed article versions to your own endpoint.

> **[Custom API protocol](https://docs.weelkit.com/integrations/custom-api/overview.md)**
>
> Make your own API a first-class schema-backed destination.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.