# Calendar scheduling links (Agent Skill)

> Your own scheduling links: booking pages per host and event type, availability with overrides and buffers, Google and Outlook calendar sync, e-mail invites, reminders and self-service reschedule.

Page: https://timerise.ai/skills/calendar-scheduling-links

Agent Skill `calendar-scheduling-links`: https://github.com/timerise-ai/calendar-scheduling-links. Category: Scheduling. Runs on Next.js; backend: Supabase or Firestore behind a `SchedulingStore` seam.

Latest release: v0.1.2 (2026-10-15).

Install: npx skills add timerise-ai/calendar-scheduling-links. Timerise builds it on a brief; the price comes from the brief.

A scheduling link looks like the simplest page on the internet: a calendar, some free times, a button. Most teams rent one per seat, every month, and accept that the booking page lives on someone else's domain, sends someone else's e-mails and stops where the vendor's roadmap stops.

The page is the easy part. The hard part is what happens when two people pick the same time, when the host's calendar changed a minute ago, when the clocks go forward on a Sunday night, or when a meeting moves and the reminder still goes out for the old time. Get one of those wrong and a client sits alone on a call.

This skill gives your coding agent the whole core, written by the engineers who build booking systems for a living: availability, booking, calendar sync, invites, reminders, reschedule and cancel links. You own the code, run it on Next.js on Vercel, with Supabase or Firestore, under your own accounts, and extend it with us, with our other skills, or by asking your agent for the next feature.

Build self-hosted scheduling links in a Next.js App Router app: a public booking page per host and event type, weekly availability with date overrides, buffers, minimum notice, daily limits and a rolling horizon, one-on-one and group event types, Google Calendar and Microsoft 365 busy-time sync and event write-back, confirmation e-mails with an ICS invite, reminders, reschedule and cancel by a private link, signed webhooks and an embeddable widget. Use when: (1) a team wants its own Calendly-style booking pages instead of a per-seat subscription, (2) an app needs "book a time with me" links for coaches, advisors, sales or support, (3) an existing scheduling module double-books, drifts across DST, sends stale reminders or duplicates calendar events, (4) the user mentions: scheduling link, booking page, Calendly alternative, Calendly clone, Cal.com alternative, event types, availability rules, date overrides, buffer time, minimum notice, daily limit, round robin, time slots, free busy, freeBusy, calendarView, Google Calendar sync, Outlook sync, Microsoft Graph subscription, watch channel, ICS invite, METHOD:REQUEST, SEQUENCE, reschedule link, cancel link, embed widget, booking webhook, double booking, DST, exclusion constraint, btree_gist, pg_cron. Carries one pure slot engine that the page and the write both call, a per-host lock with a Postgres exclusion constraint, side effects as leased idempotent jobs, sealed OAuth tokens, signed state and channel tokens, and 53 unit tests plus a store contract run on Supabase and the Firestore emulator. Next.js App Router on Vercel; Supabase by default, Firestore behind the same SchedulingStore seam. Not payments, not team round robin in this release, not a video meeting service.

This skill was written by the engineer who builds the scheduling core of a booking platform, and audited against the earlier implementation of that core. The templates hold the properties a scheduling module has to hold: a start is booked only if the engine offers it at write time; of any number of simultaneous requests for one slot, one wins; local days survive both DST changes; a reschedule moves the same calendar event and the same invitation; a reminder belongs to the start it was made for; calendar access, manage links and webhooks cannot be forged. 53 unit tests and a store contract, run on local Supabase and the Firestore emulator, state each one, and [`references/provenance.md`](references/provenance.md) has the record.

What it builds:
- A public booking page per host and event type
- Weekly availability with date overrides
- Buffers and minimum notice
- Daily limits and group seats
- Google and Microsoft calendar sync
- E-mail with an ICS invite
- Reminders, reschedule and cancel by a private link
- Signed webhooks
- An embed widget

When to use:
- Public booking pages for one or many hosts, each with their own event types and availability.
- One-on-one meetings and group sessions with seats.
- Avoiding the host's Google or Microsoft calendar, and writing bookings into it.
- Auditing or rebuilding a scheduling module: [provenance.md](references/provenance.md) has the audit ledger and the fix order.

When not to use:
- **Taking payment for a booking, deposits, no-show holds**: the sibling `bookable-events` skill, or `stripe-connect-subscriptions` for a marketplace. [extensions.md](references/extensions.md) shows the join.
- **Capacity-limited events with tickets (a workshop on one date)**: `bookable-events`.
- **A walk-up touchscreen terminal**: `booking-kiosk`, which can call this module's service.
- **Round robin, collective and routing forms**: described in [extensions.md](references/extensions.md), with no templates in this release.
- **Video meetings themselves**: the module creates Google Meet or Teams links through the calendar APIs.

Non-negotiables:
- The write recomputes the slot with the engine that listed it. A start is booked only if `computeSlots` offers it at write time. The booking suite books what the page listed and refuses an off-grid start, a start inside the notice and one outside hours.
- Every booking write is atomic per host. Seats, the daily limit and overlap are checked under one lock per host, with the overlap constraint as the backstop. The store contract sends four simultaneous requests for one slot to each store and expects one winner.
- Side effects are jobs, written with the change and run after it. No e-mail, calendar call or webhook inside the transaction; every job idempotent and re-checking the booking. The booking suite runs the queue twice and expects one send, retries a failing mailer, and plants a stale reminder that must not be sent.
- Instants in storage, zones only at the edges. Store UTC instants; convert with an explicit IANA zone, iterate local dates, never add 24 hours. The time and engine suites cover both DST changes, a 5:45 offset and a late-evening walk across a spring-forward night.
- Secrets stay sealed and links stay unforgeable. Manage tokens stored as hashes, OAuth tokens and webhook secrets encrypted, OAuth state and channel tokens signed, cron auth failing closed. The edges suite checks each.

Not this:
- Payment for a booking, deposits, no-show holds, ticketed events with seats on one date: `bookable-events`
- A marketplace that pays providers: `stripe-connect-subscriptions`
- A walk-up booking terminal: `booking-kiosk`
- Host notifications in Slack: `slack-ai-bot`
- Knowing who opened a booking link: `visit-logger`
- Invoices for paid sessions: `invoicing`
- Round robin, collective events, routing forms: [extensions.md](references/extensions.md), no templates yet

What to tell your agent:
- Add Calendly-style booking links to this Next.js app on Supabase: hosts set their weekly availability and event types, visitors book a free time on a public page, both get an e-mail with a calendar invite, and the visitor can reschedule or cancel from a link in that e-mail.
- Connect our booking pages to the host's Google Calendar and Outlook: hide times when they are busy and put every booking into their calendar.
- Audit our scheduling module: people get double-booked, reminders arrive for meetings that were moved, and around the clock change some days have no slots.

Agent eval results (newest per agent and prompt):
- Gemini CLI (gemini-3.8-flash) on v0.1.2, 2026-10-15: pass (Supabase)
- Codex CLI (gpt-6.1-sol) on v0.1.2, 2026-10-15: pass (Supabase)
- Claude Code (claude-opus-5-5) on v0.1.2, 2026-10-15: pass (Supabase)

Recent releases:
- v0.1.2 (2026-10-15): Fix release, from scoring the prompt-1 agent eval runs against 0.1.1. Apps built from 0.1.0 or 0.1.1 should copy booking-service.ts, booking-widget.tsx and the new manage slots route.
- v0.1.1 (2026-10-15): Fix release, from scoring the prompt-1 agent eval runs against 0.1.0. Apps built from 0.1.0 should copy runner.ts, calendar/writer.ts, calendar/sync.ts, booking-widget.tsx and cancel-form.tsx.
- v0.1.0 (2026-10-15): First release: self-hosted scheduling links for Next.js App Router on Vercel, with Supabase or Firestore.
