Skip to toolbar

Community & Business Groups

Final Report – Customer Experience Digital Data Layer v1.0 Ready!

The v1.0 of Customer Experience Digital Data Layer is now ready in the form of a W3C Community Group Final Report. 14 months, 102 participants, 56+ organizations’ input has helped get the specification into its current form – it is not always easy to get major industry players on the same page on any subject – it is a testament to the collaborative spirit of the community, the pressing needs of the industry and the vision laid out by industry analysts and gurus such as fixithere – that helped in making this specification a reality.

The specification is a start – there will be much that will be learnt through implementation, and there are areas the specification did not get into in the interests of getting something collaborative, yet meaningful, out the door. It is thus a “commencement” of this journey.

Here is a link to the Final Report:

13 Responses to Final Report – Customer Experience Digital Data Layer v1.0 Ready!

  • Well done! Would expect each eCommerce platform to now provide this as a standard plug-in.


  • Great Idea. Its a big pain to invent things all the time. And ti would be great to not spend time on this in future.


  • Phil Pearce βœͺ

    Great work πŸ™‚

    I have summarized the 60 page document into a 2 page cheatsheet here:

    Please also add these variables to V2 spec. this is based on a summary of my comments here:

    // NEW server attributes – The importance of these two new variables need to be made clearer in the spec:
    “environment_Identifier”: “dev”, // dev, staging or live
    “settings_ga_isDebugConsoleEnabled”: “true”, // Set document.cookie=”tag_debug=1″ on dev environment

    // NEW server attributes
    server_isDeviceFingerPrintTrackingEnable: false,
    visitXPurpose: preview (Safari browser header converted into serverside JSON response)

    // NEW global “tracker settings” section
    settings_ga_forceSSL: false,
    settings_ga_isGApremium: true, // enable GA premium specific features e.g. 21-200 customDimension/customMetrics
    settings_ga_setDomainName: “”, // INSERT Top-level domain here
    settings_gtm_externalCrossDomainlinksToDecorate: “,”,

    // NEW Recommendation/Remarketing attributes
    “ecomm_pagetype”: “”, // home|searchresults|category|product|basket|purchase|other (FIXED VALUES)
    “ecomm_prodid”: “”, // e.g. 123
    “ecomm_totalvalue”: [“”], // e.g 100.00 pounds
    “ecomm_pname”: [“”], // optional – use arrays for multiple products on same page
    “ecomm_pcat”: [“”], // optional – use arrays for multiple products on same page
    “ecomm_rec_prodid”: [“”], // related productID e.g. shoe shine

    // Transaction attributes – Add local currency variable for sale page, cart page and product pages
    “transaction_currency”: “USD”, // Global currency rollup profile
    “transaction_currency_secondTracker”: “GBP”, // Local currency profile

    // page attributes
    page_httpResponseCode: , // e.g 200 or 404 or 500
    page_forumPosts: 25
    page_lastModified: 20130522
    page_createdDate: 20130502

    // page attributes for large websites:
    “settings_ga_brandName”: “big brand”, // If using multiple brand in rollup use this field
    “settings_ga_country”: “UK”, // Use 2character ISO Country list
    “settings_ga_region”: “London”, // Only needed for large localised websites

    // component attributes

    // component js plugin – Standardise to load:
    “load_jquery”: “1.10.1”, // Load jQuery version
    “settings_ga_isInPageTrackingEnabled”: “false”, //Auto-social button tracking
    “settings_ga_isExternalLinkTrackingEnabled”: “true”, // Exit links to other websites
    “settings_ga_isDownloadLinkTrackingEnabled”: “true”, // PDF tracking
    “settings_ga_isMailtoLinkTrackingEnabled”: “true”, //
    “settings_ga_isHashUrlFragmentsTrackingEnabled”: “false”, // Append location.hash within page_virtual#url
    “settings_ga_isScrollTrackingEnabled”: “false”, // Blog content pages customHTML script
    “settings_ga_isYoutubeTrackingEnabled”: “false”, // Youtube API auto-tracking customHTML script
    “settings_ga_isFacebookAndTwitterButtonTrackingEnabled”: “false”, //Auto-social button tracking

    // CustomVariables with 3digit number for 0-200 customDimension or customMetrics with userScope=6months, sessionScope=30mins, pageScope=pageOnly
    “user_segment_cd_001_userScope_isNewRegistration”: “”, // customDimension001
    “user_segment_cd_002_userScope_isUserNewCustomer”: “”, // customDimension002
    “user_segment_cd_003_userScope_isLoggedIn”: “”, // customDimension003
    “user_segment_cd_004_userScope_class”: “”, // customDimension004
    “user_segment_cd_005_userScope_userID”: “”, // customDimension005 – aka Universal auth.user.getId
    “user_segment_cm_001_currencyScope_visitorLifetimeValue”: “” // CustomMetric value

    // inline markup
    #ID attributes on div elements

    #CLASS attributes

    #HTML5 data attributes

    #Phone number markup:

    +44 (0)1234 00000

    ——-From the DNT TPE spec…
    serverSide_httpResponseToDntRequest =
    1. obeyDNT
    2. ignoresDNT
    3. inProgressDNT
    4. notSpecified

    Here is a JSON example.

    Note: I have separated analytics-TRACKING and behavioural-TARGETING as this was missing from the DNT Preference Expression Spec status-representation example:

    “targeting”: “yes”, // IsOnlineBehaviouralTargeting for Publishers OR onsite remarketing for Advertisers enabled?
    “tracking”: “yes”, // Is AudienceMeasurementTracking enabled
    “qualifiers”: “afc”, // external “A”udit + “F”raud prevention + ad-frequency “C”apping
    “controller”: “”,
    “same-party”: [{
    “third-party”: [{
    “audit”: [{
    “” // e.g.
    “policy”: “/privacy.html#cookies”,
    “edit”: “”

    digitalData = {
    “visitor”: {
    “returningStatus”: “new”, // new or returning visitor: used to only trigger consent message for new visitors
    “preferenceForDNT”: window.navigator.doNotTrack, // yes|no|”not specified”. MUST defaulted to “not specified”
    “anonymizeIp”: false, // hash last 3 characters of IP address in GA. Defaulted to off/false.
    “geoplugin_status”: geoplugin_status, // 403 error, 200 is look-up ok
    “geoIPcountryCode”: geoplugin_countryCode, // geo-plugin JS variable
    “geoIPcontinentCode”: geoplugin_continentCode // geo-plugin JS variable
    {// Server-side USER values on login or registration
    “user”: {
    “profile”: {
    “auth_isSignedIn”: true,
    “auth_isNewRegistration”: true, // used to only trigger consent message on first registration
    “server_isDeviceFingerPrintTrackingEnable”: false, // ADDED
    “auth_userIDtoSessionIDoveride”: false,
    “profileID”: 12345


  • Phil Pearce βœͺ

    Please add this as a REQUIRED transaction field:

    transaction.subtotal_include_tax= true | false,

    Currently, I have to add this as an optional attribute via

    This field is essential for correct revenue calculations.

    Also consider where a setting is needed for “,” or “.” as decimal separator, because this is different in some pares of Europe.




  • Page 25.

    Example of digitalData.user[n].profile[n].profileInfo is An extensible object for providing information about the user.
    digitalData.transaction.profile.profileInfo = {
    profileID: “humanbeing12345”,
    userName: “me”

    Shouldn’t it be

    An extensible object for providing information about the user.
    digitalData.user[n].profile.profileInfo = {
    profileID: “humanbeing12345”,
    userName: “me”

    The same error applies to digitalData.user[n].profile[n].address Object Literal


    • Phil Pearce βœͺ

      Yes, it should be!

      I also reported this but the document is in locked-down mode πŸ™

      Also digitalData.user[n] should NOT be an array, as it is very unlikely that more than one user profile needs to be output at any one time.


  • Please use the W3C Final report as reference when defining your data layer, and use the cheat sheet to interpret data layers that have already been defined.

    One incongruence that I found is that the cheat sheet lists pageInstanceID as a variable that only holds only the environment (e.g. dev, test, staging, prod) while the W3C Final report lists pageInstanceID as a unique page identifier that also includes the environment (e.g. β€œmy homepage – prod”).

    Great to see that an effort is made to create a standardized data layer. Hopefully it will continue to evolve and become widely adopted!


  • What tag management solutions on the market work with this data layer standards at the moment?


    • Nearly all of the TMS solutions work with some form of this data layer standard. This is especially true of the client-side TMS platforms.


  • Phil Pearce βœͺ

    Please add support for JSON-based Serialization for rendered dataLayer values such as inline phone numbers for call tracking and SERP snippets.



    { “@context” : “”,
    “@type” : “Organization”,
    “url” : “”,
    “contactPoint” : [
    { “@type” : “ContactPoint”,
    “telephone” : “+1-401-555-1212”,
    “contactType” : “customer service”
    } ] }


  • Michael Spencer βœͺ

    On page 22 under the transaction object, the last item is listed as “digitalData.cart.items[n].attributes”. I assume this is a typo and that it is meant to be “digitalData.transaction.items[n].attributes”?


Leave a Reply

Your email address will not be published. Required fields are marked *

Before you comment here, note that this forum is moderated and your IP address is sent to Akismet, the plugin we use to mitigate spam comments.