This page describes the user event object, including listing potential user event types, and provides sample data for all user event types.
Media Recommendations uses real-time user events to generate recommendations.
For help with recording user events, see Record real-time user events.
User event types
There are several user event types that you can record as users browse your site:
User event name | User action |
---|---|
view-category-page | Views special pages, such as sale or promotion pages. |
view-item | Views a detail page of a document. |
view-home-page | Views homepage. |
search | Searches the datastore. |
media-play | Clicks play on a media item. |
media-complete | Stops playing a media item. |
For detailed information about the UserEvent object, see UserEvent.
Event type priority
For the highest quality results, we recommend that you record user events for all event types. The following table describes the priority of the different user event types. You must log the highest priority user events to achieve quality data models.
Priority | User Events |
---|---|
Required for initial live experiment | |
Important for improving Media Recommendations model quality over time |
User event requirements and best practices
The following tables list requirements and best practices for user event types that Media Recommendations uses. Check that your user events fulfill these requirements so that Discovery for Media can generate quality results.
Also see User event data requirements, which lists additional requirements depending on the recommendation model type and optimization objective you plan to use.
Discovery for Media requirements
Make sure your user events meet the following requirements so that Discovery for Media can generate quality results.
Event type | Requirement | Impact |
---|---|---|
All events |
Do not include synthetic data or duplicate events. |
Synthetic or duplicate events negatively impact model quality and often prevent successful model training. Duplicate events can cause incorrect metrics values. |
Include at least 100 unique user pseudo IDs for each type of event ingested. |
This ensures Discovery for Media has enough data to generate quality results. |
|
User pseudo IDs must be formatted exactly the same across event import or event recording and in Discovery for Media requests. |
Using a consistent format for user pseudo IDs helps Discovery for Media correctly identify visitor patterns and provide better-quality results based on user behavior. |
|
The |
An event that includes a document without a
|
|
Documents included in the events should exist in your datastore of documents. |
The unjoined events ratio should be kept as low as possible. A high ratio can negatively impact the quality of recommendation results. |
|
Some user events should have the same user pseudo ID. |
To construct valid behavior sequence histories, Discovery for Media must be able to see multiple events with the same user pseudo ID.
For example, |
|
view-item |
Include exactly one document per event. |
The event can't be used if no document exists. If multiple documents are included, the event is malformed and can't be used. |
media-play |
Include exactly one document per event. |
If multiple documents are included, the event is malformed and can't be used. |
User event type examples and schemas
This section provides the data formats for each event type supported by Discovery for Media.
Examples for JavaScript Pixel are provided. For BigQuery, the full table schema for each type is provided.
For all user events types, userId
is optional.
Note that:
- The
tagIds
field is needed only if you are running an A/B experiment. - The
attributionToken
field is optional; it is used to measure performance.view-item
andsearch
events that are generated from Discovery for Media clicks should have an attribution token in order to link the events back to the recommendations that generated them.
For more details about the user event object, see the
UserEvent
API reference documentation.
Category page view
The following shows the view-category-page
user event format.
Minimum required view-category-page object
The following examples show only the required fields of the view-category-page
user event format.
While there is usually only one category associated with a page, the
pageCategories
field also supports a category hierarchy, which you can provide
as a list.
When you import events, you must provide the timestamp in the
eventTime
field in the format specified by
RFC 3339.
Other fields might be required depending on the API method used or if
additional fields are used. For full details of each field and when they are
required, see the UserEvent
API reference documentation.
JavaScript Pixel
var user_event = { "eventType": "view-category-page", "userPseudoId": "user-pseudo-id", "eventTime": "2020-01-01T03:33:33.000001Z", "pageInfo": { "pageCategory": "category1 > category2" } };
BigQuery
This is the complete JSON schema for this user event type. Specify this schema when creating tables for this user event type in BigQuery.
Modes for required fields are set to REQUIRED
or REPEATED
. Modes for
optional fields are set to NULLABLE
.
Note that eventTime
is required for importing events with
BigQuery. eventTime
is a string with a Timestamp format.
[ { "name": "eventType", "type": "STRING", "mode": "REQUIRED" }, { "name": "userPseudoId", "type": "STRING", "mode": "REQUIRED" }, { "name": "eventTime", "type": "STRING", "mode": "REQUIRED" }, { "name": "userInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "userId", "type": "STRING", "mode": "NULLABLE" }, { "name": "userAgent", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "pageInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "pageviewId", "type": "STRING", "mode": "NULLABLE" }, { "name": "pageCategory", "type": "STRING", "mode": "NULLABLE" }, { "name": "uri", "type": "STRING", "mode": "NULLABLE" }, { "name": "referrerUri", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "attributionToken", "type": "STRING", "mode": "NULLABLE" }, { "name": "documents", "type": "RECORD", "mode": "REPEATED", "fields": [ { "name": "id", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "tagIds", "type": "STRING", "mode": "REPEATED" }, { "name": "attributes", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "example_text_attribute", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "text", "type": "STRING", "mode": "REPEATED" } ] }, { "name": "example_number_attribute", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "numbers", "type": "NUMERIC", "mode": "REPEATED" } ] } ] } ]
View-item
The following shows the view-item
user event data format.
Minimum required view-item object
The following examples show only the required fields of the view-item
user event format.
In most cases, documents
contains details for the associated document,
unless a bundle of items are being sold together.
When you import events, you must provide the timestamp in the
eventTime
field in the format specified by
RFC 3339.
Other fields might be required depending on the API method used or if
additional fields are used. For full details of each field and when they are
required, see the UserEvent
API reference documentation.
JavaScript Pixel
var user_event = { "eventType": "view-item", "userPseudoId": "user-pseudo-id", "eventTime": "2020-01-01T03:33:33.000001Z", "documents": [{ "id": "document-id" }] };
BigQuery
This is the complete JSON schema for this user event type. Specify this schema when creating tables for this user event type in BigQuery.
Modes for required fields are set to REQUIRED
or REPEATED
. Modes for
optional fields are set to NULLABLE
.
Note that eventTime
is required for importing events with
BigQuery. eventTime
is a string with a Timestamp format.
[ { "name": "eventType", "type": "STRING", "mode": "REQUIRED" }, { "name": "userPseudoId", "type": "STRING", "mode": "REQUIRED" }, { "name": "eventTime", "type": "STRING", "mode": "REQUIRED" }, { "name": "userInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "userId", "type": "STRING", "mode": "NULLABLE" }, { "name": "userAgent", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "pageInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "pageviewId", "type": "STRING", "mode": "NULLABLE" }, { "name": "uri", "type": "STRING", "mode": "NULLABLE" }, { "name": "referrerUri", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "attributionToken", "type": "STRING", "mode": "NULLABLE" }, { "name": "documents", "type": "RECORD", "mode": "REPEATED", "fields": [ { "name": "id", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "tagIds", "type": "STRING", "mode": "REPEATED" }, { "name": "attributes", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "example_text_attribute", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "text", "type": "STRING", "mode": "REPEATED" } ] }, { "name": "example_number_attribute", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "numbers", "type": "NUMERIC", "mode": "REPEATED" } ] } ] } ]
View-home-page
The following shows the view-home-page
user event format.
Minimum required view-home-page object
The following examples show only the required fields of the view-home-page
user event format.
When you import events, you must provide the timestamp in the
eventTime
field in the format specified by
RFC 3339.
Other fields might be required depending on the API method used or if
additional fields are used. For full details of each field and when they are
required, see the UserEvent
API reference documentation.
JavaScript Pixel
var user_event = { "eventType": "view-home-page", "userPseudoId": "user-pseudo-id", "eventTime": "2020-01-01T03:33:33.000001Z", };
BigQuery
This is the complete JSON schema for this user event type. Specify this schema when creating tables for this user event type in BigQuery.
Modes for required fields are set to REQUIRED
or REPEATED
. Modes for
optional fields are set to NULLABLE
.
Note that eventTime
is required for importing events with
BigQuery. eventTime
is a string with a Timestamp format.
[ { "name": "eventType", "type": "STRING", "mode": "REQUIRED" }, { "name": "userPseudoId", "type": "STRING", "mode": "REQUIRED" }, { "name": "eventTime", "type": "STRING", "mode": "REQUIRED" }, { "name": "userInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "userId", "type": "STRING", "mode": "NULLABLE" }, { "name": "userAgent", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "pageInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "pageviewId", "type": "STRING", "mode": "NULLABLE" }, { "name": "uri", "type": "STRING", "mode": "NULLABLE" }, { "name": "referrerUri", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "attributionToken", "type": "STRING", "mode": "NULLABLE" }, { "name": "documents", "type": "RECORD", "mode": "REPEATED", "fields": [ { "name": "id", "type": "STRING", "mode": "NULLABLE" }, { "name": "quantity", "type": "INT64", "mode": "NULLABLE" } ] }, { "name": "tagIds", "type": "STRING", "mode": "REPEATED" }, { "name": "attributes", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "example_text_attribute", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "text", "type": "STRING", "mode": "REPEATED" } ] }, { "name": "example_number_attribute", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "numbers", "type": "NUMERIC", "mode": "REPEATED" } ] } ] } ]
Search
The following shows the search
user event format.
Minimum required search object
The following examples show only the required fields of the search
user event
format.
At least one of searchQuery
or pageCategory
field is required.
documents
should include the list of document IDs shown to the end user in
the search results page.
When you import events, you must provide the timestamp in the
eventTime
field in the format specified by
RFC 3339.
Other fields might be required depending on the API method used or if
additional fields are used. For full details of each field and when they are
required, see the UserEvent
API reference documentation.
JavaScript Pixel
var user_event = { eventType: "search", userPseudoId: "user-pseudo-id", eventTime: "2020-01-01T03:33:33.000001Z", pageInfo: { pageCategory: "category1 > category2", }, documents: [ { id: "document-id1", }, { id: "document-id2", }, ], searchInfo: { searchQuery: "search-query", }, };
BigQuery
This is the complete JSON schema for this user event type. Specify this schema when creating tables for this user event type in BigQuery.
Modes for required fields are set to REQUIRED
or REPEATED
. Modes for
optional fields are set to NULLABLE
.
Note that eventTime
is required for importing events with
BigQuery. eventTime
is a string with a Timestamp format.
[ { "name": "eventType", "type": "STRING", "mode": "REQUIRED" }, { "name": "userPseudoId", "type": "STRING", "mode": "REQUIRED" }, { "name": "eventTime", "type": "STRING", "mode": "REQUIRED" }, { "name": "pageInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "pageCategory", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "documents", "type": "RECORD", "mode": "REPEATED", "fields": [ { "name": "id", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "searchInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "searchQuery", "type": "STRING", "mode": "NULLABLE" } ] } ]
Media-play
The following shows the media-play
user event format.
Minimum required media-play object
The following examples show only the required fields of the media-play
user
event format.
When you import events, you must provide the timestamp in the
eventTime
field in the format specified by
RFC 3339.
Other fields might be required depending on the API method used or if
additional fields are used. For full details of each field and when they are
required, see the UserEvent
API reference documentation.
JavaScript Pixel
var user_event = { "eventType": "media-play", "userPseudoId": "user-pseudo-id", "eventTime": "2020-01-01T03:33:33.000001Z", "documents": [ { "id": "document-id1" } ] };
BigQuery
This is the complete JSON schema for this user event type. Specify this schema when creating tables for this user event type in BigQuery.
Modes for required fields are set to REQUIRED
or REPEATED
. Modes for
optional fields are set to NULLABLE
.
Note that eventTime
is required for importing events with
BigQuery. eventTime
is a string with a Timestamp format.
[ { "name": "eventType", "type": "STRING", "mode": "REQUIRED" }, { "name": "userPseudoId", "type": "STRING", "mode": "REQUIRED" }, { "name": "eventTime", "type": "STRING", "mode": "REQUIRED" }, { "name": "userInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "userId", "type": "STRING", "mode": "NULLABLE" }, { "name": "userAgent", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "pageInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "pageviewId", "type": "STRING", "mode": "NULLABLE" }, { "name": "uri", "type": "STRING", "mode": "NULLABLE" }, { "name": "referrerUri", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "attributionToken", "type": "STRING", "mode": "NULLABLE" }, { "name": "documents", "type": "RECORD", "mode": "REPEATED", "fields": [ { "name": "id", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "tagIds", "type": "STRING", "mode": "REPEATED" }, { "name": "attributes", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "example_text_attribute", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "text", "type": "STRING", "mode": "REPEATED" } ] }, { "name": "example_number_attribute", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "numbers", "type": "NUMERIC", "mode": "REPEATED" } ] } ] } ]
Media-complete
The following shows the media-complete
user event format.
Minimum required media-complete object
The following examples show only the required fields of the media-complete
user event format.
When you import events, you must provide the timestamp in the
eventTime
field in the format specified by
RFC 3339.
Other fields might be required depending on the API method used or if
additional fields are used. For full details of each field and when they are
required, see the UserEvent
API reference documentation.
JavaScript Pixel
var user_event = { "eventType": "media-complete", "userPseudoId": "user-pseudo-id", "eventTime": "2020-01-01T03:33:33.000001Z", "documents": [ { "id": "document-id1" } ], "mediaInfo": { "mediaProgressDuration": "65s", "mediaProgressPercentage": 1.2 } };
BigQuery
This is the complete JSON schema for this user event type. Specify this schema when creating tables for this user event type in BigQuery.
Modes for required fields are set to REQUIRED
or REPEATED
. Modes for
optional fields are set to NULLABLE
.
Note that eventTime
is required for importing events with
BigQuery. eventTime
is a string with a Timestamp format.
[ { "name": "eventType", "type": "STRING", "mode": "REQUIRED" }, { "name": "userPseudoId", "type": "STRING", "mode": "REQUIRED" }, { "name": "eventTime", "type": "STRING", "mode": "REQUIRED" }, { "name": "userInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "userId", "type": "STRING", "mode": "NULLABLE" }, { "name": "userAgent", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "pageInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "pageviewId", "type": "STRING", "mode": "NULLABLE" }, { "name": "uri", "type": "STRING", "mode": "NULLABLE" }, { "name": "referrerUri", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "attributionToken", "type": "STRING", "mode": "NULLABLE" }, { "name": "documents", "type": "RECORD", "mode": "REPEATED", "fields": [ { "name": "id", "type": "STRING", "mode": "NULLABLE" } ] }, { "name": "tagIds", "type": "STRING", "mode": "REPEATED" }, { "name": "attributes", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "example_text_attribute", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "text", "type": "STRING", "mode": "REPEATED" } ] }, { "name": "example_number_attribute", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "numbers", "type": "NUMERIC", "mode": "REPEATED" } ] } ] }, { "name": "mediaInfo", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "name": "mediaProgressDuration", "type": "STRING", "mode": "NULLABLE" }, { "name": "mediaProgressPercentage", "type": "NUMERIC", "mode": "NULLABLE" } ] } ]
Custom attributes
You can include additional custom attributes and features for user events. This
can result in improved, more specific recommendations for your users when you
use Media Recommendations. To add custom attributes, use
attributes
when you record a user event.
If you provide custom attributes for ingested user events, it's important to also include them in the user events that you associate with recommendation requests. The formatting of custom attributes must be consistent between imported events and events provided with recommendation requests. This lets Discovery for Media use those custom attributes when training models and serving recommendations, which helps improve quality.
You can provide custom text values by using the text
field or custom
numerical values by using the numbers
field.
For example, the following shows the attributes
section from a request
to record a user event:
attributes: { user_age: {text: ["teen", "young adult"]}, user_location: {text: ["CA"]}, user_zip: {numbers: [90210]} }
About user information
userPseudoId
represents the unique user identifier and is required when you
record a user event.
The user information (UserInfo
) included when you record a user
event contains the userPseudoId
value and, if available, the userId
value.
userId
is optional and can be used as
a unique, persistent identifier for a user across devices whenever a user logs
in to your site. When you record the userId
for a user, Discovery for Media
can generate more personalized results for one user across multiple devices,
such as both a mobile device and a web browser.
About the timestamp
When you record a user event, be sure to include an accurate timestamp of when
the event occurred. Accurate timestamps ensure that Discovery for Media
stores events in the correct order. Timestamps are recorded automatically for
events collected using the JavaScript Pixel. When you
import events, you must provide the timestamp in the eventTime
field in the format specified by
RFC 3339.
What's next
- Learn how to record user events.