Waiting List Capture

Nothing free this week

Join the waiting list and you will hear before anyone else does

It is not a queue that goes nowhere. Cancellations are offered to this list in order, automatically, at whatever hour they happen.

11 min

median time from a cancellation to an offer

84%

of cancelled slots are refilled from this list

3 days

median wait for people who join it

How it actually works

01

You tell us what suits

Days, times, sites, and which clinicians you are happy to see. We only offer you slots that match.

02

A cancellation is offered to the whole list

Everyone whose preferences fit gets it at the same moment, in the order you joined. First to confirm takes it.

03

You confirm or ignore it

Ignoring an offer does not cost you your place. Nobody is penalised for being at work when a slot appears.

04

Your booked appointment stays put

If you already have a later appointment it stays exactly where it is until you accept something sooner.

Deep green gradient backdrop

The list right now

This week

Waiting

34

+6

Offers out

18

+4

Median wait

3d

-1d

If it is urgent

Ring the practice rather than waiting on this list. There are slots held back every day that never reach the booking page, and reception can see them.

About this block

Waiting List CapturePRO

A no-availability state that answers with three hairline figures and a numbered explanation of how offers are made, beside a sticky square tile floating a live panel of the waiting list itself and an urgent fallback.

Booking28: Waiting List Capture

A no-availability state that answers with three hairline figures and a numbered explanation of how offers are made, beside a sticky square tile floating a live panel of the waiting list itself and an urgent fallback.

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.

Radix flavor

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

Base UI flavor

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

This installs the block to components/beste/block/booking28.tsx, the dashboard33 metrics piece it floats on the tile (installed to components/beste/piece/dashboard33.tsx), and the badge23 and button21 components it uses for the eyebrow and the action.

Quick start

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

tsx
import { Booking28, booking28Demo } from "@/components/beste/block/booking28";

export default function WaitingListPage() {
  return <Booking28 {...booking28Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Booking28 } from "@/components/beste/block/booking28";
import { Dashboard33 } from "@/components/beste/piece/dashboard33";

export default function WaitingListPage() {
  return (
    <Booking28
      badge={{ label: "Nothing free this week" }}
      heading="Join the waiting list and you will hear before anyone else does"
      description="Cancellations are offered to this list in order, automatically."
      figures={[
        { value: "11 min", label: "median time from a cancellation to an offer" },
        { value: "84%", label: "of cancelled slots are refilled from this list" },
        { value: "3 days", label: "median wait for people who join it" },
      ]}
      stepsTitle="How it actually works"
      steps={[
        {
          title: "You tell us what suits",
          detail: "Days, times, sites, and which clinicians you are happy to see.",
        },
        {
          title: "A cancellation is offered to the whole list",
          detail: "Everyone whose preferences fit gets it at the same moment.",
        },
      ]}
      media={
        <Dashboard33
          title="The list right now"
          range="This week"
          items={[{ label: "Waiting", value: "34", delta: "+6", direction: "up" }]}
        />
      }
      image={{ src: "/backdrops/green.jpg", alt: "Deep green gradient backdrop" }}
      fallbackTitle="If it is urgent"
      fallbackBody="Ring the practice rather than waiting on this list."
      button={{ label: "See all available times", href: "/booking" }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow above the heading, rendered through Badge23
headingstringSection heading
descriptionstringSupporting paragraph, capped at max-w-xl
figuresFigure[][]Evidence that the list works, on a hairline row
stepsTitlestringHeading above the numbered explanation
stepsStep[][]How offers are made, numbered automatically
mediaReactNodeLive asset on the square tile, dashboard33 in the demo
image{ src: string; alt: string }Backdrop behind the media tile
fallbackTitlestringHeading in the urgent-case panel
fallbackBodystringWhat to do instead if it cannot wait
button{ label: string; href: string }Outline action under the panel
classNamestringExtra classes for the outer section
ts
type ActionLink = {
  label: string;
  href: string;
};

type Figure = {
  value: string;
  label: string;
};

type Step = {
  title: string;
  detail: string;
};

Behavior notes

  • Step numbers are computed, not authored: the block renders String(index + 1).padStart(2, "0"), so the list always reads 01, 02 and renumbers itself when reordered.
  • The tile is aspect-square rather than a fixed height, so it scales with the column width and keeps its proportions from mobile through desktop.
  • The right column is lg:sticky lg:top-24 lg:self-start. The self-start is required, otherwise the column stretches to the row height and sticky has nothing to travel within. Adjust top-24 to match your own fixed header.
  • The urgent fallback deliberately points away from the product, at a phone call. An empty state that only offers the thing that just failed is the pattern this block exists to avoid.
  • Figures lead the block rather than the steps, because the first question a waiting list raises is whether it does anything.
  • Figures and steps both carry border-t with no closing rule, so the left column reads as one continuous run.
  • Nothing here captures an email. The block explains the list and links onward, so the actual join form lives at whatever destination you point to.

More Booking blocks

View all Booking
FREE

booking29

Appointment Intake Match

Three intake questions that land on a real appointment type instead of a drop-down: the answers pick a route with its length, its facts, and the clinician you will sit with, and the image tile beside them swaps its floated availability card to match.

PRO

booking24

Service And Slot Picker

An interactive appointment picker: a hairline panel pairing a selectable service list with a scrollable day strip and a time slot grid that marks unavailable times, beside a full-height provider photo with a gradient name card, closing on a live summary bar and confirm action.

PRO

booking25

Booking Confirmed

A confirmation screen with an accent eyebrow, a two-column hairline table of the appointment details, a checked list of what to bring, and a sticky tile floating the live phone view the member also receives.

PRO

booking3

Appointment List

Upcoming and past appointments list grouped by date, with service name, provider avatar, time, duration, status badges (confirmed/pending/cancelled), and reschedule/cancel action buttons.

PRO

booking27

Choose Your Clinician

A clinician picker whose hairline list of practitioners, each showing their next opening, swaps an image tile floating a live availability card alongside their focus, background, and sites.

PRO

booking23

Cancellation Flow

Booking cancellation screen with the original booking summary, cancellation reason picker (radio list with optional notes), live refund breakdown based on cancellation policy, confirmation checkbox, and destructive cancel action.