> 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/property-mappings.md).

# Property mappings

Property mappings let you rename, move or add properties on events before they reach a destination, without writing code. You set them on each connection. They work for both browser and server destinations.

## How it works

Each mapping either copies a value from one path on the event to another path, or adds a fixed text value. Mappings run in order, and each one sees the result of the one before.

Mappings run before functions. A function on a server destination receives the event with every mapping already applied.

## Add a mapping

1. In Chord, go to **CDP** and open the destination's menu on the **Overview** tab.
2. Click **Connect**, or **View Connected Streams** and edit the connection.
3. Find **Property Mappings** and add a mapping.
4. Fill in the fields below, then save the connection.

Each mapping has these fields:

* **Enabled**: turns the mapping on or off without deleting it.
* **Scope**: which events it applies to, such as All Events, Track, Page or Identify. For Track events you can add an **Event Name (optional)**, such as `Order Completed`.
* **Source**: either a **Source Path** on the event, or a **Static Value**.
* **Destination Path**: where Chord writes the value on the event.

### Path syntax

Use dots to reach nested properties:

* `properties.sku` is the `sku` field inside `properties`.
* `context.device.type` is a deeper path.
* `properties.products.0.name` is the name of the first product.

Use `[]` to go through every item in an array:

* `properties.products.[].name` collects the `name` of every product.
* `properties.orders.[].items.[].sku` goes through nested arrays.

### Static values

To add a fixed value, set the source to **Static Value** and type it. This is handy for tagging events, such as marking where they came from.

## Examples

**Rename a property.** Map `properties.sku` to `properties.product_id`.

```json
{
  "event": "Product Viewed",
  "properties": { "sku": "ABC-123", "name": "Blue Widget" }
}
```

becomes

```json
{
  "event": "Product Viewed",
  "properties": { "sku": "ABC-123", "name": "Blue Widget", "product_id": "ABC-123" }
}
```

The original `sku` stays. Mappings copy values. They don't remove the source.

**Go through an array.** Map `properties.products.[].name` to `properties.products.[].title`.

```json
{
  "event": "Order Completed",
  "properties": {
    "products": [
      { "name": "Widget", "price": 9.99 },
      { "name": "Gadget", "price": 24.99 }
    ]
  }
}
```

becomes

```json
{
  "event": "Order Completed",
  "properties": {
    "products": [
      { "name": "Widget", "price": 9.99, "title": "Widget" },
      { "name": "Gadget", "price": 24.99, "title": "Gadget" }
    ]
  }
}
```

**Add a static value.** Map the static value `"chord"` to `properties.source_system`. Every event in the mapping's scope gets `"source_system": "chord"`.

**Limit a mapping to one event.** Set **Scope** to Track and **Event Name** to `Order Completed`. Every other event passes through unchanged.

## When a source path is missing

If the source path isn't on an event, Chord skips that one mapping and logs a warning. The event still goes to the destination with all its other mappings applied.

Where the warning shows depends on the destination:

* Server destinations log it in [Live Events](/activate/event-streaming/live-events.md): `source path "<path>" does not exist on event — mapping skipped`.
* Browser destinations log it in the visitor's browser console. It doesn't show in Live Events.

If you see this warning on many events, use **Scope** to limit the mapping to the events that carry the property. Static values never warn.

## Rules

Chord checks mappings when you save the connection. It won't save if:

* A mapping has neither a source path nor a static value, or has both.
* The destination path is blank.
* The destination path is `type`, `messageId`, `writeKey`, `receivedAt` or `sentAt`. These are protected.
* Two enabled mappings write to the same destination path in the same scope.
* The connection has more than 50 mappings.

## Limits

* Static values are always text. Chord doesn't convert them to numbers.
* Mappings copy values. They can't delete the original.
* Mappings can't branch on a value. Use scope to pick events, or write a [function](/activate/event-streaming/functions.md) for anything more complex.
* Order matters. A later mapping can read what an earlier one wrote.

The **Connections** tab shows a badge for each active mapping. Hover over a badge to see its source and destination paths.


---

# 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/property-mappings.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.
