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