Staaarter

Billing Pricing Cards Grid

A classic pricing grid for presenting SaaS plans side by side, typically Free, Pro, and Enterprise. One plan can be marked highlighted to draw the eye with a border, shadow, and badge. Each card lists its own features and links to its own call-to-action target. Built for landing pages and plan comparison sections.

By Staaarter Team
Billing
Updated April 15, 2026
Docs
Live preview

Docs

Installation

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

npx shadcn add https://staaarter.com/r/billing-pricing-cards-grid.json

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

Usage

The file also exports billing99Demo, 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 { Billing99, billing99Demo } from "@/components/blocks/billing/billing99";

export default function Page() {
  return <Billing99 {...billing99Demo} />;
}

Props

PropTypeDefaultDescription
headingstringnoneOptional heading above the grid.
descriptionstringnoneOptional supporting text under the heading.
plansPricingPlan[]nonePlans rendered as cards. Three plans render in a 3-column grid on larger screens, any other count uses 2 columns.
classNamestringnoneExtra classes for the outer wrapper.

Types

interface PricingPlan {
  id: string;
  name: string;
  price: string;
  period?: string;
  description?: string;
  features: string[];
  ctaLabel?: string;
  ctaHref?: string;
  badge?: string;
  highlighted?: boolean;
}

Behavior notes

  • This is a static grid with no toggle logic built in. If you need a monthly/yearly switch, pair it with your own state and swap the price and period strings per plan when it changes.
  • Setting highlighted on a plan gives it a primary-colored border, a soft shadow, and a filled call-to-action button instead of an outlined one.
  • Each card's badge is independent of highlighted, so you can put a "New" badge on a plan that isn't the recommended one.
  • Every card's call-to-action is a next/link, not a button, since each plan typically routes somewhere different (checkout, trial signup, a contact form).
  • On mobile, the grid collapses to a single column regardless of how many plans are passed in.

Frequently asked questions