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

# Ghost Integration

> Bidirectional member sync, label management, tier mapping, and real-time automation between Outpost and your Ghost CMS site.

Ghost is Outpost's primary integration. Your Ghost site is the source of truth for members, subscriptions, tiers, and content. Outpost connects to Ghost to read that data and layer on growth, retention, and automation tools.

<Frame caption="Ghost connection settings in Core Connections showing API keys, URL, and webhook configuration">
  <img src="https://mintcdn.com/outpost-eb0cfbad/-cSE19cqpLAJyGqt/images/integrations/ghost-settings.png?fit=max&auto=format&n=-cSE19cqpLAJyGqt&q=85&s=ed46a412d97d84f6045e17aec1c4307e" alt="Ghost integration settings with Content API key, Admin API key, API URL, and webhook URL fields" width="1540" height="482" data-path="images/integrations/ghost-settings.png" />
</Frame>

<Info>
  For initial setup instructions, see [Connecting Ghost](/getting-started/connecting-ghost).
</Info>

***

## How it works

1. You connect Outpost to Ghost using Content API and Admin API keys
2. Outpost sets up real-time notifications on your Ghost site to receive member and post events
3. When a member is created, updated, or deleted in Ghost, Outpost updates its records automatically
4. When Outpost applies or removes a label, it updates the member in Ghost to match
5. Tiers, posts, tags, and newsletter segments are read from Ghost to drive Outpost's automation and targeting

***

## What syncs

| Data                             | Direction       | When                    |
| -------------------------------- | --------------- | ----------------------- |
| Members (create, update, delete) | Ghost → Outpost | Real-time               |
| Labels                           | Outpost → Ghost | On change               |
| Posts and tags                   | Ghost → Outpost | Real-time and on-demand |
| Newsletter segments              | Ghost → Outpost | On-demand               |
| Tiers                            | Ghost → Outpost | On-demand               |

Ghost is the **source of truth** for members, subscriptions, and tiers. Stripe billing flows directly between Stripe and Ghost. Outpost reads that data to drive automation, segmentation, and conversion tools.

<Warning>
  Outpost does not create or modify Ghost tiers, subscriptions, or posts. It reads this data and writes labels back to Ghost — and creates a Ghost member when an Outpost-side action (like adding a complimentary member) needs one that doesn't exist yet.
</Warning>

***

## Connection settings

The Ghost connection is configured under **Core Connections** in the left navigation. The settings include:

| Field                                | Description                                                                                                                   |
| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- |
| **Content API Key**                  | Read-only key for accessing published content (posts, tags, tiers). Found in Ghost Admin → Integrations → Custom Integration. |
| **Admin API Key**                    | Read/write key for member and label operations. Found in the same Ghost custom integration.                                   |
| **API URL**                          | Your Ghost site's URL (e.g., `https://yoursite.com`).                                                                         |
| **Webhook URL**                      | Read-only URL that Outpost provides. This is where Ghost sends webhook notifications.                                         |
| **External webhook for new members** | Optional URL to receive notifications when new members are added. Useful for triggering external workflows.                   |

***

## Member sync

```mermaid theme={"theme":{"light":"github-light","dark":"github-dark"}}
flowchart LR
    subgraph G[Ghost]
        GM[Member<br/>record]
    end
    subgraph O[Outpost]
        OM[Member<br/>record]
        OL[Labels &<br/>automation]
    end
    GM -->|signup, subscribe,<br/>cancel, tier change| OM
    OM --> OL
    OL -->|label add/remove| GM
```

### Ghost → Outpost

When a member event occurs in Ghost, Outpost automatically:

1. Creates or updates the matching member record in Outpost
2. Syncs subscription status, tier, and payment information
3. Applies any matching auto-subscribe rules for newsletters
4. Updates segments and triggers any label-based automation flows
5. Records the event in the [Activity Log](/features/activity-log)

### Outpost → Ghost

When Outpost applies or removes a label (via automation, bulk action, or manual change):

1. Outpost updates the member's labels in Ghost to match
2. Ghost reflects the change in its member portal
3. Any Ghost-side automations tied to that label are triggered

***

## Tiers

Tiers are created and managed in Ghost. Outpost reads them so they're available for:

* Member filtering and segmentation
* Offer and access rule configuration
* Automation trigger conditions (e.g., "when a member upgrades to Premium tier")
* Email campaign targeting
* [Subscription schedules](/features/subscription-schedules) and [complimentary subscriptions](/features/complimentary-subscriptions)

***

## What Outpost monitors

Outpost automatically listens for the following events from Ghost when you connect:

| Event          | Purpose                                                 |
| -------------- | ------------------------------------------------------- |
| Member added   | New member created in Ghost                             |
| Member updated | Member changed (email, name, subscription, labels)      |
| Member deleted | Member removed from Ghost                               |
| Post published | New post published (for analytics and content tracking) |
| Post updated   | Post updated (for content sync)                         |

***

## Automatic sync checks

Beyond real-time updates, Outpost rechecks your member counts and labels against Ghost every few hours to catch anything a live update might have missed. Renamed or deleted labels are corrected automatically in the background. For member counts, Outpost allows for a small amount of normal variation — under roughly half a percent of your total — and resyncs automatically once a gap grows past that, so your data stays accurate without any action from you.

If the difference is large, Outpost deliberately holds off on fixing it all at once, so it doesn't overwhelm your Ghost site with requests. The mismatch is flagged for the Outpost team to resync safely instead. You don't need to do anything — but if you've just made a big change in Ghost (such as a bulk import) and your counts look off, you can also [resync manually](#manual-resync).

***

## Manual resync

If sync gets out of state, use the resync options in **Core Connections → Ghost**:

* **Sync members** — Re-import all Ghost members into Outpost, updating existing records and creating new ones
* **Pull members from Ghost** — Full re-import of the Ghost member list

<Tip>
  Manual resync is useful after initial setup, after restoring a Ghost backup, or if you suspect members are out of sync. For large sites, the sync runs in the background and may take several minutes.
</Tip>

***

## Ghost API version

Outpost uses the Ghost Admin API v5. Your Ghost site must be running **Ghost 5.x or later**.

***

## Large sites

For sites with large member counts, Outpost automatically manages sync performance:

* Bulk sync operations are spread out over time
* Member updates are processed in batches
* Failed requests are retried automatically

***

## Related features

<CardGroup cols={2}>
  <Card title="Stripe Integration" icon="credit-card" href="/integrations/stripe">
    Stripe works alongside Ghost for subscription billing.
  </Card>

  <Card title="Activity Log" icon="list" href="/features/activity-log">
    View Ghost sync events and errors.
  </Card>

  <Card title="Spam Filtering" icon="shield" href="/features/spam-filtering">
    Filter spam members synced from Ghost.
  </Card>

  <Card title="Members" icon="users" href="/features/members">
    Manage the member records synced from Ghost.
  </Card>
</CardGroup>

***

## FAQ

<AccordionGroup>
  <Accordion title="Do I need to create a custom integration in Ghost?">
    Yes. Go to Ghost Admin → Settings → Integrations → Add Custom Integration. This gives you the Content API key and Admin API key that Outpost needs.
  </Accordion>

  <Accordion title="What happens if I disconnect Ghost?">
    Outpost stops receiving member updates. Existing member data in Outpost is preserved, but it will become stale as Ghost members change. Labels applied by Outpost will remain in Ghost.
  </Accordion>

  <Accordion title="Why are some members not syncing?">
    Check the [Activity Log](/features/activity-log) for sync errors. Common causes include incorrect API keys or connection issues on high-volume sites. Use the manual resync option to re-import all members.
  </Accordion>

  <Accordion title="Why is my member count slightly different in Outpost and Ghost?">
    A small difference is normal and expected — here's why:

    * **Sync timing and tolerance.** Members sync from Ghost in real time, but Outpost also runs a full count check against Ghost every few hours. It tolerates a tiny gap by design — under about half a percent of your total, and always at least a couple of members — so it isn't constantly chasing one or two people who just signed up, were removed, or changed tiers. Once a gap crosses that point, Outpost resyncs on its own. A very large gap (say, right after a bulk import) is flagged for the Outpost team to resync safely instead.
    * **Marketing campaigns leave out opted-out members.** When you build an email campaign and mark it as a marketing email, Outpost automatically excludes anyone who has opted out of marketing — members carrying the `Marketing_OptOut` label — when it works out who will receive it. That makes a campaign's audience smaller than your overall member count, even with the same tier or segment selected. New campaigns are treated as marketing by default, and you can see or adjust the excluded labels in the campaign's audience settings.

    If the gap is large or doesn't close within a few hours, run **Sync members** under [Core Connections → Ghost](#manual-resync), and check the [Activity Log](/features/activity-log) for sync errors.
  </Accordion>

  <Accordion title="Can Outpost create members in Ghost?">
    Usually members are created in Ghost (via signup forms, Stripe checkout, or import) and synced to Outpost automatically. Outpost does create a Ghost member when an Outpost-side action needs one that doesn't exist yet — for example, when you add a member manually in Outpost or grant a complimentary subscription to someone who isn't in Ghost.
  </Accordion>

  <Accordion title="Does Outpost support Ghost's native newsletter feature?">
    Outpost reads Ghost's newsletter segments and member newsletter preferences. It uses this data for targeting but does not send emails through Ghost — all emails are sent via Outpost's built-in Mailgun infrastructure. No separate Mailgun setup is required.
  </Accordion>
</AccordionGroup>
