SaaS Pricing Page

Yearly billing now saves two months on every plan.See the plans
Pricing

Priced per seat, and the price is the whole price

Migration, support and every module are in the number below. There is no implementation fee, no per-site charge, and no line item that appears in your second year.

Two months free

Single site

One clinic, one rota, no card at any point.

Free

Billed monthly, cancel any time

  • One site and up to five seats
  • Booking page and reminders
  • Member records and notes
  • Community support

Practice

Most practices

The whole product for a working practice.

$29per seat / month

Billed monthly, cancel any time

  • Unlimited sites and seats
  • Billing and insurer reconciliation
  • Role-based access with requests
  • Immutable audit log
  • Migration from your old system
  • Support from the engineers who built it

Group

For groups answering to a board and an auditor.

$44per seat / month

Billed monthly, cancel any time

  • Everything in Practice
  • Single sign-on and SCIM
  • Data residency of your choosing
  • Custom retention and legal hold
  • Named contact and quarterly review
  • Contracted uptime with credits

Registered charities and single-handed practices pay nothing. Ask, and we will not make you prove it twice.

Billing questions

What people ask once they reach this page

The awkward ones are answered here rather than in a call, because the answer does not change depending on who is asking.

Still working out which tier fits?

Talk to the team

Anyone who signs in. Members, families and referrers do not, so a practice of nine people with four thousand members pays for nine.

Warm orange gradient backdrop

Practice

Most chosen
$29/seat / mo
Unlimited sites and seats
Migration included
Audit log and export
Start when you like

Try it on one clinic before you decide anything

The free tier is a real product, not a countdown. Run a single site on it for as long as you want and move up the week it stops being enough.

No card required · Cancel from settings

About this page

SaaS Pricing PagePRO

A light editorial pricing page: pill navbar, three per-seat tiers on a monthly and yearly toggle, a sticky split FAQ answering the billing questions, a closing panel floating a live plan card, and a newsletter footer.

Composed from 5 blocks. Installing this page installs all of them, plus the pieces and primitives they use.

Built in the Sirius collection.

Pricing1: SaaS Pricing Page

A light editorial pricing page: a pill navbar, three per-seat tiers on a monthly and yearly toggle, a sticky split FAQ answering the billing questions, a closing panel floating a live plan card, and a newsletter footer. Five blocks, one install, and the shortest page in the set.

Upgrade to Pro

Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.

Upgrade Now

Installation

Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.

bash
npx shadcn add "https://ui.beste.co/page/r/pricing1?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the page to components/beste/page/pricing1.tsx and everything behind it: the five blocks it composes (navbar73, pricing71, faq79, cta76, footer120), the money22, button21 and badge23 components they use, and the shadcn/ui tabs and button primitives. Nine files, no follow-up installs.

Quick start

The installed file exports pricing1Demo alongside the page: the exact props behind the preview above. Spread it to get a working page in one line.

tsx
import { Pricing1, pricing1Demo } from "@/components/beste/page/pricing1";

export default function Page() {
  return <Pricing1 {...pricing1Demo} />;
}

Each section is a separate prop, so the usual next step is to keep the demo and replace one section at a time. On this page that is nearly always pricing.

tsx
import { Pricing1, pricing1Demo } from "@/components/beste/page/pricing1";

export default function Page() {
  return (
    <Pricing1
      {...pricing1Demo}
      pricing={{
        label: "Pricing",
        heading: "Per seat, and the yearly price is two months off.",
        plans: [
          { name: "Starter", monthly: "$12", yearly: "$120", description: "Up to five seats." },
          { name: "Studio", monthly: "$19", yearly: "$190", description: "Everything, no seat cap." },
          { name: "Group", monthly: "Talk to us", yearly: "Talk to us", description: "Invoicing and SSO." },
        ],
      }}
    />
  );
}

Props

Every prop is the full prop object of the block that renders that section, so anything the block accepts is accepted here.

PropTypeDefaultDescription
navbarComponentProps<typeof Navbar73>Pill navbar
pricingComponentProps<typeof Pricing71>Three tiers on a monthly and yearly toggle
faqComponentProps<typeof Faq79>Sticky split FAQ for billing questions
ctaComponentProps<typeof Cta76>Closing panel floating a plan card
footerComponentProps<typeof Footer120>Newsletter footer
classNamestringExtra classes for the page's outer wrapper

Sections

SectionBlockNotes
Navbarnavbar73Not sticky; the page is short enough to see whole
Pricingpricing71The toggle is tabs inside the block, hence the dependency
Questionsfaq79Given bg-muted/40; the heading column sticks while answers scroll
Closingcta76Rendered on the inverted band, floating a live plan card
Footerfooter120Newsletter capture

Behavior notes

  • Every section is conditional on its own prop, so omitting faq removes that section entirely rather than rendering an empty one.
  • There is no hero. The tiers are the hero, which is why the navbar is not sticky either: the whole argument fits in about two screens and a pinned bar would only take height from it.
  • The monthly and yearly toggle is state inside pricing71, not something the page lifts. Both prices are passed per plan and the block decides which to show.
  • The FAQ's heading column is sticky within its own section, so the questions stay titled while the answers scroll past. That is block behaviour, not something the page adds.
  • The page sets className="bg-muted/40" on the FAQ after spreading faq, so a className passed inside that prop is overridden.
  • The closing panel sits inside a wrapper carrying the dark class, which swaps the theme tokens for that subtree, so the plan card floating inside it inverts with the band rather than staying light.
  • The whole page is a client component, since the blocks it composes are. It fetches nothing and holds no state above the blocks.
  • The page is Pro because blocks inside it are, which is why the licence parameters are on the command above.

Blocks in this page

Browse all blocks
PRO

navbar73

Announcement Bar Navbar

A navbar with a dark announcement strip above a hairline-bordered row carrying a lowercase wordmark, uppercase links, a sign-in link, an accent call to action, and a mobile menu.

PRO

pricing71

Three Tiers With Billing Toggle

A three-tier pricing grid whose monthly and yearly toggle swaps both the light figure and the billing note on every card, with the recommended tier outlined in the accent.

PRO

faq79

Sticky Split FAQ

A two-column FAQ with a sticky eyebrow, light heading, and support call to action on the left, and an interactive accordion of questions on the right.

PRO

cta76

Plan-Led Centered CTA

A centered call to action led by a floating plan price card on an image tile, followed by an eyebrow, a large light heading, a paragraph, two accent buttons, and a reassurance note.

PRO

footer120

CTA Footer

A footer that opens with a light closing heading and accent buttons over a hairline rule, then a slim bottom bar with a lowercase wordmark, a link row, and copyright.