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

# Subscription Schedules

> Two-phase pricing that starts on one billing interval and automatically transitions to another — like 3 months at an intro rate, then annual renewal.

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="luna" status="labs" />

Subscription schedules let you create two-phase pricing where a subscriber starts on one plan and automatically transitions to a different plan — with a different price *and* a different billing interval. This is the key difference from a regular discount: schedules give you **time-period flexibility**, not just price flexibility.

<Frame caption="The Subscription Schedules page showing configured schedules with base and renewal pricing">
  <img src="https://mintcdn.com/outpost-eb0cfbad/GtgZF2lZWcNeMe00/images/subscriptions/subscription-schedules.png?fit=max&auto=format&n=GtgZF2lZWcNeMe00&q=85&s=033bfda1f1e00f618fc53e4ad7137024" alt="Subscription Schedules page showing a list of schedules with name, base price, renewal price, and subscriber count" width="1904" height="1106" data-path="images/subscriptions/subscription-schedules.png" />
</Frame>

Go to **Labs → Subscription Schedules** to manage your schedules.

## How it works

A schedule defines two Stripe prices — an introductory price and a renewal price. These can have **different amounts and different billing intervals**:

| Phase             | What it controls                                                      |
| ----------------- | --------------------------------------------------------------------- |
| **Base price**    | The price and interval for the first period (e.g., \$10 for 3 months) |
| **Renewal price** | The price and interval for all subsequent renewals (e.g., \$50/year)  |

When a member subscribes via a schedule, Stripe automatically:

1. Bills at the **base price** for the intro period
2. Transitions to the **renewal price** when the intro period ends
3. Continues at the renewal price for all future billing cycles

No manual steps are needed — the transition happens automatically.

## Why schedules instead of offers?

A Ghost offer with a one-time discount already lets you charge less for the first payment. Schedules solve a different problem: **changing the billing interval**, not just the price.

For example, you can't do any of these with a regular offer:

* **3 months for $10, then $50/year** — the entry period is 3 months, renewal is annual
* **1 month for $5, then $100 every 6 months** — monthly intro, semi-annual renewal
* **6 months for $25, then $99/year** — half-year trial period, annual renewal

Both the intro price and the renewal price can also have their own discounts applied. The renewal price can have a one-time or forever discount, so you can combine interval flexibility with discounted pricing.

## Example use cases

* **Low-commitment entry** — 1 month for $5, then $50/year. Let people try it cheaply before committing to an annual plan.
* **Quarterly intro** — 3 months for $10, then $99/year. A longer trial period with a meaningful discount.
* **Founding member rate** — 6 months for $25, then $75/year (with a forever discount on the renewal price). Reward early subscribers.

## Setting up a schedule

Schedules pick from existing Outpost offers (each offer wraps a Stripe price), so set up your offers first if they don't already exist.

<Steps>
  <Step title="Create the intro and renewal offers">
    In **Subscriptions → Ghost Offers** or **Subscriptions → Outpost Promotions**, create two offers: one for the intro period (e.g., 3 months at $10) and one for the standard renewal (e.g., $99/year). Each offer is tied to a Stripe price.
  </Step>

  <Step title="Create the schedule in Outpost">
    Go to **Labs → Subscription Schedules** and click to add a new schedule.
  </Step>

  <Step title="Configure the schedule">
    Enter the schedule details:

    | Field                 | Description                                                      |
    | --------------------- | ---------------------------------------------------------------- |
    | **Name**              | Internal label for the schedule (e.g., "Founding Member Rate")   |
    | **Offer Headline**    | Headline shown on the schedule's sales page                      |
    | **Slug**              | URL slug used in the public schedule URL                         |
    | **Description**       | Supporting copy shown on the sales page                          |
    | **Base price**        | Pick the offer that defines the introductory period and price    |
    | **Renewal price**     | Pick the offer that defines all subsequent renewals              |
    | **Add Member Labels** | Optional labels to apply to members who enroll via this schedule |
  </Step>

  <Step title="Share the schedule URL">
    Each schedule generates a unique subscription URL. Share it in newsletters, CTAs, or embed it on your site to let members subscribe at the intro rate. Schedules are typically delivered via a [promotion](/features/promotions).
  </Step>
</Steps>

## Labels for cohort tracking

You can specify labels to automatically apply to members who enroll via a schedule. This makes it easy to:

* **Track cohorts** — See which members are on intro pricing vs. standard pricing
* **Target in campaigns** — Send different email campaigns to founding members vs. regular subscribers
* **Measure retention** — Compare churn rates between intro-rate and full-price subscribers

For example, add a `founding-member` label to members on a founding rate schedule. This lets you filter, segment, and target these members across all of Outpost's tools.

<Note>
  Subscription schedules are supported on all Stripe accounts — no additional Stripe plan or upgrade is needed.
</Note>

## How schedules differ from offers

|                      | Subscription Schedule                                        | Ghost Offer                                                |
| -------------------- | ------------------------------------------------------------ | ---------------------------------------------------------- |
| **What changes**     | Price *and* billing interval                                 | Price only (same interval)                                 |
| **Phases**           | Two separate Stripe prices with independent intervals        | One price with a discount applied                          |
| **Discount support** | Both phases can have their own discounts                     | One-time, repeating, or forever discount on a single price |
| **Best for**         | Flexible entry periods (1/3/6 month intros → annual renewal) | Simple discounts on an existing tier                       |

***

## Frequently asked questions

<AccordionGroup>
  <Accordion title="Can I have more than two phases?">
    No. Outpost supports two-phase schedules: a base price for the first period and a renewal price for all subsequent periods. If you need more complex pricing, consider combining a schedule with a time-limited offer.
  </Accordion>

  <Accordion title="What happens if a member cancels during the intro phase?">
    The member loses access at the end of their current billing period, just like a standard cancellation. If they resubscribe later, they'll get the current pricing — they won't return to the intro rate unless you create a new schedule or offer for them.
  </Accordion>

  <Accordion title="Can I change the renewal price after members have enrolled?">
    The schedule itself can be updated, but existing subscribers continue at their original renewal price — Stripe locks it in when they sign up. New subscribers will get the updated renewal price. To change pricing for existing subscribers, you would need to update their subscriptions in Stripe directly.
  </Accordion>

  <Accordion title="Can I apply a discount to a schedule's renewal price?">
    Yes. Both the intro price and the renewal price are independent offers, so either can have its own discount. For example, you could offer a 3-month intro at $10, then an annual renewal at $99 with a 20% forever discount — making the effective renewal \$79.20/year.
  </Accordion>

  <Accordion title="Why not just use an offer with a one-time discount?">
    A one-time discount offer charges less for the first payment but keeps the same billing interval. Schedules let you change the interval — start someone on a 3-month plan and then renew them annually. If you only need a cheaper first payment on the same interval, a regular offer is simpler.
  </Accordion>
</AccordionGroup>

***

## Related features

<CardGroup cols={2}>
  <Card title="Tiers & Pricing" icon="layer-group" href="/features/tiers-and-pricing">
    The subscription products that schedules are built on
  </Card>

  <Card title="Offers & Discounts" icon="tag" href="/features/offers-and-discounts">
    Simple discounts when you don't need to change the billing interval
  </Card>

  <Card title="Promotions" icon="rocket" href="/features/promotions">
    Outpost's flexible offer system — schedules are used through promotions
  </Card>

  <Card title="Autoresponder" icon="envelope-open-text" href="/features/basic-autoresponder">
    Automated emails triggered by subscription events
  </Card>

  <Card title="Labels" icon="tag" href="/features/labels">
    Tag schedule subscribers for cohort tracking
  </Card>
</CardGroup>
