---
title: Northbeam
slug: northbeam
createdAt: 2025-12-12T20:59:04.818Z
---

**Northbeam** is a marketing attribution and analytics platform that provides multi-touch attribution and media mix modeling. This destination sends order and refund events server-side from Chord CDP to the Northbeam Orders API. There is no device-mode component.

# Getting Started

This is a cloud-mode destination. You will need:

- **API Key** — found in your Northbeam dashboard under **Settings > API Keys**.
- **Data Client ID** — a UUID identifying your account, found in your Northbeam dashboard under **Settings > API Keys**.

Optionally:

- **Test Mode** — when enabled, events are sent to Northbeam's UAT environment instead of production. Defaults to `false`.

# Connecting to the Northbeam 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 **Northbeam** from the destination catalog.
5. Enter the destination name, **API Key**, and **Data Client ID**.
6. Optionally enable **Test Mode** during initial setup.
7. Click **"Create"** to connect.

# Events

# Event Mapping

| Chord Event       | Northbeam Action          | Notes |
| ----------------- | ------------------------- | ----- |
| `Order Completed` | Create order              |       |
| `Order Refunded`  | Create order with refunds |       |

All other events (page, identify, and other track events) are silently skipped.

# Order Completed

Sends an order to the Northbeam Orders API. The event is skipped if required fields are missing.

## Order Attributes

| Northbeam Attribute | Chord Source (Priority Order)                                | Notes                                       |
| ------------------- | ------------------------------------------------------------ | ------------------------------------------- |
| `order_id`          | `properties.order_id`                                        | **Required**                                |
| `customer_id`       | `userId` > `properties.customer_id`                          | **Required**                                |
| `customer_email`    | `properties.email` > `context.traits.email` > `traits.email` | **Required**                                |
| `time_of_purchase`  | `timestamp`                                                  | ISO 8601 format; falls back to current time |
| `purchase_total`    | `properties.total` > `properties.revenue`                    | Defaults to `0`                             |
| `currency`          | `properties.currency`                                        | Defaults to `"USD"`                         |
| `tax`               | `properties.tax`                                             | Defaults to `0`                             |
| `shipping_cost`     | `properties.shipping`                                        | Defaults to `0`                             |

## Product Attributes

Each product in `properties.products[]` is required. Each product must have an `id` and `name`.

| Northbeam Attribute | Chord Source (Priority Order)                                                                         | Notes                                                      |
| ------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
| `id`                | `properties.products[].product_id` > `properties.products[].sku`                                      | **Required**                                               |
| `name`              | `properties.products[].name`                                                                          | **Required**                                               |
| `quantity`          | `properties.products[].quantity`                                                                      | Defaults to `1`                                            |
| `price`             | `properties.products[].price`                                                                         | Defaults to `0`; coerced to number (accepts string values) |
| `variant_id`        | `properties.products[].variant_id` > `properties.products[].product_id` > `properties.products[].sku` | Always present                                             |
| `variant_name`      | `properties.products[].variant` > `properties.products[].name`                                        | Always present                                             |

# Order Refunded

Sends a refund to the Northbeam Orders API as an order payload with a `refunds` array. The event is skipped if required fields are missing.

## Order Attributes

Same as **Order Completed** above, except `time_of_purchase` prefers `properties.original_timestamp` over `timestamp` to preserve the original order date.

## Refund Attributes

The destination checks for an explicit `properties.refunds[]` array first. If not present, it falls back to `properties.products[]` and treats all products as fully refunded.

**From&#x20;**`properties.refunds[]`**&#x20;(preferred):**

| Northbeam Attribute | Chord Source (Priority Order)                                                                       | Notes                       |
| ------------------- | --------------------------------------------------------------------------------------------------- | --------------------------- |
| `product_id`        | `properties.refunds[].product_id`                                                                   | **Required**                |
| `variant_id`        | `properties.refunds[].variant_id`                                                                   |                             |
| `quantity`          | `properties.refunds[].quantity`                                                                     | Defaults to `1`             |
| `refund_amount`     | `properties.refunds[].refund_amount` > `properties.refunds[].amount` > `properties.refunds[].price` | **Required**                |
| `refund_cost`       | `properties.refunds[].refund_cost`                                                                  | Defaults to `refund_amount` |
| `refund_made_at`    | `properties.refunds[].refund_made_at` > `timestamp`                                                 | ISO 8601 format             |

**From&#x20;**`properties.products[]`**&#x20;(fallback):**

| Northbeam Attribute | Chord Source (Priority Order)                                                                         | Notes           |
| ------------------- | ----------------------------------------------------------------------------------------------------- | --------------- |
| `product_id`        | `properties.products[].product_id` > `properties.products[].sku`                                      |                 |
| `variant_id`        | `properties.products[].variant_id` > `properties.products[].product_id` > `properties.products[].sku` |                 |
| `quantity`          | `properties.products[].quantity`                                                                      | Defaults to `1` |
| `refund_amount`     | `properties.products[].price` × `properties.products[].quantity`                                      | Calculated      |
| `refund_made_at`    | `timestamp`                                                                                           |                 |

# Validation

Both event types are validated before sending. Required fields:

**Order Completed:** `order_id`, `customer_id`, `customer_email`, non-empty `products[]` with each product having `id` and `name`.

**Order Refunded:** `order_id`, `customer_id`, `customer_email`, non-empty `refunds[]` with each refund having `product_id` and `refund_amount`.

# Testing and Validation

After connecting the destination, use the browser console and CDP Live Events to verify behavior. No access to the Northbeam dashboard is required.

**Order Completed — happy path**

```js
window.chord.track("Order Completed", {
  order_id: "TEST-001",
  email: "test@example.com",
  total: 89.97,
  tax: 7.00,
  shipping: 5.99,
  currency: "USD",
  products: [
    {
      product_id: "PROD-001",
      name: "Classic T-Shirt",
      price: 29.99,
      quantity: 2,
      variant_id: "VAR-001-BLK-M",
      variant: "Black / Medium"
    }
  ]
});
```

In CDP Live Events, confirm:

- A **Northbeam Request Payload** `INFO` log appears containing the full transformed payload and `messageId`
- A `200` or `201` response log follows

**Order Completed — sku-only product (no variant fields)**

```js
window.chord.track("Order Completed", {
  order_id: "TEST-002",
  email: "test@example.com",
  total: 103.00,
  currency: "USD",
  products: [
    { sku: "RVTTG50", name: "REVERSE Tone Correcting Treatment", price: 103, quantity: 1 }
  ]
});
```

In CDP Live Events, confirm:

- The payload log shows `id: "RVTTG50"`, `variant_id: "RVTTG50"`, `variant_name: "REVERSE Tone Correcting Treatment"` (all falling back from `sku` and `name`)
- No warnings are logged

**Order Refunded**

```js
window.chord.track("Order Refunded", {
  order_id: "TEST-001",
  email: "test@example.com",
  refunds: [
    {
      product_id: "PROD-001",
      quantity: 1,
      refund_amount: 29.99
    }
  ]
});
```

In CDP Live Events, confirm the payload log shows a `refunds` array with the correct `refund_amount`.

***

**Updated 29 Apr 2026**
