Skip to content
Pierre Bossetti

Case study

Bains de Saillon: from fragmented ad spend to executive decisions

Case study: Reconciling Google, Meta, and TikTok Ads spend with web analytics through a custom UTM strategy and executive Looker Studio dashboards.

  • [Google Ads]
  • [Meta Ads]
  • [TikTok Ads]
  • [Looker Studio]
  • [UTM Strategy]
Client
Bains de Saillon. Thermal baths and hotel resort complex in Valais, Switzerland.
Objective
Unify multi-channel ad spend (Google, Meta, TikTok) with web journeys to provide a clear, single source of truth for executive decision-making.
Technical problem
Advertising data was siloed across platforms. Directors lacked a clear view of cross-channel ROAS and could not confidently allocate budgets.
Solution implemented
Deployed a rigorous UTM taxonomy, reconciled multi-channel cost data, and built automated Looker Studio dashboards for the C-suite.

The fragmentation problem

Bains de Saillon advertised on Google Ads, Meta Ads and TikTok Ads at the same time. Each platform had its own dashboard. Each one reported its own conversions.

Those numbers did not add up. Every platform counts a conversion in its own way, with its own attribution window, and each one tends to claim the credit. Add the three together and you get more bookings than the resort ever received.

The directors had to decide where the next franc of budget should go. They had no neutral number to base that decision on. They were flying blind on true cross-channel performance.

The data architecture & UTM strategy

Data reconciliation starts before the click. If the link in the ad is not tagged in a clean and consistent way, no dashboard can fix it afterwards.

So the first step was a strict, standardized UTM taxonomy. It is tailored to the resort's business units: spa, hotel and restaurants. Every campaign name tells you the unit, the objective, the audience and the month. Sources and mediums come from a short, fixed list. There is no free text, and no "Facebook", "facebook" and "fb" variants.

The key detail is the alignment with GA4's default channel grouping. Meta and TikTok links use thepaid_social medium. GA4 then groups them as "Paid Social", next to "Paid Search" for Google. No custom channel rules are needed.

# Pattern
utm_source   = platform, lowercase, no spaces   (google | facebook | instagram | tiktok)
utm_medium   = cost model, fixed list           (cpc | paid_social)
utm_campaign = unit_objective_audience_yyyymm   (all lowercase, "_" as separator)
utm_content  = creative or ad set name          (optional)

# Google Ads (auto-tagging stays on, UTMs are the safety net)
?utm_source=google&utm_medium=cpc&utm_campaign=spa_booking_brand_202611

# Meta Ads (Facebook + Instagram)
?utm_source=facebook&utm_medium=paid_social&utm_campaign=hotel_booking_lookalike_202611&utm_content=carousel_a

# TikTok Ads
?utm_source=tiktok&utm_medium=paid_social&utm_campaign=restaurant_booking_interest_202611&utm_content=video_15s

# Business units: spa | hotel | restaurant
# Result in GA4: Google -> "Paid Search", Meta and TikTok -> "Paid Social"

Simplified, illustrative excerpt. Campaign names and values are examples.

Reconciling ad spend with web data

With clean tags, the next step is a single pipeline. Ad cost from Google, Meta and TikTok, and web behavior from GA4, are brought together. The join key is the one defined in the UTM taxonomy: source, medium and campaign.

  • Cost side: spend, clicks and impressions for each platform, per day and per campaign.
  • Web side: sessions, key events and bookings measured in GA4 on the resort's own website.
  • One key: because every campaign name follows the same pattern, cost and results line up row by row.
  • Automated refresh: the data updates on its own. Nobody exports spreadsheets by hand.

This changes the source of truth. Before, the number came from the ad platform: platform-reported data. Now, it comes from what happened on the resort's own site: objective first-party measurement. The platforms still report their numbers, and they are used to optimize campaigns. They are no longer used to judge them.

The executive Looker Studio dashboard

The clean pipeline feeds a Looker Studio dashboard built for directors, not for data scientists. It answers a few business questions on one screen, with no filters to learn and no jargon.

  • Blended ROAS: total booking revenue divided by total ad spend, across all channels.
  • CAC per channel: what one booking costs on Google, Meta and TikTok, side by side.
  • User journey flows: the path from ad click to booking, split by business unit: spa, hotel and restaurants.

The blending logic is kept simple and readable. A few calculated fields group the sources into three channels and compute the two ratios.

-- Looker Studio calculated fields (blended data source: cost + GA4 sessions/bookings)

Blended ROAS = SUM(Booking Revenue) / SUM(Ad Cost)

CAC per Channel = SUM(Ad Cost) / SUM(Bookings)

Channel = CASE
  WHEN REGEXP_MATCH(Source, "google")             THEN "Google Ads"
  WHEN REGEXP_MATCH(Source, "facebook|instagram") THEN "Meta Ads"
  WHEN REGEXP_MATCH(Source, "tiktok")             THEN "TikTok Ads"
  ELSE "Other"
END

Simplified, illustrative excerpt. Field names depend on the data source.

Business impact

The code and the architecture serve one purpose: to put the directors in control. They no longer guess where to allocate the marketing budget.

  • Immediate clarity: the dashboard shows which campaigns actually drive resort bookings and revenue, in a visual form that can be read in a minute.
  • Confident budget decisions: money can move from channels that look good in their own platform to the ones that bring bookings.
  • One shared number: marketing and management look at the same figures, so meetings are about decisions, not about whose report is right.
  • A foundation that lasts: the UTM taxonomy and the pipeline apply to every new campaign, in every business unit.

If your data fragmentation also involves offline sales or a CRM, read how we handled CRM lead integration for Groupe Mutuel.