Overview
Cross-domain tracking enables you to track user journeys across multiple domains or subdomains as a single session. This is essential when your ad landing pages, main website, and checkout/conversion process exist on different domains.
When You Need Cross-Domain Tracking
Common Scenarios
Multiple Domains:
- Marketing site:
www.example.com - Product site:
product.example.com - Checkout:
checkout.example.com
External Platforms:
- Main site:
www.example.com - Payment processor:
payments.thirdparty.com - Confirmation redirects back:
www.example.com/thanks
Regional Sites:
- US site:
www.example.com - UK site:
www.example.co.uk - Shared conversion funnel
Partner/Affiliate Flows:
- Partner site:
partner.com - Redirect to:
www.example.com/offer - Convert on:
www.example.com/checkout
LinkedIn Insight Tag Behavior
Default Behavior
The LinkedIn Insight Tag uses browser cookies to track users:
First-Party Cookie:
- Name:
li_fat_id,bcookie,lidc - Domain-specific
- Not shared across domains
What This Means:
- User on
site1.comhas different cookie than same user onsite2.com - LinkedIn sees two different sessions
- Attribution may break if conversion on different domain
Cookie Scope
Subdomain Tracking (Automatic):
www.example.com ← Shares cookies automatically
app.example.com
shop.example.com
If all on same root domain (example.com), tracking works automatically.
Different Domains (Requires Setup):
example.com ← Different cookies, tracking breaks
another-domain.com
Implementation Approaches
Approach 1: Install Insight Tag on All Domains
Best Practice: Install the same Insight Tag on all domains in your funnel.
Why This Works:
- LinkedIn can identify users across domains
- Cookie sharing not required
- LinkedIn's backend links sessions
- Works with view-through attribution
Implementation:
Install identical Insight Tag on all domains:
Domain 1: www.example.com
<script type="text/javascript">
_linkedin_partner_id = "1234567";
window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
window._linkedin_data_partner_ids.push(_linkedin_partner_id);
</script>
<script type="text/javascript">
(function(l) {
if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
window.lintrk.q=[]}
var s = document.getElementsByTagName("script")[0];
var b = document.createElement("script");
b.type = "text/javascript";b.async = true;
b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
s.parentNode.insertBefore(b, s);})(window.lintrk);
</script>
Domain 2: checkout.example-shop.com
<!-- SAME TAG CODE -->
<script type="text/javascript">
_linkedin_partner_id = "1234567"; // Same Partner ID
window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
window._linkedin_data_partner_ids.push(_linkedin_partner_id);
</script>
<script type="text/javascript">
(function(l) {
if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
window.lintrk.q=[]}
var s = document.getElementsByTagName("script")[0];
var b = document.createElement("script");
b.type = "text/javascript";b.async = true;
b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
s.parentNode.insertBefore(b, s);})(window.lintrk);
</script>
Key Points:
- ✓ Use same Partner ID on all domains
- ✓ Install complete tag on each domain
- ✓ Include conversion tracking code where appropriate
- ✓ LinkedIn backend handles cross-domain attribution
Approach 2: URL Parameters for Attribution
Use Case: When tag installation on all domains isn't possible (third-party platforms)
How It Works:
- LinkedIn ad includes tracking parameters
- Parameters persist through redirects
- Final conversion page reads parameters
- Manually attribute conversion
Implementation:
Step 1: LinkedIn Ad URL Parameters
Ensure LinkedIn ads include UTM or custom parameters:
https://example.com/landing?
utm_source=linkedin&
utm_medium=cpc&
utm_campaign=fall_promo&
li_click_id={{CLICK_ID}}
LinkedIn auto-populates {{CLICK_ID}} with unique identifier.
Step 2: Persist Parameters
Maintain parameters through domain changes:
// Get URL parameters
function getUrlParameter(name) {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(location.search);
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
}
// Store in session storage
var liClickId = getUrlParameter('li_click_id');
if (liClickId) {
sessionStorage.setItem('li_click_id', liClickId);
}
// Append to outbound links to other domains
var checkoutUrl = 'https://checkout.otherdomain.com/start';
var storedClickId = sessionStorage.getItem('li_click_id');
if (storedClickId) {
checkoutUrl += '?li_click_id=' + storedClickId;
}
window.location.href = checkoutUrl;
Step 3: Track Conversion with Context
On final conversion page:
// Retrieve click ID
var liClickId = getUrlParameter('li_click_id') || sessionStorage.getItem('li_click_id');
// Track conversion
window.lintrk('track', {
conversion_id: YOUR_CONVERSION_ID,
value: 99.99,
currency: 'USD'
});
// Optional: Send to your analytics
analyticsTrack('conversion', {
source: liClickId ? 'linkedin' : 'unknown',
li_click_id: liClickId
});
Approach 3: Subdomain Cookie Sharing
Use Case: Tracking across subdomains of same root domain
Default Behavior: LinkedIn Insight Tag automatically shares cookies across subdomains when configured properly.
Verification:
// Check cookie domain
document.cookie.split(';').forEach(function(cookie) {
if (cookie.includes('li_fat_id')) {
console.log('LinkedIn cookie:', cookie);
}
});
Look for domain=.example.com - the leading dot means all subdomains share it.
If Not Working:
Ensure tag installed identically on all subdomains:
- Same Partner ID
- Same tag code
- No domain restrictions in tag configuration
Third-Party Platform Integration
Shopify/E-commerce Platforms
Scenario: Marketing site on custom domain, checkout on Shopify
Implementation:
1. Install Tag on Marketing Site
<!-- On www.example.com -->
<script type="text/javascript">
_linkedin_partner_id = "1234567";
window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
window._linkedin_data_partner_ids.push(_linkedin_partner_id);
</script>
<script type="text/javascript">
(function(l) {
if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
window.lintrk.q=[]}
var s = document.getElementsByTagName("script")[0];
var b = document.createElement("script");
b.type = "text/javascript";b.async = true;
b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
s.parentNode.insertBefore(b, s);})(window.lintrk);
</script>
2. Install Tag on Shopify
In Shopify Admin:
- Online Store > Themes > Actions > Edit Code
- Open
theme.liquid - Paste Insight Tag before
</head> - Save
3. Add Conversion Tracking to Order Confirmation
In Shopify Admin:
- Settings > Checkout > Order Processing
- Additional Scripts section
- Add:
{% if first_time_accessed %}
<script type="text/javascript">
window.lintrk('track', {
conversion_id: YOUR_CONVERSION_ID,
value: {{ total_price | money_without_currency }},
currency: '{{ shop.currency }}'
});
</script>
{% endif %}
{% if first_time_accessed %} prevents double-tracking on page refresh.
Payment Processors
Scenario: Checkout redirects to Stripe/PayPal/external processor
Challenge: Can't install tag on processor's domain
Solution:
1. Track Intent Before Redirect
// Before redirecting to payment processor
window.lintrk('track', {
conversion_id: CHECKOUT_INITIATED_ID
});
// Then redirect
window.location.href = 'https://payment-processor.com/checkout';
2. Track Completion After Return
// On return URL: www.example.com/order/complete
window.lintrk('track', {
conversion_id: PURCHASE_COMPLETE_ID,
value: orderTotal,
currency: 'USD'
});
For reliable tracking:
- Payment processor sends webhook on completion
- Server-side code triggers LinkedIn conversion via API
- See Server-Side Implementation
Testing Cross-Domain Tracking
Manual Testing Process
1. Clear Cookies Start fresh for accurate test
2. Click LinkedIn Ad Or visit with utm_source=linkedin parameter
3. Navigate Through Funnel Move from domain to domain as user would
4. Check Network Requests
On each domain:
- Open DevTools > Network
- Filter for "linkedin" or "snap.licdn.com"
- Verify tag loads
- Check for tracking requests
5. Complete Conversion
On confirmation page:
- Verify conversion tracking fires
- Check Network tab for conversion request
- Note conversion_id in request
6. Wait and Verify
- Wait 24-48 hours
- Check Campaign Manager
- Verify conversion attributed correctly
Debugging Tools
Browser Console:
// Check if Insight Tag loaded
if (typeof window.lintrk === 'function') {
console.log('✓ LinkedIn Insight Tag loaded');
console.log('Partner IDs:', window._linkedin_data_partner_ids);
} else {
console.error('✗ LinkedIn Insight Tag not found');
}
// Check cookies
document.cookie.split(';').forEach(function(cookie) {
if (cookie.trim().startsWith('li_')) {
console.log('LinkedIn cookie:', cookie.trim());
}
});
// Check session storage (if using parameter passing)
console.log('Stored Click ID:', sessionStorage.getItem('li_click_id'));
Network Tab:
Look for requests to:
snap.licdn.com/li.lms-analytics/insight.min.js(tag loading)px.ads.linkedin.com/collect(conversion tracking)
Common Issues and Solutions
Issue 1: Conversions Not Attributed
Symptoms:
- Tag fires on both domains
- Conversion tracked
- Not showing in LinkedIn reports
Possible Causes:
- Different Partner IDs used
- Tag not on intermediate domain
- Attribution window expired
- User clicked ad on different device
Solutions:
- Verify same Partner ID on all domains
- Install tag on all funnel domains
- Check attribution window settings
- Understand cross-device limitations
Issue 2: Duplicate Conversions
Symptoms:
- Multiple conversions for single purchase
- Inflated conversion numbers
Causes:
- Conversion tracking on multiple pages
- User refreshes confirmation page
- Tag fires multiple times
Solutions:
// Prevent duplicate tracking
var conversionKey = 'linkedin_conv_' + YOUR_CONVERSION_ID;
if (!sessionStorage.getItem(conversionKey)) {
window.lintrk('track', {
conversion_id: YOUR_CONVERSION_ID,
value: 99.99,
currency: 'USD'
});
sessionStorage.setItem(conversionKey, 'true');
}
Issue 3: Third-Party Domain Can't Track
Symptoms:
- Can't install tag on external platform
- Conversions not tracking
Solutions:
- Use server-side conversion API
- Track pre-redirect intent + post-return completion
- Use UTM parameters for attribution
- Work with platform for tag support
Best Practices
Implementation
- Same Partner ID Everywhere - Consistency is critical
- Tag on All Domains - Install on every domain in funnel
- Test Full Funnel - Walk through entire user journey
- Document Flow - Map out all domains involved
- Monitor Regularly - Check tag health on all domains
Attribution
- Appropriate Windows - Match attribution to sales cycle
- Understand Limitations - Cross-device is limited
- Layered Tracking - Track micro and macro conversions
- UTM Consistency - Use standardized parameters
- Backup Methods - Have fallback attribution logic
Privacy
- Consistent Privacy Policy - Cover all domains
- Unified Consent - Share consent status across domains
- Respect Opt-Outs - Honor on all properties
- Secure Transfers - Use HTTPS for all domains
- Data Minimization - Only track necessary information
Advanced Configurations
Cookie Consent Across Domains
Challenge: User grants consent on Domain A, must respect on Domain B
Solution:
Domain A (after consent):
// User consented
sessionStorage.setItem('tracking_consent', 'granted');
// Append to links to Domain B
var linkToDomainB = 'https://domainb.com/page?consent=granted';
Domain B:
// Check consent from parameter or storage
function hasTrackingConsent() {
var urlConsent = getUrlParameter('consent');
var storedConsent = sessionStorage.getItem('tracking_consent');
return urlConsent === 'granted' || storedConsent === 'granted';
}
// Load tag conditionally
if (hasTrackingConsent()) {
// Load Insight Tag
}
Multi-Partner ID Tracking
Use Case: Tracking for multiple LinkedIn accounts
// Primary account
_linkedin_partner_id = "1234567";
window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
window._linkedin_data_partner_ids.push(_linkedin_partner_id);
// Additional accounts (e.g., agency + client)
window._linkedin_data_partner_ids.push("7654321");
// Load tag (same code)
(function(l) {
if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
window.lintrk.q=[]}
var s = document.getElementsByTagName("script")[0];
var b = document.createElement("script");
b.type = "text/javascript";b.async = true;
b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
s.parentNode.insertBefore(b, s);})(window.lintrk);
All partner IDs receive tracking data.
GTM Implementation for Cross-Domain
Setup
1. GTM Container on All Domains
Install same GTM container on all domains.
2. Create LinkedIn Tag
Tag Type: Custom HTML
<script type="text/javascript">
_linkedin_partner_id = "{{LinkedIn Partner ID}}"; // GTM variable
window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
window._linkedin_data_partner_ids.push(_linkedin_partner_id);
</script>
<script type="text/javascript">
(function(l) {
if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
window.lintrk.q=[]}
var s = document.getElementsByTagName("script")[0];
var b = document.createElement("script");
b.type = "text/javascript";b.async = true;
b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
s.parentNode.insertBefore(b, s);})(window.lintrk);
</script>
3. Trigger: All Pages
Fires on every pageview, all domains.
4. Publish to All Containers
If using separate GTM containers per domain, publish to each.
Monitoring and Maintenance
Regular Checks
Monthly:
- Verify tag active on all domains
- Check Campaign Manager for detected domains
- Review conversion attribution
After Changes:
- Site redesigns
- New domain additions
- Platform migrations
- URL structure changes
Campaign Manager Verification
- Account Assets > Insight Tag
- View detected domains
- Confirm all funnel domains listed
- Check last activity dates
Next Steps
After implementing cross-domain tracking:
- Test thoroughly - Complete test purchases across domains
- Monitor attribution - Verify conversions attribute correctly
- Document setup - Record all domains and configuration
- Train team - Ensure stakeholders understand flow
- Optimize campaigns - Use conversion data for bidding
Additional Resources
- Install Insight Tag - Base implementation
- Event Tracking - Conversion tracking setup
- Troubleshooting - Common issues
- Server-Side Implementation - Alternative approach