Fixing a Cross-Domain Tracking Problem That Shouldn’t Have Taken Two Months

Every once in a while, a problem shows up that reminds me why marketing ops isn’t really about tools — it’s about knowing what to look at, asking the right questions, and understanding just enough about the technical plumbing to keep the whole system from falling apart.

The SEA team ran into one of those problems shortly after they copied our North America Webflow site for their own regional rollout. On the surface, the copy-paste approach made sense: our layout, components, and IA were already proven; 80% of the site was reusable. But a website is never just what you see on the screen. Under the hood, there were integrations, scripts, and tracking logic that absolutely could not be duplicated blindly.

It took only a few days for them to realize something was wrong. Their paid campaigns weren’t attributing correctly. Organic traffic was showing up as “direct.” UTM parameters weren’t sticking. And once a user clicked from the Webflow site into our product portal — which sits on a completely different domain — every tracking value disappeared. Because their team assumed it was a cookie issue, they spent months trying to debug consent banners, cookie configs, and storage logic. Nothing worked.

From their perspective, the situation was frustrating. They had already involved the engineering team in headquarters, tried different patches, and ran through a whole list of theories. Still broken. Meanwhile, their marketing dashboard was basically blind — no source tracking, no campaign performance, no way to tie new customers back to the channel or keyword they came from.

I only learned about the issue because I happened to be visiting HQ and bumped into their Head of Marketing. We started talking, and I asked a few questions. Within minutes, it was clear the problem wasn’t cookies at all. It was cross-domain tracking. Webflow runs on AWS; our product runs on a separate domain and server. If you want UTM parameters or Google linker information to persist across domains, you need a specific setup on both sides: a linker, proper domain configuration in GTM, and custom code in the Webflow header that matches the actual region’s domain — not the version they had copied from us.

They had taken my North America site, copied the entire header, and never changed the subdomain references. So their tracking script was essentially “looking for” a domain that didn’t exist. The rest of the system behaved as if tracking had never been implemented at all.

It didn’t take long to fix — maybe an hour. I rebuilt the linker inside GTM, rewrote their header script with the correct subdomain references, cleaned up old logic that didn’t apply to their setup, and pushed a few updates to match their environment. Once we tested it, everything snapped back into place. Attribution worked. Paid campaigns tracked again. Organic and direct traffic separated correctly. UTM parameters persisted into the backend system. And funnel data tied cleanly all the way down to customer lifetime value.

The SEA team was relieved. Their engineers were honestly a bit stunned — not because the solution was complicated, but because the real problem was nowhere near where they had been focusing. Months spent troubleshooting cookies… when the issue lived in a completely different layer.

For me, the lesson wasn’t that I “saved” anything. It was more a reminder that, in marketing ops, understanding fundamentals matters more than memorizing tools. Most problems aren’t solved by adding new software; they’re solved by asking the right question at the right time. And technical problems, especially cross-domain ones, rarely announce themselves clearly. You have to know what affects what, and which assumptions to challenge first.

I documented everything afterward — the linker setup, the naming conventions, the custom header code structure, the cross-domain tracking checklist, and best practices for regional teams. That documentation turned into a small but important foundation for consistency across international sites. And quietly, it also strengthened cross-region relationships. Helping the SEA team with something that had been slowing them down for months created trust, which later made collaboration much smoother.

If there’s one takeaway from the whole experience, it’s this: marketing ops is not just about running campaigns — it’s about owning the infrastructure that makes every campaign measurable. And sometimes, fixing that infrastructure comes down to nothing more than understanding what question to ask and where to look.



FYI, custom tracking (code sample)
 

<script>  document.addEventListener("DOMContentLoaded", function() {    const urlParams = new URLSearchParams(window.location.search);    

// CASE 1: If URL already includes ?inviteCode=xxx    
// → Pass that value through to all sign-up buttons & PingPong login links    

if (urlParams.has("inviteCode")) {      const inviteCode = urlParams.get("inviteCode");            

// Attach inviteCode to all sign-up CTAs on the page      

const signupButtons = document.querySelectorAll(".signup-button");      signupButtons.forEach(button => {        const signupUrl = new URL(button.href);        signupUrl.searchParams.append("inviteCode", inviteCode);        button.href = signupUrl.toString();      });            

// Update any internal redirect that points to id.pingpongx.com      
// Ensures attribution persists across domains (Webflow → Product portal)      

document.querySelectorAll("a").forEach(link => {        const url = new URL(link.href);        if (url.hostname === "id.pingpongx.com") {          url.searchParams.set("inviteCode", inviteCode);          link.href = url.toString();        }      });    

// CASE 2: No inviteCode in URL    
// → Default all links to "organic_google" for clean attribution    

} else {      const signupButtons = document.querySelectorAll(".signup-button");      signupButtons.forEach(button => {        const signupUrl = new URL(button.href);        signupUrl.searchParams.append("inviteCode", "organic_google");        button.href = signupUrl.toString();      });            

// Also sync default inviteCode across login/redirect URLs      

document.querySelectorAll("a").forEach(link => {        const url = new URL(link.href);        if (url.hostname === "id.pingpongx.com") {          url.searchParams.set("inviteCode", "organic_google");          link.href = url.toString();        }      });    }  });</script>



Let’s Talk About Your Growth Challenges.

"​I always enjoy meeting people who are working on meaningful problems in marketing challenges, AI, or automated workflow.

 If anything you’ve read here resonates—or sparks an idea you want to explore—I’m more than happy to chat and compare perspectives."

Daniel
Let's Chat