> 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/attribution-and-affiliate/retention-com.md).

# Retention.com

Retention.com is a visitor identification and retargeting platform that matches anonymous website visitors to contact records for email and direct mail remarketing. This destination loads the Retention.com pixel in the browser and forwards page views, identify events, order data and product interactions. There is no server-side component.

## Getting started

The Retention.com pixel loads automatically, so you don't install any script yourself. You need your Retention.com site ID. Find it in your Retention.com account settings.

## Settings

* **Destination Name** (required): a name to tell this destination apart.
* **Site ID** (required): your Retention.com site ID. Chord uses it to load the Retention.com tracking pixel.
* **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 **Retention.com** from the destination catalog, using the settings above. See [Connect a destination](/activate/event-streaming/connect-a-destination.md) for the full steps.

## Event mapping

| Chord event                                                           | Retention.com event                                | Notes |
| --------------------------------------------------------------------- | -------------------------------------------------- | ----- |
| `page`                                                                | `geq.page()`                                       |       |
| `identify`                                                            | `geq.suppress(email)`                              |       |
| [`Email Captured`](/collect-data/tracking-plan/email-captured.md)     | `geq.suppress(email)`                              |       |
| [`Order Completed`](/collect-data/tracking-plan/order-completed.md)   | `geq.trackOrder(orderData)`                        |       |
| [`Checkout Started`](/collect-data/tracking-plan/checkout-started.md) | `geq.event("Checkout Started Reclaim", payload)`   |       |
| [`Product Added`](/collect-data/tracking-plan/product-added.md)       | `geq.addToCart(productData)`                       |       |
| [`Product Viewed`](/collect-data/tracking-plan/product-viewed.md)     | `geq.event("Viewed Product Reclaim", productData)` |       |

## Page events

Fires a Retention.com page view call.

**Retention SDK call:** `geq.page()`

No additional attributes are sent with page events.

## Identify events

Suppresses Retention.com anonymous visitor collection for known users. When a user is identified with an email, Retention.com stops collecting anonymous data for that email.

**Retention SDK call:** `geq.suppress(email)`

| Chord source (priority order)                                                            | Retention.com field | Notes                                     |
| ---------------------------------------------------------------------------------------- | ------------------- | ----------------------------------------- |
| `properties.email` > `properties.emailAddress` > `context.traits.email` > `traits.email` | `email`             | The event is skipped if no email is found |

## Email Captured

Suppresses Retention.com collection when an email is captured. This works the same way as identify.

**Retention SDK call:** `geq.suppress(email)`

| Chord source (priority order)       | Retention.com field | Notes                                     |
| ----------------------------------- | ------------------- | ----------------------------------------- |
| `properties.email` > `traits.email` | `email`             | The event is skipped if no email is found |

## Order Completed

Sends an order tracking call to Retention.com. The event is skipped, with a console warning, if `properties.products` is empty.

**Retention SDK call:** `geq.trackOrder(orderData)`

| Chord source (priority order)                                                                               | Retention.com field | Notes                                                                                   |
| ----------------------------------------------------------------------------------------------------------- | ------------------- | --------------------------------------------------------------------------------------- |
| `properties.cart_id` > `properties.cartId` > `properties.order_id` > `properties.orderId` > `properties.id` | `order_number`      | A cart ID wins over an order ID when both are present. Empty string if none is present. |
| `properties.total` > `properties.value` > `properties.price` > sum of product `price × quantity`            | `order_amount`      | Defaults to `0`; converted to string                                                    |
| `properties.email` > `properties.emailAddress` > `context.traits.email` > `traits.email`                    | `order_email`       | Empty string if absent                                                                  |

## Checkout Started

Sends a cart abandonment event using Retention.com's Reclaim feature. It reads cart and line-item data from the event's `properties`.

**Retention SDK call:** `geq.event("Checkout Started Reclaim", payload)`

**Top-level payload fields**

| Chord source (priority order)                                                                               | Retention.com field  | Notes                                 |
| ----------------------------------------------------------------------------------------------------------- | -------------------- | ------------------------------------- |
| `properties.cart_id` > `properties.cartId` > `properties.order_id` > `properties.orderId` > `properties.id` | `cart_id`            | Empty string if none is present       |
| `properties.total` > `properties.value` > `properties.price` > sum of product `price × quantity`            | `cart_amount`        | Defaults to `0`. Converted to string. |
| `properties.currency` > `properties.meta.i18n.currency`                                                     | `currency`           | Defaults to `"USD"`                   |
| `properties.checkout_url` > `properties.checkoutUrl`                                                        | `extra.checkout_url` | Empty string if absent                |

**Per line item (each entry in `properties.products`, sent in `extra.line_items`)**

| Chord source (priority order)                           | Retention.com field          | Notes                                                                    |
| ------------------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------ |
| `product.quantity`                                      | `quantity`                   | Defaults to `1` when absent                                              |
| `product.subtotal` > `product.price × product.quantity` | `line_price`                 | Omitted only if both `subtotal` and `price`/`quantity` are absent        |
| `product.name`                                          | `product.title`              | Omitted if absent                                                        |
| `product.product_id` > `product.id`                     | `product.id`                 | Omitted if absent. `product.id` itself falls back to `sku` or `variant`. |
| `product.url`                                           | `product.url`                | Omitted if absent                                                        |
| `product.price`                                         | `product.price.amount`       | Omitted if absent                                                        |
| `properties.currency`                                   | `product.price.currencyCode` | Defaults to `"USD"`                                                      |
| `product.sku`                                           | `product.sku`                | Omitted if absent                                                        |
| `product.image_url`                                     | `product.image.src`          | Omitted if absent                                                        |

## Product Added

Sends an add-to-cart event. If the event has a root-level `product_id`, `productId`, `sku` or `variant`, Chord reads product data from root-level `properties` and fills any gaps from `properties.products[0]`. Otherwise it uses the first entry in `properties.products`. If that finds no product, Chord reads root-level `id`, `product_id` or `sku` as a last resort. The event is skipped if there is still no product.

**Retention SDK call:** `geq.addToCart(productData)`

| Chord source (priority order) | Retention.com field | Notes                                        |
| ----------------------------- | ------------------- | -------------------------------------------- |
| `product_id` > `sku` > `id`   | `productID`         | Empty string if none is present              |
| `name`                        | `productName`       | Empty string if absent                       |
| `image_url`                   | `imageURL`          | Empty string if absent                       |
| `price`                       | `price`             | Converted to string. Empty string if absent. |
| `url`                         | `url`               | Empty string if absent                       |
| `brand`                       | `brand`             | Empty string if absent                       |
| `window.location.hostname`    | `hostname`          | Set automatically by the browser             |

Each of these is read from root-level `properties`, or from `properties.products[0]`, as described above.

## Product Viewed

Sends a product viewed event using Retention.com's Reclaim feature.

**Retention SDK call:** `geq.event("Viewed Product Reclaim", productData)`

It uses the same attributes as **Product Added** above, and the same rule for choosing the product.

## Custom events

Chord does not send other track events to Retention.com, because Retention.com only acts on the fixed set of events above. Other track events are skipped with a console warning.

## Initialization

Chord loads `https://s3-us-west-2.amazonaws.com/jsstore/a/{siteId}/ge.js` on the first event it receives. It tracks loading state (`fresh` → `loading` → `loaded`/`failed`) to prevent duplicate script loads. Events that arrive while the script is loading are queued and processed after initialization completes. If the script fails to load, later events are silently dropped.

## CSP requirements

If your site uses a Content Security Policy, allow the following domains. `script-src` covers where the SDK file is downloaded from. `connect-src` covers where the SDK sends tracking data at runtime. These are different hosts, and you must allow both.

| Directive     | Domain                                          | Purpose                                                                                                            |
| ------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| `script-src`  | `https://s3-us-west-2.amazonaws.com`            | Downloads `ge.js` (the Retention.com SDK)                                                                          |
| `connect-src` | `https://*.execute-api.us-west-2.amazonaws.com` | Outbound event, order and suppression calls to Retention.com's tracking API                                        |
| `connect-src` | `https://alocdn.com`                            | Per-account configuration fetch                                                                                    |
| `connect-src` | `https://pro.ip-api.com`                        | Geo and VPN validation (only if `enable_geo_check` or `enable_vpn_check` is enabled in your Retention.com account) |
| `connect-src` | `https://a.usbrowserspeed.com`                  | Fingerprint fallback for anonymous visitor resolution                                                              |
| `connect-src` | `https://b-code.liadm.com`                      | LiveIntent identity resolution (only if enabled in your Retention.com account)                                     |

Check this list against your Retention.com account's current configuration. You may need more domains if you have optional features turned on that aren't listed here.


---

# 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/attribution-and-affiliate/retention-com.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.
