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

> The scheduling tool that reduces no-shows and builds your brand

- Site: https://lemcal.com
- Category: SaaS / Scheduling
- Verdict: **Solid side project** (72/100 vibecodeable)
- Estimated effort: 2-3 weekends of focused work

## Verdict

Build a personal subset in 2 to 3 weekends, but keep paying for the production-grade reliability of external calendar webhooks and OAuth token management.

Building a custom scheduling clone with AI assistance is entirely feasible because frontend booking pages and basic database CRUD operations can be rapidly scaffolded. However, maintaining production-grade OAuth token refreshes, incremental calendar webhooks, and precise free/busy slot calculations across multiple calendars takes genuine engineering attention and robust background queues.

### What you can't replicate

- Deep native integration with the lemlist cold email ecosystem
- Built-in enterprise user base of 13,000+ active professionals

## What it does

An online meeting scheduling and calendar management platform designed for sales professionals and founders featuring personalized booking pages, multi-calendar sync, and automated workflows.

### Core features

- Customizable public booking pages with Unsplash photos and branding
- OAuth2 bi-directional sync with Google Calendar and Microsoft Graph
- Availability calculation engine with buffer times and rolling windows
- Meeting type management (duration, location, questions)
- Automated email notifications and reminder dispatching
- Round-robin team meeting distribution logic
- Calendly configuration import utility

## The business

### Pricing

- Starter: $0 — For solopreneurs and founders
- Pro: $9/mo — For teams and advanced workflows

### Funding

€30M raised.
- Bootstrapped to profitability
- €30M secondary investment round (2021)
Investors: Expedition Growth Capital

Founded 2018.
Team size: ~90 (lempire ecosystem).

## The hard parts

- Managing robust, continuous bi-directional calendar sync without hitting API rate limits or missing external edits
- Computing real-time free/busy availability slots across multiple overlapping calendars and timezones
- Implementing durable background worker queues for scheduled email reminders and webhook retries

## How to vibe code lemcal

### Prerequisites

- Node.js (free): Runtime environment for building and running the Next.js application.
- GitHub (free): Version control and deployment pipeline integration.
- Google Cloud Console Account (free): Required to configure OAuth2 credentials and webhooks for Google Calendar API integration.

### Recommended AI tools

- Claude Code: Best-in-class terminal agent for scaffolding full-stack features, database schemas, and complex calendar scheduling logic iteratively.
- Cursor: Ideal AI code editor for fine-tuning UI components, Tailwind styles, and client-side booking page interactions.

### Stack

- Frontend: Next.js with Tailwind CSS and shadcn/ui
- Backend: Next.js API Routes / Server Actions
- Database: Turso (SQLite at the edge)
- Auth: better-auth
- Payments: None (personal use)
- Other: Resend API for transactional email reminders, Inngest for durable background jobs and reminder triggers

### Hosting

- Vercel (Hosting the Next.js frontend and serverless API endpoints with zero-config GitHub deploys.): $0/mo (Hobby tier)
- Cloudflare (Edge caching and DNS management for custom booking page subdomains.): $0/mo (Free tier)

### Build guide

1. **Project Scaffolding & Database Schema** — Initialize the Next.js project with Tailwind CSS, shadcn/ui, and configure Turso SQLite connection via Drizzle ORM.

```
Scaffold a new Next.js project using App Router and TypeScript. Install Tailwind CSS and configure shadcn/ui primitives. Set up Drizzle ORM connected to a Turso SQLite database. Create the initial database schema supporting users, calendars, event_types (title, duration, slug, buffer_time), bookings (host_id, guest_name, guest_email, start_time, end_time, status), and availability_schedules (user_id, day_of_week, start_time, end_time). Ensure all foreign keys have appropriate indexes and cascade rules. Write a migration script to apply the schema to Turso.
```

2. **Authentication & User Profiles** — Integrate better-auth for user credential management and unique booking URL profiles.

```
Configure better-auth in the Next.js application supporting email/password sign-in and Google OAuth. Create a user profile table extension that stores custom branding fields such as display name, bio, profile image URL, and a unique slug for their public booking page (e.g., app.local/username). Build an authenticated dashboard layout where users can view and edit their profile settings, avatar, and custom slug.
```

3. **Calendar OAuth & Bi-directional Sync** — Implement Google Calendar OAuth connection, token encryption, and external event fetching.

```
Implement the Google Calendar OAuth2 authorization flow. Store encrypted access and refresh tokens securely in a connected_accounts table linked to the user. Build a background synchronization service that calls the Google Calendar API (v3/calendars/primary/events) to fetch busy time blocks for a given date range. Handle token refreshing automatically when expired. Add an endpoint that aggregates busy times from all connected calendars for a specific user.
```

4. **Availability Engine & Public Booking Page** — Build the algorithmic availability slot generator and the responsive public booking page UI.

```
Build a robust availability calculation engine as a server action or API route. Given a target date, a user's availability schedule rules (e.g., Mon-Fri 9am-5pm), meeting duration, buffer times, and fetched external calendar busy blocks, compute all valid available time slots. Create a public-facing booking page route ([username]/[eventSlug]) that renders a calendar date picker and available time slot buttons. Allow guests to select a slot, input their name, email, and custom pre-meeting answers.
```

5. **Booking Creation & Calendar Event Push** — Handle appointment booking submissions, database persistence, and external calendar event creation.

```
Implement the booking confirmation logic when a guest submits a slot. Validate that the slot is still available against race conditions. Insert the booking record into the SQLite database. Simultaneously, call the Google Calendar API to insert a corresponding calendar event on the host's primary calendar with the guest as an attendee and a Google Meet video conference link attached. Return a success state and redirect to a confirmation view.
```

6. **Automated Email Reminders & Polish** — Set up Inngest background jobs to dispatch confirmation and reminder emails via Resend.

```
Integrate Resend for transactional email dispatching. Set up Inngest background job functions to automatically trigger a confirmation email to the guest immediately upon booking creation, and schedule reminder emails to be sent 24 hours and 1 hour before the meeting start time. Add error handling and retry logic for failed email deliveries. Polish the overall user dashboard UI with clean toast notifications and responsive styling.
```

### Cost vs paying

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

- Google Cloud Console API Project Verification: $0
- Custom Domain (optional): ~$12/yr
- Total: ~$12 one-time

**Ongoing costs (monthly):**

- Vercel Hosting & Turso Database: $0/mo (Free tiers)
- Resend Email API: $0/mo (Free tier up to 3k emails)
- Total: $0/mo

- Paying for the SaaS instead: $9/mo (Pro Plan)
- Build time: 24-36 hours
- AI tool credits: $20 one-time (Claude Pro / Cursor)
- Break-even: Never (subscription is cheaper, build is for learning)

## Sources

- [lemcal Official Website & Pricing](https://lemcal.com)
- [Lempire & lemcal Growth Analysis](https://www.lennysnewsletter.com)