LinkedIn Ads Cross-Domain Tracking | OpsBlu Docs

LinkedIn Ads Cross-Domain Tracking

Implement LinkedIn Insight Tag tracking across multiple domains and subdomains for comprehensive conversion measurement

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.com has different cookie than same user on site2.com
  • LinkedIn sees two different sessions
  • Attribution may break if conversion on different domain

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
});

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:

  1. Online Store > Themes > Actions > Edit Code
  2. Open theme.liquid
  3. Paste Insight Tag before </head>
  4. Save

3. Add Conversion Tracking to Order Confirmation

In Shopify Admin:

  1. Settings > Checkout > Order Processing
  2. Additional Scripts section
  3. 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'
});

3. Use Server-Side Webhook

For reliable tracking:


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:

  1. Different Partner IDs used
  2. Tag not on intermediate domain
  3. Attribution window expired
  4. 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:

  1. Use server-side conversion API
  2. Track pre-redirect intent + post-return completion
  3. Use UTM parameters for attribution
  4. Work with platform for tag support

Best Practices

Implementation

  1. Same Partner ID Everywhere - Consistency is critical
  2. Tag on All Domains - Install on every domain in funnel
  3. Test Full Funnel - Walk through entire user journey
  4. Document Flow - Map out all domains involved
  5. Monitor Regularly - Check tag health on all domains

Attribution

  1. Appropriate Windows - Match attribution to sales cycle
  2. Understand Limitations - Cross-device is limited
  3. Layered Tracking - Track micro and macro conversions
  4. UTM Consistency - Use standardized parameters
  5. Backup Methods - Have fallback attribution logic

Privacy

  1. Consistent Privacy Policy - Cover all domains
  2. Unified Consent - Share consent status across domains
  3. Respect Opt-Outs - Honor on all properties
  4. Secure Transfers - Use HTTPS for all domains
  5. Data Minimization - Only track necessary information

Advanced Configurations

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

  1. Account Assets > Insight Tag
  2. View detected domains
  3. Confirm all funnel domains listed
  4. Check last activity dates

Next Steps

After implementing cross-domain tracking:

  1. Test thoroughly - Complete test purchases across domains
  2. Monitor attribution - Verify conversions attribute correctly
  3. Document setup - Record all domains and configuration
  4. Train team - Ensure stakeholders understand flow
  5. Optimize campaigns - Use conversion data for bidding

Additional Resources