Booking a service still runs on message threads. Someone asks for a time, the provider checks a calendar, both sides go back and forth, and payment happens somewhere else. Every manual handoff creates room for double bookings, forgotten meetings, and unpaid sessions.
— Case study 01
Markado
Service scheduling with a real calendar and payments

project overview
A booking website where a professional shares one link, clients pick a free time slot, and the meeting plus the payment are handled automatically.
shipped outcome
A conversation becomes a confirmed, paid, calendar-synced appointment in about thirty seconds, with no manual step for the provider.
- Role
- Full-stack product engineering
- Timeline
- Ongoing
- Year
- 2025
- Team
- Focused product team
The product uses one scheduling surface as the source of truth for availability, the calendar event, and the payment. A provider defines working rules once. Every free slot, Google Calendar entry, Meet link, and Stripe checkout derives from those rules instead of being coordinated by hand.
A conversation becomes a confirmed, paid, calendar-synced appointment in about thirty seconds, with no manual step for the provider.
— Interface evidence
The product, not a placeholder
These are the verified interface captures from the project build. Scroll inside taller frames to inspect each complete page.




— Delivery process
From operating constraint to shipped system
The work is sequenced around risk. Domain rules and failure states come before interface polish; automation arrives before handoff.
Map every booking state
Requested, confirmed, paid, rescheduled, cancelled, and no-show states were defined before the database schema so the product could recover cleanly from every transition.
Model availability first
Availability became a pure server-side function of working rules, calendar events, buffers, notice periods, and timezone instead of UI state.
Layer integrations safely
Google OAuth, Calendar read/write, Meet conferencing, and Stripe were added behind separate boundaries so one provider failure cannot corrupt the full booking flow.
Automate delivery
Type checking, linting, tests, container builds, and deployment run through the delivery pipeline so shipping is repeatable rather than ceremonial.
— System architecture
Clear boundaries, explicit responsibilities
Each layer has one job and a narrow contract. That keeps external services replaceable and product behavior testable.
availability
30 min
Next.js App Router
Server-rendered booking pages with an interactive slot selection surface.
tRPC
One end-to-end typed contract between product UI and backend procedures.
PostgreSQL + Prisma
Versioned relational models for users, working rules, event types, and bookings.
Google Calendar / Meet · Stripe
Calendar truth, automatic conferencing, checkout, and webhook confirmation.
— What shipped
Product capabilities
Live availability engine
Slots are computed against real calendar data, timezones, buffers, and notice periods rather than exposed as a static list.
Automatic meeting setup
A confirmed booking creates the calendar event and conferencing details for both sides.
Payment inside the flow
Checkout happens before confirmation, so a reserved slot and a paid slot cannot drift apart.
— Engineering pressure
Challenges resolved
Timezone correctness
Every moment is stored in UTC and converted only at the display edge with the intended timezone captured explicitly.
Simultaneous booking attempts
Availability is revalidated during the final transaction so two clients cannot silently claim the same slot.
External API failure
Calendar and payment failures remain isolated and visible instead of leaving a booking in an unknown state.
verified project destinations
next transmission
Need a system this deliberate?
Bring the operating problem. We will shape it into a clear product brief and a buildable next step.
Start a project