I'm not a developer. I described what I wanted in plain English, argued with it a few times, and tested it like a client would. Here's what it does — and the exact prompt, so you can have one too.
The moment it finally bothered me enough: I was sending a booking link to a couple who had just told me, unprompted, how much they loved my website. They clicked the link and landed on someone else's domain, looking at someone else's logo above a form that was technically mine. Thirty seconds earlier they were in my world. Now they were in a software company's, being gently reminded that this scheduler was powered by somebody.
I was paying $12 a month for that. Not a fortune — $144 a year — and the tool worked fine. But I was paying, every month, to hand my clients to another brand at exactly the moment they'd decided they liked mine. That's the part that got me: not the money, the handoff.
A page at /book on my own site. It looks like the rest of my site because it is the rest of my site. Here's exactly what happens when a couple uses it:
The times shown are only times I'm genuinely free — it reads my real Google Calendar, so a wedding, an edit block, or a dentist appointment all remove slots automatically. It also keeps a buffer around whatever's already there, so I'm never booked into the ten minutes after something else ends.
A couple in California sees California time. Nobody does mental arithmetic before talking to me, and nobody shows up an hour off.
Name, email, phone, and what they want to discuss — plus a choice between a video call and a plain phone call, because not everyone wants to be on camera the first time.
The event appears with their details in it and a video-call link generated automatically. No copying, no confirming, no me typing anything.
Not from a scheduling company — from me, at my domain, in my fonts and colors. It has the time, the call link, and a private link they can use to reschedule or cancel themselves, any time, without emailing me to ask.
Which sounds obvious, and turned out to be the single most interesting thing I learned building this.
Google Calendar reminders don't remind your client. This is the one I'd bet most photographers get wrong without ever finding out. When you create a calendar event and set a reminder on it, that reminder fires for you — the organizer. Your guest gets the invitation, and then silence. Their own calendar's default settings decide whether they're ever nudged, and plenty of people have those turned off entirely. I assumed a reminder was a reminder. The AI flagged it while we were wiring up the confirmation email, which is why item 5 in the prompt below exists: if you want your client reminded, you have to send that email yourself.
Testing like a client finds what reading the code never will. We didn't just check that it worked — we ran real bookings, to my real email, and then opened them on a phone. That's how we caught things that looked perfect in the code: a confirmation whose subject line rendered as garbage characters in some mail apps, a booking page that let you pick a time it shouldn't have offered, an email that turned unreadable when the client's phone was in dark mode. None of that is a logic error. All of it is the client's actual experience.
The hard parts were easy and the easy parts were hard. I assumed reading a live calendar and generating video-call links would be the wall. It took one afternoon. What actually ate time was permissions — getting the right access from Google, in the right order, and a stretch where I pasted an example line from the instructions literally instead of my own value and quietly broke the whole thing for twenty minutes. If you build this, budget your patience for the boring plumbing, not the impressive part.
Here's the thing to paste into an AI coding assistant — Claude Code or whatever you're using — with your website's folder open. Replace everything in [brackets] with your own details. And expect a conversation, not a vending machine: I went back and forth several times, said "that's not quite right" more than once, and asked it to explain the Google permissions to me twice because I didn't understand the first answer.
Build me a self-hosted booking page for my photography studio website. My stack: [static site host, e.g. Netlify] with serverless functions. My calendar is Google Calendar. Requirements: 1. A /book page on my site where clients pick a day, then a time, then enter name, email, phone, and what they want to talk about. 2. Only show times I'm actually free: read availability from my Google Calendar (walk me through creating the OAuth credentials — I've never done it). My working hours are [DAYS + HOURS, e.g. Mon–Fri 11am–6pm], calls are [LENGTH] minutes, keep a [BUFFER]-minute buffer around existing events, and don't allow bookings less than [NOTICE] hours from now. 3. Booking creates the event on my calendar with a Google Meet link and the client as a guest. 4. Send the client a confirmation email FROM MY OWN email address, styled to match my brand (my colors and fonts: [BRAND NOTES]), including a private link they can use to reschedule or cancel themselves. 5. Important: Google Calendar reminders only fire for the organizer, not guests — so build a scheduled job that emails MY CLIENT a reminder one hour before the call. 6. Times must display in the client's own timezone. 7. If anything fails, show a graceful message with my email address instead of an error. Test it end to end with a real booking to my own email before we call it done, and show me proof.
Two notes on using it. Give it your real working hours rather than "normal business hours" — vague inputs produce vague software. And take the last line seriously: test it end to end with a real booking. An assistant will tell you it's done. A test booking tells you the truth.
The email ping-pong is gone. I used to spend three messages establishing that Tuesday didn't work — now the couple picks from what's actually open and it's finished in one click. The confirmation arrives from my domain, so replies come to my inbox and the whole exchange stays inside my brand. Reschedules happen without me: the private link means a couple can move the call at 11pm without composing an apologetic email, which they appreciate more than I expected.
And the monthly fee is gone — but honestly that's the least interesting part. The real change is that a couple now goes from my portfolio to my booking page to my confirmation email to my reminder without once landing on a page that belongs to someone else. For a business where the entire product is how it feels to work with you, that continuity is worth more than $144.
Effectively nothing at a photographer's volume. The page is a file on the website you already pay for, and the booking logic runs as a serverless function — most static hosts include a free tier that covers far more bookings than a studio will ever take. Google Calendar and Google Meet come with the email account you already have. The only real cost is the hour or two spent building it, against roughly $144 a year for a subscription.
Build it so failure is boring — that's what item 7 in the prompt is for. If the calendar can't be reached, the page shows a short message with your email address instead of an error screen, and the client emails you like they would have anyway. Nothing is lost, because the bookings live in Google Calendar rather than in the page: if the page is down for an hour, every existing booking is untouched and you're still reachable.
Yes, and they should be able to. A booking page is a shortcut for people who want one, not a gate in front of you. Keep your email address visible on the page and treat the booker as the default rather than the requirement — plenty of couples prefer to write a note first, and turning that away to protect a system is backwards.
— Alex Knight · About me · See the booking page