Prodular UI

Plan picker

Pro

Picks a plan, seats and a billing period, with a summary of the price, what is due today, and whether the change is an upgrade or a downgrade. Prices and proration come from your billing backend.

npx prodular-ui add plan-picker

Part of Prodular UI Pro. Preview and read the docs freely, install with a license. See pricing

Change a subscription

On Growth with 10 seats and 8 in use. Pick Scale to see the credit and what is due today; pick Starter for a downgrade at the end of the period.

Save about 17% yearly
Seats8 people use a seat today.

First purchase

Without current it is a checkout. Enterprise has no price and offers Talk to sales.

2 months free
EnterpriseContracts, invoicing terms and a named contact.
Custom
  • Custom limits
  • SAML and SCIM
  • 99.9% uptime SLA
SeatsOne seat per person who signs in.

Anatomy

<PlanPicker  plans={plans}  value={selection}  onValueChange={setSelection}  current={subscription}  seatsInUse={members.length}  proration={preview}  onConfirm={changePlan}/>

Guidance

Use it when

  • Billing settings where people change plan, seats or period, and in-app checkout.
  • proration from your billing provider's preview endpoint, so Due today matches the invoice.
  • seatsInUse so nobody buys fewer seats than people who already sign in.

Avoid

  • Marketing pricing pages. Use the pricing block, which sells; this one changes a subscription.
  • Working out proration in the browser for real charges. Show what the backend returns.

Rules for AI agents

Published in llms-full.txt, the registry and the MCP server, so coding agents follow them when they build with this component.

  • Prices are per seat per month for each period; yearly is billed as twelve months.
  • Keep the selection in state and, when it changes, fetch a proration preview from the billing provider (for example Stripe or Polar upcoming invoice) and pass it with prorationLoading while it loads.
  • Pass current for existing subscriptions. The button says Upgrade, Downgrade, Switch or Update, and is disabled when nothing changed.
  • Downgrades that wait for renewal return effective "period_end" and nextInvoice; the summary explains when the change happens.
  • Throw from onConfirm with a clear message on payment failures; nothing else changes.

API

PlanPicker

PropTypeDefaultDescription
plansPricingPlan[]{ id, name, description?, price: { monthly, yearly }, badge?, features?, minSeats?, maxSeats? }. A null price means talk to sales.
value / onValueChange{ planId, seats, period }The selection, controlled.
currentPlanSelectionThe subscription today.
seatsInUsenumber0Minimum seats.
proration / prorationLoading{ credit?, dueToday, nextInvoice?, effective? } / booleanWhat the change costs today.
onConfirm / onContactSales(value) => Promise<void> / (plan) => voidApplies the change, or contacts sales for custom plans.
currency / locale / timeZonestring"USD" / "en-US"Formatting.
yearlyNotestringBeside the period switch, like Save 17%.

Installation

The Prodular UI CLI adds the source to components/ui with everything it depends on. In a project that already uses shadcn/ui, the shadcn CLI installs it from the Prodular registry too. See Installation for the first setup.

npx prodular-ui add plan-picker# or, with the registry in components.jsonnpx shadcn@latest add @prodular/plan-picker