> ## 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.

# YouTube Integration

> Automatically publish YouTube videos as Ghost posts with embedded players, configurable metadata, tags, and publish settings.

export const PlanStatus = ({tier, status, beta, deprecated}) => {
  const variants = {
    luna: {
      bg: "#8340B9",
      color: "#ffffff",
      border: "1px solid #8340B9"
    },
    voyager: {
      bg: "#6B2FA0",
      color: "#ffffff",
      border: "1px solid #6B2FA0"
    },
    "space-station": {
      bg: "transparent",
      color: "#8340B9",
      border: "1px solid #8340B9"
    },
    "all-plans": {
      bg: "transparent",
      color: "#525252",
      border: "1px solid #a3a3a3"
    },
    labs: {
      bg: "transparent",
      color: "#a16207",
      border: "1px solid #a16207"
    },
    beta: {
      bg: "transparent",
      color: "#a16207",
      border: "1px solid #a16207"
    },
    "invite-only": {
      bg: "transparent",
      color: "#525252",
      border: "1px solid #a3a3a3"
    },
    bespoke: {
      bg: "transparent",
      color: "#525252",
      border: "1px solid #a3a3a3"
    },
    "outpost-hosted": {
      bg: "transparent",
      color: "#525252",
      border: "1px solid #a3a3a3"
    },
    deprecated: {
      bg: "transparent",
      color: "#b91c1c",
      border: "1px solid #b91c1c"
    }
  };
  const chip = (variant, label) => {
    const s = variants[variant] || variants["all-plans"];
    return <span key={variant + ":" + label} style={{
      display: "inline-flex",
      alignItems: "center",
      padding: "0.15rem 0.55rem",
      fontSize: "0.7rem",
      fontWeight: 700,
      letterSpacing: "0.05em",
      textTransform: "uppercase",
      borderRadius: "3px",
      lineHeight: 1.4,
      whiteSpace: "nowrap",
      backgroundColor: s.bg,
      color: s.color,
      border: s.border
    }}>
        {label}
      </span>;
  };
  const tierLabel = {
    "luna": "Luna",
    "voyager+": "Voyager+",
    "voyager-luna": "Voyager + Luna",
    "space-station+": "Space Station+",
    "all-plans": "All plans"
  };
  const tierVariant = {
    "luna": "luna",
    "voyager+": "voyager",
    "voyager-luna": "voyager",
    "space-station+": "space-station",
    "all-plans": "all-plans"
  };
  const statusLabel = {
    "labs": "Labs",
    "invite-only": "Invite-only",
    "bespoke": "Bespoke",
    "deprecated": "Deprecated",
    "outpost-hosted": "Outpost Hosted"
  };
  return <span style={{
    display: "inline-flex",
    gap: "0.4rem",
    flexWrap: "wrap",
    alignItems: "center",
    margin: "0 0 1.25rem 0"
  }}>
      {tier && chip(tierVariant[tier], tierLabel[tier])}
      {status && chip(status, statusLabel[status])}
      {beta && chip("beta", "Beta")}
      {deprecated && chip("deprecated", "Deprecated")}
    </span>;
};

<PlanStatus tier="voyager+" />

The YouTube integration automatically publishes videos from your YouTube channel as Ghost posts. You can import your existing video library and have new uploads automatically create posts — each with an embedded player, and you control how metadata, descriptions, tags, and templates are applied.

***

## How it works

1. You enter your YouTube Channel ID and configure import settings
2. Outpost checks your channel for new videos about once an hour
3. Each video is created as a Ghost post with an embedded YouTube player
4. Tags, author, description, and template are applied based on your settings
5. Posts are created as drafts or published automatically, depending on your publish mode

***

## Settings

| Field                                             | Description                                                                                                                                                                                                                                                           |
| ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Channel ID**                                    | Your YouTube channel ID. Required to enable all other settings.                                                                                                                                                                                                       |
| **Mode**                                          | **Import Existing Videos** imports your full video library. **Add Only New Videos** only imports videos published after connecting.                                                                                                                                   |
| **Post Tags**                                     | Tags to automatically apply to every imported video post.                                                                                                                                                                                                             |
| **Post Author**                                   | The Ghost author to assign to imported posts. Populated from your Ghost site's author list.                                                                                                                                                                           |
| **Add YouTube Description to the Post**           | **No** — skip the description. **First Paragraph** — include only the first paragraph. **All Text** — include the full video description.                                                                                                                             |
| **Add YouTube Description to the Metadata field** | **No** or **Yes** — controls whether the video description is also included in the post's excerpt.                                                                                                                                                                    |
| **Hide the Featured Image on the Post**           | **No** or **Yes** — choose whether the video thumbnail appears as the post's featured image.                                                                                                                                                                          |
| **Post Template**                                 | Assign a custom Ghost theme template to imported posts. Leave blank for the default template.                                                                                                                                                                         |
| **Embed Options**                                 | **Embed YouTube Video** — embeds the video player directly in the post. **Deferred Loading** — relies on a theme-side script to inject the player at view time (your theme must support the deferred-loading helper). **None** — no player embed, just the post text. |
| **Publish Mode**                                  | **Draft** — imported posts are saved as drafts for review. **Published** — posts go live immediately.                                                                                                                                                                 |
| **Visibility**                                    | **Public** — all visitors can see the post. **Public and Unlisted** — includes unlisted videos. **Unlisted** — only unlisted videos are imported.                                                                                                                     |

***

## Unlisted videos and account access

If you select **Public and Unlisted** or **Unlisted** visibility, Outpost needs access to your YouTube account to read unlisted videos:

1. Click **Connect API** in the visibility section
2. Sign in with Google to authorize Outpost to access your YouTube account
3. Outpost can now import unlisted videos alongside public ones

<Warning>
  Public videos do not require API authorization. Only connect the API if you need to import unlisted videos.
</Warning>

To disconnect, click **Disconnect API**. This revokes Outpost's access to your YouTube account.

***

## Post creation

When a video is imported, Outpost creates a Ghost post with:

* **Title** — The video's YouTube title
* **Content** — An embedded YouTube player (based on your embed options), plus the video description if configured
* **Featured image** — The video's thumbnail (unless hidden)
* **Tags** — Your configured default tags
* **Author** — Your configured default author
* **Template** — Your configured theme template
* **Status** — Draft or published per your publish mode setting

***

## Related features

<CardGroup cols={2}>
  <Card title="Contextly" icon="sparkles" href="/integrations/contextly">
    Drive content recommendations that include imported video posts.
  </Card>

  <Card title="Trending Posts" icon="fire" href="/features/trending-posts">
    Track which imported videos are trending on your site.
  </Card>
</CardGroup>

***

## FAQ

<AccordionGroup>
  <Accordion title="How often does Outpost check for new videos?">
    Outpost checks your YouTube channel for new uploads about once an hour and imports them automatically based on your configured settings.
  </Accordion>

  <Accordion title="Can I import videos from multiple channels?">
    Each YouTube integration connects to one channel. If you need to import from multiple channels, contact support.
  </Accordion>

  <Accordion title="What happens if I change my import settings?">
    Settings changes apply to future imports only. Already-imported posts are not retroactively updated. To re-import with new settings, disconnect and reconnect the integration.
  </Accordion>

  <Accordion title="Does deferred loading affect SEO?">
    Deferred loading uses a theme-side script to inject the embed at view time, which can improve page speed scores. Confirm with your theme developer that the deferred-loading helper is wired up; otherwise the player may not appear.
  </Accordion>
</AccordionGroup>
