[CODE]

A Year of Ad Spend That Taught the System Nothing

Two B&Bs in Hengchun ran Google Ads for years with zero recorded conversions — because the landing page lived on someone else's website. Here's what changed when the ads finally got real signal: tripled weekly inquiries, YoY revenue past double.

7 min read AI-generated
case-study google-ads ga4 bnb attribution

For all of 2025, two B&Bs in Hengchun ran paid Google Ads, and the conversion counter on both accounts read zero. Not low. Zero. Twelve months, two ad accounts, a monthly budget on each, and the system never once recorded a single booking inquiry it could attribute to a click.

The operator wasn’t doing anything wrong. The bookings were coming in — through a long habit of posting and replying in Facebook lodging groups, plus word of mouth and repeat guests. The ads, though, were running blind. And the reason is the part that matters: the ad clicks landed on a one-page listing hosted on a third-party travel portal. Someone else’s domain. No way to install your own tracking. So Google’s automated bidding had no idea which of those clicks ever turned into a phone call or a LINE message. It was optimizing against nothing, year after year.

This piece covers the same client as [Launching a B&B Site That Owns Its Own Bookings] and [The click was never the booking], but from the angle that matters most to a business reader: the full arc from invisible ad spend to measurable revenue, and why the order of operations was everything.

The real problem wasn’t the ad settings

It’s tempting to look at zero conversions and assume the campaigns were misconfigured — wrong keywords, bad bids, weak copy. They weren’t, in the sense that fixing any of those would have changed nothing. The landing page lived on a domain the operator didn’t control. You can’t install a tag on a page you don’t own. With no tag, there’s no conversion event. With no conversion event, the bidding algorithm has no learning data and is, quite literally, guessing who might book.

Ads that aren’t learning are more wasteful than ads learning the wrong thing. An account learning the wrong thing at least has signal to correct. An account with no signal burns budget into a void. That’s the diagnosis that set the order of everything that followed.

Step one: own the landing page

At the end of March 2026 the client’s own site went live, and the ad landing pages moved off the third-party portal and onto a domain the operator controls. GA4 went on at the same time. This wasn’t a redesign for aesthetics — it was the precondition for any measurement at all. You cannot optimize what you cannot observe, and you cannot observe traffic on a page you don’t own.

Step two: the tracking bug that hid all the signal

Installing the tag isn’t the same as the tag working. The first deploy had a bug: phone-tap and LINE-button taps fired, but the GA4 events never actually sent. The buttons were being clicked. The system saw nothing.

On April 3rd that bug was fixed. From that moment, every on-site CTA interaction — the phone tap, the LINE tap — started being recorded. To be clear about what these are: these are on-site contact-button clicks captured by GA4 after a visitor reaches the site. Not ad clicks (Google already counts those at the campaign level). For the first time in the history of these two accounts, Google’s automated bidding received the signal it had been missing for a year: this person actually contacted the operator. That’s the moment the system started learning.

Step three: turn on cross-platform reach

In early June a Performance Max campaign went live across both accounts. Cross-network sessions more than quadrupled between May and June. With the tag finally working, this wasn’t just more traffic; it was traffic the system could now read and learn from.

Step four: stop bidding on people who will never book

Over two days in mid-June, both accounts got a large keyword cleanup. Out went the searches that look adjacent but never convert: people looking for attractions, for hotels in general, for tour itineraries. In went over 50 competitor-exclusion terms. Property A also got its own distinctive feature keywords added — the water play pool, the KTV room, the electric mahjong table — the specific things its actual guests search for.

This is where judgment lives. Adding good keywords is easy. Knowing which adjacent-but-wrong searches are quietly draining the budget — and being willing to cut them — is the harder call, and it’s the one that sharpened the system’s picture of who actually books.

The ongoing layer: a weekly report nobody has to open GA4 to read

Every Monday morning a cron job produces an automated weekly operations report — phone, LINE and Facebook inquiry volume, ad traffic quality, and the page conversion funnel — so that any anomaly surfaces while it still matters. The operator never has to open a dashboard. (The reporting system itself is covered in [Building GA4 Reports for People Who Don’t Open GA4].)

What actually changed

The inquiry numbers tell the cleanest version of the story. Combined weekly phone + LINE + Facebook inquiries across both properties:

  • W22 (pre-June baseline): 1×
  • W23 (first week of June): 1.5×
  • W24 (big keyword-change week — learning period — dipped): 1.1×
  • W25 (learning period over): 3.2×
  • W26: 3.4×

After the learning period closed, weekly inquiry volume was more than three times the pre-change level. The dip in W24 is the system retraining on the new keyword picture — exactly what you’d expect, and exactly why you don’t panic when changes look like they hurt for a week.

The YoY monthly revenue, 2025 vs 2026, follows the same shape with a lag:

  • May (first full month on the new site): Property A up 16.8%; Property B at -3%, which is effectively flat — last May had a large multi-night event booking inflating the base.
  • June (PMax live, keywords cleaned): +43.7% and +64%.
  • July (the harvest of June’s inquiry spike — measured as of June 29, with July barely started): +126.8% and +99.7%.
  • Cumulative: at least +60% and +51.9%.

June’s late-month inquiries were mostly people booking July stays. The July numbers are confirmed bookings already on the books before the month even began — one property past double, the other a hair under it.

May’s modest growth is worth a sentence, because honesty about it is part of the point: these two B&Bs were already carrying their base load through multiple channels before the ads were fixed. The ad improvement’s incremental share was less dramatic here than it would be for a property leaning harder on paid traffic. That doesn’t weaken the result — it sharpens what the result is attributable to.

Why this work exists at all

Engineering the site, fixing the attribution, standing up PMax, doing the keyword surgery, and producing a report every week — each of those used to be a separate line of headcount. An engineer, a data analyst, an ads specialist, someone to write the weekly report. For two small B&Bs in Hengchun, that stack was never on the table. The cost of making it happen was simply larger than the business could justify.

So this work didn’t get done by anyone — not because nobody wanted it, but because the economics never closed. What changed isn’t that AI replaced a team. It’s that the whole stack became affordable for a client at this scale for the first time. The interventions here aren’t exotic; the achievement is that they were viable to deliver, end to end, for a two-property business.

Whether the gains hold comes down to friction, not discipline — whether feeding booking confirmations back is easy enough to just happen, whether the weekly report is readable enough to act on. That’s a system design problem, not an operator reliability problem. How much the operator engages is their call; the job on this side is to keep lowering the threshold until there’s no reason not to use it. But the thing that was structurally broken for a year — ads spending into a void with no way to learn — is fixed. The system can finally see, and for the first time in twelve years of operation, the ad budget is learning instead of guessing.