Week 2 of Beauty Bar was where the real problems started — and where AI pair programming earned its keep...
The Plan
This week had three objectives: authentication, payment integration, and getting the app in front of a real salon owner for the first time. Two out of three went smoothly. The third one humbled me.
Authentication with Supabase
Auth was the straightforward win. Supabase's auth system is well-documented and Claude Code has seen enough implementations to generate correct patterns on the first pass.
What Worked
I described the auth requirements — email/password for salon owners, magic link for clients, role-based access — and Claude Code scaffolded the entire flow. Protected routes, middleware, session management. Roughly 90 minutes of work for what would have taken a full day manually.
The Nuance
The generated code was functional but generic. It did not account for the salon-specific flow where a client might book as a guest first and create an account later. I had to redesign the session handling to support anonymous-to-authenticated transitions. This is the kind of domain-specific logic that AI cannot infer — you have to specify it.
Payment Integration
Stripe integration was the most tedious part of the week. Not because it is hard, but because payment flows have zero tolerance for bugs. A broken booking form is annoying. A broken payment form is a lawsuit.
The Approach
I broke the payment flow into discrete, testable pieces:
- Product and price creation in Stripe dashboard
- Checkout session generation on the server
- Webhook handling for payment confirmation
- Booking confirmation after successful payment
Claude Code handled each piece well in isolation. The integration between pieces is where I spent most of my time — making sure the booking state machine transitioned correctly through each payment state.
Lesson Learned
When building payment flows with AI, write the state machine first. Define every possible state and transition before writing any code. The AI can implement each transition perfectly, but it needs the complete map to avoid missing edge cases.
The User Test
Friday afternoon, I showed the app to the salon owner it is being built for. This was the humbling part.
The booking flow that made perfect sense to me as a developer made no sense to her as a user. She wanted to see stylist availability before choosing a service. The app showed services first. She wanted to browse by stylist. The app organized by service category.
None of this was an AI failure or a code failure. It was a prioritization failure. I built what was logical instead of what was intuitive for the target user.
Week 2 Takeaways
- Auth is a solved problem — Let AI handle it and spend your time on domain logic
- Payment flows need state machines first — Define the map, then let AI build the roads
- User test early — No amount of AI acceleration matters if you are building the wrong thing
What is Next
Week 3: Rebuilding the booking flow based on real user feedback. The stylist-first navigation pattern changes the entire data model. Time to restructure.
Explore Frameworks
More from Building in Public
Why I Build in Public
The case for radical transparency in the AI age. Why sharing failures accelerates learning faster than hoarding wins.
Building Beauty Bar: Week 1 of Vibe Coding a Full App
I'm building an AI-powered booking app for salons. Here's what happened in week 1 — the good, the broken, and the agents that saved it.
The Vibe Coding Guide
How to build production apps by vibing with AI. The tools, the process, and the mindset shift required.
The AI Alchemist
Practical AI strategies, behind-the-scenes builds, and emerging tools — delivered weekly to practitioners.