Scripts

LinkedIn Insight Tag

The LinkedIn Insight Tag is a lightweight JavaScript snippet for conversion tracking, retargeting, and audience insights on LinkedIn Ads campaigns.

Nuxt Scripts provides a registry script composable useScriptLinkedInInsight() to integrate it in your Nuxt app.

LinkedIn Insight Tag

View source

Nuxt Config Setup

Add this to your nuxt.config.ts to load LinkedIn Insight Tag globally. Alternatively you can use the useScriptLinkedInInsight composable for more control.

export default defineNuxtConfig({
  scripts: {
    registry: {
      linkedinInsight: {
        trigger: 'onNuxtReady',
      }
    }
  }
})

This config automatically enables first-party mode (bundle + proxy). See below to customise.

useScriptLinkedInInsight()

The useScriptLinkedInInsight composable lets you have fine-grain control over when and how LinkedIn Insight Tag is loaded on your site.

const { proxy } = useScriptLinkedInInsight()

Please follow the Registry Scripts guide to learn more about advanced usage.

First-Party Mode: Privacy Focused Proxy

No extra config needed. The script is bundled from your domain (faster loads, no extra DNS lookup) and runtime requests are reverse-proxied through your server with automatic anonymisation (user IPs stay hidden from LinkedIn Insight Tag, works with ad blockers). Learn more.

Mode
Bundle Proxy Partytown
Privacy
All identifying data is stripped: IP, user agent, language, screen size, timezone, and hardware fingerprints.
export default defineNuxtConfig({
  scripts: {
    // ✅ First-party mode: bundled + proxied
    registry: {
      linkedinInsight: {
        trigger: 'onNuxtReady',
      },
    },
  },
})

Example

Using LinkedIn Insight Tag in a component with the proxy to send events .

<script setup lang="ts">
const { proxy } = useScriptLinkedInInsight()

// noop in development, ssr
// just works in production, client
function handleAction() {
  // use proxy methods here
}
</script>

<template>
  <div>
    <button @click="handleAction">
      Send Event
    </button>
  </div>
</template>
idstring | string[] required

Your LinkedIn Insight Tag Partner ID, or an array of Partner IDs to push onto window._linkedin_data_partner_ids. The first ID is used as the primary _linkedin_partner_id global.

eventIdstring

Optional page-load event ID for Conversions API deduplication. Assigned to window._linkedin_event_id BEFORE the Insight Tag base code runs. Must match the eventId sent with the corresponding server-side Conversions API event. Per-event conversion deduplication uses the per-call event_id passed to lintrk('track', { conversion_id, event_id }) instead.

enableAutoSpaTrackingboolean = false

Auto-fire lintrk('track') on Vue Router route changes (SPA virtual page views). When true, suppresses the script's built-in auto-page-view via window._wait_for_lintrk and tracks every navigation including the initial page through Nuxt's page:finish hook. When false, the script fires its own page-view exactly once on load and SPA navigations are not tracked unless lintrk('track') is called manually.

Examples

Tracking a conversion

<script setup lang="ts">
const { proxy } = useScriptLinkedInInsight({
  id: '111143',
})

function trackPurchase() {
  proxy.lintrk('track', { conversion_id: 1111111177 })
}
</script>

Per-event deduplication with the Conversions API

When you also send conversions through LinkedIn's server-side Conversions API, pass the same event_id to both. LinkedIn discards the server-side duplicate and counts the Insight Tag event. See LinkedIn deduplication.

<script setup lang="ts">
const { proxy } = useScriptLinkedInInsight({
  id: '111143',
})

function trackSignup() {
  const eventId = crypto.randomUUID()
  proxy.lintrk('track', { conversion_id: 1111111177, event_id: eventId })
  // Send the same eventId to your server-side Conversions API call.
}
</script>

Page-load conversion deduplication

For dedup on the auto-fired page-view, set eventId at registration. The composable assigns window._linkedin_event_id before the Insight Tag base code runs, so the page-view URL includes &eventId=… automatically.

<script setup lang="ts">
const { proxy } = useScriptLinkedInInsight({
  id: '111143',
  eventId: 'page-load-event-id-123',
})
</script>

Enhanced matching with setUserData

Pass plain email; the Insight Tag SHA-256 hashes it on-device. See LinkedIn enhanced matching.

<script setup lang="ts">
const { proxy } = useScriptLinkedInInsight({
  id: '111143',
})

function onSignupSuccess(email: string) {
  proxy.lintrk('setUserData', { email })
}
</script>

The Insight Tag stores the hashed email in localStorage["li_hem"] and transmits it on the next page-view via a separate POST to https://px.ads.linkedin.com/wa/... (the WebsiteActions gateway). The /collect URL of the page-view immediately following setUserData does not carry it; LinkedIn picks it up on the next full page load when the bootstrap reads it back from localStorage.

SPA virtual page views

By default, the Insight Tag fires a page-view exactly once when the script loads, so SPA route changes go untracked. Opt in to per-route tracking with enableAutoSpaTracking:

<script setup lang="ts">
useScriptLinkedInInsight({
  id: '111143',
  enableAutoSpaTracking: true,
})
</script>

When enabled, the composable suppresses the script's built-in auto-page-view (via window._wait_for_lintrk = true) and fires lintrk('track') on Nuxt's page:finish hook instead, so each route (including the initial page) produces exactly one /collect beacon.

Multiple Partner IDs

If you need to push more than one Partner ID onto window._linkedin_data_partner_ids, pass an array. The composable promotes the first ID to the primary _linkedin_partner_id global.

<script setup lang="ts">
useScriptLinkedInInsight({
  id: ['111143', '111154'],
})
</script>