Cross-Domain Overview
Track user journeys that span multiple domains or subdomains while maintaining session continuity.
Same Device ID Approach
Shared Device ID
Use the same device ID across domains:
// Domain A - Get device ID
const deviceId = Countly.get_device_id();
const link = `https://domain-b.com?cly_device_id=${deviceId}`;
// Domain B - Read and use device ID
const urlParams = new URLSearchParams(window.location.search);
const deviceId = urlParams.get('cly_device_id');
Countly.init({
app_key: 'YOUR_APP_KEY',
url: 'https://your-server.com',
device_id: deviceId || undefined // Use passed ID or generate new
});
Link Decoration
Automatically append device ID to links:
function decorateLinks(selector) {
document.querySelectorAll(selector).forEach(link => {
link.addEventListener('click', function(e) {
const deviceId = Countly.get_device_id();
const url = new URL(this.href);
url.searchParams.set('cly_device_id', deviceId);
this.href = url.toString();
});
});
}
// Apply to cross-domain links
decorateLinks('a[href*="other-domain.com"]');
Subdomain Tracking
Cookie Configuration
For subdomains, configure cookie domain:
Countly.init({
app_key: 'YOUR_APP_KEY',
url: 'https://your-server.com',
storage: 'cookie',
cookie_domain: '.example.com' // Note leading dot
});
This allows:
- www.example.com
- shop.example.com
- app.example.com
to share the same device ID.
Multi-App Tracking
Same Countly Server
Track multiple apps with separate app keys:
// Main website
Countly.init({
app_key: 'WEBSITE_APP_KEY',
url: 'https://your-server.com',
device_id: sharedDeviceId
});
// Separate app (e.g., documentation)
// Use same device_id for cross-app tracking
Linking User Across Apps
// When user logs in, sync device ID
function onUserLogin(userId) {
// Use user ID as device ID for consistency
Countly.change_id(userId, true); // true = merge data
}
Form Handling
Cross-Domain Forms
document.getElementById('cross-domain-form').addEventListener('submit', function(e) {
const deviceId = Countly.get_device_id();
// Add hidden field
const input = document.createElement('input');
input.type = 'hidden';
input.name = 'cly_device_id';
input.value = deviceId;
this.appendChild(input);
});
Verification
Testing Cross-Domain Tracking
- Visit Domain A
- Note device ID:
Countly.get_device_id() - Click link to Domain B
- Verify same device ID
- Check Countly dashboard for unified session
Debugging
// Enable debug mode
Countly.debug = true;
// Log device ID
console.log('Device ID:', Countly.get_device_id());
Considerations
Privacy
- Inform users about cross-domain tracking
- Respect consent across all domains
- Provide opt-out mechanism
Technical
- URL parameters may be logged by servers
- Consider POST instead of GET for sensitive data
- Clean URLs after reading device ID