Staaarter

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.

By Staaarter Team
Billing
Updated July 22, 2026
Docs
Live preview

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.json

Prefer 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

PropTypeDefaultDescription
eyebrowstring"Early access"Small badge label above the heading.
headingstringnoneMain headline.
descriptionstringnoneOptional supporting sentence under the heading.
pricestringnoneDiscounted price shown large, e.g. "$19".
intervalstring"/mo"Unit shown next to the price.
regularPricestringnoneOptional full price shown struck through next to the discounted price.
lockedInLabelstring"Price locked in for 12 months"Note under the price block, shown with a lock icon.
seatsRemainingnumbernoneSeats left. When 0, the primary CTA is hidden and only the waitlist link shows.
seatsTotalnumbernoneTotal seats available, used with seatsRemaining to draw the claimed-seats bar.
featuresstring[]noneOptional bullet list of what's included.
ctaLabelstring"Get early access"Label on the primary button.
ctaHrefstringnoneDestination for the primary button.
waitlistLabelstring"Join the waitlist"Label on the secondary or fallback button.
waitlistHrefstringnoneDestination for the waitlist link. Omit to hide it entirely.
classNamestringnoneExtra 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