The Trade Desk Cross-Domain Tracking | OpsBlu Docs

The Trade Desk Cross-Domain Tracking

Implementation guide for tracking users across multiple domains with The Trade Desk Universal Pixel.

Cross-Domain Tracking Overview

Cross-domain tracking enables The Trade Desk Universal Pixel to maintain user identity and attribution across multiple domains. This is essential for businesses with separate marketing sites, checkout domains, or subdomain structures. Proper cross-domain configuration ensures accurate conversion tracking and user journey measurement.

Common Use Cases

  • Main site (www.example.com) and checkout domain (checkout.example.com)
  • Marketing site (marketing.example.com) and application (app.example.com)
  • Multiple brand domains sharing marketing campaigns
  • Third-party payment processors (shop.example.com → secure.paymentprovider.com)
  • Regional domains (example.com, example.co.uk, example.de)
  • Mobile app deep links to web checkout

Implementation Methods

Method 1: Universal Pixel on All Domains

Deploy the same Universal Pixel ID on all domains:

Domain A (www.example.com):

ttd.universal({
  advertiser_id: 'YOUR_ADVERTISER_ID',
  td1: 'YOUR_UNIVERSAL_PIXEL_ID',
  event_name: 'page_view'
});

Domain B (checkout.example.com):

ttd.universal({
  advertiser_id: 'YOUR_ADVERTISER_ID',
  td1: 'YOUR_UNIVERSAL_PIXEL_ID',
  event_name: 'purchase',
  value: 199.99,
  currency: 'USD',
  order_id: 'ORD123456'
});

Method 2: URL Parameter Passing

Pass TTD user identifier (TDID) via URL parameters:

Link from Domain A to Domain B:

// Add TDID to outbound links
document.addEventListener('DOMContentLoaded', function() {
  const tdid = getTTDID(); // Get TDID from cookie

  // Update all cross-domain links
  document.querySelectorAll('a[href*="checkout.example.com"]').forEach(link => {
    const url = new URL(link.href);
    url.searchParams.set('_tdid', tdid);
    link.href = url.toString();
  });
});

function getTTDID() {
  const cookies = document.cookie.split(';');
  for (let cookie of cookies) {
    const [name, value] = cookie.trim().split('=');
    if (name === 'TDID') {
      return value;
    }
  }
  return null;
}

Receive TDID on Domain B:

// Read TDID from URL parameter and set cookie
function setTDIDFromURL() {
  const urlParams = new URLSearchParams(window.location.search);
  const tdid = urlParams.get('_tdid');

  if (tdid) {
    document.cookie = `TDID=${tdid}; domain=.example.com; path=/; max-age=31536000; secure; samesite=lax`;
  }
}

setTDIDFromURL();

Method 3: UID2.0 Cross-Domain Identity

Use UID2 tokens for deterministic cross-domain tracking:

Domain A - Generate and Pass UID2:

// Server-side: Generate UID2 token from email
const uid2Token = await generateUID2Token(userEmail);

// Client-side: Store in session storage
sessionStorage.setItem('uid2_token', uid2Token);

// Pass UID2 to Universal Pixel
ttd.universal({
  advertiser_id: 'YOUR_ADVERTISER_ID',
  td1: 'YOUR_UNIVERSAL_PIXEL_ID',
  uid2_token: uid2Token,
  event_name: 'page_view'
});

// Add UID2 to cross-domain links
document.querySelectorAll('a[href*="checkout.example.com"]').forEach(link => {
  const url = new URL(link.href);
  url.searchParams.set('uid2', uid2Token);
  link.href = url.toString();
});

Domain B - Receive and Use UID2:

// Read UID2 from URL parameter
const urlParams = new URLSearchParams(window.location.search);
const uid2Token = urlParams.get('uid2');

if (uid2Token) {
  sessionStorage.setItem('uid2_token', uid2Token);
}

// Use UID2 in Universal Pixel
ttd.universal({
  advertiser_id: 'YOUR_ADVERTISER_ID',
  td1: 'YOUR_UNIVERSAL_PIXEL_ID',
  uid2_token: sessionStorage.getItem('uid2_token'),
  event_name: 'purchase',
  value: 299.99,
  currency: 'USD',
  order_id: 'ORD789456'
});

GTM Cross-Domain Configuration

Create Custom JavaScript Variable:

function() {
  return function(tracker) {
    tracker.set('linker', {
      'domains': ['checkout.example.com', 'secure.example.com'],
      'decorate': true
    });
  };
}

Update Universal Pixel Tag:

// Get TDID and pass to links
ttd.universal({
  advertiser_id: 'YOUR_ADVERTISER_ID',
  td1: 'YOUR_UNIVERSAL_PIXEL_ID',
  event_name: 'page_view'
});

// Decorate cross-domain links
document.addEventListener('DOMContentLoaded', function() {
  const domains = ['checkout.example.com', 'secure.example.com'];

  document.querySelectorAll('a').forEach(link => {
    const linkHostname = new URL(link.href).hostname;
    if (domains.includes(linkHostname)) {
      link.addEventListener('click', function() {
        const tdid = getTTDID();
        if (tdid) {
          const url = new URL(link.href);
          url.searchParams.set('_tdid', tdid);
          link.href = url.toString();
        }
      });
    }
  });
});

Subdomain Tracking

Set cookies to parent domain for subdomain sharing:

// Set TDID cookie to parent domain
function setTDIDCookie(tdid) {
  const domain = '.example.com'; // Note the leading dot
  document.cookie = `TDID=${tdid}; domain=${domain}; path=/; max-age=31536000; secure; samesite=lax`;
}

Subdomains automatically share cookies:

Third-Party Payment Processor Tracking

Pass Order Data via URL Parameters

// Before redirect to payment processor
function redirectToPayment(orderData) {
  const paymentURL = 'https://secure.paymentprovider.com/checkout';
  const params = new URLSearchParams({
    merchant_id: 'YOUR_MERCHANT_ID',
    order_id: orderData.orderId,
    amount: orderData.total,
    return_url: encodeURIComponent(
      `https://www.example.com/confirmation?order_id=${orderData.orderId}`
    ),
    _tdid: getTTDID() // Pass TDID for attribution
  });

  window.location.href = `${paymentURL}?${params.toString()}`;
}

Track Conversion on Return URL

// On confirmation page after payment redirect
const urlParams = new URLSearchParams(window.location.search);
const orderId = urlParams.get('order_id');

// Fetch order details from server
fetch(`/api/orders/${orderId}`)
  .then(res => res.json())
  .then(order => {
    ttd.universal({
      advertiser_id: 'YOUR_ADVERTISER_ID',
      td1: 'YOUR_UNIVERSAL_PIXEL_ID',
      event_name: 'purchase',
      value: order.total,
      currency: 'USD',
      order_id: order.id,
      items: order.items
    });
  });

Server-Side Cross-Domain Tracking

Pass User ID in Server Session

// Node.js example - Domain A
app.get('/checkout-redirect', (req, res) => {
  const userId = req.session.userId;
  const uid2Token = req.session.uid2Token;

  // Redirect to Domain B with encrypted session token
  const sessionToken = encryptSessionData({ userId, uid2Token });
  res.redirect(`https://checkout.example.com/start?session=${sessionToken}`);
});
// Node.js example - Domain B
app.get('/start', (req, res) => {
  const sessionToken = req.query.session;
  const sessionData = decryptSessionData(sessionToken);

  // Restore session and fire pixel
  req.session.userId = sessionData.userId;
  req.session.uid2Token = sessionData.uid2Token;

  res.render('checkout', {
    uid2Token: sessionData.uid2Token
  });
});

Validation & Testing

Pre-Launch Checklist

  • Universal Pixel deploys on all domains with same advertiser ID
  • Cross-domain links properly decorated with TDID or UID2
  • Cookies set with correct domain scope (.example.com)
  • Third-party payment redirects maintain user identity
  • Return URLs capture conversion data correctly
  • Server-side session passing works across domains

Testing Cross-Domain Tracking

  1. Visit Domain A - Open Chrome DevTools and verify Universal Pixel fires
  2. Check TDID Cookie - Application tab → Cookies → verify TDID exists
  3. Click Cross-Domain Link - Navigate to Domain B via link
  4. Verify TDID Persistence - Check TDID cookie on Domain B matches Domain A
  5. Trigger Conversion - Complete purchase or lead action
  6. Confirm Attribution - Verify conversion in TTD reporting with correct source

Chrome DevTools Network Debugging

Filter: adsrvr
Look for: insight.adsrvr.org requests
Verify: TDID parameter matches across domains
Check: Response status 200 OK

Common Issues & Solutions

Problem: Cookies set to specific subdomain only

Solution: Set cookie domain to parent domain with leading dot:

document.cookie = 'TDID=value; domain=.example.com; path=/';

TDID Lost on Payment Redirect

Problem: Third-party payment processor doesn't preserve TDID

Solution: Pass TDID in return URL and restore on confirmation page

Attribution Breaks on Domain Switch

Problem: Universal Pixel creates new session on Domain B

Solution: Implement UID2 for deterministic cross-domain identity

Best Practices

  • Use same Universal Pixel ID across all owned domains
  • Implement UID2 for most reliable cross-domain tracking
  • Set cookies to parent domain (.example.com) for subdomain sharing
  • Decorate all cross-domain links with TDID or UID2 parameters
  • Test cross-domain flows in incognito mode to verify cookie behavior
  • Monitor attribution in TTD reporting across domain transitions
  • Document all domains and subdomains in implementation guide
  • Use server-side session passing for sensitive or complex flows
  • Implement fallback server-side conversion tracking for critical transactions
  • Regular audit of cross-domain tracking accuracy