Unified Profile Service and Unified Identity Service
23 Nov 2025 » Platform
If you have been following my posts, you now understand the concept of profile projection, and the roles of the Unified Identity Service (UIS) and the Unified Profile Service (UPS). However, for others who are not familiar with these concepts, I am going to explain them from a different angle.
As usual, since I have been writing about the Adobe Experience Platform (AEP), I will use the following diagram as reference:
And just to set the stage, today I will describe the “Profile Store” and the “Identity Store” boxes in the previous diagram.
Unified Profile Service
This is the simplest of the two, but before I get into the details, I will start by explaining what it is not. It is very tempting to think that this is a relational database where each row corresponds to a profile, with the columns being the schema parameters. Let me assure you that this is not the case. There is no SQL database behind the scenes, nor are we issuing SELECTs, UPDATEs or INSERTs. If this were the case, profile collapses would be totally unsolvable, whereas in reality, there are various solutions.
Instead, you have to think of UPS as a store of fragments, which behaves as follows based on the type of dataset:
- Profile datasets: it keeps the last update received from the data source, for each primary identity.
- Events datasets: it keeps all events whose TTL has not been reached.
All these fragments are keyed by their primary identity. Think of it as a key-value pair database, where the key is the primary identity and the value is an array of fragments. This is why it is so important to decide on the primary identity in a schema: it will be the key used to find fragments in UPS. The same applies to the primary field in the identityMap.
You can also see how time plays a role: as new profile fragments are received from data sources, previous fragments are deleted, and every day, events whose TTL has been reached are deleted. Remember that the Data Lake keeps all data until the batch is deleted.
I want you to pause and see how in this database, a fully formed profile is nowhere to be found. All you have are scattered pieces of information.
Unified Identity Service
Now that we have all the previous fragments, how do we know which need to be combined to project a profile?
If there is only one identity involved, the solution is simple. However, in scenarios where there are multiple identities associated with a single profile, we need a place to store linked identities. This is the role of the UIS. Think of it as a specialized storage that keeps track of namespaces, identities, and links between identities. I like how HubSpot depicts this identity graph:
In AEP, you can view many details of UIS in the “Identities” menu:
While UPS cares only about primary identities, UIS wants to know about additional identities, those not marked as primary. As records are ingested from data sources, UIS takes the following steps:
- Checks that the primary identity is present; if it is not, rejects the record.
- If there is an additional identity:
- If the identity is already in another graph in the database, both graphs will be collapsed into a single graph.
- If the identity is new, it will be added to the store and linked to the primary identity in the record.
You will have noticed in the screenshot above that the minimum size of the identity graph is 2. Although you could have, theoretically, a graph with just one node, it does not make sense to store it. Only when two or more nodes are required is a graph created. As a consequence, 2.b above may also create a new graph.
UIS keeps track of where the links between identities came from and when these links were stored in the graph. This key feature has two consequences:
- If you delete a dataset or a batch in a dataset, all links between identities that were formed from this dataset or batch will be deleted. I have built solutions around this capability to un-collapse profiles.
- The Identity Graph Linking Rules feature could be implemented, as it can detect the age of a link between identities.
Where is the Profile?
So, we have fragments and identity graphs, not profiles. However, we always talk about a profile. How do we get it?
I will not explain it here, as I wrote a blog post where I described the process step by step: profile projection. I recommend that, if you have not read it, you do so now. Both posts will make a lot of sense when read together.


