Billing Early Access Pricing
A pricing card for beta programs and product launches, built to reward early adopters. It pairs a discounted price against a struck-through regular price, a locked-in pricing note, and a claimed-seats progress bar. Once seats hit zero the primary button disappears and only a waitlist link remains, so the card doesn't invite signups it can't fulfill.
Docs
Installation
A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its badge, button dependencies and any missing npm packages, and installs them straight into your project.
npx shadcn add https://staaarter.com/r/billing-early-access-pricing.jsonPrefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/billing/billing50.tsx instead.
Usage
The file also exports billing50Demo, 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 { Billing50, billing50Demo } from "@/components/blocks/billing/billing50"; export default function Page() { return <Billing50 {...billing50Demo} />; }
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| eyebrow | string | "Early access" | Small badge label above the heading. |
| heading | string | none | Main headline. |
| description | string | none | Optional supporting sentence under the heading. |
| price | string | none | Discounted price shown large, e.g. "$19". |
| interval | string | "/mo" | Unit shown next to the price. |
| regularPrice | string | none | Optional full price shown struck through next to the discounted price. |
| lockedInLabel | string | "Price locked in for 12 months" | Note under the price block, shown with a lock icon. |
| seatsRemaining | number | none | Seats left. When 0, the primary CTA is hidden and only the waitlist link shows. |
| seatsTotal | number | none | Total seats available, used with seatsRemaining to draw the claimed-seats bar. |
| features | string[] | none | Optional bullet list of what's included. |
| ctaLabel | string | "Get early access" | Label on the primary button. |
| ctaHref | string | none | Destination for the primary button. |
| waitlistLabel | string | "Join the waitlist" | Label on the secondary or fallback button. |
| waitlistHref | string | none | Destination for the waitlist link. Omit to hide it entirely. |
| className | string | none | Extra classes for the outer container. |
Behavior notes
- The claimed-seats bar only renders when both seatsRemaining and seatsTotal are set; pass either one alone and the bar is skipped, though the seats-left text still shows with just seatsRemaining.
- When seatsRemaining is exactly 0, the primary Get early access button is removed and the waitlist link becomes the only action, styled as the primary button instead of a ghost link.
- There's no internal state, everything renders from props on the server, so this component doesn't need 'use client'.
- Both buttons render as next/link via the Button component's render prop, so ctaHref and waitlistHref can point straight at checkout or signup routes.
Frequently asked questions
More Billing Blocks
View all →Billing Invoice List
Invoice history table with status badges, formatted amounts, and a per-row download link, built with shadcn/ui and Tailwind CSS.
Billing Failed Payment Alert
High-contrast failed-payment alert with a message, a retry button, and an optional update-payment-method button, built with shadcn/ui and Tailwind CSS.
Billing Credit Balance
Compact credit balance card with a large total, an optional purchased-versus-promotional breakdown, a low-balance notice, and a top-up button.
Billing Payment Methods
A saved payment method list for React and Next.js with brand icons, a default badge, near-expiry warnings, and remove/set-default actions per row.
Billing Add Card
A card entry form for React and Next.js with auto-formatted fields, internal brand detection, and per-field validation feedback built with shadcn/ui and Tailwind CSS.
Billing Coupon Code
An inline promo code input for React and Next.js with a simulated loading state, an applied summary showing the discount amount, and an invalid-code message.