What is a headless booking system (and when does your business need one)?

Stanislav TyshchenkoEngineeringTutorial10 min readJun 13, 2026
Headless booking system architecture diagram

Most booking software ships as a complete package: the database, the availability logic, the calendar widget, and the customer-facing UI are all bundled together. You install it, configure it, and your booking page looks like everyone else's booking page.

A headless booking system takes a different approach. It exposes everything the software knows — services, staff, real-time availability, cart, checkout, payments — through a REST API. You build the customer-facing UI however you want. The backend handles the hard parts; the frontend is entirely yours.

This is the same architectural pattern that powers headless commerce (Shopify Storefront API, Medusa) and headless CMS (Contentful, Sanity). Headless booking applies the same idea to scheduling and service businesses.

In a headless booking system, the API is the product. The UI is your responsibility — but it can look like anything, live anywhere, and be built with any technology stack.

Headless vs traditional booking software

Traditional booking softwareHeadless booking system
Frontend UIProvided by the vendor — limited customisationFully custom — you build it
IntegrationEmbed a widget or use a hosted pageAPI calls from any frontend or backend
Design controlTheme options, CSS overridesPixel-perfect, no constraints
Stack flexibilityVendor's stack onlyReact, Next.js, Vue, mobile — anything
Multi-surfaceOne widget, one hosted pageWeb, mobile, kiosk, Shopify, voice — same API
Setup timeHours to daysDays to weeks (frontend build)
Best forBusinesses that want to move fast with standard UXBusinesses that need a custom experience or multi-channel booking

When does a headless approach make sense?

Not every business needs headless. Here's how to tell if it's the right fit:

You need a custom UI. Your brand is strong enough that a generic booking widget would feel wrong. A high-end spa, a luxury hotel, a medical clinic with specific patient flows — these businesses need a booking experience that matches their identity, not a themed SaaS widget.

You're building a multi-surface product. You want the same availability engine to power a website, a mobile app, and a Shopify storefront — all at once. Traditional booking software typically forces you to pick one surface. Headless lets one backend serve all of them.

You're an agency or freelancer building for clients. Every client needs a different booking UI. With a headless backend, you write one integration and deploy customised frontends across multiple clients. The backend handles the hard parts; you focus on the client's design.

You're a developer who wants control. You're comfortable with REST APIs and you'd rather spend a week building a clean Next.js booking page than spend a month hacking around widget limitations.

You need to embed booking inside another product. Not a standalone booking page — a booking flow inside your existing app or platform, with your own auth, your own data model, and your own UX.

When headless isn't the right choice

If you're a single-location salon or yoga studio that just needs a booking page live this week, headless adds friction without much benefit. A traditional Shopify booking app or an all-in-one SaaS platform will get you there faster. Headless pays off when the UI customisation need is real and the development resources exist.

What a headless booking API actually exposes

A proper headless booking API needs to cover the full customer journey, not just availability lookup. The Opencals Storefront API, for example, covers:

1

Service catalog

List services (products), collections, variants, and pricing. This is what you show on your booking homepage — the service menu.

2

Staff and locations

List staff members and locations. Customers pick who they want to book with and where, filtering availability accordingly.

3

Real-time availability

Get available time slots for a given service, staff member, location, and date range. The API handles all the scheduling logic — staff hours, existing bookings, break times, buffer time.

4

Cart

Create and manage a booking cart. Supports multiple services, multiple staff, mixed appointment types. The cart persists so customers can build a complex booking across multiple steps.

5

Checkout and payment

Initiate checkout, collect payment (deposits or full amount) via Stripe, and confirm the booking. The API handles idempotency, payment failures, and partial payment flows.

6

Customer self-service

Authenticated endpoints for customers to view, reschedule, and cancel their own bookings without calling the salon.

This is the full picture. Some booking APIs only expose availability and booking creation — which means you have to build or bolt on your own cart, payment, and post-booking management. A complete headless booking API handles the entire flow.

Building on the Opencals Storefront API

Opencals is built headless-first. The same API that powers the Opencals dashboard and the Shopify app is publicly available as the Storefront API.

Authentication uses a Storefront API key (sfk_…) scoped to a single store. You get a key from the Opencals dashboard.

bash
# Get your store's available services curl https://api.opencals.com/storefront/products \ -H "Authorization: Bearer sfk_your_api_key"

The typed TypeScript SDK handles auth, request construction, and response parsing:

typescript
import { setupOpencals, ProductService } from "@opencals/storefront-sdk"; const opencals = setupOpencals({ apiKey: "sfk_your_api_key" }); const products = await ProductService.listProducts({ opencals }); // products.data is fully typed — no casting needed

The fastest way to see the full stack in action is the Haar open-source template — a complete Next.js 15 salon booking website built on the Storefront API, MIT licensed, one-click Vercel deploy.

Deploy with Vercel

Headless booking and Shopify

A common pattern: a Shopify store as the product storefront, headless booking for the service side. Instead of embedding a widget inside a Shopify product page, you build a custom /book route (or an entirely separate domain) that calls the Opencals API, with the same availability engine and the same Shopify customer account.

The Opencals Shopify app and the Storefront API share one backend. You can run both simultaneously — the Shopify app for customers who discover you through the product storefront, the custom UI for customers who arrive at your booking site directly.

Frequently Asked Questions

Early Access — 3 Months Free

Ready to transform your service business?

Join 150+ businesses already using Opencals. Get 3 months completely free with all features unlocked.

No credit card required
Setup in 10 minutes
Cancel anytime