Unwrapped

Legacy SaaS dossier · calendly

Calendly

Calendly

CategorySchedulingCalendly Teams, 300 seatsSite ↗

An availability calculator + an ICS file generator, per-seat-priced. The hard part, figuring out 'when am I free', already lives in your calendar.

01 · Data

Data the SaaS sits on

Google Calendar API
Google Calendar APIAPI
Microsoft 365
Microsoft 365API
Zoom links
Zoom linksAPI

Internal Build Score

0.83

Feasibility of a useful internal substitute for the actually-used 20% of this SaaS, built with Claude and your own data layer.

IBS = 0.25·U + 0.25·C + 0.20·D + 0.15·I + 0.15·Mthis record · 83%
  • U

    User adoption gap

    weight 0.250.60

    How much licensed surface area sits idle.

  • C

    Core simplicity

    weight 0.250.95

    How small the actually-used 20% is when re-implemented honestly.

  • D

    Data portability

    weight 0.200.88

    How clean the exit is, exports, formats, audit lock.

  • I

    Integration burden (inverse)

    weight 0.150.85

    How few external systems must keep working through the SaaS.

  • M

    Moat erosion

    weight 0.150.92

    How much the original differentiator has been commoditised by LLMs + cheap infra.

Editorial heuristic. Not investment advice, not a procurement recommendation.

03 · Feature usage

Commonly used vs. rarely touched

Commonly used

05

  • Show free 30/60 min slots from a calendar feed
  • Public booking page with timezone handling
  • ICS invite + Zoom link on confirm
  • Round-robin across a team
  • Buffer + min-notice windows

Rarely touched

07

  • Workflows engine for reminder emails
  • Routing forms that re-implement Typeform, sold separately
  • Salesforce integration as a paid tier
  • Analytics dashboards for a calendar
  • Meeting polls + group events SKUs
  • Embed code + branded pages as upsells
  • AI scheduling assistant, read: a Claude call you already have

Internal build

Build it yourself

01 · Stack & flow

Next.js
Next.js
Postgres
Postgres
Google Calendar API
Google Calendar API
MSAL (Outlook)
MSAL (Outlook)
Stripe
Stripe

Internal build map

Data in

Google free-busy
Outlook free-busy
Host rules

Agent layer

Slot calculator
Round-robin picker

Logic

apply buffers
render in booker TZ
create event
email ICS

Outputs

Open slots JSON
Calendar event
ICS invite
Build time
2 weeks
Run cost
$0.5/seat·mo
vs. SaaS
$36K / yr

Build outline

  1. OAuth into Google + Microsoft calendars
  2. Free-busy query + slot calculator
  3. Public booking page with timezone select
  4. Create event + email ICS + Zoom link
  5. Round-robin assignment from a team table

02 · Claude prompt

First, map what you actually use (optional)
Step 1 · usage audit prompt

// Calendly usage audit, scope the rebuild Input: the event-type list with 90-day booking counts, the routing forms, the workflows (reminders), and the connected calendars. ## Do 1. Keep event types booked in the last 90 days; drop the rest. 2. List which workflows send anything beyond a basic reminder email. 3. Note any routing form that is really a qualification quiz, rebuild it as a plain form. ## Output JSON: { keep_event_types[], keep_workflows[], drop[] }.

Step 2 · rebuild the core

// Scheduling assistant, booking-page backend You receive (a) a host's free-busy windows for the next 14 days, (b) the host's rules (meeting length, buffers, min notice, timezone), and (c) the booker's requested constraints (time zone, preferred range). ## What you must do 1. Return the next 8 open slots that satisfy every rule. 2. Each slot is { start_iso, end_iso, host_local, booker_local }. 3. If fewer than 8 are available, return what you can and set `exhausted: true`. ## What you do not do - Do not write the event. Slot selection happens client-side; the next step posts the event back through the calendar API. - Do not assume the booker's timezone, use only what they passed. - Do not invent buffers or "look-aheads" beyond the host's rules. ## Output JSON: { slots[], exhausted }.

03 · Result

Book a 30-min intro with @anna next week, Pacific time
host:anna#tz=PT

Tue 10:00 PT · Wed 14:30 PT · Thu 11:00 PT (next 3 of 8 slots)