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
Configure Auto-Link Domains
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
Configure Cookie Domain
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:
- www.example.com
- shop.example.com
- checkout.example.com
- app.example.com
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
- Visit Domain A - Open Chrome DevTools and verify Universal Pixel fires
- Check TDID Cookie - Application tab → Cookies → verify TDID exists
- Click Cross-Domain Link - Navigate to Domain B via link
- Verify TDID Persistence - Check TDID cookie on Domain B matches Domain A
- Trigger Conversion - Complete purchase or lead action
- 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
Cookie Not Shared Across Subdomains
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