Analytics counts sessions. Your money lives in a booking system, a CRM or an order table, and those systems have never heard of a session. Between the two sits the question every advertiser actually wants answered, which is not “did this campaign contribute to traffic that converted” but “which advertisement produced this specific paying customer”. Answering it is a database join that most businesses never build.
Answer first
Read the click identifier from the URL the moment a visitor lands, store it in your own first-party storage, attach it as a hidden field to every enquiry, and make sure it survives into the record of the sale. Then send those confirmed sales back to the advertising platform as offline conversions with their real values. That is the whole thing. It is a few days of engineering, it does not depend on any analytics product, and it is the only way to state which advertisement produced which customer without using the word “modelled”.
Why analytics cannot do this for you
Even with cross-domain measurement working perfectly, analytics answers a different question. It tells you that a session which involved a campaign later reached a page you called a conversion. That is useful and it is not proof. The identity it uses is a browser, the event it records is a page view, and the number attached to it is whatever your tag sent.
Your finance system has different identities, different events and different numbers. The reservation that was cancelled, the order that was refunded, the enquiry that turned into a much larger contract six weeks later: none of those corrections reach analytics, and all of them change which advertising was actually worth buying.
The join is what lets the two systems agree, and it has to happen in yours, because you are the only party that can see both halves.
The identifier is the thread
When auto-tagging is on, Google appends a click identifier to your landing page URL. That string is the only durable connection between one specific advertisement click and everything that happens afterwards. Meta and Microsoft have their equivalents.
Two details matter and are routinely missed.
There is more than one kind. Google may send a gclid, or for some iOS traffic a gbraid or wbraid, which exist because privacy rules prevent user-level tracking in those cases. They behave differently, they cannot all be treated as identifying an individual, and code that assumes a gclid is always present will silently drop a slice of your best traffic.
It has a life span. The identifier is only useful inside the platform’s conversion window, and if your sales cycle is longer than the storage you gave it, the thread is already cold by the time the money arrives. Store it deliberately rather than accepting a default.
The four steps of the join
Capture on landing. Read the identifier from the URL on every page that can receive advertising traffic, not just the homepage. Traffic lands deep, on a product page, a property page, a specific service. Store it first-party, and store the first one you saw rather than overwriting it on every subsequent visit, unless you have decided otherwise on purpose.
Attach it to the enquiry. Every form gets a hidden field. Every phone conversation gets the identifier from the session that produced it. This is the point where the marketing world hands the thread to the business world, and it should be boring and automatic.
Carry it to the sale. The enquiry becomes a booking, an order or a signed contract. In most systems that is a different record, and this is where the thread is usually cut, not by a tracking failure but by a data model that never had a field for it. If the identifier does not survive that transition, everything upstream was wasted.
Import the confirmed outcome back. Send the sale, its identifier, its timestamp and its real value to the platform as an offline conversion. This is the step that changes performance rather than reporting, because automated bidding will now optimise towards revenue instead of form submissions.
Grade the evidence, do not average it
Not every match is equally strong, and the useful discipline is to say so.
A sale carrying a genuine click identifier is proof. A sale that only carries a source, so you know it came from paid search but not which click, is weaker evidence. A sale matched by a phone number or an email address that also appears on an enquiry is weaker still, because people share devices and reuse addresses.
Report those tiers separately rather than collapsing them into one confident total. It is the same discipline we use to publish the Attribution Gap Index. It costs nothing, it makes the number defensible in a room with a finance director in it, and it tells you exactly where to invest next. A business that can say “this much is click-proven, this much is source-level, this much we cannot see” is in a completely different position from one presenting a single figure it cannot break down.
What it looks like when it lands
In one luxury vacation rental account, the advertising platform reported $173,555 of revenue across a two-month window. Once every booking carried the identifier of the click that produced it, $100,646 could be traced to a confirmed reservation. The remaining $72,909 was not fraud and it was not lost revenue. It was revenue the account could no longer claim credit for, which is a different and more useful thing to know.
That number then did something the report could not. It changed which campaigns received budget, because the campaigns producing provable bookings were not the ones the platform had been favouring.
We eventually built this join as a product, because doing it by hand for every property management system stopped being reasonable. That is what BookingBridge is: it stores the identifiers and the values, not the guests, and it answers the one question the platform cannot.
Where it still cannot reach
Someone who enquires on a phone and books on a laptop breaks the thread, because those are two browsers and you have no honest way to connect them without a login. View-through conversions, where an advertisement was seen and never clicked, leave no identifier at all. And in that same account, 27 percent of bookings came through online travel agents, where no click exists anywhere in your systems to find.
Say those numbers out loud. An account that proves three-quarters of its revenue and names the reason for the rest is more trustworthy than one claiming everything.
Where this sits in the chain
This is the third and last of the three places a chain of custody breaks. The first is the hand-off between domains, where the session restarts. The second is the conversation that happens on the phone and never reaches the platform.
Fix them in that order, because each one makes the next cheaper. Repair the hand-off and the identifier survives long enough to be captured. See the conversations and the enquiries worth joining are visible. Build the join and, for the first time, the sentence “this advertisement produced this customer” becomes a statement of fact rather than an interpretation.
That sentence is the whole point of the method.