A lightweight booking page that works with both SavvyCal and Cal.com. Click a time slot link → form opens with that time pre-filled → enter name/email → submit → booked.
Why this exists: Neither SavvyCal nor Cal.com support pre-selecting a specific time via URL. Without this app, clicking a time link takes the recipient to your calendar page where they have to find and click the slot again.
Part of the Propose Times system — the Raycast extension intelligently generates meeting times (batched around existing meetings, respecting your scheduling preferences), and this app handles the one-click booking.
Vercel account — A hosting service that runs this small web app. Deploying is as simple as clicking a button.
- 💰 Free — The free tier handles plenty of bookings
- 🔗 Sign up for Vercel (you can use your GitHub account)
A scheduling account — Either one:
- Click the "Deploy with Vercel" button above
- Add your environment variables:
SAVVYCAL_TOKEN- Get from SavvyCal Settings (optional if using Cal.com only)CALCOM_API_KEY- Get from Cal.com API Keys (optional if using SavvyCal only)
- Deploy!
This app provides a simple booking form at /book that accepts URL parameters. The provider parameter determines which calendar service to use.
| Parameter | Required | Description |
|---|---|---|
provider |
No | Set to savvycal (default) |
slot |
Yes | ISO timestamp of the meeting start time |
link_id |
Yes | SavvyCal scheduling link ID |
duration |
No | Meeting duration in minutes (default: 30) |
tz |
No | Timezone (default: America/New_York) |
| Parameter | Required | Description |
|---|---|---|
provider |
Yes | Set to calcom |
slot |
Yes | ISO timestamp of the meeting start time |
username |
Yes | Cal.com username |
event_slug |
Yes | Event type slug |
duration |
No | Meeting duration in minutes (default: 30) |
tz |
No | Timezone (default: America/New_York) |
SavvyCal:
https://your-app.vercel.app/book?slot=2024-01-15T14:00:00Z&link_id=link_abc123&duration=25&tz=America/New_York
Cal.com:
https://your-app.vercel.app/book?provider=calcom&slot=2024-01-15T14:00:00Z&username=skinnyandbald&event_slug=pow-wow&duration=30&tz=America/New_York
This app is the backend for the Propose Times Raycast extension. The extension generates the meeting time messages; this app handles the one-click booking.
-
Deploy this app using the button above
-
Install the Raycast extension:
git clone https://github.com/skinnyandbald/propose-times.git cd propose-times npm install npm run buildThen in Raycast: Preferences → Extensions → + → Import Extension → select the folder
-
Connect them: In Raycast extension preferences, set Booker URL to your Vercel deployment URL (e.g.,
https://your-app.vercel.app) -
Choose your provider: In extension preferences, select either SavvyCal or Cal.com and enter the appropriate credentials.
Now when you generate meeting times, each slot links directly to this booking form.
# Install dependencies
npm install
# Copy environment file and add your tokens
cp .env.example .env.local
# Run development server
npm run dev- Next.js 16 (App Router)
- TypeScript
- SavvyCal API / Cal.com API v2
MIT