Hospitality & EntertainmentServer-Side Reservation Attribution Architecture

The marketing system saw the journey. The booking platform confirmed the reservation.
Building the server-side architecture that joined them.

Client
Atomic Golf
Vertical
Hospitality & Entertainment
Core problem
Attribution context lost at the domain boundary; backend reservation data disconnected from session and marketing identifiers; Meta EMQ at 4/10
Signal environment
Marketing website (atomicgolf.com) · REX booking engine (separate domain) · Backend reservation system · GA4 · Meta Ads
The architectural gap
Attribution context lost at the domain boundary; backend reservation data disconnected from session and marketing identifiers; Meta EMQ at 4/10
What changed
Cloud Run proxy with Firestore enrichment; GA4 Measurement Protocol routing; Meta CAPI with browser and backend identity stitching; EMQ 9/10; ROAS 12x

Atomic Golf is an entertainment and hospitality venue with a digital acquisition model built around paid social, paid search, and organic discovery.

The customer journey begins on atomicgolf.com, where visitors browse venues, packages, and offers, then cross into the REX booking engine on a separate domain to complete a reservation.

Google Analytics 4 (GA4) and Google Tag Manager (GTM) were in place and functioning correctly on the main website. Paid campaigns were running across Meta and Google Ads. The REX platform was confirming reservations reliably. Each layer worked on its own terms. The limit the architecture had reached was the domain boundary. When a visitor left atomicgolf.com and entered the REX booking environment, the signal path connecting the marketing visit to the reservation outcome had no governed bridge.

The most commercially important event in the customer journey, a confirmed reservation, was happening on a third-party domain the marketing team did not control.

Browser-side tracking could reach the main website and capture engagement, CTA clicks, and booking intent. It could not reliably follow the user into REX and return a confirmed reservation event with the original session and campaign context intact.

The practical consequence was misattribution at scale. Paid social visitors who completed a reservation could return to GA4 as Direct or Organic. The session context from the originating paid campaign had dissolved at the domain boundary. GA4 cross-domain linker parameters were preserving the GA client ID in some cases, but a new session was often starting on the REX domain. When it did, the booking appeared under the new session's source rather than the campaign that drove the original visit. Paid campaign performance was being systematically understated.

The backend reservation system held the authoritative transaction data: confirmed reservation, value, package, guest count, and customer contact details. None of it was reaching GA4 or Meta in a form the platforms could use for optimization. Meta was receiving browser-side events from the marketing site with fbp and fbc identifiers, but without the hashed customer data needed to produce a usable Event Match Quality score. Meta's Event Match Quality was sitting at 4/10. The browser knew the marketing journey. The backend knew the customer. Neither knew what the other had.

Building the server-side architecture

GA4 and GTM auditFull review of the existing browser-side implementation across the main website and the REX booking domain: event structure, cross-domain linker behavior, GA client ID and session ID continuity, conversion tracking reliability, and attribution quality across paid channels. The audit mapped what browser tracking could do and where it needed a server-side complement.
Server-side GTM on Cloud RunServer-side Google Tag Manager (sGTM) deployed on Google Cloud Run as the server-side routing layer, with a load-balanced endpoint and separate production and preview containers. The foundation for receiving events from both browser and backend, transforming them, and routing to downstream platforms.
Cloud Run proxy for normalization and enrichmentA custom proxy layer between the backend reservation system and the downstream destinations. The proxy normalizes incoming reservation payloads into the schemas required by GA4 Measurement Protocol and Meta Conversions API (CAPI). It corrects timestamp formatting, applies consent-aware routing, and prepares the event stream for each destination format. The architecture supports additional vendor destinations without separate one-off integrations for each.
Firestore context storage for session enrichmentBrowser and session identifiers captured earlier in the journey are stored in Firestore keyed by client and session: GA client ID, session ID, session number, Meta fbp and fbc, click IDs including fbclid and gclid, user agent, IP address, page URL, referrer, and consent state. When a backend reservation event arrives, the proxy retrieves the stored context and enriches the event before routing. The browser captured the marketing journey. The backend confirmed the transaction. Firestore held the bridge between them.
GA4 Measurement Protocol routingBackend reservation events routed to GA4 with the enriched payload: transaction ID, value, currency, package, guest count, GA client ID, session context, source URL, and consent fields. GA4 now receives confirmed reservation events with the session context needed for accurate attribution, rather than relying on what the booking domain's confirmation page could send from the browser.
Meta CAPI with browser and backend identity stitchingThe server-side Meta CAPI implementation combines what neither the browser nor the backend could provide on its own. The browser provides fbp, fbc, and click identifiers. The backend provides hashed email, hashed phone, and external customer ID. The proxy joins both into a single enriched event. The combination is what drives a meaningful Event Match Quality score and gives Meta's bidding algorithm signal grounded in confirmed reservation outcomes rather than website engagement proxies.
Attribution drift monitoringActive alerting built around reservation attribution patterns: monitoring for sudden increases in Direct or Organic reservation attribution, drops in Paid Social attribution, declining click ID coverage, and backend events arriving without matching browser context. Standard analytics setups check whether tags fire. This layer checks whether the attribution story the data is telling still reflects reality.

Meta Event Match Quality improved from 4/10 to 9/10 following the CAPI implementation and browser-backend identity stitching.

"They created a much more reliable measurement framework that we can actually trust for decision-making."
— Bobak Mostaghasi, CEO, Atomic Golf

At 4/10, most server events were unmatched to user profiles and the bidding algorithm was operating on weak signal. At 9/10, the optimization input reflects actual booking customers.

Paid media ROAS improved from 2–3x to 12x. Two things changed simultaneously. Meta's bidding algorithm started receiving confirmed reservation signals with accurate customer identity rather than browser proxy events, which improved algorithmic optimization. More consequentially, the marketing team now had attribution they could trust. They could see clearly which campaigns were actually driving bookings and which had appeared productive only because the broken attribution model was crediting them for revenue they hadn't produced. The campaigns that didn't hold up were killed. The ones that did were scaled. The ROAS improvement was the result of better algorithmic signal and better human decisions, both made possible by the architecture.

Attribution accuracy across GA4 improved. Reservations previously returning as Direct or Organic due to session loss at the domain boundary are now attributed to the originating paid channel.

All project milestones were delivered on time and under budget. The architecture was stabilized without changing the client's existing booking processes or requiring changes to the REX platform.

If the most important conversion event in the customer journey happens in a third-party environment the marketing team does not control, the attribution layer needs a server-side bridge.

The Assessment maps the gap.

Start here

The Measurement Architecture Assessment — a 30-minute call, a fixed-fee diagnostic, a clear picture of where your signal layer breaks and what to do about it.