- #javascript
- #business
- #booking
- #lucide
Pawfect Strolls
Booking site for a dog-walking service.
- year
- 2025
- status
- active
$ cat ./case-study
$ cat ./case-study/problem
Problem
A local dog walker was getting all their inbound through DMs and texts — losing leads, missing follow-ups, no clean way to publish pricing without screenshotting it onto Instagram. They needed a site where someone could see the services, prices, and book a walk in under a minute on their phone.
$ cat ./case-study/approach
Approach
Static marketing site with a booking form that hits an email handler. Skipped a full booking platform because the operator runs a small route — a contact-style form + a follow-up email covers 95 percent of the use case at 5 percent of the platform fee. Lucide icons + a tight color palette for the visual identity, every touch target sized for phone use.
$ cat ./case-study/stack
Stack notes
Vanilla JS over a framework because the page needs to be instantly fast on a parking-lot 4G signal — clients book between meetings, not at desks. No bundler tax, no hydration cost, no framework runtime to ship.
$ cat ./case-study/what-broke
What broke
First version had the pricing tiers as three side-by-side cards. Looked great on desktop, completely unreadable on the iPhone SE preview width the owner actually browses from. Restacked them vertically with the "most booked" tier highlighted, which is what mobile users care about anyway.
$ cat ./case-study/next-time
What I'd do differently
I would separate the marketing pages from the booking flow more cleanly. Right now they share a layout, which meant one small style fix on the booking form leaked weird padding into the home hero. Worth the extra route file to keep the seams clean.
Marketing + booking site for a Park City dog-walking business. Pricing tiers, contact form, and an About page with the team. Custom domain at pawfectstrolls.com.

$ next
Task Manager (TS + Auth0)
React + TypeScript task app with Auth0 + URL-driven state.