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
- Up to 3 projects
- Basic analytics
- Community support
- Custom integrations
- Priority support
Pro
Most PopularFor growing teams
- Unlimited projects
- Advanced analytics
- Priority support
- Custom integrations
- Dedicated manager
Installation
npx shadcn@latest add "https://billui.com/r/plan-group.json""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 codeExamples
Horizontal Card Layout
Use layout="horizontal" on PlanCard combined with layout="vertical" on PlanGroupContent to create a row-style pricing list.
Compare plans
Basic
- 5 projects
- Basic analytics
- Priority support
Pro
Popular- Unlimited projects
- Advanced analytics
- Priority support
Default Yearly Period
Set defaultPeriod="year" to show yearly prices by default.
Annual pricing
Save more with yearly billingHobby
For side projects
- 3 projects
- Community support
Team
For small teams
- Unlimited projects
- Team collaboration
- Priority support
Custom Toggle Labels
Customize the toggle labels with monthLabel and yearLabel.
Flexible billing
Solo
For freelancers
- 10 projects
- Email support
Agency
For creative agencies
- Unlimited projects
- White-label reports
- 24/7 support
Without Header
You can use PlanGroup without a header for simpler use cases.
Monthly
Flexible billing
- All features
- Cancel anytime
Annual
Best value
- All features
- 2 months free
API Reference
PlanGroup
The root container component that provides context for billing period state.
| Prop | Type | Default |
|---|---|---|
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.
| Prop | Type | Default |
|---|---|---|
monthLabel | string | "Monthly" |
yearLabel | string | "Yearly" |
yearDiscount | string | — |
PlanGroupContent
Grid container for the pricing cards.
| Prop | Type | Default |
|---|---|---|
layout | "horizontal" | "vertical" | "horizontal" |
columns | 2 | 3 | 4 | 2 |
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.
| Prop | Type | Default |
|---|---|---|
monthlyAmount | number | — |
yearlyAmount | number | — |
currency | string | "$" |
originalMonthlyAmount | number | — |
originalYearlyAmount | number | — |
usePlanGroup
Hook to access the billing period state from child components.
const { period, setPeriod } = usePlanGroup();