Copyright © IBM Corporation 2012. This document is available under the W3C Document License. See the W3C Intellectual Rights Notice and Legal Disclaimers for additional information.
This specification describes a method for surfacing Customer Experience Digital Data on a Web/Digital resource as a set of JavaScript Objects, and also specifies the parameters for communicating this data to digital analytic and reporting servers.
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications can be found in the W3C technical reports index at http://www.w3.org/TR/.
This document is the Customer Experience Digital Data Acquisition 1.0 Submission.
By publishing this document, W3C acknowledges that the Submitting Members have made a formal Submission request to W3C for discussion. Publication of this document by W3C indicates no endorsement of its content by W3C, nor that W3C has, is, or will be allocating any resources to the issues addressed by it. This document is not the product of a chartered W3C group, but is published as potential input to the W3C Process. A W3C Team Comment has been published in conjunction with this Member Submission. Publication of acknowledged Member Submissions at the W3C site is one of the benefits of W3C Membership. Please consult the requirements associated with Member Submissions of section 3.3 of the W3C Patent Policy. Please consult the complete list of acknowledged W3C Member Submissions.
Collection and analysis of visitor behavioral and demographic data has become an integral part of web design and website success. This data is central to site performance analysis, dynamically tailoring site content to visitor activity and interest and retargeting visitors based on behaviors.
Increasingly, multiple vendors are involved in the data collection process on a given digital property, and each has a solution that needs to be implemented on the web page. As a result, page design has become more complex and development cycles lengthen as different requirements for data surfacing and formatting are added to the design process. Furthermore, changing or adding vendors typically requires that the client development team change the page design to accommodate vendor requirements. The common data items must be continually surfaced in different ways for different vendors and each design requirement is a custom effort, contributing to the lengthening development cycles. Clients are searching for a simpler, flexible and standard method to surface this common data on the web page and across their digital properties.
Terminology is based on W3C's Architecture of the World Wide Web [WEBARCH] and Hyper-text Transfer Protocol [RFC2616]
Customer Experience digital data items that are tracked and captured by different vendors are commonly understood elements used in digital analytics, but vendor specific format requirements and code assignments create design complexity and vendor dependency in site design.
As a simple instance, vendorA may capture some digital data for page details as a concatenation of ‘PageID + PAGENAME + PAGECATEGORY' while vendor B may capture the same through distinct variables vendorB.page.pageId, vendorB.page.pageName, vendorB.page.pageCategory. Further, the names of the variables, the data structure name & types and methods of extensibility all vary on a per-vendor basis. Frequently, custom code must be written to capture data to meet a given vendor's requirements.
Cumulatively, differences of this type between vendors permeate across all relevant customer experience digital data objects including Order, Shopping Cart, Registrant and more, increasing the complexity of customer experience digital data management at the site.
To this end, a Standard data object that represents the common data elements in a standard way will allow development teams to implement standard design structures that populate the Standard data object. Vendor code placed on the page would reference that standard structure, simplifying the process of on-boarding or changing vendors, and shaving off expensive development cycles.
The proposed Standard data object is a JavaScript object because of ubiquitous support for JavaScript in web browsers and web based applications, as well as in other forms of digital properties like mobile & kiosks and so forth.
The use of a JavaScript object means that the data is not embedded in the html markup and would not affect page registration or performance. Developers would only need to populate the data fields in the object that are applicable to the page, keeping the size and complexity of the object to a minimum. That coding would never change regardless of page requirements vis-a-vis vendor additions or deletions unless new data elements were required. Because the data is a standard object, vendors who recognize the object would provide code that references that object, requiring no modification of the page other than to drop the vendor code container onto the page.
This standard will thus yield a shorter development cycle using fewer resources and there will be a savings to the client in time and money. The addition or deletion of vendors will be independent of considerations of page redesign, allowing decisions to be made based on vendor efficacy rather than cost of migration.
Conformance is defined in accordance with the use of the words MUST, MUST NOT, SHOULD, SHOULD NOT, MAY and RECOMMENDED as described in RFC 2119 [RFC2119] .
This section details the JavaScript Object structure to be used whenever the corresponding data value needs to be surfaced.
This section is normative
The root JavaScript Object (JSO) MUST be digitaldata
, and all data elements used in web analytics MUST derive off of this JavaScript Object either directly
or indirectly.
This section is normative
Page Identifier is among the most widely used web analytic data element, and is among the top level web analytic objects. A Page Identifier MUST have the
following Object Name & Type.
Object Name | Type | Comment |
---|---|---|
digitaldata.PageIdentifier |
String |
Page Identifier indicating stage of production |
This section is normative
Page Details Object carries significant details about the page, and the most commonly used data elements are captured by the specification below. Page
Details MUST have the following Object Name & Type.
Object Name | Type | Comment |
---|---|---|
digitaldata.page.pageid |
String |
Page ID |
digitaldata.page.pagename |
String |
PageName |
digitaldata.page.pagecategory |
String |
Page Category |
digitaldata.page.searchterm |
String |
Internal Search Term |
digitaldata.page.searchresult |
Integer |
Number of Internal Search Results |
digitaldata.page.destinationurl |
String |
Destination URL |
digitaldata.page.referringurl |
String |
Referring URL |
digitaldata.page.breadcrumb[n] |
String Array(n) |
Bread Crumb – hierarchical identifier |
digitaldata.page.attributes[n] |
String Array(n) |
Additional dimensions to page details |
This section is normative
Product Object carries details about a particular product with frequently used attributes listed below. Product Object MUST have the following Object Name
& Type.
Object Name | Type | Comment |
---|---|---|
digitaldata.product.productid |
String |
Product Id |
digitaldata.product.productname |
String |
Product Name |
digitaldata.product.sku |
String |
Product Sku |
digitaldata.product.categoryid |
String |
Product Category |
digitaldata.product.attributes[n] |
String Array(n) |
Additional dimensions to a product |
This section is normative
Cart Object carries details about items in cart. ‘Items' is an array under Cart Object. Cart Object MUST have the following Object Name & Type.
Object Name | Type | Comment |
---|---|---|
digitaldata.cart.items[n] |
Array |
Cart Line Items |
digitaldata.cart.items[n].productid |
String |
Product ID |
digitaldata.cart.items[n].productname |
String |
Product Name |
digitaldata.cart.items[n].categoryid |
String |
Product Category |
digitaldata.cart.items[n].quantity |
Integer |
Product Quantity |
digitaldata.cart.items[n].baseprice |
Number |
Product Base Price |
digitaldata.cart.items[n].attributes[n] |
String Array (n) |
Additional dimensions |
This section is normative
Order Object consists of Order Object and the Products and Address sub Objects. Order Object and the sub objects of Products and Address MUST have the
following Name& Type.
Object Name | Type | Comment |
---|---|---|
digitaldata.order.orderid |
String |
Order Number |
digitaldata.order.ordersubtotal |
Number |
Order Total |
digitaldata.order.currencycode |
String |
Currency Conversion Code |
digitaldata.order.registrationid |
String |
Customer ID |
digitaldata.order.address.line1 |
String |
Customer Address Line 1 |
digitaldata.order.address.line2 |
String |
Customer Address Line 2 |
digitaldata.order.address.city |
String |
Customer City |
digitaldata.order.address.state_province |
String |
Customer State/Province |
digitaldata.order.address.postalcode |
String |
Customer Zip/Postal Code |
digitaldata.order.address.country |
String |
Customer Country |
digitaldata.order.shippingaddress.line1 |
String |
Customer Shipping Address Line 1 |
digitaldata.order.shippingaddress.line2 |
String |
Customer Shipping Address Line 2 |
digitaldata.order.shippingaddress.city |
String |
Customer Shipping City |
digitaldata.order.shippingaddress.state_province |
String |
Customer Shipping State/Province |
digitaldata.order.shippingaddress.postalcode |
String |
Customer Shipping Zip/Postal Code |
digitaldata.order.shippingaddress.country |
String |
Customer Shipping Country |
digitaldata.order.shippingcharges |
Number |
Shipping Charges |
digitaldata.order.salestax |
Number |
Sales Tax |
digitaldata.order.attributes[n] |
String Array (n) |
Additional dimensions to an Order |
digitaldata.order.items[n] |
Array |
Order Line Items |
digitaldata.order.items[n].productid |
String |
Order Line Item Product ID |
digitaldata.order.items[n].productname |
String |
Order Line Item Product Name |
digitaldata.order.items[n].categoryid |
String |
Order Line Item Product Category ID |
digitaldata.order.items[n].quantity |
Integer |
Order Line Item Product Quantity |
digitaldata.order.items[n].baseprice |
Number |
Order Line Item Product Base Price |
digitaldata.order.items[n].attributes |
String |
Additional dimensions to an Item |
This section is normative
A registrant is a visitor who logs in or registers at the site, sharing additional information during the process. Analytic data details related to a
Registrant MUST be captured in the following Object Name & Type.
Object Name | Type | Comment |
---|---|---|
digitaldata.registrant.Registrantid |
String |
Registrant ID |
digitaldata.registrant.email |
String |
Email Address |
digitaldata.registrant.address.line1 |
String |
Registrant Address Line 1 |
digitaldata.registrant.address.line2 |
String |
Registrant Address Line 2 |
digitaldata.registrant.address.city |
String |
Registrant City |
digitaldata.registrant.address.state_province |
String |
Registrant State/Province |
digitaldata.registrant.address.postalcode |
String |
Registrant Zip/Postal Code |
digitaldata.registrant.address.country |
String |
Registrant Country |
digitaldata.registrant.attributes[n] |
String Array (n) |
Additional dimensions |
This section is normative
Element identifies specific objects on a Page such as flash movies, videos, portlets and similar content.
Typically used for tracking dynamic elements of page content. The Analytic data object MUST have the following
Object Name & Type to surface this information.
Object Name | Type | Comment |
---|---|---|
digitaldata._elements._element[n].elementid |
String |
Element ID |
digitaldata._elements._element[n].elementcategory |
String |
Element Category |
digitaldata._elements._element[n].attributes |
String |
Additional dimensions |
This section is normative
This object populates event tags on a page and is used to track an event that has a start
and stop - for example, an application, a submission or an event that should be tracked
separately from content. This object tracks non-mercantile transactions; mercantile
transactions are tracked usd the differential between the cart and order object.
Event objects MUST follow the name & type indicated below.
Object Name | Type | Comment |
---|---|---|
digitaldata._events._event[n].eventid |
String |
Event ID |
digitaldata._ events._event [n].eventcategory |
String |
Event Category |
digitaldata._ events._event [n].eventaction |
Integer |
Event Action |
digitaldata._ events._event [n].eventpoints |
Integer |
Event Points |
digitaldata._ events._event [n].attributes |
String |
Additional dimensions |
This section is normative
Extensions or custom analytic data locations may sometimes be needed to collect unique, vendor or client-specific data that is not part of the standard.
It is RECOMMENDED that all extensions or custom digital data locations be derived from the root digitaldata
object, with a custom.companyid
added at
the level of the hierarchy where the extension or custom field is being added.
For instance, to add some custom digital data fields, the object would look like:
Object Name | Comment |
---|---|
digitaldata.page.custom.ibm.extrafields |
Extending Page Details Object |
digitaldata.custom.ibm._generaltags_generaltag[n].linenumber |
Extending Root Object |
digitaldata.custom.ibm._ generaltags_generaltag [n].attributes[n1] |
Extending Root Object |
The fields after custom.companyid
are completely unique to the vendor/client requirements.
This section is informative
Product Detail Page
To surface data for a typical product detail page using the JavaScript object we would instantiate the standard page related digital data values as well as data for the individual product displayed: digitaldata = { page: {pageid:'PRODUCT:PRODUCTNAME(PRODUCTID)', categoryid:'categoryid', searchterm:'', searchresults:''},
product: {productid:'productid', productname:'productname', categoryid:'categoryid'} }
Shopping Cart
This example creates the data object for a typical web cart. Analytics page information is created as well as entries for each of the products carted. digitaldata= {cart: {items: new Array()}, page: {pageid:'CART', categoryid:'CART', searchterm:'', searchresults:''} }; var counter=0; for (counter=0; counter<=1;counter++ ) {digitaldata.cart.items[counter] = {productid:'productid'+counter, productname:'productname'+counter, quantity:'1', baseprice:'99.99', categoryid:'categoryid'} };
Order Page
A typical order thank you page is very similar to a cart page but will typically collect information about the customer. In this example, page information, order information, customer information and individual information on purchased items are collected. digitaldata= { order: {orderid:'123456', ordersubtotal:'199.98', shippingcharges:'10', registrationid:'registrationid', address:{city:'austin',state_province:'tx',postalcode:'78759'}, {items: new Array()}, page:{pageid:'ORDER CONFIRMATION', categoryid:'ORDERCONFIRMATION', searchterm:'', searchresults:''}, registrant:{registrationid:'registrationid', email:'email@address.com', address:{city:'austin',state_province:'tx',postalcode:'78759',country:'us'} } }; var counter=0; for (counter=0;counter<=1;counter++ ) {digitaldata.order.items[counter] = {productid:'productid'+counter, productname:'productname'+counter, quantity:'1', baseprice:'99.99', categoryid:'categoryid', } }
This section is normative
This section details the parameter list used for communicating Customer Experience Digital Data to the analytic servers. Data is typically communicated as
parameters on an Http GET request, and so the parameter list would show up as:
http://datadomain.com?pi=pageID&cg=categoryID
In the table below, the first column carries the standard names of the parameters; these names are terse to accommodate length limitations on HTTP requests, though newer browsers are supporting longer lengths. The second column identifies the parameter, and the third column ties it back to the JavaScript object which surfaced the data. Between the surfacing of the data and its actual communication through the Http request, additional processing may be done on a per-vendor basis.
The parameter names MUST be defined as shown below for carrying the identified data.
Page Identifier
Parameter Name | Comment | Reference JavaScript Object |
---|---|---|
pid |
Page Identifier | digitaldata.PageIdentifier |
Page Details
Parameter Name | Comment | Reference JavaScript Object |
---|---|---|
pi |
Page ID | digitaldata.page.pageid |
pn |
Page Name | digitaldata.page.pagename |
cg |
Page Category | digitaldata.page.pagecategory |
se |
Internal Search Term | digitaldata.page.searchterm |
sr |
Number of Internal Search Results | digitaldata.page.searchresult |
ul |
Destination URL | digitaldata.page.destinationurl |
rf |
Referring URL | digitaldata.page.referringurl |
bc_h1..bc_hn |
Bread Crumb – hierarchical identifier | digitaldata.page.breadcrumb |
pv_a1..pv_an |
Additional dimensions to page details | digitaldata.page.attributes[n] |
Product
Parameter Name | Comment | Reference JavaScript Object |
---|---|---|
pr |
Product Id | digitaldata.product.productid |
pm |
Product Name | digitaldata.product.productname |
sk |
Product Sku | digitaldata.product.sku |
pcg |
Product Category | digitaldata.product.categoryid |
pr_a1..pr_an |
Additional dimensions to a product | digitaldata.product.attributes[n] |
Cart
Parameter Name | Comment | Reference JavaScript Object |
---|---|---|
-- | Cart Line Items. Each item must be sent as a separate HTTP Request |
digitaldata.cart.items[n] |
pr |
Product ID | digitaldata.cart.items[n].productid |
pm |
Product Name | digitaldata.cart.items[n].productname |
pcg |
Product Category | digitaldata.cart.items[n].categoryid |
qt |
Product Quantity | digitaldata.cart.items[n].quantity |
bp |
Product Base Price | digitaldata.cart.items[n].baseprice |
sx_a1..sx_an |
Additional Item Dimensions | digitaldata.cart.items[n].attributes[n] |
Order
Parameter Name | Comment | Reference JavaScript Object |
---|---|---|
on |
Order Number | digitaldata.order.orderid |
tr |
Order Total | digitaldata.order.ordersubtotal |
cc |
Currency Conversion Code | digitaldata.order.currencycode |
cd |
Customer ID | digitaldata.order.registrationid |
ca1 |
Customer Address Line 1 | digitaldata.order.address.line1 |
ca2 |
Customer Address Line 2 | digitaldata.order.address.line2 |
ct |
Customer City | digitaldata.order.address.city |
st |
Customer State/Province | digitaldata.order.address.state_province |
zp |
Customer Zip/Postal Code | digitaldata.order.address.postalcode |
cy |
Customer Country | digitaldata.order.address.country |
sa1 |
Customer Shipping Address Line 1 | digitaldata.order.shippingaddress.line1 |
sa2 |
Customer Shipping Address Line 2 | digitaldata.order.shippingaddress.line2 |
sct |
Customer Shipping City | digitaldata.order.shippingaddress.city |
sst |
Customer Shipping State/Province | digitaldata.order.shippingaddress.state_province |
szp |
Customer Shipping Zip/Postal Code | digitaldata.order.shippingaddress.postalcode |
scy |
Customer Shipping Country | digitaldata.order.shippingaddress.country |
sg |
Shipping Charges | digitaldata.order.shippingcharges |
st |
Sales Tax | digitaldata.order.salestax |
or_a1..or_an |
Additional dimensions to an Order | digitaldata.order.attributes[n] |
-- | Order Line Item. Each item should be sent as a separate HTTP request |
digitaldata.order.items[n] |
pr |
Order Line Item Product ID | digitaldata.order.items[n].productid |
pm |
Order Line Item Product Name | digitaldata.order.items[n].productname |
pcg |
Order Line Item Product Category ID | digitaldata.order.items[n].categoryid |
qt |
Order Line Item Product Quantity | digitaldata.order.items[n].quantity |
pr |
Order Line Item Product Base Price | digitaldata.order.items[n].baseprice |
sx_a1..sx_an |
Additional dimensions to an Item | digitaldata.order.items[n].attributes |
Registrant
Parameter Name | Comment | Reference JavaScript Object |
---|---|---|
cd |
Registrant ID | digitaldata.registrant.Registrantid |
em |
Email Address | digitaldata.registrant.email |
ca1 |
Registrant Address Line 1 | digitaldata.registrant.address.line1 |
ca2 |
Registrant Address Line 2 | digitaldata.registrant.address.line2 |
ct |
Registrant City | digitaldata.registrant.address.city |
st |
Registrant State/Province | digitaldata.registrant.address.state_province |
zp |
Registrant Zip/Postal Code | digitaldata.registrant.address.postalcode |
cy |
Registrant Country | digitaldata.registrant.address.country |
rg1..rgn |
Additional dimensions | digitaldata.registrant.attributes[n] |
Element
Parameter Name | Comment | Reference JavaScript Object |
---|---|---|
eid |
Element ID | digitaldata._elements._element[n].elementid |
ecat |
Element Category | digitaldata._elements._element[n].elementcategory |
e_a1..e_an |
Additional dimensions | digitaldata._elements._element[n].attributes |
Event
Parameter Name | Comment | Reference JavaScript Object |
---|---|---|
cid |
Event ID | digitaldata._events._event[n].eventid |
ccid |
Event Category | digitaldata._events._event [n].eventcategory |
cat |
Event Action | digitaldata._events._event [n].eventaction |
cpt |
Event Points | digitaldata._events._event [n].eventpoints |
c_a1..c_an |
Additional dimensions | digitaldata._events._event [n].attributes |
This section is informative
A standard specification for customer experience data acquisition, as the one laid out in this document, serves to
simplify the space, and by offering a method to precisely define and reference the data being collected, holds the
promise of addressing some of the data privacy concerns related to commercial use of consumer data. We intend to encourage
participants in the W3C standardization effort to consider how the specification laid out in this submission can be evolved
to help address privacy concerns, including, but not limited to, accommodating privacy categorizations that may emerge from W3C's
"Do Not Track" efforts. Such extensions could help deliver standardized solutions, contributing to simplified and meaningful
consumer choice and greater transparency regarding use of consumer data.
Additional Contributors:
Peter Cousins (IBM)