Identity Resolution
Linking information about people and households in private identity graphs

What is Identity Resolution?

Identity resolution is the process of forming identity clusters from identifier profiles that you have loaded into your Optable DCN from your sites, applications, and other sources. The process is automatically and continuously performed by your Optable DCN, and underpins the audience building, insights, and matching capabilities.
Conceptually, identity clusters represent individual people and contain identifiers and traits associated with these. An identity cluster may also reference household identifiers and traits which are shared with other person clusters. See household data below for a description of how household data affects identity resolution.

Matching Logic

ID profiles are matched to identity clusters when they are loaded into your DCN. Two ID profiles are part of the same identity cluster if they describe the same ID or if there is a link between them because at least one of the two appears in the other's neighbors list. A chained list of ID profiles (chained by neighbor links) will get merged into a single identity cluster.
Identity cluster resolution on ID profiles originating from multiple sources

Example

The following two ID profiles and their associated data will be merged into the same identity cluster.
Assuming that the following ID profile is loaded first from source #1:
{
"id": "e:3b2b95279a401a9e27125c588fbe72cda4a2fe9bb551684ea3a11d63be0a63e1",
"neighbors": [
{
"id": "c1:ed1b94a0c6ea1095a439d8399734e47379c204c4fbcf8aeaf6f8594da4e72873"
},
{
"id": "c:0ujsswThIGTUYm2K8FjOOfXtY1K"
}
],
"traits": [
{
"key": "foo",
"value": "1234"
},
{
"key": "bar",
"value": "baz"
}
]
}
and the second ID profile is loaded sometime later from source #2:
{
"id": "c:0ujsswThIGTUYm2K8FjOOfXtY1K",
"traits": [
{
"key": "lorem",
"value": "ipsum"
},
{
"key": "bar",
"value": "blue"
}
]
}
The resulting identity cluster will look like:
{
"ids": [
"c:0ujsswThIGTUYm2K8FjOOfXtY1K",
"c1:ed1b94a0c6ea1095a439d8399734e47379c204c4fbcf8aeaf6f8594da4e72873",
"e:3b2b95279a401a9e27125c588fbe72cda4a2fe9bb551684ea3a11d63be0a63e1"
],
"traits": [
{
"key": "foo",
"value": "1234"
},
{
"key": "lorem",
"value": "ipsum"
},
{
"key": "bar",
"value": "blue"
}
],
"sources": [
1,
2
]
}
Note that the resulting identity cluster contains data from both ID profiles. The list of ids includes all of the identifiers appearing in the ID profile data (including in the neighbors attribute). The traits includes the merged set of traits. For the conflicting trait "bar" the value "blue" from source #2 is selected as described below.
Finally, suppose that a third ID profile is finally loaded from source #3 and looks like:
{
"id": "c2:AA8eBcff01",
"neighbors": [
{
"id": "c:0ujsswThIGTUYm2K8FjOOfXtY1K"
}
],
"traits": [
{
"key": "bar",
"value": "pink"
}
]
}
The updated identity cluster will contain the new ID "c2:AA8eBcff01" as well as the updated trait:
{
"ids": [
"c2:AA8eBcff01",
"c:0ujsswThIGTUYm2K8FjOOfXtY1K",
"c1:ed1b94a0c6ea1095a439d8399734e47379c204c4fbcf8aeaf6f8594da4e72873",
"e:3b2b95279a401a9e27125c588fbe72cda4a2fe9bb551684ea3a11d63be0a63e1"
],
"traits": [
{
"key": "foo",
"value": "1234"
},
{
"key": "lorem",
"value": "ipsum"
},
{
"key": "bar",
"value": "pink"
}
],
"sources": [
1,
2,
3
]
}

Trait Key Conflict Resolution

When ID profiles are joined into an identity cluster and several traits with the same key are specified among the profile records, the last updated value will be selected for the trait added in the associated identity cluster.

When Does Identity Resolution Happen?

Identity resolution happens in real-time for audience activation. A snapshot of all identity clusters is also saved hourly and is processed to support audience insights, exporting, and secure matching.

Identity Resolution Scope and Household Data

By default, all ID profiles describe an individual person's identifiers and traits. This is why all neighboring identifiers are joined together in a single identity cluster representing the individual person. You can also optionally associate household identifiers and traits to person identity clusters by loading household scoped ID profiles.

Household Data Matching Logic

Identity resolution matching logic on household scoped ID profiles is different from the default matching logic described above. For person scoped ID profiles (the default), neighbor-linked IDs get merged into a single identity cluster. However, household ID profiles are ignored during the initial identity cluster resolution process. Instead, once a personal identity cluster is computed, if there are any household ID profiles linked to any of the identity cluster's personal identifiers, the data from these is separately resolved and added to the cluster.
The household ID profiles may be linked directly to one of the personal identity cluster's IDs, or indirectly through other household or personal ID profiles.
A given identity cluster with associated household data will export that data separately from the personal data. Note that the same household data may be added to multiple identity clusters, and that a logical household, formed by the resolution of a set of joined household ID profiles, is therefore shared by one or more identity clusters.
Here's a quick visual overview of identity cluster resolution with a mix of person and household data:
Identity cluster resolution with household and person data

Household Trait Key Conflict Resolution

When a set of joined household ID profiles specifies several values for a single trait key, the last updated value is retained and associated with identity clusters. This is the exact same trait key conflict resolution performed on personal data, just applied separately to the household data.
An identity cluster may have the same trait key specified as both a personal and household trait, possibly with different values. Trait key conflicts are resolved separately for personal and household traits.

Complete Example

It's easiest to understand how personal and household data are treated during identity cluster resolution by looking at an example.
If you first load the following person scoped ID profiles:
{
"id": "e:3b2b95279a401a9e27125c588fbe72cda4a2fe9bb551684ea3a11d63be0a63e1",
"neighbors": [
{
"id": "c:0ujsswThIGTUYm2K8FjOOfXtY1K"
}
],
"traits": [
{
"key": "age",
"value": "28"
}
]
}
and:
{
"id": "e:274e44d98f150bdaff591268419d09f488c22a617e34e15434e5ac1f8db3b216",
"neighbors": [
{
"id": "c:e27125c588fbe72cda4a"
},
{
"id": "r:0b179df0-6cd5-49f1-be21-425d002e0d22"
}
],
"traits": [
{
"key": "age",
"value": "32"
}
]
}
The resulting identity graph structure looks like:
Example person-scoped ID profiles
If you subsequently load the following household scoped ID profiles:
{
"id": "r:0b179df0-6cd5-49f1-be21-425d002e0d22",
"scope": "household",
"neighbors": [
{
"id": "i4:192.168.3.12"
},
{
"id": "e:3b2b95279a401a9e27125c588fbe72cda4a2fe9bb551684ea3a11d63be0a63e1"
}
],
"traits": [
{
"key": "tenure",
"value": "rental"
},
{
"key": "hhi",
"value": "90K"
}
]
}
and:
{
"id": "s:e0ef86a8-6ebf-4c9d-9127-e69407fe748d",
"scope": "household",
"neighbors": [
{
"id": "e:274e44d98f150bdaff591268419d09f488c22a617e34e15434e5ac1f8db3b216"
}
],
"traits": [
{
"key": "hhi",
"value": "125K"
}
]
}
The resulting private ID graph after the household ID profiles have been loaded looks like:
Combined ID profiles: blue indicates person-scope and reddish brown indicates household-scope
Note that the r:0b179df0-6cd5-49f1-be21-425d002e0d22 ID was initially created as a person scoped identifier (blue circle in the first diagram), and was updated to household scope identifier later (reddish brown circle in the second diagram).
The resulting identity clusters will share the same household data. For completeness, here is what they look like:
{
"ids": [
"c:0ujsswThIGTUYm2K8FjOOfXtY1K",
"e:3b2b95279a401a9e27125c588fbe72cda4a2fe9bb551684ea3a11d63be0a63e1"
],
"traits": [
{
"key": "age",
"value": "28"
}
],
"household": {
"ids": [
"r:0b179df0-6cd5-49f1-be21-425d002e0d22",
"s:e0ef86a8-6ebf-4c9d-9127-e69407fe748d",
"i4:192.168.3.12"
],
"traits": [
{
"key": "hhi",
"value": "125K"
},
{
"key": "tenure",
"value": "rental"
}
]
},
"sources": [
1
]
}
and:
{
"ids": [
"c:e27125c588fbe72cda4a",
"e:274e44d98f150bdaff591268419d09f488c22a617e34e15434e5ac1f8db3b216"
],
"traits": [
{
"key": "age",
"value": "32"
}
],
"household": {
"ids": [
"r:0b179df0-6cd5-49f1-be21-425d002e0d22",
"s:e0ef86a8-6ebf-4c9d-9127-e69407fe748d",
"i4:192.168.3.12"
],
"traits": [
{
"key": "hhi",
"value": "125K"
},
{
"key": "tenure",
"value": "rental"
}
]
},
"sources": [
1
]
}
Note that the hhi household trait appearing in each of the resolved identity clusters has been set to the value 125K. This assumes that the last ID profile describing s:e0ef86a8-6ebf-4c9d-9127-e69407fe748d and specifying the 125K value was loaded last into the DCN and therefore took precedence when resolving trait key conflicts at the household level as described here.