The clients, and what they were up against
This project covers a handful of small lodging businesses: a few B&Bs around the Hengchun peninsula in southern Taiwan, plus one property I treat as my own testbed. Some came on as full clients — website, analytics, ads, the lot — and at least one signed on only for ads health checks. Different scopes, same underlying problem.
The problem is the one every independent B&B owner knows in their gut: the booking platforms own the relationship with the guest. OTAs dominate for three compounding reasons — advertising budgets that buy the top of every search and feed, years of accumulated brand trust, and full-time professional marketing teams. Against that, a small property with a pretty website and nothing else is simply invisible. And the commission OTAs take on every booking is higher than most people realize, which is precisely why a direct-booking channel matters so much.
But “build them a website” is not the answer on its own. A standalone site with no search ranking, no analytics anyone can read, and no ad spend backed by data doesn’t compete with an OTA — it just sits there. What these owners were missing wasn’t a brochure. It was a complete digital operation: a site that ranks, reporting they can actually act on without hiring a specialist, and ad budget steered by real numbers.
What I built
Three connected pieces.
The websites. Built in Astro, each property gets a fast, bilingual (Chinese/English) site with room information, pricing, activity guides, itinerary suggestions, and clear contact paths — LINE, phone, WeChat. I added a small admin layer so owners can edit promo banners and cards themselves, upload images, and manage who has access, all without touching code or calling me. The own-property site doubles as the place I prototype things — clickable service cards, summer early-bird promos, attraction and itinerary guide pages — before they graduate to client sites. A lot of the unglamorous work here was performance: getting Lighthouse mobile scores up, killing layout shift, serving responsive image formats so a hero photo doesn’t cost a visitor 65MB. Fast pages rank better and convert better; that’s not cosmetic.
Analytics and conversion tracking. Every site is wired to GA4, with Google Search Console verification and Google Ads conversion tracking layered on top. The fiddly but essential detail: making sure a conversion actually fires before a contact click hands the visitor off to the phone or WeChat app, so the data isn’t lost. Without that, ad spend is flying blind.
The automation engine. This is where most of the work went. A multi-site system that pulls GA4 data, reads per-property context files (peak seasons, local geography, what counts as a real conversion for that property), and produces two things: an automated weekly operations report written in plain language an owner can read over coffee, and a Google Ads health check that audits the account and tells the owner what to fix and why.
What changed for the owners
The weekly report lands on schedule and opens with a plain-language summary before any charts — no dashboards to log into, no GA4 jargon to decode. The ads health check is the bigger shift. It does the keyword cleanup a paid specialist would do — flagging zombie keywords with zero impressions, redundant phrase-match overlaps, weak-signal and low-CTR terms — and it explains its reasoning in everyday language, because the reader is a B&B owner, not a PPC consultant. It checks landing-page speed for real instead of guessing, compares lost-budget against lost-rank before ever suggesting more spend, and refuses to recommend things that can’t actually be done. Crucially, it’s built not to cry wolf: a huge amount of the engineering went into stopping the system from raising false alarms that would send an owner chasing a non-problem.
The result is that a small property now runs a direct-booking channel with the same feedback loop a much larger operator would have — see what’s working, fix what isn’t, every week.
Technical direction, briefly
Astro for the sites because it ships fast static pages by default and the SSR adapter covers the admin app when I need it — the right cost-and-speed tradeoff for a one-person shop. GitHub Actions runs the whole automation engine on a schedule, which means no servers to babysit. The reports and audits use LLMs (Gemini for the standard tier, Claude for a premium tier), but the hard lesson — and most of the commit history — is that you cannot let a language model freely write numbers into a client report. The numbers are computed deterministically in code and the model only fills in the prose around them, with a verification pass that rejects any figure it can’t trace. That discipline is what makes the output trustworthy enough to send to a real client unattended.
What it means that one person did this
The honest reflection is that this work probably wouldn’t have happened at all — not for these clients. Not because no one wanted to do it, but because the price of doing it the old way was out of reach. A website build, ongoing analytics, ad optimization, and a report every single week — each of those used to mean separate headcount, and together they cost far more than a small B&B could justify. So small properties simply went without, and stayed dependent on the platforms taking a cut of every booking.
AI didn’t replace a team here. It made a service that was never economically viable for this kind of client viable for the first time. One person, with the right tooling, can now stand up and maintain the kind of digital operation that used to belong only to businesses large enough to afford a marketing department. That’s the part worth sitting with — not the cleverness of any single script, but the fact that the floor for who gets to compete just dropped.