No sales call required. The details that usually decide it are written down here, in plain language.
Most practices are running live within a week. You import members and appointments from a spreadsheet or a direct export, connect billing, then invite the team from a guided checklist.
You do, always. Every record stays yours and can be exported in full at any time, in an open format, with no request queue and no exit fee.
Yes. Locations share one member directory but keep their own calendars, rooms, and templates, so a group rollout never forces a single way of working.
Your cancellation window and fee are set once per service. The slot reopens automatically, the waitlist is notified, and the fee lands on the next invoice.
Claims are raised from the same record as the appointment, submitted in batches, and reconciled against payments so nothing sits unmatched at month end.
Roles scope what each person can open, from front desk to clinician to finance. Every view and edit on a record is logged and searchable.
No. Plans are priced on seats, not on volume, so a busy month never turns into a surprise line on your bill.
Guided setup is included on every plan, and larger groups get a named contact who stays with you through rollout and training.
Still weighing something up?
Send us the question and a real person on the product team answers, usually the same working day.
An always-open FAQ laid out as a two-column grid of numbered, hairline-separated question and answer entries, closing with a soft support panel that pairs a short prompt with two actions.
Always-open FAQ: a monospace eyebrow over a hairline rule and a two-column heading, then every question and answer laid out as a numbered, hairline-separated cell in a two-column grid, closing on a soft support panel that pairs a short prompt with one or two actions.
Free block
This block is free. No license or account is required: install it with the CLI and use it in unlimited projects.
Radix flavor
npx shadcn add "https://ui.beste.co/r/faq80"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/faq80"This installs the block to components/beste/block/faq80.tsx plus the badge23 and button21 components it uses for the eyebrow and the support actions.
The installed file exports faq80Demo alongside the block: the exact props behind the preview above. Spread it to get a working FAQ in one line.
import { Faq80, faq80Demo } from "@/components/beste/block/faq80";
export default function Page() {
return <Faq80 {...faq80Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Faq80 } from "@/components/beste/block/faq80";
export default function Page() {
return (
<Faq80
badge={{ label: "Answers" }}
heading="Everything teams ask before they move"
description="The details that usually decide it are written down here."
items={[
{
question: "How long does a migration take?",
answer: "Most teams are live within a week, imports included.",
},
{
question: "Who owns the data we bring in?",
answer: "You do. Export everything at any time, in an open format.",
},
]}
support={{
title: "Still weighing something up?",
description: "Send the question over and a real person answers.",
buttons: [
{ label: "Talk to the team", href: "/contact" },
{ label: "Read the docs", href: "/docs", tone: "outline" },
],
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Monospace eyebrow above the hairline rule, rendered via Badge23 |
heading | string | – | Section heading in the left column |
description | string | – | Supporting paragraph, right-aligned from md up |
items | FaqItem[] | [] | Question and answer cells, numbered in source order |
support | Support | – | Soft panel under the grid, with its own actions |
className | string | – | Extra classes for the outer <section> |
type ActionLink = {
label: string;
href: string;
tone?: "primary" | "neutral" | "outline";
};
type FaqItem = { question: string; answer: string };
type Support = {
title: string;
description: string;
buttons?: ActionLink[];
};Cmd+F finds it. Nothing here is client-interactive beyond the links.String(index + 1).padStart(2, "0"), so entries read 01, 02, and reordering items renumbers them.md:grid-cols-2), so questions 1 and 2 sit side by side, not stacked down one column. Order the list with that reading path in mind.border-t rather than a bottom rule, which keeps a rule above every row of the grid and leaves the bottom edge open into the support panel.support.buttons runs through Button21 with its own tone, so the first can stay solid while the rest fall back to the hairline outline; omitting buttons renders the panel as copy only.bg-muted fill, not a tinted or bordered card, which is why it reads as a soft closing block rather than another FAQ cell.faq93
A two-column question grid with every answer already visible on a hairline, so nothing is hidden behind a toggle, closed by a soft panel pointing at a direct reply.
faq96
An FAQ with nothing to open: a serif heading that settles in word by word beside the intro and a pill action, then six questions and answers laid out in a three-column ruled grid that arrive in turn.
faq17
Questions on left, answers on right in a two-column grid layout. Works well for balanced, side-by-side presentation.
faq86
An FAQ split across two columns of independent accordions, so opening one answer never closes another, closing on a soft support panel with two actions.