Staaarter

Billing Downgrade Options

A downgrade selection panel for account settings and billing pages. It compares the current and target plan side by side, lists which features are lost or reduced in a plain checklist, and offers a pause-the-subscription alternative before the user commits to downgrading. Built as a selection interface, not a confirmation dialog, so pair it with your own confirmation step for the actual plan change.

By Staaarter Team
Billing
Updated July 14, 2026
Docs
Live preview

Docs

Installation

A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its badge, button dependencies and any missing npm packages, and installs them straight into your project.

npx shadcn add https://staaarter.com/r/billing-downgrade-options.json

Prefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/billing/billing49.tsx instead.

Usage

The file also exports billing49Demo, the exact props behind the preview above. Spread it to get a working section in one line, then replace it with your own data.

import { Billing49, billing49Demo } from "@/components/blocks/billing/billing49";

export default function Page() {
  return <Billing49 {...billing49Demo} />;
}

Props

PropTypeDefaultDescription
headingstring"Change your plan"Panel heading.
descriptionstring(see source)Supporting line under the heading.
currentPlanNamestringnoneName of the plan the customer is on now.
currentPricestringnoneCurrent price shown as-is, e.g. "$99/mo".
targetPlanNamestringnoneName of the plan they're downgrading to.
targetPricestringnoneTarget price shown as-is, e.g. "$29/mo".
effectiveNotestringnoneOptional note about when the change takes effect.
impactsDowngradeImpact[]noneFeatures affected by the downgrade, each marked as fully lost or just reduced.
pauseHeadingstring"Not ready to downgrade?"Heading on the pause-alternative box.
pauseDescriptionstring(see source)Body text on the pause-alternative box.
pauseLabelstring"Pause instead"Label on the pause button.
pauseHrefstringnoneLink for the pause action. The whole pause box is omitted if this isn't set.
downgradeLabelstring"Continue to downgrade"Label on the main downgrade button.
downgradeHrefstringnoneLink the downgrade button points to.
classNamestringnoneExtra classes for the outer container.

Types

interface DowngradeImpact {
  feature: string;
  status: "lost" | "limited";
  detail?: string;
}

Behavior notes

  • The impacts list is rendered exactly as given, an X icon for a fully lost feature and a minus icon for one that's just reduced. The count in the section heading is computed from how many entries have status "lost".
  • The pause-alternative box only renders when pauseHref is set, so leave it out entirely if you don't offer a pause option.
  • This is a selection screen, not a confirmation. Clicking downgrade just follows downgradeHref, so route it to a confirmation dialog or a second step before the plan actually changes.
  • There's no internal state, every value is driven entirely by props, so a parent server component can render this without needing 'use client'.

Frequently asked questions