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

# Run the Recurring Revenue Lifecycle

> Understand how a recurring catalog item becomes an ongoing customer relationship.

export const RubaSocials = () => {
  if (typeof document === "undefined") {
    return null;
  }
  const inject = () => {
    const footer = document.getElementById("footer");
    if (!footer || document.getElementById("ruba-socials")) {
      return false;
    }
    const isDark = document.querySelector("html.dark") || document.querySelector('html[class*="dark"]');
    const lineColor = isDark ? "#383838" : "#e8e8ed";
    const iconColor = isDark ? "#8e8e93" : "#86868b";
    const markColor = isDark ? "#ffffff" : "#08080c";
    const hoverColor = "#0071e3";
    const div = document.createElement("div");
    div.id = "ruba-socials";
    div.style.cssText = `display:flex;align-items:center;gap:20px;padding-top:20px;margin-top:20px;border-top:1px solid ${lineColor};width:100%`;
    const logo = `<a href="https://getruba.com" style="display:inline-flex;height:24px;align-items:center;gap:8px;text-decoration:none;color:${markColor};line-height:1;"><svg width="24" height="24" viewBox="0 0 120 120" aria-hidden="true" style="display:block;flex:none;"><g transform="translate(2.5 0)"><path d="M19 25h59L65.43 47H19a4 4 0 0 1-4-4V29a4 4 0 0 1 4-4Z" fill="${markColor}"/><path d="M19 73h31.57L38 95H19a4 4 0 0 1-4-4V77a4 4 0 0 1 4-4Z" fill="${markColor}"/><path d="M85 25h25L70 95H45Z" fill="#007AFF"/></g></svg><span style="display:inline-flex;height:24px;align-items:center;font-weight:600;font-size:15px;color:${markColor};letter-spacing:-0.01em;line-height:1;">Ruba</span></a>`;
    const spacer = `<div style="flex:1"></div>`;
    const ig = `<a href="https://instagram.com/getruba" target="_blank" rel="noopener" aria-label="Instagram" style="display:flex;align-items:center;color:${iconColor};transition:color 0.15s ease;" onmouseover="this.style.color='${hoverColor}'" onmouseout="this.style.color='${iconColor}'"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="20" rx="5" ry="5"/><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"/><line x1="17.5" y1="6.5" x2="17.51" y2="6.5"/></svg></a>`;
    const li = `<a href="https://linkedin.com/company/getruba" target="_blank" rel="noopener" aria-label="LinkedIn" style="display:flex;align-items:center;color:${iconColor};transition:color 0.15s ease;" onmouseover="this.style.color='${hoverColor}'" onmouseout="this.style.color='${iconColor}'"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"/><rect x="2" y="9" width="4" height="12"/><circle cx="4" cy="4" r="2"/></svg></a>`;
    const x = `<a href="https://x.com/getruba" target="_blank" rel="noopener" aria-label="X" style="display:flex;align-items:center;color:${iconColor};transition:color 0.15s ease;" onmouseover="this.style.color='${hoverColor}'" onmouseout="this.style.color='${iconColor}'"><svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg></a>`;
    const github = `<a href="https://github.com/rubadot" target="_blank" rel="noopener" aria-label="GitHub" style="display:flex;align-items:center;color:${iconColor};transition:color 0.15s ease;" onmouseover="this.style.color='${hoverColor}'" onmouseout="this.style.color='${iconColor}'"><svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M12 .7a11.5 11.5 0 0 0-3.64 22.4c.58.1.79-.25.79-.56v-2.24c-3.22.7-3.9-1.37-3.9-1.37-.53-1.34-1.29-1.7-1.29-1.7-1.05-.72.08-.71.08-.71 1.16.08 1.78 1.2 1.78 1.2 1.04 1.77 2.72 1.26 3.38.96.1-.75.4-1.26.74-1.55-2.57-.3-5.27-1.29-5.27-5.69 0-1.26.45-2.29 1.19-3.09-.12-.29-.52-1.47.11-3.05 0 0 .97-.31 3.16 1.18A10.96 10.96 0 0 1 12 6.09c.98 0 1.94.13 2.86.39 2.2-1.49 3.16-1.18 3.16-1.18.63 1.58.23 2.76.11 3.05.74.8 1.19 1.83 1.19 3.09 0 4.42-2.7 5.39-5.28 5.68.42.36.79 1.06.79 2.14v3.28c0 .31.21.67.8.56A11.5 11.5 0 0 0 12 .7Z"/></svg></a>`;
    div.innerHTML = logo + spacer + ig + li + x + github;
    footer.appendChild(div);
    return true;
  };
  if (!document.documentElement.dataset.rubaSocialsObserver) {
    document.documentElement.dataset.rubaSocialsObserver = "true";
    const observer = new MutationObserver(() => {
      if (!document.getElementById("ruba-socials")) {
        inject();
      }
    });
    observer.observe(document.body, {
      childList: true,
      subtree: true
    });
  }
  setTimeout(() => {
    if (!inject()) {
      const interval = setInterval(() => {
        if (inject()) {
          clearInterval(interval);
        }
      }, 500);
      setTimeout(() => clearInterval(interval), 10000);
    }
  }, 300);
  return null;
};

<link rel="stylesheet" href="/style.css" />

<RubaSocials />

A subscription is Ruba’s record of an ongoing agreement between one customer and one recurring catalog item. Checkout normally creates it, the renewal engine advances it, and its state determines whether attached benefits remain available.

## The subscription lifecycle

<Steps>
  <Step title="Checkout establishes the relationship">
    After the first checkout succeeds, Ruba records both the initial [order](/features/orders) and the subscription that will control future billing periods.
  </Step>

  <Step title="The period advances">
    When `current_period_end` is reached, Ruba opens the next period, prepares another order with the applicable tax and discount, and charges the saved payment method.
  </Step>

  <Step title="Payment determines the next state">
    A successful renewal leaves the subscription active. A failed charge moves it to `past_due` and begins the [recovery schedule](/features/subscriptions/failed-payments).
  </Step>

  <Step title="Access follows subscription state">
    Benefits stay granted while the relationship is active or trialing. Cancellation, revocation, or an unrecovered payment can remove that access according to the configured grace period.
  </Step>
</Steps>

## Bringing subscriptions into existence

Paid recurring items always begin through checkout because Ruba must collect and validate a payment method.

Free recurring items have a second route: create the subscription directly for an existing customer through the [Create Subscription operation](/api-reference/subscriptions/create). That route does not create an initial order, send a confirmation email, or collect money.

## Recurring pricing

The catalog item supplies the commercial rules that the subscription locks in:

| Decision       | Available behavior                                                          |
| -------------- | --------------------------------------------------------------------------- |
| Cadence        | Daily, weekly, monthly, or yearly.                                          |
| Interval count | Multiply the cadence, such as every 2 months.                               |
| Price model    | Fixed amount, pay what you want, or free.                                   |
| Currency       | The currency selected during checkout remains attached to the subscription. |

Cadence and price model cannot be replaced on the same catalog item after creation. Create another item when those structural rules need to differ, then move eligible subscribers through the [subscription update flow](/features/subscriptions/manage#change-the-plan).

## Renewal reminders

Ruba sends an advance reminder seven days before a renewal when the billing cycle is at least six months. The threshold includes:

* yearly plans;
* monthly plans with an interval count of at least 6;
* weekly plans with an interval count of at least 25; and
* daily plans with an interval count of at least 180.

Free subscriptions and subscriptions already set to end at the current period are excluded. You can disable these messages under **Settings → Customer notifications**.

## Cancellation

Ending renewal and ending access are separate decisions.

<CardGroup cols={2}>
  <Card title="Stop after the paid period" icon="calendar-xmark">
    Cancel at period end to keep the subscription and its benefits active through `current_period_end`. This pending cancellation can be reversed before that timestamp.
  </Card>

  <Card title="Remove access now" icon="ban">
    Revoke immediately to move the subscription to `canceled` and remove its benefits at once. This action cannot be reversed.
  </Card>
</CardGroup>

Customers can perform the actions you permit from the [Customer Portal](/features/customer-portal/introduction). Your team can operate the full lifecycle from the dashboard or API.

## Decisions and edge cases

<AccordionGroup>
  <Accordion title="How is a subscription different from a catalog item?">
    The catalog item defines what is sold: its copy, price, cadence, and benefits. A subscription records one customer’s continuing relationship with that item.
  </Accordion>

  <Accordion title="Can an organization allow several subscriptions per customer?">
    The default is one active subscription for each customer within an organization. If your model requires parallel subscriptions, enable **Allow multiple subscriptions** under the organization’s subscription settings.
  </Accordion>

  <Accordion title="When does the first charge happen?">
    Checkout collects it immediately unless the item includes a trial. With a trial, the first charge is attempted when that trial ends.
  </Accordion>

  <Accordion title="Does editing a catalog price change current subscriptions?">
    No. Current subscriptions retain the amount captured when they began. A catalog price edit affects later purchases. Move an existing customer to another price by changing the subscription’s product or allowing a portal plan change.
  </Accordion>

  <Accordion title="When are benefits removed?">
    A period-end cancellation preserves benefits through the paid term. Immediate revocation removes them now. Exhausted payment recovery removes them when the subscription becomes unpaid, subject to the organization’s configured [benefit grace period](/features/subscriptions/failed-payments#benefit-revocation-grace-period).
  </Accordion>
</AccordionGroup>

## Continue the build

<CardGroup cols={2}>
  <Card title="Operate subscriptions" icon="sliders" href="/features/subscriptions/manage">
    Change plans, quantities, discounts, trial dates, renewal dates, and cancellation state.
  </Card>

  <Card title="Choose proration" icon="scale-unbalanced" href="/features/subscriptions/proration">
    Decide when a plan change applies and when its difference is charged or credited.
  </Card>

  <Card title="Recover failed renewals" icon="arrow-rotate-right" href="/features/subscriptions/failed-payments">
    Follow retry timing, customer recovery, and benefit revocation.
  </Card>

  <Card title="Use the API" icon="terminal" href="/api-reference/subscriptions/list">
    Read and operate subscription records programmatically.
  </Card>
</CardGroup>
