---
title: Insider Pixel
slug: insider-pixel
docTags: 
createdAt: 2026-05-05T16:37:07.183Z
---

The **Insider Pixel** destination loads the Insider One Web SDK (`ins.js`) directly in the visitor's browser (device mode) and sends page views, ecommerce events, and user profile updates client-side via `window.InsiderQueue`. Unlike the [server-side Insider One destination](#), device-mode events originate from the browser and are subject to ad blockers, but enable richer client-side context such as session data and browser fingerprinting.

Use this destination alongside the [server-side Insider One destination](#) for maximum coverage.

# Getting Started

This is a device-mode destination. The Insider One Web SDK (`ins.js`) is loaded automatically — no manual script installation is required. You will need:

- **Partner Name** — your Insider partner name (account slug). This is the subdomain used in the SDK URL, e.g. `mystore` in `mystore.api.useinsider.com`. Found in **InOne Panel > Settings > Account Preferences**.
- **Partner ID** *(optional)* — your Insider partner ID. When provided, it is appended as the `id` query parameter on the SDK script URL (`ins.js?id=<partnerId>`).

# Connecting to the Insider Pixel CDP Destination

:::BlockQuote
**Warning:** Before connecting destinations in the Chord CDP, please verify with all Destination owners that all **non-Chord CDP** configured destinations are **disabled**. Running external destinations alongside configured Chord CDP destinations **can result in duplicate events downstream.**
:::

1. Log into the Chord data platform.
2. Navigate to the CDP.
3. Click the **"Add"** button next to Destinations.
4. Select **Insider Pixel** from the destination catalog.
5. Enter the destination name and **Partner Name**.
6. Optionally enter a **Partner ID** if your Insider account requires the `id` parameter on the SDK URL.
7. Click **"Create"** to connect.

# Events

# Event Mapping

| Chord Event Type    | `InsiderQueue` push type             | Notes                                         |
| ------------------- | ------------------------------------ | --------------------------------------------- |
| `identify`          | `user` → `init`                      | Updates user attributes; no event recorded    |
| `page`              | `user` → `other` → `init`            | Sends a generic page view with the page title |
| `track` (ecommerce) | `user` → *(event-specific)* → `init` | See ecommerce event mapping below             |
| `track` (other)     | `user` → `custom_event` → `init`     | Sent as a custom event                        |

Unsupported event types (e.g. `group`, `alias`) are silently dropped.

# Ecommerce Event Mapping

Six Chord ecommerce track event names map to dedicated Insider SDK queue types:

| Chord Event Name      | `InsiderQueue` type | Notes                                                                      |
| --------------------- | ------------------- | -------------------------------------------------------------------------- |
| `Product Viewed`      | `product`           | First product in `properties.products`                                     |
| `Product List Viewed` | `category`          | Category breadcrumb from `properties.category` or first product's category |
| `Cart Viewed`         | `cart`              | Full product list with totals                                              |
| `Product Added`       | `add_to_cart`       | First product in `properties.products`                                     |
| `Product Removed`     | `remove_from_cart`  | First product in `properties.products`                                     |
| `Order Completed`     | `purchase`          | Full product list with order totals                                        |

All other track event names are sent as `custom_event` (see Custom Events below).

# User Data

User data is pushed on **every** event (not only `identify`), so Insider always has the latest profile context regardless of event order.

| `InsiderQueue` user field     | Chord Source (Priority Order)                                   | Notes                                                    |
| ----------------------------- | --------------------------------------------------------------- | -------------------------------------------------------- |
| `uuid`                        | `userId`                                                        | Primary user identifier                                  |
| `email`                       | `context.traits.email` > `traits.email`                         |                                                          |
| `phone_number`                | `context.traits.phone` > `traits.phone` > `traits.phone_number` |                                                          |
| `name`                        | `traits.firstName`                                              |                                                          |
| `surname`                     | `traits.lastName`                                               |                                                          |
| `gender`                      | `traits.gender`                                                 |                                                          |
| `birthday`                    | `traits.birthday`                                               |                                                          |
| `city`                        | `traits.address.city`                                           |                                                          |
| `country`                     | `traits.address.country`                                        |                                                          |
| `language`                    | `traits.locale`                                                 | Hyphens converted to underscores, e.g. `en-US` → `en_US` |
| `custom.segment_anonymous_id` | `anonymousId`                                                   | Always included                                          |

# Identify Events

Identify events push user attributes then trigger an `init` flush:

```javascript
InsiderQueue.push({ type: "user", value: <user object> })
InsiderQueue.push({ type: "init" })
```

See the User Data table above for the full field mapping.

# Page Events

Page events push a generic page view using the `other` queue type:

```javascript
InsiderQueue.push({ type: "user", value: <user object> })
InsiderQueue.push({ type: "other", value: { name: <page title> } })
InsiderQueue.push({ type: "init" })
```

| `InsiderQueue` field | Chord Source (Priority Order)             | Notes                                     |
| -------------------- | ----------------------------------------- | ----------------------------------------- |
| `other.name`         | `properties.title` > `context.page.title` | Page title sent as the `other` event name |

URL and referrer are not included in the queue push — the Insider SDK reads these automatically from the browser.

# Track Events

# Ecommerce Events

Each ecommerce event type pushes a specific SDK payload. Currency is pushed separately when present. See the User Data table above for user field mappings shared across all events.

**Product Viewed (**`product`**&#x20;type)**

Uses the first product from `properties.products`. See the Product Object table below for field mappings.

```javascript
InsiderQueue.push({ type: "user", value: <user object> })
InsiderQueue.push({ type: "currency", value: <currency> })   // if present
InsiderQueue.push({ type: "product", value: <product object> })
InsiderQueue.push({ type: "init" })
```

| `InsiderQueue` field | Chord Source (Priority Order)       | Notes                    |
| -------------------- | ----------------------------------- | ------------------------ |
| `currency`           | `properties.currency`               | Only pushed when present |
| `product.*`          | First item in `properties.products` | See Product Object below |

**Product List Viewed (**`category`**&#x20;type)**

```javascript
InsiderQueue.push({ type: "user", value: <user object> })
InsiderQueue.push({ type: "category", value: { breadcrumb: [<category>] } })
InsiderQueue.push({ type: "init" })
```

| `InsiderQueue` field  | Chord Source (Priority Order)                      | Notes            |
| --------------------- | -------------------------------------------------- | ---------------- |
| `category.breadcrumb` | `properties.category` > first product's `category` | Wrapped in array |

**Cart Viewed (**`cart`**&#x20;type)**

```javascript
InsiderQueue.push({ type: "user", value: <user object> })
InsiderQueue.push({ type: "currency", value: <currency> })   // if present
InsiderQueue.push({ type: "cart", value: { total, items, shipping_cost } })
InsiderQueue.push({ type: "init" })
```

| `InsiderQueue` field | Chord Source (Priority Order)             | Notes                                               |
| -------------------- | ----------------------------------------- | --------------------------------------------------- |
| `currency`           | `properties.currency`                     | Only pushed when present                            |
| `cart.total`         | `properties.total` > `properties.revenue` | Cart subtotal                                       |
| `cart.shipping_cost` | `properties.shipping`                     |                                                     |
| `cart.items`         | `properties.products`                     | Array of product objects — see Product Object below |

**Product Added / Product Removed (**`add_to_cart`**&#x20;/&#x20;**`remove_from_cart`**&#x20;type)**

Uses the first product from `properties.products`. See the Product Object table below for field mappings.

```javascript
InsiderQueue.push({ type: "user", value: <user object> })
InsiderQueue.push({ type: "add_to_cart" | "remove_from_cart", value: <product object> })
InsiderQueue.push({ type: "init" })
```

**Order Completed (**`purchase`**&#x20;type)**

```javascript
InsiderQueue.push({ type: "user", value: <user object> })
InsiderQueue.push({ type: "currency", value: <currency> })   // if present
InsiderQueue.push({ type: "purchase", value: { order_id, total, items, shipping_cost } })
InsiderQueue.push({ type: "init" })
```

| `InsiderQueue` field     | Chord Source (Priority Order)             | Notes                                               |
| ------------------------ | ----------------------------------------- | --------------------------------------------------- |
| `currency`               | `properties.currency`                     | Only pushed when present                            |
| `purchase.order_id`      | `properties.order_id`                     |                                                     |
| `purchase.total`         | `properties.total` > `properties.revenue` | Order total                                         |
| `purchase.shipping_cost` | `properties.shipping`                     |                                                     |
| `purchase.items`         | `properties.products`                     | Array of product objects — see Product Object below |

# Product Object

The product object is used for `product`, `add_to_cart`, `remove_from_cart`, and each item in the `cart` and `purchase` `items` arrays.

| Field               | Chord Source (Priority Order) | Notes                                    |
| ------------------- | ----------------------------- | ---------------------------------------- |
| `id`                | `product_id` > `sku` > `id`   | At least one identifier required         |
| `name`              | `name`                        |                                          |
| `taxonomy`          | `category`                    | Wrapped in array; omitted if not present |
| `unit_sale_price`   | `unit_sale_price` > `price`   | Actual price paid                        |
| `unit_price`        | `unit_price` > `price`        | List/original price                      |
| `quantity`          | `quantity`                    |                                          |
| `url`               | `url`                         |                                          |
| `product_image_url` | `image_url`                   |                                          |

Products without a resolvable ID are filtered out.

# Custom Events

All track events not in the ecommerce map are sent as `custom_event`:

```javascript
InsiderQueue.push({ type: "user", value: <user object> })
InsiderQueue.push({ type: "custom_event", value: [{ event_name, event_parameters }] })
InsiderQueue.push({ type: "init" })
```

| Field                     | Chord Source | Notes                                                        |
| ------------------------- | ------------ | ------------------------------------------------------------ |
| `event_name`              | `event`      | Lowercased, spaces replaced with underscores                 |
| `event_parameters.custom` | `properties` | All properties forwarded as-is; the `meta` field is excluded |

Property keys are not lowercased or aliased for custom events — they are forwarded as received.

# Initialization

On the first event, the plugin:

1. Sets `window.InsiderQueue = window.InsiderQueue || []` to ensure the queue exists before the SDK loads
2. Constructs the SDK URL: `https://<partnerName>.api.useinsider.com/ins.js` — with `?id=<partnerId>` appended if a Partner ID is configured
3. Loads the script via a `<script>` tag injection
4. Tracks SDK loading state (`fresh` → `loading` → `loaded` / `failed`) using `window.__chordCDPInsiderPixelState` to prevent duplicate script loads

Events arriving after the first load reuse the already-loaded SDK. If the script fails to load, subsequent events are silently dropped.

# CSP Requirements

If your site uses a Content Security Policy, allow the following domains:

| Directive     | Domain                         |
| ------------- | ------------------------------ |
| `script-src`  | `https://*.api.useinsider.com` |
| `connect-src` | `https://*.api.useinsider.com` |
| `img-src`     | `https://*.api.useinsider.com` |

# Combining with Server-Side Insider One

Running both Insider Pixel (device mode) and the [server-side Insider One destination](#) provides redundancy:

- **Device mode** captures browser-native session context and sends events directly from the browser
- **Server-side** captures events that may be blocked by ad blockers or occur outside the browser

# Testing and Validation

Because this is a device-mode destination, events are sent directly from the browser — they do not appear in the Chord CDP Live Events tab. Validate using browser developer tools instead.

After connecting the destination:

1. Load your storefront and open browser developer tools (**Network** tab, filter by `useinsider`).
2. Confirm `ins.js` is loaded from `<partnerName>.api.useinsider.com` and the **Initiator** column points to the Chord CDP snippet.
3. In the browser **Console**, inspect `window.InsiderQueue` immediately after page load (before the SDK initializes) to verify queue items are being pushed with the correct `type` and `value` structure.
4. Check the network requests the SDK fires after initialization: `hit` and `insert` for page and user events, `set-purchase-stats` for purchase events.
5. In Insider One, navigate to **InOne Panel > Audience** and verify the user profile was created or updated.

# Troubleshooting

# SDK not loading

**Problem:** The Insider SDK script is not being injected into the page.

- Confirm the destination is enabled in Chord and that your storefront is loading the Chord CDP snippet.
- Verify the **Partner Name** is correct — it must match the subdomain of your Insider account (e.g. `mystore`, not `mystore.api.useinsider.com`).
- Check your browser's Content Security Policy — a missing `script-src` or `connect-src` allowance for `*.api.useinsider.com` will block the script.
- Inspect the browser console for script load errors.

# Events not appearing in Insider One

**Problem:** The SDK loads but events do not appear in the Insider One panel.

- In the browser console, inspect `window.InsiderQueue` before SDK initialization to confirm queue items are being pushed.
- Verify that Insider's Web SDK "new IO mode" (`inioa`) is enabled for your account. The `InsiderQueue` integration requires this to be active — contact Insider support to confirm or enable it.
- Confirm that a `userId` is present on events. Without a UUID, Insider cannot match events to a profile.

# Duplicate profiles

**Problem:** Insider One is creating multiple profiles for the same customer.

- Confirm that events consistently include the same `userId`. Inconsistent identifiers cause Insider to create separate profiles.
- If your store captures both anonymous and logged-in sessions, ensure an identify call is sent when a user logs in.

# Existing Insider pixel conflict

**Problem:** The Insider SDK was already installed directly on the storefront before switching to Chord CDP device mode.

- Remove the native `ins.js` script tag (or tag manager rule) from the storefront. Running both the native pixel and the Chord CDP device-mode destination simultaneously causes duplicate SDK loads and can prevent Chord CDP's queue items from being processed correctly.

***

**Updated 05 May 2026**
