Nobody opens a demo call asking about feature parity. These are the questions that decide it, so they are answered here instead.
You will not have one. One clinic goes live first while everything else carries on unchanged, and the busy part of the migration is three days in the middle of a fortnight. If the first site does not go smoothly, nothing else moves.
Eleven practices, none of them closed for a day
Then they should not have to learn one. The screens people use every hour, the clinic list and the member record, work the way the paper version did. Everything else is optional and stays out of the way until somebody looks for it.
Median time to first booking by a new user: 4 minutes
Thirty days' notice, no penalty, and a full export in a format another system can import. The export stays live for ninety days after you close the account, and we will join a call with whoever you move to.
Clause 6.3 and 6.5 of the agreement, in writing
Support is staffed by the people who wrote the code, including the founders, and the on-call rota starts before clinics do. Every incident gets a public write-up with a date on it, whether or not anyone noticed.
Median first response, 11 minutes inside clinic hours
Still carrying a worry that is not on this list?
Put it to an engineerAn always-open FAQ that states four buying worries as quoted headings in a hairline matrix of cards, each answering in full and closing on a line of proof under a rule.
An always-open FAQ that states four buying worries as quoted headings in a hairline matrix of cards, each answering in full and closing on a line of proof under a rule.
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/faq83?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/faq83?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/faq83.tsx plus the badge23 and button21 components it uses for the eyebrow and the closing action.
The installed file exports faq83Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Faq83, faq83Demo } from "@/components/beste/block/faq83";
export default function FaqPage() {
return <Faq83 {...faq83Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Faq83 } from "@/components/beste/block/faq83";
export default function FaqPage() {
return (
<Faq83
badge={{ label: "The real questions" }}
heading="The four things everyone is actually worried about"
description="Nobody opens a demo call asking about feature parity."
items={[
{
index: "01",
worry: "We cannot afford a week of chaos while we switch",
answer: "One clinic goes live first while everything else carries on unchanged.",
proof: "Eleven practices, none of them closed for a day",
},
{
index: "02",
worry: "We will be locked in once our records are inside",
answer: "Thirty days' notice, no penalty, and a full export another system can import.",
proof: "Clause 6.3 and 6.5 of the agreement, in writing",
},
]}
closingLabel="Still carrying a worry that is not on this list?"
button={{ label: "Put it to an engineer", href: "/contact" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow above the hairline rule, rendered through Badge23 |
heading | string | – | Section heading in the left column of the header |
description | string | – | Supporting paragraph, right-aligned from md up |
items | Objection[] | [] | Worries, laid out two-up from md |
closingLabel | string | – | Prompt beside the closing action |
button | { label: string; href: string } | – | Closing action, right-aligned from md up |
className | string | – | Extra classes for the outer section |
type ActionLink = {
label: string;
href: string;
};
type Objection = {
index: string;
worry: string;
answer: string;
proof: string;
};worry as plain text or you will get doubled quotes.proof is required on every card, not optional. The block is built so that no objection is answered without something checkable underneath it.gap-px over a bg-border container with bg-card cells makes the background show through as one-pixel seams, and the container's overflow-hidden clips the corners so it reads as one panel.flex flex-col with the answer marked flex-1, so the proof lines up along the bottom across every card regardless of answer length.border-t, so the rule belongs to the proof rather than sitting as a divider in the card.md:grid-cols-2, which is why four items is the count it is tuned for. An odd count leaves the last card spanning one column with a gap beside it.index is copy, not a computed counter, so numbering survives reordering untouched.faq15
Clickable question cards that open answers in a modal dialog. Perfect for card-based layouts that need expanded views.
faq68
Two-column FAQ section with a badge, heading, and description on the left, and a stacked list of numbered question cards on the right. Each card opens to reveal a plain answer block below it with no separator line.
faq32
Cards with quote icons in corners, arranged in a grid. Elegant design for emphasizing key points with typography.