Insider Pixel
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
- Log into the Chord data platform.
- Navigate to the CDP.
- Click the "Add" button next to Destinations.
- Select Insider Pixel from the destination catalog.
- Enter the destination name and Partner Name.
- Optionally enter a Partner ID if your Insider account requires the id parameter on the SDK URL.
- 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 |
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:
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:
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 type)
Uses the first product from properties.products. See the Product Object table below for field mappings.
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 type)
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 type)
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 / remove_from_cart type)
Uses the first product from properties.products. See the Product Object table below for field mappings.
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 type)
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:
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:
- Sets window.InsiderQueue = window.InsiderQueue || [] to ensure the queue exists before the SDK loads
- Constructs the SDK URL: https://<partnerName>.api.useinsider.com/ins.js — with ?id=<partnerId> appended if a Partner ID is configured
- Loads the script via a <script> tag injection
- 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:
- Load your storefront and open browser developer tools (Network tab, filter by useinsider).
- Confirm ins.js is loaded from <partnerName>.api.useinsider.com and the Initiator column points to the Chord CDP snippet.
- 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.
- Check the network requests the SDK fires after initialization: hit and insert for page and user events, set-purchase-stats for purchase events.
- 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