Fees
Most people begin with a single conversation and settle into a rhythm from there. Every plan can be paused, and nothing renews without asking.
Beginning
$60per month
One session a month
For when you want a steady place to check in without a weekly commitment.
Rhythm
$110per month
Two sessions a month
The pace most of our clients settle into, with room to go deeper when a week asks for it.
Three pricing tiers under a centred serif heading that settles in word by word: two soft muted cards and a featured card set on a photograph with a dark scrim and film grain, each with a serif price, a cadence line, a check list and a sliding-marker pill.
Three tiers where the featured one is a photograph: it sits on an ink wash under film grain while the others stay on soft panels, each with a serif price, a cadence line, ticked features and its own action.
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.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://ui.beste.co/r/pricing75?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/pricing75?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/pricing75.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.
The installed file exports pricing75Demo alongside the block: the exact props behind the preview above. Spread it to get a working pricing section in one line.
import { Pricing75, pricing75Demo } from "@/components/beste/block/pricing75";
export default function Page() {
return <Pricing75 {...pricing75Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Pricing75 } from "@/components/beste/block/pricing75";
export default function Page() {
return (
<Pricing75
eyebrow="Fees"
heading="Support that fits the season you are in."
description="Every plan can be paused, and nothing renews without asking."
tiers={[
{
name: "Beginning",
price: "$60",
cadence: "One session a month",
description: "A steady place to check in without a weekly commitment.",
features: ["One 60-minute session", "A short written note"],
button: { label: "Start gently", href: "/start", tone: "outline" },
},
{
name: "Rhythm",
price: "$110",
cadence: "Two sessions a month",
description: "The pace most clients settle into.",
features: ["Two 60-minute sessions", "Priority rescheduling"],
button: { label: "Find your rhythm", href: "/rhythm", tone: "light" },
image: { src: "/photos/lake.jpg", alt: "A still mountain lake at dawn" },
},
]}
labels={{ perMonth: "a month" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small-caps line above the heading |
heading | string | – | Section heading, rendered as an h2 through Text1 |
description | string | – | Intro under the heading |
tiers | Tier[] | [] | Pricing tiers, three across from md |
labels | { perMonth?: string } | {} | Suffix beside the price |
className | string | – | Extra classes for the outer <section> |
type Tier = {
name: string;
price: string;
cadence: string;
description: string;
features: string[];
button: ActionButton;
image?: { src: string; alt: string };
};
type ActionButton = {
label: string;
href: string;
tone?: "primary" | "light" | "dark" | "outline";
};featured flag: a tier is featured because it has an image, so the highlight and the photograph can never disagree with each other.background tokens rather than the adaptive ones the light cards use."$60", "60 EUR" or "From $60" all render as given with no formatting or currency logic.mt-auto, so the actions line up along the bottom of the row however uneven the feature lists above them are.md:items-stretch, which is what lets that mt-auto have a full-height card to push against.featured boolean, so a card is styled from one decision rather than from several.useId; note that all featured cards in one instance share it, which is fine since they render the same filter.pricing78
Three pricing cards under a centred serif heading that settles in word by word, with a pill toggle between paying per session and committing to a season: the serif prices blur out and in as it switches, and each card ends in a sliding-marker pill.
pricing77
A two-plan pricing section: a sticky column with a serif heading that settles in word by word, an intro and a reduced-fee note, beside two cards, one soft muted and one ink, each with a serif price, a check list and a sliding-marker pill.
pricing82
A tall photograph that blurs in and drifts on scroll on the left; on the right a serif headline that settles in word by word, an intro, a monthly or yearly pill switch, and two plans as ruled rows, each with a serif price that blurs to its new value, the included features in one line and a sliding-marker pill.
pricing79
Three plan cards under a centred serif headline that settles in word by word and a monthly or yearly pill switch whose ink marker slides between the two; prices blur to their new value, a small saving note appears on yearly, the middle plan sits in ink, and each card ends in a full-width sliding-marker pill.