Brianna — everyone calls her Brie — runs B&H Dog Training Co. in Houston. The “H” is Hershey, her dog. The brand is hand-drawn: five illustrations of a trainer and her dog, one for each service she offers — puppy, obedience, behavior, reactivity, advanced. The business card is cream and brown with a teal accent. Her Google Business Profile has 23 reviews, every single one of them five stars.
She was paying $300 a month for a website that was doing none of that work for her. No SEO. No live reviews. No real pages for her five services. No visible deliverable at the end of any month. Just a line item.
The brand that worked everywhere else — in her hands, on paper, at the first session with a new client — stopped at her website. That’s the gap I was hired to close. For less than she’d been paying for nothing.
What a service business actually needs on the web
For a service business like Brie’s, the website isn’t where people decide to hire her. It’s where people confirm she’s real, read a few reviews, and either text her or hit the booking link. That’s it. The job of the site is to make that path short and make the business feel like the one they already liked on Instagram.
Every decision on this build served one of two goals: look like her, and let someone go from “this looks real” to “I’m booked” without a phone call if they don’t want one.
What shipped
A ground-up Next.js 14 rebuild
The whole site is Next.js 14 on the App Router, hosted on Vercel. Not a page builder, not a theme — actual code. Playfair Display for the display type, Inter for everything else. Edge-cached, mobile-first, fast on 4G in a client’s driveway.
A palette pulled straight from her business card
Cream background, warm brown copy, soft tan accents, a teal pop for calls to action. Those are the exact colors on the card she hands people in person. The site opens and it feels like her. That’s not a template choice — that’s a design system built around a brand she’d already proven worked offline.
Five service pages, five original illustrations
Puppy, obedience, behavior, reactivity, advanced. Each service got its own page, with Brie’s own illustration at the top, her own description, and a direct booking link. No stock dog photos, no generic icons, no “we’re passionate about dogs” filler. The art she had already drawn did the work it was drawn to do.
Live Google reviews, pulled from the Places API
23 five-star reviews is a huge trust signal and I wasn’t going to let that live in a widget Google’s own crawler couldn’t read. The /reviews page pulls directly from the Google Places API using her Place ID — new review posted on Google, next page load shows it on the site. Zero copy-paste, zero stale testimonials.
Side note for anyone building this — her listing is a Service Area Business, which don’t show up in Places API text search. I had to pull the Place ID straight out of the Google Maps embed iframe HTML. Documenting that here because the next person who builds this for an SAB will spend an hour on it otherwise.
A contact form that actually delivers
The /contact form hits a Next.js API route, sends through Resend to Brie’s inbox, BCCs me so I can see delivery issues before she does, and sets reply_to to the sender so she can hit reply and talk to the lead directly. No Formspree, no Mailchimp redirect, no 10-second delay — the lead is in her phone within seconds of hitting send.
A booking link that goes straight to HoneyBook
Every “Book a session” button on the site deep-links into her existing HoneyBook portal. She already had a booking system that worked. My job wasn’t to replace it — it was to make sure every path through the site ended there.
An AI chatbot for the inevitable 10pm question
Same chatbot I ship on every client site — embedded via a one-line script, trained on her service pages, qualifies the lead, and drops a notification into my CRM so Brie sees it the next morning instead of losing the person who was ready to book at 10pm but didn’t want to leave a voicemail.
A proper blog, with three posts to start
The /blog route runs on a dynamic [slug] so she can add posts without touching code. First three posts cover puppy fundamentals, reactivity, and what to look for in a trainer — the questions she already answers on every intake call. SEO content, in her voice, one time, forever.
The one engineering gotcha worth flagging
The canonical for her site is www.bhdogtrainingco.com. The apex 308-redirects to www. That’s the right setup — but it meant the contact form’s preflight CORS check was blowing up when the form posted to bhdogtrainingco.com/api/contact and got a 308 before the OPTIONS even landed. Fix: hard-code the form’s submit URL to the www origin so the request lands on the canonical host directly. CORS headers and an OPTIONS handler on the API route for anyone who hits it cross-origin. Documenting it here so future-me doesn’t waste an hour.
What Shipped
- ✓ Next.js 14 App Router build on Vercel
- ✓ 5 bespoke service pages, each with her original illustration
- ✓ Live Google reviews via Places API (SAB listing)
- ✓ Resend-backed contact form with proper reply-to
- ✓ HoneyBook booking links on every CTA
- ✓ AI chatbot with lead capture into my CRM
- ✓ Dynamic blog route, 3 launch posts in her voice
What this means if you’re a service business
If your reputation is already strong in person, on the phone, on Instagram — and your website is the weakest link in that chain — the site isn’t the problem. The gap between your brand and your site is the problem.
A ground-up build in Next.js is the thing that closes it. Your colors, your fonts, your drawings, your reviews, your booking flow — every piece under your own code, performant on a phone, nothing in a widget Google can’t read.
Brie’s site now looks like Brie, pulls her reviews live, and lets a stranger go from Google search to booked session without a phone call if that’s what they want. For less than $300 a month. That’s what the build was for.