Booking
for developers

The best way to add booking to your product. Capacity, payments, waitlists, and packs — all through a simple API.

Quickstart

Start booking in minutes

Install the SDK. Query availability. Create a booking. That's it.

book.ts
1import { Seshn } from '@seshn/sdk';
2
3const seshn = new Seshn('sk_live_...');
4
5const slots = await seshn.availability.query({
6 serviceId: 'svc_yoga_class',
7 from: '2026-03-15',
8 to: '2026-03-22',
9});
10
11const booking = await seshn.bookings.create({
12 slotId: slots[0].id,
13 contactId: 'ct_jane_doe',
14 seats: 2,
15});

Built-in

Everything you need to ship

Capacity math, credit ledgers, waitlists, payments — built in, not bolted on.

Shared capacity

Seat-based booking with race-condition protection. No double-books, ever.

Pack credits

Session packs, memberships, and credits with a double-entry ledger.

Waitlist

Automatic promotion when cancellations free up seats.

Payments

Stripe built in. Hold, charge, confirm, refund — one integration.

Recurring

Weekly or monthly series. All-or-nothing atomic reservation.

Webhooks

HMAC-signed with automatic retry. 15+ event types.

Check-in

Track arrivals, flag no-shows, auto-mark after the slot ends.

Multi-tenant

Organizations, scoped API keys, role-based access, audit log.

Pricing

Per-seat, flat, tiered, or per-duration. Calculated server-side.

Payment flow

Hold → Pay → Confirm

Stripe built in. Hold a seat, collect payment, auto-confirm. No webhooks to wire up.

payment.ts
1// 1. Create a held booking with payment
2const { booking, clientSecret } = await seshn.bookings.create({
3 slotId: slots[0].id,
4 contactId: 'ct_jane_doe',
5 seats: 2,
6 hold: true,
7 payment: { amount: 4000, currency: 'usd' },
8});
9
10// 2. Complete payment on the frontend with Stripe.js
11const stripe = Stripe('pk_live_...');
12await stripe.confirmPayment({ clientSecret });
13
14// 3. Seshn auto-confirms via Stripe webhook
15// booking.status → 'confirmed'

Recurring bookings

One call, weeks of sessions

Book a recurring series in a single request. All-or-nothing — every slot reserved atomically.

recurring.ts
1const series = await seshn.bookingSeries.create({
2 contactId: 'ct_jane_doe',
3 serviceId: 'svc_yoga_class',
4 resourceId: 'res_studio_a',
5 seats: 1,
6 recurrence: {
7 frequency: 'weekly',
8 dayOfWeek: 2, // Tuesday
9 time: '14:00',
10 count: 8, // 8 weeks
11 },
12});
13
14// series.bookings → 8 confirmed bookings
15// Cancel just one: seshn.bookingSeries.cancelOccurrence(id, 3)

Why Seshn

Not another calendar tool

Other APIs were designed for 1:1 meetings. Seshn is built for shared capacity, seat math, and session packs.

FeatureSeshnOnSchedHapioCal.com
Native seat-based capacity engine
~
~
Session pack / credit ledger
Waitlist with auto-promote
~
Check-in tracking
Recurring series booking
Stripe-native hold → pay → confirm
~
~
Pricing engine (4 strategies)
Race condition protection
Provisional booking holds
TypeScript SDK

~ = limited or partial support

API

Clean, RESTful, predictable

GET

/v1/availability

Query slots with real-time capacity

POST

/v1/bookings

Atomic seat reservation with race protection

POST

/v1/booking-series

Create recurring booking series

POST

/v1/bookings/:id/confirm

Confirm a held booking after payment

GET

/v1/entitlements

Pack credits, memberships, session passes

POST

/v1/waitlist

Auto-promote when slots open up

GET

/v1/payments

Stripe-integrated payment tracking

POST

/v1/webhooks

Real-time events with retry + HMAC signing

Get early access

Free to start. We're opening to a small group of developers first.