> For the complete documentation index, see [llms.txt](https://docs.chord.co/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.chord.co/activate/event-streaming/destinations/personalization/ninetailed.md).

# Ninetailed

**Ninetailed** is a personalization and experimentation platform that personalizes content in real time, based on what it learns about each visitor. This destination sends your page, identify and track events from Chord's servers to Ninetailed, to create and update visitor profiles. There is no browser component.

## Getting started

You need two values from your Ninetailed dashboard: your organization ID and the slug of the environment to send events to. Chord does not need the Ninetailed SDK on your storefront for this destination.

## Settings

* **Destination Name** (required): a name to tell this destination apart.
* **Organization ID** (required): the ID of your organization in Ninetailed. You can find it in your Ninetailed dashboard. It is also known as the API key.
* **Environment Slug** (required): the Ninetailed environment to send events to. You can find it in your Ninetailed dashboard. Defaults to `main`.
* **Consent Requirements** (optional): the consent categories a visitor must accept before Chord sends data to this destination. See [Consent](/activate/event-streaming/consent.md).

## Connect

Add **Ninetailed Cloud** from the destination catalog, using the settings above. See [Connect a destination](/activate/event-streaming/connect-a-destination.md) for the full steps.

## Events

Chord sends `page`, `identify` and `track` events. It ignores every other event type, such as `group`.

All `track` events are forwarded under their own name. There is no event-specific mapping.

## What Chord sends

Chord sends each event to Ninetailed as it is, with the changes below. Anything not listed passes through unchanged.

| Chord source (priority order)                        | Ninetailed field                                                    | Notes                                                                                                                 |
| ---------------------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| Fixed value `server`                                 | `channel`                                                           | Every event is marked as coming from the server                                                                       |
| `userId` > `anonymousId`                             | `userId`                                                            | Sent as text. The visitor ID is the anonymous ID when there is no `userId`                                            |
| `anonymousId` > a newly generated ID                 | `anonymousId`                                                       |                                                                                                                       |
| `messageId` > a newly generated ID                   | `messageId`                                                         |                                                                                                                       |
| `timestamp` > the current time                       | `timestamp`                                                         | Sent as an ISO 8601 date and time. The current time is also used if the timestamp can't be read                       |
| Fixed values                                         | `context.library.name`, `context.library.version`                   | Identifies Chord as the sender                                                                                        |
| `context.app.name`, `context.app.version`            | `context.app.name`, `context.app.version`                           | Sent as text, and only when the event has `context.app`. Missing values become empty text                             |
| `context.screen`                                     | `context.screen`                                                    | Passed through, with `name` sent as text. Only when the event has `context.screen`; a missing name becomes empty text |
| `context.page.url` > `properties.url`                | `context.page.url`, and `properties.url` on `page` events           | Empty text when there is no URL                                                                                       |
| `context.page.path`                                  | `context.page.path`, and `properties.path` on `page` events         | `/` when missing                                                                                                      |
| The query string parameters parsed from the page URL | `context.page.query`, and `properties.query` on `page` events       | An empty object when there are none                                                                                   |
| `context.page.referrer` > `properties.referrer`      | `context.page.referrer`, and `properties.referrer` on `page` events | Empty text when missing                                                                                               |
| `context.page.search`                                | `context.page.search`, and `properties.search` on `page` events     | Empty text when missing                                                                                               |

The `context.page` fields are added only when the event has a page URL or path. The `properties` fields are added to every `page` event.

## Errors and retries

If Ninetailed returns a server error (status 500 or higher) or a rate limit error (status 429), Chord retries the event. Other error responses mean the event itself was rejected, so Chord does not retry them. The error is logged. See [Errors and retries](/activate/event-streaming/errors-and-retries.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.chord.co/activate/event-streaming/destinations/personalization/ninetailed.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
