Staaarter

Billing Subscription Tier Benefits

A plan comparison section that lays tiers out as cards with a price, a short description, and a checkmarked list of what's included. One tier can be flagged as recommended, which adds a ring and a badge to its card. Each card ends in its own call-to-action button. Built as a static display for pricing and upgrade pages, not a picker, use the Billing Plan Selector block instead if you need the cards to be selectable.

By Staaarter Team
Billing
Updated June 18, 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-subscription-tier-benefits.json

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

Usage

The file also exports billing135Demo, 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 { Billing135, billing135Demo } from "@/components/blocks/billing/billing135";

export default function Page() {
  return <Billing135 {...billing135Demo} />;
}

Props

PropTypeDefaultDescription
headingstringnoneOptional heading above the tier cards.
descriptionstringnoneOptional supporting text below the heading.
tiersTierBenefit[]noneTiers rendered as cards. Three tiers render in a 3-column grid, anything else falls back to 2 columns.
classNamestringnoneExtra classes for the outer container.

Types

interface TierBenefit {
  name: string;
  price: string;
  interval?: string;
  description?: string;
  recommended?: boolean;
  benefits: string[];
  ctaLabel?: string;
  ctaHref?: string;
}

Behavior notes

  • This is a static comparison, not a picker: no click handler changes state, each card's CTA is a plain link to ctaHref.
  • A tier with recommended set true gets a primary ring around its card and a "Most popular" badge next to its name, plus its CTA button switches from outline to the filled default variant.
  • The grid switches between a 3-column and 2-column layout automatically based on tiers.length === 3, there's no separate prop to force the column count.
  • Prices and intervals are plain strings so currency formatting, symbol placement, and localization are entirely up to the caller.
  • Benefit lists have no maximum length or truncation, a very long list just makes that card taller than its neighbors since the grid rows aren't equal-height locked.

Frequently asked questions