# How to Vibe Code Your Own TidyCal (and Stop Paying for It)

> Simple calendar management and booking solution

- Site: https://tidycal.com
- Category: Scheduling & Calendar
- Verdict: **Solid side project** (72/100 vibecodeable)
- Estimated effort: 2-3 weeks part-time

## Verdict

Build a personal-use single-user clone with AI coding tools, but keep paying if you need robust multi-host round-robin sync and AppSumo's public directory network.

You can spin up a single-user booking page with Google Calendar sync and Stripe in a weekend using Next.js and Cursor. However, integrating Microsoft Graph and Apple CalDAV robustly, handling webhook idempotency for payment failures, and managing timezone boundary edge cases will consume significant debugging hours.

### What you can't replicate

- TidyCal's public directory traffic and user marketplace
- AppSumo's massive customer acquisition engine
- Instant trust and brand equity among clients booking professionals

## What it does

An online appointment scheduling and calendar management SaaS that allows individuals and teams to create shareable booking pages, sync multiple external calendars, and accept payments via Stripe or PayPal.

### Core features

- Shareable personal and team booking pages
- Google Calendar, Microsoft Office 365, and Apple CalDAV sync
- Stripe and PayPal upfront payments
- Session passes and recurring subscriptions
- Automated email reminders
- Round-robin and collective meeting distribution
- AI scheduling assistant and MCP server

## The business

### Pricing

- Free Plan: $0 — Forever free tier for basic scheduling
- Pro: $12/mo — For professionals wanting custom domains and no branding

Founded 2021.
Team size: Unknown.

## The hard parts

- Multi-calendar two-way synchronization without infinite sync loops or timezone calculation errors
- Handling edge cases across three distinct, heavily rate-limited calendar APIs (Google, Microsoft Graph, Apple iCloud)
- Fintech webhook orchestration for session pack decrementing, refunds, and subscription renewals
- Collective meeting matrix math (finding intersecting free slots across multiple busy hosts)

## How to vibe code TidyCal

### Prerequisites

- Node.js (free): Runtime environment for building and running the TypeScript full-stack web application.
- GitHub (free): Code repository and deployment source control.
- Google Cloud Console Account (free): Required to configure OAuth credentials and Calendar API webhooks for two-way sync.

### Recommended AI tools

- Cursor: AI code editor ideal for iterating on complex UI components, scheduling grid selectors, and form logic.
- Claude Code: Agentic terminal tool best suited for scaffolding backend APIs, database schemas, and external OAuth sync workers.

### Stack

- Frontend: Next.js
- Backend: Next.js API Routes
- Database: Turso
- Auth: better-auth
- Payments: Stripe
- Other: Vercel AI SDK, Resend, Tailwind CSS

### Hosting

- Vercel (Hosting the Next.js frontend and serverless API endpoints with zero-config deployment.): $0/mo (Hobby Tier)
- Turso (Serverless SQLite database storage for users, booking types, and appointment records.): $0/mo (Free Tier)

### Build guide

1. **Project Scaffolding & Database Schema** — Initialize the Next.js application with Tailwind CSS, configure Turso SQLite via Drizzle ORM, and set up the core data models for users, event types, availability schedules, and bookings.

```
Scramble a new Next.js project using App Router, TypeScript, and Tailwind CSS. Configure Drizzle ORM to connect to Turso SQLite. Create the database schema tables: users (id, email, name, timezone, custom_slug), event_types (id, user_id, title, duration_mins, price, description, is_active), availability_rules (id, user_id, day_of_week, start_time, end_time), and bookings (id, event_type_id, client_name, client_email, start_time, end_time, status, payment_intent_id). Write migration files and verify connection setup.
```

2. **Authentication & User Dashboard** — Implement authentication using better-auth with email/password and Google OAuth, and build the main user dashboard to manage booking pages and event types.

```
Integrate better-auth into the Next.js app supporting email/password and Google OAuth login, storing session data in the Turso database. Build a responsive user dashboard layout where authenticated users can view their unique booking URL (e.g., /app/username), create new event types with custom durations and pricing, and toggle their active status. Include form validation using Zod and React Hook Form.
```

3. **Calendar Integration & Free/Busy Slot Calculation** — Connect external Google Calendar accounts via OAuth 2.0, fetch calendar events, and implement the booking matrix algorithm to compute available time slots.

```
Build a Google Calendar OAuth integration flow allowing users to connect their calendar and store encrypted refresh tokens in the database. Implement a backend service route that queries the Google Calendar Freebusy API for a given date range. Write the scheduling matrix algorithm in TypeScript that takes a user's weekly availability rules, subtracts busy intervals from connected calendars, accounts for buffer times and minimum notice periods, and returns available time slots for any requested date.
```

4. **Public Booking Page & Slot Selector** — Create the public-facing booking page where clients can view event details, pick a timezone, select an available time slot, and input their details.

```
Create a dynamic public booking page route at /[username]/[eventSlug]. Build a responsive UI component that displays the host's profile, event description, and duration. Include an interactive date picker and a time slot grid that fetches available slots for the selected date based on the host's schedule and calendar conflicts. Allow clients to select their local timezone, pick a time slot, and enter their name and email.
```

5. **Stripe Payments & Confirmation Workflows** — Integrate Stripe Checkout for paid booking types, handle webhook events to confirm bookings, and trigger automated confirmation emails via Resend.

```
Integrate Stripe Checkout for paid event types. When a client selects a slot for a paid event, create a Stripe Checkout session with metadata containing the booking details and redirect them to Stripe. Implement a webhook endpoint (/api/webhooks/stripe) that handles checkout.session.completed events, saves the confirmed booking to the Turso database, and calls the Google Calendar API to insert the event into the host's calendar. Send confirmation emails to both host and client using Resend.
```

### Cost vs paying

**Starting costs (one-time):**

- Custom domain (optional): $12/year
- AI coding tool subscription: $20 one-time
- Total: ~$32 one-time

**Ongoing costs (monthly):**

- Vercel Hobby Hosting: $0/mo
- Turso DB & Resend Email: $0/mo (Free tiers)
- Total: $0/mo

- Paying for the SaaS instead: $12/mo (Pro Plan)
- Build time: 25-35 hours
- AI tool credits: $20 (Cursor Pro or Claude Pro for 1 month)
- Break-even: 0 months (Free to self-host)

## Sources

- [TidyCal Official Website & Feature Pages](https://tidycal.com)
- [TidyCal Pricing & Feature Matrix](https://tidycal.com/pricing)