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

# How publishing works

> What happens between clicking Publish and the article appearing on your site.

Publishing is the same three clicks whichever destination you use. What differs is what the
destination gives back.

## Publishing an article

Open a finished article and click **Publish** in the top-right corner.

<Frame caption="Choose a destination, then publish">
  <img src="https://mintcdn.com/seosorted-dc17c331/vEMg5kPU9zyxc5bn/images/connectors/publish-modal.png?fit=max&auto=format&n=vEMg5kPU9zyxc5bn&q=85&s=571b86dfd8ff135968277b04a02859d0" alt="Publish article dialog listing connected destinations with radio buttons" width="1440" height="900" data-path="images/connectors/publish-modal.png" />
</Frame>

Every connected publishing destination is listed. Pick one and click **Publish now**.

<Note>
  Only publishing destinations appear here — WordPress, Webflow, Shopify and Webhook. Search
  Console and Analytics are data sources; they never receive content.
</Note>

Publishing is queued, not instant: the request returns a job and the dialog waits for it. A
typical publish takes a few seconds — longer when a featured image has to be uploaded.

## Confirmation

<CardGroup cols={2}>
  <Card title="WordPress and Shopify" icon="link">
    Return a public URL, so the dialog links straight to the live post.
  </Card>

  <Card title="Webhook and Webflow" icon="circle-check">
    Have no public URL — a webhook is your own endpoint, Webflow items need a site publish — so
    the dialog confirms delivery instead.
  </Card>
</CardGroup>

<Frame caption="A destination that returns a URL">
  <img src="https://mintcdn.com/seosorted-dc17c331/vEMg5kPU9zyxc5bn/images/connectors/wp-publish-success.png?fit=max&auto=format&n=vEMg5kPU9zyxc5bn&q=85&s=1d0d9877fddfae4162ff2e01f283b532" alt="Publish dialog showing Published with a clickable post URL" width="1440" height="900" data-path="images/connectors/wp-publish-success.png" />
</Frame>

<Frame caption="A destination that doesn't">
  <img src="https://mintcdn.com/seosorted-dc17c331/vEMg5kPU9zyxc5bn/images/connectors/webhook-publish-success.png?fit=max&auto=format&n=vEMg5kPU9zyxc5bn&q=85&s=0400315692f8367d7678f7468465b88f" alt="Publish dialog showing Published and Delivered to your webhook endpoint" width="1440" height="900" data-path="images/connectors/webhook-publish-success.png" />
</Frame>

Either way the article moves to **Published** and appears under the Published tab.

## What gets sent

Whatever the destination, we send the same article:

* **Title** and **slug**
* **Body**, rendered from Markdown to HTML, with JSON-LD article schema prepended
* **Meta description** as the excerpt/summary
* **Featured image**, where the destination supports one
* **Author** — the article's author persona, falling back to your workspace name

Destination-specific mapping is documented on each connector's page.

## Scheduling and auto-publish

Articles can also publish on a schedule instead of on demand:

* **Add to calendar** on any article sets the date it should go out.
* When that time arrives, a background job publishes it to the article's own destination if it
  has one, otherwise to the workspace's default publishing destination.
* **Auto-publish**, set during onboarding or in project settings, sends newly generated articles
  out without a manual step.

<Warning>
  Scheduled and auto-publish runs need a **connected** destination and an active paid plan at the
  time they fire. If the connector was disconnected — or a delivery keeps failing and the
  connector flipped to **Error** — the scheduled article stays where it is instead of publishing.
  Check the Integrations tab if a scheduled post doesn't appear.
</Warning>

## Publishing the same article twice

Publishing again creates a **new** item at the destination rather than updating the previous
one — with one exception: the webhook connector sends `article.updated` instead of
`article.published`, so your own handler can upsert on `article.id`.
