Product string (s.products) has for years been one of the most powerful features of Adobe Analytics, but it has its limits. Whenever DMPG implements we always find ourselves jumping through hoops to squeeze the most value out of the feature as possible… with Customer Journey Analytics it’s looking like that’s a thing of the past.
The flexibility baked into CJA allows users to effectively come up with our own custom data model, and if we want to we can run multiple ‘product strings!’
What is s.products in Adobe Analytics anyway?
The product string in Adobe Analytics is powerful because it:
- Allows us to describe more than one individual data entity, products usually, in one tracking server call and get at them individually in the tool for analysis.
- s.products is the only variable which can be used with merchandising eVars (in ‘CJA terms’ these are now called “binding dimensions”, but more on that later.) Binding a merchandising eVar to a product means the description attaches only to that product SKU, and down the line when we have multiple products recorded in a purchase, we can have multiple different values attached to each individual product in the order. This is better than just holding one value in a traditional eVar to describe all products purchased.
Sounds great! What’s the limit then?
Well the main thing is, you can only have ONE of them. You can only have ONE thing that behaves like a “product.” You hit an obvious limit when a data model needs to represent TWO things that need to behave like a product. What if you are:
- A media company where the ‘product’ is both ‘shows’ AND ‘episodes’. The company is interested in understanding engagement on two levels. How do users originally find a ‘show’, then how do they return and work their way through the ‘episodes’?
- A fashion retailer where the ‘product’ is both ‘styles’ AND ‘sizes.’ Each of the individual sizes can be in and out of stock; how can size availability be monitored and understood at “style” level…
- A property developer where the product is both ‘locations/developments’ AND individual ‘houses/plots.’ As you can imagine, both of which need to be ‘sold’ to the customer in a different way and the effectiveness of each approach needs to be understood.
- An insurance aggregator where the ‘product’ needs to be both the risk profile of the customer requesting an insurance quote, AND the individual quotes returned to the customer from insurance partners.
You may be able to tell these are all real life examples taken from the DMPG clientbase. There are halfway solutions that can be conjured to handle all the above in AA, but let’s focus on how these more complex product models are handled in the new CJA world.
How does CJA remove these limitations?
CJA allows us much more flexibility in configuring the data model we use with our collected data, and we can even explore multiple different data models via multiple Data Views.
As for limitation 1) above; tracking multiple values per hit, s.products + list eVars are no longer the only variable types that can hold multiple values. In fact they don’t even exist anymore in CJA. In CJA due to the flexible configuration of schemas, any variable can be configured to receive multiple values in one go. In AEP schemas, arrays can be combined with many different data types during schema creation, e.g. you can have an array of strings (closest to list eVars), objects (closer to s.products). We can effectively run as many list eVars as we want and as many product string style objects as we want…
With respect to limitation 2) above, helpfully we can also now bind a merchandising eVar to ANY variable not just a product name.
Adobe has overviewed this in their documentation on this subject. One of the examples above is grounded in a media company mirroring scenario #1. This is well worth a watch, but doesn’t quite get to the value here – as we’ve unpicked below!
The documented example is based on two different user profiles, searching for different search terms and finding different videos.
The example user journey:
user profile 1 | user profile 1 | user profile 2 | user profile 2 | user profile 1 |
searches | watches video | searches | watches video | watches video |
search-term:"kids show" | show name:"orangey" | search-term: "grownup movie" | show name:"analytics after hours" | show name:"orangey" |
It shows that we can bind a search term to a user profile, so we only attribute video starts made by the user profile to searches made by the same user profile, ignoring search terms that were made by another profile. Here we can compare the 2 resulting approaches and data. Lets try and represent it in a grid as best we can, and document the expected data:
Scenario 1: Standard Non-Binded eVar Configuration Visualisation, less good
user profile 1 | user profile 1 | user profile 2 | user profile 2 | user profile 1 | |
searches | watches video | searches | watches video | watches video | |
search-term:"kids show" | show name:"orangey" | search-term: "grownup movie" | show name:"analytics after hours" | show name:"orangey" | |
Standard Non-Binded eVar Configuration | search-term:"kids show" | > | Search-term:"grownup movie" | > | > |
Resulting Data
Standard Non-Binded eVar Configuration | search term | searches | video starts |
grownup movie | 1 | 2 | |
kids show | 1 | 1 |
Scenario 2: Binding to User Profile Configuration
user profile 1 | user profile 1 | user profile 2 | user profile 2 | user profile 1 | |
searches | watches video | searches | watches video | watches video | |
search-term:"kids show" | show name:"orangey" | search-term: "grownup movie" | show name:"analytics after hours" | show name:"orangey" | |
Standard Non-Binded eVar Configuration | search-term:"kids show" | Search-term:"grownup movie" | |||
V bind to user profile | V bind to user profile | ||||
search term | > "kids show" | > "kids show" | > "grownup movie" | > "grownup movie" | > "kids show" |
user profile | user profile 1 | user profile 1 | user profile 2 | user profile 2 | user profile 1 |
show name:"orangey" | show name:"analytics after hours" | show name:"orangey" |
Resulting Data
Binding to User Profile Data | search term | searches | video starts |
grownup movie | 1 | 1 | |
kids show | 1 | 2 |
But… It’s a bit of a contrived example of this binding that understates the step forward that has been made with CJA. For starters, the example compares the option of binding the search term to the user profile dimension only to the obviously less good option of using a traditional eVar.
In reality you could get pretty much the exact same results in AA today using merchandising eVar functionality, binding to the Show Name. Granted, if two users used the same search term you would run into an issue. I would argue if all users in this App are logged in there is an argument to be made for using “Profile ID” as the Person ID to avoid this anyway – but that’s another subject for another time.
Scenario 3: Binding to Show Name at Video Start (legacy Conversion Syntax merch eVar)
user profile 1 | user profile 1 | user profile 2 | user profile 2 | user profile 1 | |
searches | watches video | searches | watches video | watches video | |
search-term:"kids show" | show name:"orangey" | search-term: "grownup movie" | show name:"analytics after hours" | show name:"orangey" | |
Standard Non-Binded eVar Configuration | search-term:"kids show" | Search-term:"grownup movie" | |||
search term | > | > "kids show" | V | > "grownup movie" | > "kids show" |
show name | V | show name:"analytics after hours" | |||
show name:"orangey" | > | > | show name:"orangey" |
Resulting Data
Binding to User Profile Data | search term | searches | video starts |
grownup movie | 1 | 1 | |
kids show | 1 | 2 |
In any case, in the Adobe example, the user didn’t really discover the 2nd “orangey” video view via search anyway.
Here’s a better example…
What if we set two descriptive dimensions with two different binding scopes.
Dimension 1: Show Finding Method > binds to Show Name dimension “orangey”
Dimension 2: Episode Finding Method > binds to Episode Name dimension “orangey S2, E1, Orangey Turns Green”
CJA allows us the flexibility to set two variables every time someone searches, holding the keyword they used, and bind each one with a different binding dimension.
What this allows us to do is first bind the keyword to the Show Name dimension. This will persist against the Show Name as it won’t change on an episode by episode basis and all future episodes a user views of “orangey” will be attributed to the original search term used to find them.
When a user views another episode of “orangey” with a different title, without using search to find it, the original search term is no longer bound to the episode name and we have a clearer view on how each episode was found – no search term was used in this case.
This to me is the essence of the new unlimited product binding functionality. The ability to draw distinct sticky relationships between any 2 variables, effectively running two product strings or more where in AA currently we can only run one. I am excited about the possibilities for this for all of our clients!
Scenario 4: 2 Separate Dimensions Binding to 2 Dimensions
user profile 1 | user profile 1 | user profile 2 | user profile 2 | user profile 1 | |
searches | watches video | searches | watches video | watches video | |
search-term:"kids show" | show name:"orangey" | search-term: "grownup movie" | show name:"analytics after hours" | show name:"orangey" | |
Binding to Show Name | show-finding:"kids show" | show -finding:"grownup movie" | |||
show finding term | > | > "kids show" | V | > "grownup movie" | > "kids show" |
show name | V | show name:"analytics after hours" | |||
show name:"orangey" | > | > | show name:"orangey" | ||
Binding to Episode Name | episode-finding:"kids show" | episode-finding:"grownup movie" | no search term used | ||
episode finding term | > | > "kids show" | V | > "grownup movie" | |
episode name | V | episode name:"analytics after hours s1 ep2" | |||
episode name: "orangey s1 ep1" | episode name: "orangey s1 ep2" |
Resulting Data
2 Independent Binding Variables Data | show finding term | searches | video starts |
grownup movie | 1 | 1 | |
kids show | 1 | 2 | |
episode finding term | searches | video starts | |
grownup movie | 1 | 1 | |
kids show | 1 | 1 | |
no search term used | 1 |