> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://contentful.com/developers/docs/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://contentful.com/_mcp/server. # Contentsquare plugin > Send relevant events downstream to your customer data platforms or analytics tools. The Contentsquare plugin sends experience impression events to a web instance of Contentsquare by pushing those events to Contentsquare's data layer. ## Installation Install the dependency: #### npm ```bash npm install @ninetailed/experience.js-plugin-contentsquare ``` #### yarn ```bash yarn add @ninetailed/experience.js-plugin-contentsquare ``` Then, add the plugin to the Ninetailed instance: #### React, Next.js ```jsx import { NinetailedContentsquarePlugin } from '@ninetailed/experience.js-plugin-contentsquare'; ``` ```jsx //... ``` #### Gatsby ```javascript plugins: [ // ... { resolve: `@ninetailed/experience.js-gatsby`, options: { // ... componentViewTrackingThreshold: 2000, // (Optional prop) Number, default = 2000 ninetailedPlugins: [ { resolve: `@ninetailed/experience.js-plugin-contentsquare`, options: {} } ] } } ] ``` #### JavaScript ```javascript import { Ninetailed } from '@ninetailed/experience.js'; import { NinetailedContentsquarePlugin } from '@ninetailed/experience.js-plugin-contentsquare'; export const ninetailed = new Ninetailed( { clientId: // Your client ID environment: // Your Ninetailed environment }, { plugins: [ new NinetailedContentsquarePlugin(); ], // Specify an amount of time (ms) that a component must be present in the viewport to register a component view componentViewTrackingThreshold: 2000, } ); ``` ## Timing configuration The Contentsquare Plugin logs that an element has been seen only after the element has remained within the user's viewport for a specified amount of time (in milliseconds), determined by the value of the `componentViewTrackingThreshold` property on the Ninetailed instance (see code samples above). If the option is unspecified, the value defaults to `2000`. ## Default data layer properties Events sent from this plugin are named `nt_experience`. They are sent with the following default properties: | Parameter | Value Type | Value Description | | ---------- | ---------- | -------------------------------------- | | experience | String | Experience ID of the experience | | variant | String | "control", "variant 1", "variant 2", … | | audience | String | CMS entry ID of the audience | | component | String | CMS entry ID of the shown variant | ## Custom event properties You can also define your own variables to push to Contentsquare's data layer on each event by passing in a configuration object when instantiating the plugin. To do so, define a config object with a `template` property whose value is an object consisting of key-value pairs, where the key is the name of the property you want to add to the Contentsquare data layer and the value is a string of the desired variable value surrounded by double curly braces (`{{ }}`). ### Available properties | Property | Notes | | -------------------------- | ------------------------------------------------------------------------------------------------- | | experience.id | | | experience.type | `nt_experiment` or `nt_personalization` | | experience.name | | | experience.description | | | audience.id | `ALL_VISITORS` if not set | | audience.name | `All Visitors` if not set | | audience.description | | | selectedVariant | | | selectedVariant.YOUR\_PROP | Specify any property key from the selected experience variant | | selectedVariantIndex | 0, 1, 2, etc. | | selectedVariantSelector | "control", "variant 1", "variant 2", etc. This is a mapping of `selectedVariantIndex` from above. | ### Example custom use This example shows passing the human-readable name of an audience to a custom data layer property titled `ninetailed_audience_name`. The default data layer properties are also pushed. #### React, Next.js ```jsx //... ``` #### Gatsby ```javascript plugins: [ // ... { resolve: `@ninetailed/experience.js-gatsby`, options: { // ... componentViewTrackingThreshold: 2000, ninetailedPlugins: [ { resolve: `@ninetailed/experience.js-plugin-contentsquare`, options: { template: { ninetailed_audience_name: '{{ audience.name }}', } } } ] } } ] ``` #### JavaScript ```javascript import { Ninetailed } from '@ninetailed/experience.js'; import { NinetailedContentsquarePlugin } from '@ninetailed/experience.js-plugin-contentsquare'; export const ninetailed = new Ninetailed( { clientId: // Your client ID environment: // Your Ninetailed environment }, { plugins: [ new NinetailedContentsquarePlugin({ template: { ninetailed_audience_name: '{{ audience.name }}', }, }); ], // Specify an amount of time (ms) that a component must be present in the viewport to register a component view componentViewTrackingThreshold: 2000, } ); ``` > Send relevant events downstream to your customer data platforms or analytics tools.