Overview

Build scheduling and booking experiences with the Transactional Calendar API.

What is Calendar?

Transactional Calendar is a complete scheduling infrastructure that lets you add booking capabilities to any application. Create event types, manage availability, and let customers book time with your team.

Why Calendar?

Modern Scheduling Infrastructure

  • Embeddable booking - Drop booking widgets into any website
  • Flexible availability - Define complex schedules and overrides
  • Team scheduling - Round-robin, collective, and pooled events
  • Calendar sync - Two-way sync with Google, Outlook, Apple

Built for Developers

  • Simple API - RESTful endpoints with comprehensive SDKs
  • Webhooks - Real-time notifications for all booking events
  • White-label - Full customization of booking experience
  • Multi-tenant - Each organization has isolated calendars

Core Concepts

Event Types

Event types define what can be booked:

const eventType = await client.calendar.eventTypes.create({
  title: '30-minute Consultation',
  slug: 'consultation-30',
  duration: 30,
  description: 'Quick consultation call',
  location: { type: 'GOOGLE_MEET' },
});

Availability

Schedules define when bookings can happen:

const schedule = await client.calendar.schedules.create({
  name: 'Work Hours',
  timezone: 'America/New_York',
  availability: [
    { day: 'MONDAY', startTime: '09:00', endTime: '17:00' },
    { day: 'TUESDAY', startTime: '09:00', endTime: '17:00' },
    { day: 'WEDNESDAY', startTime: '09:00', endTime: '17:00' },
    { day: 'THURSDAY', startTime: '09:00', endTime: '17:00' },
    { day: 'FRIDAY', startTime: '09:00', endTime: '17:00' },
  ],
});

Bookings

When customers book time:

const booking = await client.calendar.bookings.create({
  eventTypeId: 'evt_xxx',
  startTime: '2024-01-15T10:00:00Z',
  attendee: {
    name: 'John Doe',
    email: 'john@example.com',
  },
});

Key Features

Scheduling Logic

FeatureDescription
Buffer timeAdd breaks between meetings
Minimum noticePrevent same-day bookings
Maximum advanceLimit how far ahead users can book
Slot intervalsControl booking slot granularity

Team Features

FeatureDescription
Round-robinDistribute meetings evenly
CollectiveRequire all team members
Group eventsAllow multiple attendees

Integrations

PlatformFeatures
Google CalendarTwo-way sync, Meet links
Outlook/Office 365Two-way sync, Teams links
Apple CalendarCalDAV sync
ZoomAutomatic meeting links

Architecture

Your Application
↓
Transactional Calendar
Scheduling
Availability
Reminders
↓
Google Calendar
Outlook
Apple

Use Cases

SaaS Platforms

Add scheduling to your product:

  • Customer success calls
  • Demo bookings
  • Support appointments
  • Onboarding sessions

Marketplaces

Connect service providers with customers:

  • Consultations
  • Coaching sessions
  • Professional services

Healthcare

Medical appointment scheduling:

  • Patient appointments
  • Telehealth visits
  • Follow-up scheduling

Education

Academic scheduling:

  • Office hours
  • Tutoring sessions
  • Parent-teacher meetings

Getting Started

  1. Create an event type - Define what can be booked
  2. Set up availability - Configure when bookings are allowed
  3. Connect calendars - Sync with existing calendars
  4. Embed or integrate - Add booking to your application
  5. Handle webhooks - React to booking events

Quick Example

import { Transactional } from '@usetransactional/node';
 
const client = new Transactional({ apiKey: 'tr_live_xxx' });
 
// 1. Create an event type
const eventType = await client.calendar.eventTypes.create({
  title: 'Product Demo',
  slug: 'demo',
  duration: 45,
  location: { type: 'ZOOM' },
});
 
// 2. Get available slots
const slots = await client.calendar.availability.get({
  eventTypeId: eventType.id,
  startDate: '2024-01-15',
  endDate: '2024-01-22',
});
 
// 3. Create a booking
const booking = await client.calendar.bookings.create({
  eventTypeId: eventType.id,
  startTime: slots.available[0].startTime,
  attendee: {
    name: 'Jane Smith',
    email: 'jane@company.com',
  },
});
 
console.log('Booking confirmed:', booking.uid);
console.log('Meeting link:', booking.meetingUrl);

Next Steps