Skip to content

FRD: Booking Confirmation

Document Summary

FieldDetails
Feature NameBooking Confirmation
StatusDraft
OwnerDavid Holmes
ContributorsDesign, Engineering
Target Releasev2.0.0 (P2)
Related LinksRoadmap item #56
Last Updated2026-05-26

Introduction

Overview

Booking Confirmation is a compact display widget that composes Badge, Timeline, and Button to present a confirmed booking summary with a calendar-add CTA. It is the end-state companion to the Meeting Scheduler (#55) and Availability Picker (#54), giving users a clear confirmation of their scheduled meeting or appointment. The widget is intentionally small in scope (size S) and focused on display rather than interaction.

Goals

  • Deliver a <BookingConfirmation> component that displays booking details in a confirmation card.
  • Compose Badge, Timeline, and Button primitives.
  • Include an “Add to Calendar” CTA that generates a downloadable .ics file or fires a callback.
  • Ship Storybook stories with realistic booking data.

Non-Goals

  • Booking modification or cancellation (separate action flows).
  • Calendar integration beyond .ics file generation.
  • Real-time status updates or push notifications.
  • Email confirmation sending.

Scope

In Scope

AreaDescription
Component<BookingConfirmation> displaying confirmed booking details
Status BadgeBadge showing confirmation status (“Confirmed”, “Pending”, “Cancelled”)
TimelineTimeline showing booking event sequence (booked, confirmed, upcoming)
DetailsDate, time, duration, title, and optional organizer/attendee info
Calendar CTA”Add to Calendar” button generating .ics content or firing callback
StoriesStorybook stories for confirmed, pending, cancelled states

Out of Scope

AreaReason
Booking modificationSeparate action flow
CancellationSeparate action flow
Email sendingApplication-layer concern
Multi-booking listThis is a single-booking confirmation card
Calendar API integration.ics file is the portable standard; deeper integration is app-level

Users and Pain Points

User Groups

UserDescriptionNeeds
DevelopersEngineers building booking/scheduling featuresA ready-made confirmation display widget
DesignersDesign-system consumersConsistent confirmation card UX
End UsersPeople who booked a meeting or appointmentClear confirmation of what was booked and when

Pain Points

UserPain PointImpact
DevelopersBuilding confirmation displays from scratch with badge, timeline, and calendar-add logicRepeated boilerplate
End UsersUnclear confirmation UIs that do not show all booking details or offer calendar integrationMissed meetings due to forgotten bookings

Definitions

TermDefinition
Booking ConfirmationA display widget showing the details of a confirmed appointment or meeting
Status BadgeA styled label indicating the booking status (Confirmed, Pending, Cancelled)
Calendar Add CTAA button that allows the user to add the booking to their calendar
ICS FileAn iCalendar standard file that can be imported into calendar applications

Current State

Existing Behavior

The design system provides Badge for status labels, Timeline for event sequences, and Button for actions. There is no booking-confirmation widget that assembles these into a cohesive display.

Current Limitations

  • No booking-confirmation pattern or component.
  • No .ics file generation utility.
  • Timeline exists but is not applied to booking event sequences.

Existing Workarounds

  • Developers build custom confirmation cards with manual badge and detail layout.
  • Calendar-add functionality requires external libraries or manual .ics string construction.

Proposed Solution

Summary

Introduce <BookingConfirmation> that accepts booking details (date, time, duration, title, status, organizer, attendees) and renders them in a card with a status badge, a mini timeline, detail rows, and an “Add to Calendar” button. The calendar button either generates and downloads a .ics file or calls a custom onAddToCalendar callback.

Key Capabilities

  • Status badge with color-coded tone (success for confirmed, warning for pending, destructive for cancelled).
  • Booking details: date, time, duration, title, optional organizer and attendee names.
  • Mini timeline showing booking lifecycle (Requested -> Confirmed -> Upcoming/Completed).
  • “Add to Calendar” button generating .ics content.
  • Optional secondary actions slot (e.g., “Cancel Booking”, “Reschedule”).

User Experience

Users see a confirmation card with a “Confirmed” badge at the top, followed by booking details (date, time, duration, title). A small timeline shows the booking progression. At the bottom, an “Add to Calendar” button downloads an .ics file. Optional secondary action buttons appear below.

Developer Experience

<BookingConfirmation
status="confirmed"
title="Product Demo"
date="2026-06-15"
time="14:00"
duration={60}
organizer="Alice Chen"
onAddToCalendar={() => downloadIcs(bookingData)}
/>

Requirements

IDRequirementPriorityNotes
FR-001BookingConfirmation displays booking details in a cardMust-
FR-002Status badge shows with appropriate tone coloringMust-
FR-003Timeline shows booking lifecycleShould-
FR-004”Add to Calendar” CTA is presentMust-
FR-005.ics generation utility is providedShouldBuilt-in or callback

Priority Definitions

PriorityMeaning
MustRequired for this feature to ship.
ShouldImportant, but can be deferred if needed.
CouldNice to have. Not required for initial release.

Functional Requirements

IDRequirementUser BenefitPriority
FUNC-001status prop accepts "confirmed" | "pending" | "cancelled" and renders a color-coded BadgeClear booking statusMust
FUNC-002date, time, and duration render as formatted detail rowsBooking specifics at a glanceMust
FUNC-003title renders as a heading within the cardMeeting contextMust
FUNC-004organizer and attendees render when providedParticipant informationShould
FUNC-005Timeline renders 2-3 steps based on status (Requested, Confirmed, Upcoming/Completed, or Cancelled)Booking lifecycle contextShould
FUNC-006”Add to Calendar” button fires onAddToCalendar callback or auto-generates .ics downloadCalendar integrationMust
FUNC-007Auto .ics generation creates valid iCalendar content from booking propsNo-callback-needed calendar addShould
FUNC-008Optional actions slot accepts additional buttons (Cancel, Reschedule)Extensible action areaCould

Non-Functional Requirements

IDRequirementCategoryPriority
NFR-001Component renders in under 10msPerformanceMust
NFR-002All interactive elements are keyboard-navigableAccessibilityMust
NFR-003Works in light and dark themesThemingMust
NFR-004No new runtime dependenciesMaintainabilityMust
NFR-005Generated .ics content validates against iCalendar specCorrectnessShould

API / Interface Requirements

Public API

NameTypeDescriptionRequired
status"confirmed" | "pending" | "cancelled"Booking statusYes
titlestringMeeting/booking titleYes
datestringBooking date (YYYY-MM-DD)Yes
timestringStart time (HH:MM, 24h)Yes
durationnumberDuration in minutesYes
organizerstringOrganizer nameNo
attendeesstring[]Attendee namesNo
locationstringMeeting location or linkNo
showTimelinebooleanShow booking lifecycle timelineNo (default: true)
onAddToCalendar() => voidCustom calendar-add callback (overrides auto .ics)No
actionsReactNodeAdditional action buttonsNo
classNamestringAdditional CSS classesNo

Example Usage

import { BookingConfirmation } from "@/components/ui/booking-confirmation";
<BookingConfirmation
status="confirmed"
title="Product Demo with Acme Corp"
date="2026-06-15"
time="14:00"
duration={60}
organizer="Alice Chen"
attendees={["Bob Smith", "Carol Jones"]}
location="https://meet.example.com/abc123"
/>

API Notes

  • When onAddToCalendar is not provided, the component auto-generates and downloads a .ics file.
  • Status badge tones: confirmed -> success, pending -> warning, cancelled -> destructive.
  • Duration auto-formats: 60 -> “1 hour”, 30 -> “30 min”, 90 -> “1h 30m”.
  • Date and time auto-format for display (e.g., “June 15, 2026 at 2:00 PM”).

Accessibility Requirements

IDRequirementNotes
A11Y-001Status badge has aria-label including status textNot just color
A11Y-002Booking details are presented in a definition list or labeled regionsScreen reader can parse details
A11Y-003”Add to Calendar” button has descriptive labele.g., “Add Product Demo to Calendar”
A11Y-004Timeline steps are conveyed to screen readersaria-label on timeline items with status

Checklist

  • Keyboard support is defined.
  • Focus behavior is defined.
  • Screen reader behavior is defined.
  • Color contrast requirements are met.
  • Reduced motion behavior is considered.
  • Semantic HTML expectations are documented.
  • ARIA usage is defined only where needed.

Content and Documentation Requirements

IDRequirementLocationPriority
DOC-001Storybook docs page with overview and props tableStorybookMust
DOC-002”When to use / When not to use” guidanceStorybook docsMust
DOC-003Stories for confirmed, pending, and cancelled statusesStorybookMust
DOC-004Story demonstrating .ics download behaviorStorybookShould

Dependencies

DependencyTypeOwnerStatusNotes
BadgeEngineeringDesign SystemReadyStatus display
TimelineEngineeringDesign SystemReadyBooking lifecycle
ButtonEngineeringDesign SystemReadyCalendar CTA and actions
Design tokensDesignDesign SystemReady-

Risks and Tradeoffs

Risk / TradeoffImpactMitigation
Auto-generated .ics files may not cover all calendar app quirksSome calendar apps may not import correctlyTest with Apple Calendar, Google Calendar, and Outlook; follow iCalendar spec strictly
No timezone in .ics generationCalendar event may appear at wrong time in different timezonesAdd optional timezone prop; document timezone requirement
Display-only widget limits interactivityUsers cannot modify or cancel from this componentIntentional: actions slot allows consumer to add modification buttons

Open Questions

IDQuestionOwnerStatusResolution
Q-001Should the .ics generator be extracted as a standalone utility function?David HolmesOpen
Q-002Should a timezone prop be required for .ics generation?David HolmesOpen
Q-003Should the component support a “copy link” action for the meeting location?David HolmesOpen

Acceptance Criteria

IDCriteriaRelated Requirement
AC-001Booking details (title, date, time, duration) display correctlyFR-001, FUNC-002, FUNC-003
AC-002Status badge renders with correct tone for confirmed/pending/cancelledFR-002, FUNC-001
AC-003Timeline renders booking lifecycle stepsFR-003, FUNC-005
AC-004”Add to Calendar” button is present and functionalFR-004, FUNC-006
AC-005Auto .ics download works when onAddToCalendar is not providedFUNC-007
AC-006Organizer and attendees display when providedFUNC-004
AC-007All Storybook stories render without errorsDOC-003
AC-008Component passes axe accessibility auditNFR-002

LLM Handoff Instructions

Expected LLM Behavior

  • Follow the requirements and acceptance criteria in this document.
  • Do not expand scope beyond the In Scope section.
  • Respect the Out of Scope section.
  • Use Badge for status display with tone mapping: confirmed -> success, pending -> warning, cancelled -> destructive.
  • Use Timeline for booking lifecycle.
  • Use Button for “Add to Calendar” and any additional actions.
  • Implement .ics generation as a utility function that creates valid iCalendar content.
  • Auto-format date/time/duration for display.
  • Place stories under the SaaS Widgets Storybook section.

LLM Should Not

  • Build booking modification or cancellation flows.
  • Add calendar API integration beyond .ics files.
  • Add email sending.
  • Modify existing Badge, Timeline, or Button components.

Decision Log

DateDecisionReasonOwner
2026-05-26Display-only confirmation card with actions slot for extensibilityKeeps scope small (S-size); consumer adds modification UX via actions slotDavid Holmes
2026-05-26Auto .ics generation with callback overrideProvides value out of the box while allowing custom behaviorDavid Holmes

Document History

DateAuthorChange
2026-05-26David HolmesInitial draft