Booting AR/OS000
[ Back to work → ]
Case study

Skedio

A scheduling and CRM platform for appointment-based businesses in Serbia: online booking, a team calendar, client records, and automated WhatsApp reminders. A product I'm building solo, from scratch.

In active development
Next.js 16TypeScriptSupabasePostgreSQLLemon SqueezyTwilioResendSentry

The problem

Salons, clinics, barbers, and gyms across Serbia still run on a paper diary and a ringing phone. Every missed call is a lost booking, every no-show is wasted time, and the foreign scheduling tools that exist ignore how business is actually done here: WhatsApp instead of email that goes unread, and hours and habits that don't match. Skedio is built for this market specifically: appointments are confirmed and reminders arrive over WhatsApp.

What I built

01

24/7 online booking

A public booking page for each business: clients pick a service, staff member, and time slot and book themselves, day or night, no phone call needed.

02

Team calendar

Week time-grid and month views of every staff member's appointments, with statuses color-coded and completed or canceled slots greyed out.

03

Built-in client records

A lightweight CRM: every client's history in one place, deduplicated by normalized phone number so the same person never fragments into two records.

04

Staff management

Add staff members, set their working hours and services, and give each their own bookable calendar and availability.

05

Service catalog

Define services with a duration and price; availability and slot lengths are generated from them automatically.

06

Dashboard & analytics

A home dashboard with the day's appointments and the metrics that matter, computed correctly against the local Belgrade calendar day.

07

Automated WhatsApp reminders

A scheduled job sends WhatsApp reminders a configurable number of hours before each appointment, each with a one-tap self-cancel link.

08

Ten-minute onboarding

A first-run wizard takes a non-technical owner from signup to a live, bookable page in about ten minutes. No manual, no training call.

How it's engineered

Supabase + PostgreSQL

Auth, data, and row-level access on Supabase Postgres, with the schema managed through versioned migrations.

Subscriptions

Paid plans and billing handled through Lemon Squeezy, so the product can charge from day one.

WhatsApp via Twilio

Reminders are queued in the database and dispatched by a cron-triggered endpoint through Twilio, with per-message delivery status tracked.

Transactional email & monitoring

Booking and confirmation emails through Resend; runtime errors and performance watched with Sentry and Vercel analytics.

Timezone-correct by design

Every time is stored in UTC and converted to Europe/Belgrade for display and slot math, with no naive server-clock bugs across daylight-saving changes.

Availability engine

Bookable slots are generated with a 15-minute buffer around every appointment, guarded at the database level by an exclusion constraint so two bookings can never overlap.

By the numbers

~11.000
Lines of code
17
App screens
8
API endpoints
6
DB migrations
5
Integrations

Inside the product

Skedio dashboard with the day's appointments and metrics
Skedio week calendar showing staff appointments
Skedio client records list
Skedio staff management screen

Status & what's next

Skedio is in active development and pre-launch: the app is built and running at app.skedio.rs, and the marketing site has been rebuilt on Next.js. Everything now points at a single goal: free-trial signups from owners who want to stop losing time to the paper diary. The near-term roadmap is growing the user base, featured businesses, and polishing reliability and user experience.

[ Back to work → ]
Leskovac, RS00% ↕--:-- · EN