> ## Documentation Index
> Fetch the complete documentation index at: https://www.dataframer.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Fields and Linking

> Name the values your signals and traces share, and choose how they link into journeys

DataFramer groups your signals and AI traces into journeys by the values they share: [fields](#fields) name those values, and the [linking rule](#linking-rule) decides how they group signals and traces.

## Fields

A **field** names one value that your signals and traces carry, such as a questionnaire id, and lists the paths where it is: on events, such as `properties.questionnaire_id`, and on traces, such as `metadata.questionnaire_id`. Find them under **Settings → Events → Fields**. The [linking rule](#linking-rule) and the work types of [Outcome Metering](/docs/outcomes/overview) pick from them.

The first path that has a value is used, so when sources put one value at different paths, for example `properties.plan.tier` from Segment's webhook and `properties.plan_tier` from its warehouse export, list both. A trace without the value reads it from its parent trace.

**Journey id**, the id our [libraries](/docs/user-signals/link-traces) write, and **User** are built in; you can add paths to them but not delete them. Only company admins change fields. Saving new paths for a field counts again the work of each work type that uses it, and links your signals and traces again if the linking rule uses it.

## Linking rule

The linking rule decides which signals and traces belong to the same journey. Choose it under **User Journeys → Linking**; it applies to all of your signals and traces:

* **Link by a field** (the default): a signal and a trace are in the same journey when a field has the same value on both. The default field is **Journey id**. Pick another field to link by a value you already put on both, such as a conversation id, or PostHog's `properties.$session_id` on events and Langfuse's `sessionId` on traces.
* **User and time gap**: each user's signals and traces form one journey until the user is inactive for longer than a gap you set. The user id comes from the **User** field, or from another field you pick.

Under both rules, a signal or trace without a value keeps its journey id, so signals from before login stay out of a user's journeys. Changing the rule also regroups the signals and traces DataFramer already has, within a few minutes.

## Check that it works

Open **User Journeys** in DataFramer. The **Live Events** tab lists accepted and rejected events as they arrive, with the reason for each rejection and the source of each event by name, such as "Library · browser" or "Segment webhook · web app". The **Linking** tab shows how many signals were matched to a trace over the last 30 days, and how many were not.

![The Live Events tab with accepted events from a library and a Segment webhook, each named in the Source column, and a rejected event expanded to show why it was rejected](https://mintcdn.com/aimonlabsinc/qPJ_ItzqzBilymj7/images/user-signals/live-events.png?fit=max\&auto=format\&n=qPJ_ItzqzBilymj7\&q=85\&s=562659d8357f1f4f83984fd7cb86603c)

![The Linking tab with the share of events linked to a trace, waiting for traces, or in journeys with no AI traces over the last 30 days](https://mintcdn.com/aimonlabsinc/qPJ_ItzqzBilymj7/images/user-signals/linking-tab.png?fit=max\&auto=format\&n=qPJ_ItzqzBilymj7\&q=85\&s=be019a7596d789feb30b902ecb8a0640)

## Next steps

> **[User Journeys](/docs/journeys/overview)**
>
> See the resulting journeys and their timelines


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.