Booking
A booking component for Bijection.
git clone https://github.com/bijectionhq/booking.git
cd booking
git checkout 238dc6eee0e202e9bb1a20800cac2f49bd1ed727Bijection repository access is required. Request access.
Description
A booking component for Bijection.
Explore the package README for API concepts, configuration, and examples. Check the Bijection source for adaptation-specific setup.
Review the source and its dependencies before adopting this package. Source availability does not establish npm publication or runtime qualification.
Getting started
- Get the source at the revision above and read its package documentation.
- Check the required Bijection SDK version, dependencies, and external service credentials.
- Follow the package setup instructions and the guide to using components.
- Exercise the component in your deployment according to your project’s verification rules.
Open source
Maintained source: bijectionhq/booking. Based on Finchmedia/booking-component. License: Apache-2.0. Consult the repository for license terms, notices, and contributor attribution.
From the upstream publisher
A booking component for Convex.
Explore the demo ↗Upstream overview
From the upstream package documentation.
A Convex component for booking rooms, people and equipment. It manages timezone-aware availability, prevents conflicting bookings and reserves several resources atomically. It supports equipment pools, confirmation, cancellation, rescheduling and token-based booking management. Use the backend API for custom interfaces or the included React Booker for single-resource booking flows.
Use cases
From the upstream package documentation.
- Prevent overlapping bookings for meeting rooms, studios, and other exclusive resources.
- Manage equipment rental pools with quantity-based availability for interchangeable items.
- Coordinate appointments that require several resources, such as a staff member, room, and equipment, in one atomic booking.
- Add a public booking page with date selection, available time slots, and contact capture using the included React Booker.
- Let customers cancel or reschedule through token-based management links, with optional email notifications through Resend.
How it works
From the upstream package documentation.
Register the component in convex/convex.config.ts with app.use(booking), then expose booking operations through your own Convex functions. Browser clients call these host functions, which check authorization and your booking policies before delegating to components.booking.*. The component keeps booking records and inventory in its own tables and uses transactional checks to prevent conflicting reservations.
Configure resources and schedules with weekly hours, date overrides and IANA timezones, then link resources to the event types that define how they can be booked. Inventory is tracked on a 15-minute grid. Equipment pools and bookings that need several resources use the multi-resource API, which reserves every requested resource atomically.
Bookings, moves and confirmations check one set of rules: the event type and its resources exist, are active, are linked to each other and belong to the event type's organization. Expected failures throw ConvexError({ code, message }) with documented codes, so your host functions can map them to their own messages. Read-only maintenance audits list stored data that needs attention after an upgrade.
For the React UI, wrap your page in BookingProvider with your host's public API and render <Booker />. It handles date, duration and slot selection, contact details and confirmation for one exclusive resource, and shows booking errors itself. onBookingComplete receives the booking, including its UID, so you can link to your booking management pages.
The backend supports confirmation, cancellation and atomic rescheduling. Token-based management links let customers cancel or move their bookings. Your host controls booking policies and the expiry of provisional bookings, and optional Resend integration adds email notifications.
Upstream package FAQ
Does @mrfinch/booking expose public Convex mutations that clients can call directly?
No. Browser clients call host functions that you write and control. Those host functions perform authorization and policy checks before calling components.booking.* internally. The old public makeBookingAPI factory was removed in version 0.4.0 and must be replaced with authorized host wrappers.
What Convex version does @mrfinch/booking require?
@mrfinch/booking requires Convex 1.46 or newer. Install it alongside the component with npm install @mrfinch/booking convex@^1.46.0. Node 24 LTS is recommended for development.
Can I use @mrfinch/booking without the React Booker UI?
Yes. The React Booker and its peer dependencies are optional. Backend-only apps can skip installing convex-helpers, react-hook-form, @hookform/resolvers, and lucide-react, and interact with the component entirely through host functions calling components.booking.*.
How does @mrfinch/booking handle timezone-aware scheduling?
@mrfinch/booking supports weekly hours, date overrides, and IANA timezones in its schedule model. Booking timestamps are stored as Unix milliseconds and availability is tracked on a 15-minute grid.
How do I test host functions that use @mrfinch/booking with convex-test?
@mrfinch/booking exposes its schema and modules for use with convex-test. After installing convex-test and Vitest, import bookingComponent from @mrfinch/booking/test and call bookingComponent.register(t) before invoking host functions in your tests. Pass a second argument to register if you mounted the component under a non-default name.
Use with agents and CLI
Give your coding agent the component’s source identity and setup guidance.
Help me integrate Booking with Bijection.
Read: https://bijection.com/components/booking/SKILL.md
Check SDK compatibility and dependency availability.
Follow this project's execution and verification rules.Upstream README.md
View repository ↗Documentation from Finchmedia/booking-component, recorded October 23, 2026. APIs and setup may differ in the Bijection adaptation.
Booking and availability for Convex apps. Reserve rooms, people or equipment; combine resources into a booking; and track quantities for interchangeable items. Use the React Booker or build your own interface.
Quick Start · API Reference · Live Demo
Upgrading from 0.4.x? Read the upgrade guide and the 0.5.0 notes in the CHANGELOG. The 0.4.x README and docs stay available at the v0.4.3 tag.
Install
Start with an existing Convex app.
The package requires Convex 1.46 or newer and convex-helpers (the component's
paginated queries use its paginator). Use Node 24 LTS for development.
npm install @mrfinch/booking convex@^1.46.0 convex-helpers@^0.1.124
Register the component, then run npx convex dev:
// convex/convex.config.ts
import { defineApp } from "convex/server";
import booking from "@mrfinch/booking/convex.config";
const app = defineApp();
app.use(booking);
export default app;
The component registers the Resend component
as its own child for optional email; it comes with the package. Email stays off
until your host functions pass resendOptions with an API key, so apps without
email need no Resend setup.
For the optional React UI, also install its peer dependencies. Keep your existing React 18 or 19 installation and use the matching React DOM version.
npm install react-hook-form@^7.88.0 @hookform/resolvers@^5.9.1 lucide-react@^1.47.0
The package includes Zod 4. Backend-only apps can skip these UI peers.
Your first booking page
Follow the Quick Start to add the complete public gateway, its rate-limit table, providers and styling. Run the setup seed to create and link a resource, schedule and event type.
With that setup in place, render the Booker beneath your Convex and
ConvexQueryCacheProvider providers:
// app/book/page.tsx
"use client";
import { Booker, BookingProvider } from "@mrfinch/booking/react";
import { api } from "@/convex/_generated/api";
export default function BookingPage() {
return (
<BookingProvider publicApi={api.public}>
<Booker eventTypeId="quick-meeting" resourceId="meeting-room" title="Book a Meeting" />
</BookingProvider>
);
}
The Booker handles date, duration and slot selection, contact details and
confirmation for one exclusive resource. Use onBookingComplete(booking) to
connect your management pages to the returned booking UID and secret token.