Custom Booking, Stripe, and Coupon Codes — Building a Beauty Platform from Scratch

Custom Booking, Stripe, and Coupon Codes — Building a Beauty Platform from Scratch

Not every project we take on involves enterprise dashboards, complex data pipelines, or AI-powered decision engines. Sometimes a client walks in with a clear vision: "I'm launching a beauty brand. I need a website that books clients, takes payments, and looks stunning." And honestly? Those projects are some of the most fun we get to do.

This is the story of how we built blushedbykoko.com.au — a full booking and payment platform for a PMU (permanent makeup) artist in Sydney. It's a lip blush business, and the site needed to feel as polished as the results. But underneath the cinematic hero section and smooth animations, there's a serious piece of engineering running the show.

Why Not Just Use Fresha or Calendly?

It's a fair question. There are dozens of off-the-shelf booking tools out there, and for a lot of businesses, they work fine. But "fine" wasn't what this project needed.

The global appointment scheduling software market hit USD 546.1 million in 2025 and is projected to nearly quadruple to USD 1.9 billion by 2034, according to Fortune Business Insights. That kind of growth tells you something — businesses are hungry for better scheduling tools. But most of the growth is coming from businesses that want more control, not less.

Off-the-shelf tools come with trade-offs that stack up fast. The booking page looks like every other booking page. The branding options are limited. You're paying monthly fees that climb as you grow. And the moment you want something slightly outside the template — say, a live coupon banner that scrolls across your homepage — you're stuck. According to a 2026 report by Modgility, companies that initially choose off-the-shelf solutions often end up spending two to three times more on customisations and workarounds than custom development would have cost from the start.

For Blushed by Koko, we wanted the booking system to feel native to the brand. Not a widget bolted onto a pretty website. The booking experience is the website.

The Build — More Than a Pretty Face

We built the platform on Next.js 14 with the App Router, React 19, TypeScript, Tailwind CSS, and Prisma with PostgreSQL. The stack is modern, fast, and gives us full control over every pixel and every API call.

The booking flow is a five-step progressive form that guides customers through the entire process:

  1. Pick a service — Full Lip Blush, Perfecting Touch-Up, Annual Colour Refresh, or Lip Blush Correction, each with different durations and pricing.
  2. Choose a date and time — An interactive calendar that pulls real availability, respects blocked dates and time ranges, and calculates slots based on service duration.
  3. Enter your details — Name, email, phone, optional notes.
  4. Apply a coupon — Real-time validation with instant price preview.
  5. Confirm and pay — Review everything, then proceed to Stripe checkout for the deposit.

Each step slides in with smooth Framer Motion transitions. The availability data is cached client-side with a 60-second TTL and deduplicates in-flight requests so the calendar feels instant even on slower connections. Every date calculation runs through Sydney timezone logic because UTC midnight in PostgreSQL and 2pm in Sydney are very different things when you're booking appointments.

The Coupon Banner That Sells Itself

This was one of those features that sounds simple until you think about it. The client wanted active discount codes displayed right on the landing page — not buried in an Instagram post or a flyer, but front and centre where every visitor sees them.

We built a CouponBanner component that renders as an infinite-scroll marquee. It pulls from the database at build time, showing only coupons the admin has flagged with showOnBanner. The banner appears three times across the page in different visual variants — default, subtle, and editorial — so the promotion stays visible without feeling aggressive.

The coupon system itself supports both percentage and fixed-dollar discounts, optional expiry dates, usage limits with atomic increment tracking, and service-specific targeting. When a customer enters a code during booking, it validates in real time — checking that the coupon is active, not expired, hasn't hit its usage cap, and applies to the selected service. The discount preview updates instantly.

Here's the part that surprised even us: if a coupon covers the entire cost of a service, the system skips Stripe entirely. The booking auto-confirms as paid. No checkout redirect, no payment friction. The customer just... books. It's a small detail, but it's the kind of thing that makes a 100% discount actually feel like a gift rather than a clunky workaround.

Stripe Without the Headache

Stripe processed $1.9 trillion in transaction volume in 2025, powering over five million businesses globally, according to Small Business Trends. There's a reason it's the go-to — the API is clean, the documentation is excellent, and the checkout experience is trusted. But integrating it properly still takes care.

The payment model here uses a deposit system. When a customer books, they pay a deposit via Stripe Checkout. The admin can later charge the balance through the dashboard — which creates a new Stripe session for the remaining amount. Refunds flow back through webhooks with proper status tracking.

We built the webhook handler to be idempotent. Double-delivered events don't cause double charges. If a checkout session is still open, the system reuses the existing URL instead of spinning up a new one. And the handler returns 200 even on internal errors so Stripe doesn't hammer the endpoint with retries.

Payment methods are flexible too. The admin can manually record cash, bank transfer, or PayID payments for clients who prefer to settle in person. Every payment gets logged with its method, amount, and type — deposit, balance, or refund.

The Admin Dashboard — Full Control, No Developer Required

The whole point of building custom is that the business owner runs it independently after handoff. The admin panel covers everything:

  • Booking management — Filter by date range, status, payment status, or search by name. Edit details, reschedule, cancel, add notes.
  • Availability control — Set regular hours by day of week, block entire days, or block specific time ranges for holidays or personal commitments.
  • Coupon engine — Create, edit, activate, deactivate, or delete coupons. Set percentage or fixed discounts, expiry dates, usage limits, and choose which ones appear on the landing page banner.
  • Payment tracking — See deposit status, charge balances, process refunds, record manual payments.
  • Dashboard stats — Today's bookings, pending confirmations, weekly revenue, quick-view of the day's schedule.

Automated email notifications handle the rest — booking confirmations, cancellations, reschedule alerts, and timed reminders at 24 hours and 2 hours before each appointment. The client doesn't have to chase anyone. The system does it.

By the Numbers

Building this as a custom platform rather than stitching together off-the-shelf tools saved real money and real headaches:

  • ~200 development hours avoided compared to trying to customise a generic booking tool, integrate a separate payment system, and build admin functionality on top
  • 1.5 FTEs replaced — the platform handles what would otherwise require a part-time receptionist coordinating bookings manually ($55K AUD) and a web admin maintaining a separate site and booking tool ($50K AUD)
  • $105,000 in estimated annual savings from operational efficiency
  • Automation type: Full-stack — booking, payments, coupons, emails, and admin all in one system

The platform doesn't just save money. It gives the business owner something more valuable: time back and full control over how her brand presents itself.

Fun Projects Deserve Serious Engineering

There's a tendency in our industry to treat "small" projects as simple ones. A beauty booking site? How hard could it be? But the reality is that timezone-aware availability calculations, idempotent webhook handling, atomic coupon usage tracking, and a five-step booking flow with real-time validation are genuine engineering challenges. They just happen to live behind a gorgeous hero section with parallax scrolling and floating particles.

We had a blast building Blushed by Koko. It reminded us that the best projects aren't always the biggest ones — they're the ones where great design meets solid engineering, and the end user never has to think about any of it. They just book an appointment, and it works.

Sometimes that's the whole point.

    Float Infinity Logo

    Powered by Float Infinity

    Privacy PolicyTerms of Service© 2025 Float Infinity