Booking Confirmation Receipt

Confirmed

You're all set

Your booking is confirmed. Show this receipt at check-in or save it for later.

Confirmation

BK-2026-0482

Service

Deep Tissue Massage

60 min session

Date

Thursday, September 24, 2026

Time

14:00 — 15:00

Location

Serenity Spa

42 Wellness Ave, San Francisco

Guest

Alex Morgan

alex@beste.co

Total paid

$120.40

Visa •••• 4242

Dr. Emily Carter

Licensed Massage Therapist

Scan at check-in

Confirmation emailed to alex@beste.co

Cancellation policy: Free cancellation up to 24 hours before your appointment. Late cancellations may incur a 50% charge.

About this block

Booking Confirmation ReceiptFREE

Post-booking success screen with animated check icon, confirmation number, booking summary (service, date/time, location, total), scannable QR code ticket, action buttons (calendar, receipt, directions), and email confirmation note.

Booking15: Booking Confirmation Receipt

Post-checkout confirmation screen: an animated success check, a confirmation number, a list of booking details keyed to a fixed icon set, a provider row, a purely decorative but visually authentic QR code generated from the confirmation number, action buttons, and an email and cancellation-policy footer.

Free block

This block is free. No license or account is required: install it with the CLI and use it in unlimited projects.

Installation

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/booking15"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/booking15"

This installs the block to components/beste/block/booking15.tsx, plus the badge and button shadcn/ui primitives it uses for the status badge and the action buttons.

Quick start

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

tsx
import { Booking15, booking15Demo } from "@/components/beste/block/booking15";

export default function BookingConfirmedPage() {
  return <Booking15 {...booking15Demo} />;
}

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

tsx
import { CalendarPlus, Navigation } from "lucide-react";
import { Booking15 } from "@/components/beste/block/booking15";

export default function BookingConfirmedPage() {
  return (
    <Booking15
      badge={{ label: "Confirmed", variant: "secondary" }}
      heading="You're all <strong>set</strong>"
      description="Your booking is confirmed."
      confirmationNumber="BK-2026-0482"
      details={[
        { key: "service", label: "Service", value: "Deep Tissue Massage", subValue: "60 min session" },
        { key: "date", label: "Date", value: "Thursday, March 5, 2026" },
        { key: "time", label: "Time", value: "14:00 — 15:00" },
        { key: "price", label: "Total paid", value: "$120.40", subValue: "Visa •••• 4242" },
      ]}
      actions={[
        { icon: CalendarPlus, label: "Add to calendar", href: "https://beste.co" },
        { icon: Navigation, label: "Get directions", href: "https://beste.co" },
      ]}
      email="alex@beste.co"
      policyNote="Free cancellation up to 24 hours before your appointment."
      labels={{
        confirmationPrefix: "Confirmation",
        scanLabel: "Scan at check-in",
        emailSentTemplate: "Confirmation emailed to {email}",
        policyLabel: "Cancellation policy",
      }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }Status badge, always shown with a shield-check icon
headingstringSection heading, supports inline <strong>
descriptionstringSection intro text
confirmationNumberstringShown under the success icon and used to seed the QR pattern
detailsBookingDetail[][]Icon-labeled rows in the details list
provider{ name: string; title: string; avatar: string }Provider row shown between details and the QR code
actionsBooking15Action[][]Buttons in the actions grid
emailstringInterpolated into labels.emailSentTemplate for the footer note
policyNotestringCancellation policy text in the footer
labelsBooking15Labels{}UI copy: confirmation prefix, scan caption, email template, policy label
classNamestringExtra classes for the outer <section>
ts
type BookingDetail = {
  key: "service" | "date" | "time" | "location" | "guest" | "price";
  label: string;
  value: string;
  subValue?: string;
};

type Booking15Action = {
  icon: LucideIcon;
  label: string;
  href?: string;
};

type Booking15Labels = {
  confirmationPrefix?: string;
  scanLabel?: string;
  emailSentTemplate?: string;
  policyLabel?: string;
};

Behavior notes

  • The QR code is not a real scannable code: generateQRPattern seeds a small hash-based pseudo-random generator from confirmationNumber (falling back to "BK-DEMO" when unset) to fill a 21x21 grid, then overlays three genuine QR-style finder squares (7x7 rings with 3x3 cores, with cleared quiet zones around them) purely so it reads as a QR code in a static preview.
  • details[].key must be one of six fixed values (service, date, time, location, guest, price); each maps to a fixed Lucide icon through the internal detailIcons map, so there is no way to attach a custom icon to a detail row.
  • The packaged demo's date detail is generated by formatFutureDate(4) (today plus four days) inside a factory function, createBooking15Demo(), that runs once when the module is first evaluated, not on every render, so the shipped booking15Demo date is fixed to whenever that module first loaded rather than "four days from the current visitor."
  • Action buttons render as a real <a href> (via asChild) when action.href is set, or a plain non-interactive button when it's omitted; there is no calendar or maps integration built in, only whatever URL the caller supplies.
  • The success icon uses an animate-ping overlay on an emerald-tinted circle for the pulse effect, and the whole card is a single scrollable stack of bordered sections (header, details, provider, QR, actions, footer notes) that each render conditionally based on whether their prop is provided.

More Booking blocks

View all Booking
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

booking2

Reservation Summary

Booking confirmation card with service details, date/time, provider info with avatar, price breakdown with subtotal/tax/discount/total, promo code input, cancellation policy, and confirm CTA.

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.

PRO

booking13

Live Social Proof Bar

Booking.com-style social proof ticker with rotating messages: live viewers, recent bookings, scarcity alerts, and location-based activity. Animated transitions, urgency indicators, and trust signals that boost conversion.

PRO

booking17

Ride Booking

Ride-share style booking with pickup/dropoff address inputs, schedule now/later toggle, ride class selector (economy/comfort/xl) with ETA and fare, payment method row, and confirm ride CTA. Perfect for taxi, transfer, and shuttle apps.

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.