A comprehensive pricing display component with billing toggles, feature comparisons, and contact options for SaaS and subscription services.
Overview
The Pricing Cards component streamlines subscription plan presentation with clear feature comparisons and pricing options, making it essential for converting visitors into customers. It supports monthly/yearly billing toggles, popular plan highlighting, and contact cards for enterprise inquiries, reducing decision friction and improving conversion rates. Perfect for SaaS landing pages, subscription services, and any business with tiered pricing models.
Installation
pnpm dlx shadcn@latest add https://deltacomponents.dev/r/pricing-cards.json
Usage
1import { PricingCards } from "@/registry/components/pricing-cards"23const plans = [4 {5 id: "basic",6 name: "Basic",7 description: "Perfect for getting started",8 price: { monthly: 9, yearly: 90, currency: "$" },9 features: [10 { text: "Up to 1,000 API calls", included: true },11 { text: "Basic support", included: true },12 { text: "Advanced analytics", included: false },13 ],14 cta: { text: "Get Started" },15 },16 {17 id: "pro",18 name: "Pro",19 description: "Best for growing businesses",20 price: { monthly: 29, yearly: 290, currency: "$" },21 features: [22 { text: "Up to 10,000 API calls", included: true },23 { text: "Priority support", included: true },24 { text: "Advanced analytics", included: true },25 ],26 cta: { text: "Start Free Trial" },27 popular: true,28 },29]3031export function Component() {32 return (33 <PricingCards34 plans={plans}35 onPlanSelect={(planId) => console.log("Selected:", planId)}36 />37 )38}
API Reference
Props
PricingCards
Prop | Type | Default | Description |
---|---|---|---|
plans | PricingPlan[] | - | Array of pricing plans to display (required) |
defaultBillingCycle | "monthly" | "yearly" | "yearly" | Default billing cycle selection |
showBillingToggle | boolean | true | Whether to show monthly/yearly toggle |
yearlyDiscount | number | 20 | Discount percentage for yearly billing |
onPlanSelect | (planId: string) => void | undefined | Callback when a plan is selected |
contactCard | ContactCard | undefined | Optional contact card for enterprise plans |
className | string | "" | Additional CSS classes |
PricingPlan
Prop | Type | Default | Description |
---|---|---|---|
id | string | - | Unique identifier for the plan (required) |
name | string | - | Plan name (required) |
description | string | undefined | Brief plan description |
price | { monthly: number, yearly: number, currency: string } | undefined | Pricing information |
customPrice | { label: string, sublabel?: string } | undefined | Custom pricing display (e.g., "Contact Us") |
features | PricingFeature[] | - | List of plan features (required) |
cta | { text: string, variant?: string } | - | Call-to-action button configuration (required) |
popular | boolean | false | Whether this is the popular/recommended plan |
badge | string | undefined | Optional badge text (e.g., "Most Popular") |
billingNote | string | undefined | Additional billing information |
PricingFeature
Prop | Type | Default | Description |
---|---|---|---|
text | string | - | Feature description (required) |
included | boolean | - | Whether feature is included in plan (required) |
Examples
Complete Pricing Layout
A full pricing section with multiple plans, billing toggle, and contact option.