B

Plan Group

A container for displaying multiple pricing plans with a monthly/yearly toggle.

Simple, transparent pricing

Choose the plan that works best for you. All plans include a 14-day free trial.

Free

For individuals

$0/mo
  • Up to 3 projects
  • Basic analytics
  • Community support
  • Custom integrations
  • Priority support

Pro

Most Popular

For growing teams

$49$29/mo
  • Unlimited projects
  • Advanced analytics
  • Priority support
  • Custom integrations
  • Dedicated manager

Installation

npx shadcn@latest add "https://billui.com/r/plan-group.json"
components/ui/plan-group.tsx
"use client";

import { cva, type VariantProps } from "class-variance-authority";
import * as React from "react";

import { cn } from "@/lib/utils";
import { PlanCardPrice } from "./plan-card";

// ... component code

Examples

Horizontal Card Layout

Use layout="horizontal" on PlanCard combined with layout="vertical" on PlanGroupContent to create a row-style pricing list.

Compare plans

Basic

$9/mo
  • 5 projects
  • Basic analytics
  • Priority support

Pro

Popular
$29/mo
  • Unlimited projects
  • Advanced analytics
  • Priority support

Default Yearly Period

Set defaultPeriod="year" to show yearly prices by default.

Annual pricing

Save more with yearly billing

Hobby

For side projects

$48/yr
  • 3 projects
  • Community support
Best Value

Team

For small teams

$192$144/yr
  • Unlimited projects
  • Team collaboration
  • Priority support

Custom Toggle Labels

Customize the toggle labels with monthLabel and yearLabel.

Flexible billing

Solo

For freelancers

$12/mo
  • 10 projects
  • Email support

Agency

For creative agencies

$49/mo
  • Unlimited projects
  • White-label reports
  • 24/7 support

Without Header

You can use PlanGroup without a header for simpler use cases.

Monthly

Flexible billing

$29/mo
  • All features
  • Cancel anytime
Save $70

Annual

Best value

$278/yr
  • All features
  • 2 months free

API Reference

PlanGroup

The root container component that provides context for billing period state.

PropTypeDefault
defaultPeriod"month" | "year""month"
onPeriodChange(period: BillingPeriod) => void

PlanGroupHeader

Container for the title, description, and toggle.

PlanGroupTitle

The main heading for the pricing section.

PlanGroupDescription

Supporting text below the title.

PlanGroupToggle

Toggle button for switching between monthly and yearly billing.

PropTypeDefault
monthLabelstring"Monthly"
yearLabelstring"Yearly"
yearDiscountstring

PlanGroupContent

Grid container for the pricing cards.

PropTypeDefault
layout"horizontal" | "vertical""horizontal"
columns2 | 3 | 42

PlanPrice

Price display that responds to the billing period toggle. Use this instead of PlanCardPrice when you want the price to change with the toggle.

PropTypeDefault
monthlyAmountnumber
yearlyAmountnumber
currencystring"$"
originalMonthlyAmountnumber
originalYearlyAmountnumber

usePlanGroup

Hook to access the billing period state from child components.

const { period, setPeriod } = usePlanGroup();

On this page