Skip to main content
← CoreMade

Case Studies

How Lucky Dog Spa runs its entire operation on custom software

An end-to-end system covering customer bookings, pet records, scheduling, kennel operations, staff workflows, communications, administration, payments, and applied AI.

Lucky Dog Spa public website homepage

Lucky Dog Spa is a boutique grooming, boarding, and day care shop in McAllen, Texas. Iza Treviño has spent more than twenty years as a master groomer. The work is personal, appointment-only, and built around dogs of every size and temperament. The software had to match that, not the other way around.

This is CoreMade's first client, and the first full system we shipped: a public site, a customer account, a staff portal on its own subdomain, a payment register, SMS, and an AI layer that sits on top of the same records.

The problem was not the website

Like a lot of service businesses, the spa's day used to live in pieces. A booking tool here. A spreadsheet there. Texts and Facebook messages for the real conversations. Money coming in by card, POS, cash, and Zelle. None of it lined up.

The front desk reconstructed context. Kennel capacity lived in someone's head. A client's last visit, their dog's coat notes, and whether a boarding spot was actually open were three different questions.

A prettier marketing site would not have fixed that. They needed one system that could run the business.

Build around the operation, not a template

We started with how the spa actually works. Grooming is a drop-off window, not an open calendar. Tuesday through Friday, 9 to noon. Saturday, 8 to 11. Boarding and day care are appointment-only, with kennel limits and an earlier pickup for XLG dogs. Clients book in English or Spanish. Staff need the day's schedule, kennel load, and request queue in one place.

A generic booking widget would have papered over all of that. So we designed a complete operational platform.

Stack, chosen after the workflow was clear: Next.js 16, React 19, TypeScript, Tailwind v4, Supabase for auth and data, Resend for magic-link email, Twilio for SMS, Stripe when they flip it on, and Vercel AI SDK for the assistant. Production lives on Vercel at luckydog-spa.com. Staff lives at admin.luckydog-spa.com.

What customers see

Online booking chooser for grooming, boarding, and day care
Customers pick a service, then sign in with a phone number. Every web booking lands as a staff-reviewed request.

The public site is the front door. It has to sell the spa and then put people into the system, not bounce them into a third-party calendar. Accounts keep pet profiles, appointment history, and conversations together, so the front desk is not reconstructing a dog from texts and sticky notes.

Services catalog with breed-size filters
One catalog, not a maze of detail pages. Sixty-eight services, filtered by type and breed size.

Bilingual UI was not a translation layer bolted on at the end. McAllen clients switch between English and Spanish the way they actually talk. A welcome modal, an EN | ES toggle, and a full Spanish message catalog are part of the product.

Every customer web booking lands as requested. The confirmation screen does not pretend the slot is locked. Staff still have to assign a kennel and confirm the window. If a confirmed appointment is rescheduled by the customer, it returns to staff review so capacity can be rechecked.

Public AI assistant with Ask AI and Contact Staff tabs
The public assistant answers from real spa policies and hands off into a staff conversation when a person should take over.

What staff run

The staff portal is the system. It is a separate host, phone-code or magic-link login, and it is organized the way the day actually runs.

Staff portal Today's Overview with redacted messages
Today's cards: requests, grooming, day care, boarding, completed, settled dollars. A message pane for SMS and tickets.
Staff week calendar with status chips and redacted names
Confirmed, Requested, Cancelled, and Prebook live on the same week view. Click through to assign kennels.
Appointment request queue with Assign actions and redacted client names
The queue. Customer submissions wait here until someone assigns a kennel and confirms duration.

The operational lifecycle is requested → confirmed → completed → pickup → settled. Cancelled is an exit. payment_status is a separate question. Appointment status answers where the dog is in the day. Payment status answers whether money has been collected. Pickup can come from the customer account or a QR scan. Settled means the pet was handed off and the balance was closed.

Kennels and money

Grooming kennel grid by station and hour
Station × time grid. Staff assign, move, resize, extend a stay, add a service or incidental, and optionally text the customer when the change matters.
Cashier register with redacted names and amounts
Payment closeout is a staff action, not a customer checkout. Combined same-day bills sit next to Create Invoice.
Transaction ledger with redacted clients and amounts
The ledger filters by channel: web, POS, cash, register. Stripe is wired. Refunds are staff-only.

We did not ask the spa to change how people pay. The register tracks card, POS, cash, and Zelle, and it is built to take Stripe when they are ready. Customer web bookings are not charged at request. Staff collect at the visit. A customer who cancels a paid visit creates a refund request. Staff review it. Nobody auto-refunds from the public site.

Twilio sends request-received, confirmation (with an account link), ready-for-pickup, and optional schedule-change texts. Quiet hours are real: mass SMS send slots open at 10:00 AM Central.

AI that earns its place

Eva staff assistant with redacted thread titles
Eva is the staff-side layer. It can see bookings, messages, and policies because they already live in one system.

Lucky Dog did not need a chatbot for the homepage. They needed fewer interruptions for questions they already answer every day. That is the bar we use for applied AI. If a model cannot see the records and cannot close the loop, it is decoration.

What we learned building the first one

A local service business will not change its money habits for software. Support the methods they already use, then add the processor later.

Capacity is a first-class object. For a kennel, booked is not the same as a form was submitted. Staff confirmation is part of the product.

Accounts beat guest checkout when the relationship is the dog. Pet notes, coat condition, medications, and last visit are the work, not extras.

Status and money are different axes. Mixing them is how completed starts meaning three things.

The first client teaches you the studio. Lucky Dog forced the shape we now use everywhere: understand the operation, design the system, then choose the stack. Not the reverse.

Project results

  • Public website for grooming, boarding, and day care, in English and Spanish
  • Phone-number accounts for pets, appointments, and messaging
  • Online booking that always lands as a staff-reviewed request
  • Staff portal on admin.luckydog-spa.com: overview, calendar, requests, kennels, register
  • Kennel scheduler with assign, move, resize, extend, and incidentals
  • Multi-method payment tracking, Stripe-ready, staff-only refunds
  • Twilio SMS for request, confirm, pickup, and schedule changes
  • AI assistant with Ask AI / Contact Staff handoff, plus Eva on the staff side

The result is not a marketing site with a form. It is the system the business runs on.

What are you trying to solve?

Tell us about the problem, the current system, or the software you need.

Start a project

← All articles