Third-Party Cookie Deprecation

Third-party cookies have historically been used for cross-domain tracking of end-user activity. They collect analytics data that are then leveraged to provide a more personalized user experience. In recent years, however, major browsers have opted to phase out third-party cookies in order to improve their compliance with privacy regulations.

As of January 2021, Coveo implemented a way for clients to send a tracking ID (the client ID) through the Usage Analytics (UA) Write API, thereby removing the need for a third-party cookie to track user visits. The client ID is generated by Coveo’s library, coveoanalytics.js, and usually stored client side in local storage.

Note

If the coveoanalytics.js library isn’t used, clients can still send the client ID by adding it as a parameter on the call to the Coveo UA Write API - Version 15.

Clients deploying newer versions of Coveo search interfaces don’t rely on third-party cookies to track their end users; they rely on other mechanisms (e.g., first-party cookies) that makes tracking IDs unique to their website.

Meanwhile, those who use the older version of the Coveo JavaScript Search Framework (JSUI) dating pre-January 2021 still use third-party cookies to track user activities between visits. In order to respect compliance goals and browser evolution, Coveo will deprecate third-party cookies by June 2023. Clients who still rely on a JSUI version dating from before January 2021 will be required to upgrade to a newer version prior to the deprecation.

Important

If you don’t upgrade your Coveo solution to a newer version, you will no longer be able to track user visits once the deprecation is completed. This will also impact Coveo Machine Learning (ML), the Visit Browser, and several other major features that rely on visits.

Step 1: Verify the JSUI Version

Verify which JSUI version your Coveo implementation is currently using.

Step 2: Upgrade Your Implementation

If you’re using a JSUI version that predates the January 2021 version, you must upgrade your implementation. We recommend that you upgrade to the latest version available. At minimum, you must upgrade to the version that includes the January 2021 JSUI release.

For applicable Coveo integrations, the following table lists the January 2021 version upgrades:

Integration Upgrade

Coveo for Salesforce

Upgrade to 4.13 (or higher).

Coveo for Sitecore

Upgrade to 5.0.943.3 (or higher).

Coveo for ServiceNow

Upgrade to 21.2.51 (or higher).

Coveo for Zendesk

Upgrade all search pages to 2.10083 (or higher).

Notes
  • The Coveo for Slack integration isn’t impacted by the deprecation as it was originally released after January 2021.

  • You also have the option to forego the integration upgrade, and instead upgrade your JSUI package to the January 2021 version (or newer) only. However, we still recommend a full package upgrade for Coveo for Sitecore 5 clients, because the January 2021 JSUI version may not be supported well by the latest package.

  • Although you can upgrade to the January 2021 version, we recommend upgrading to the latest version available to ensure optimal performance.

Step 3: Test Your Upgrade

Once you’ve completed the upgrade, test your implementation to ensure that the upgrade is successful and that the cookie header has been set. You can do this by creating a custom dimension and a dashboard report in the Coveo Administration Console. This step is necessary for verifying if there are elements in your implementation that:

  • are still using the third-party cookie.

  • aren’t using the client ID.

Note

If you have a custom integration with custom events, you may notice that the client ID doesn’t pass. This may be resolved by adding the set cookie header parameter in Coveo UA, which lets you drill down on the custom events and retrieve the information that the client ID would have gotten had it passed.

Add a Custom Dimension

  1. On the Dimensions (platform-eu | platform-au) page, create a custom dimension.

    • Ensure that you give the dimension a meaningful display name (e.g., Third-Party Cookie).

    • For the API name, enter c_third_party_cookie_set.

    • Under Related events, ensure that all three check boxes are selected.

Add a Custom Dashboard

  1. On the Reports (platform-eu | platform-au) page, add a blank dashboard.

  2. At the upper-right corner of the window, click More, and then select Paste JSON configuration.

  3. In the Import a Report Configuration panel that appears, paste this JSON configuration, and then click Import and save.

  4. Adjust the date range to specify the date your upgrade was completed. The dashboard should look similar to the following example:

    Comparison dashboard
    • The dashboard is comprised of three Table cards. Ideally, the All events card and the Events sending a Client ID card should be identical, with the same events and event counts, while the Events leveraging a third-party cookie card should be empty.

    • If the Events leveraging a third-party cookie isn’t empty (as shown in the previous example), it might indicate that the upgrade was incomplete and that there’s a search hub in your deployment that’s still leveraging a third-party cookie.

Reference

{
 "displayName": "Third-party cookie deprecation check",
 "type": "DASHBOARD",
 "configuration": {
  "description": "This report is to validate the third-party cookie deprecation and the transition to the client ID",
  "dateRange": {
   "range": "weeks",
   "length": 1,
   "offset": -1
  },
  "compareRange": {
   "range": "weeks",
   "length": 1,
   "offset": -2
  },
  "tabs": [
   {
    "id": "9487",
    "title": "Tab 1",
    "sections": [
     {
      "title": "",
      "position": {
       "col": "1",
       "row": "1",
       "sizex": "6",
       "sizey": "11",
       "minSizex": 2
      },
      "cards": [
       {
        "id": "7006",
        "href": "",
        "title": "All events",
        "sortBy": "DocumentView",
        "filters": "",
        "metrics": [
         "DocumentView",
         "CustomEvent",
         "PerformSearch"
        ],
        "cardType": "DetailedStatistics",
        "position": {
         "col": 1,
         "row": 2,
         "sizex": 4,
         "sizey": 4,
         "minSizex": 1,
         "minSizey": 2
        },
        "ascending": false,
        "showCount": false,
        "dimensions": [
         "customEventType",
         "originLevel1"
        ],
        "headerHref": "",
        "showHeader": true,
        "metricsSort": [
         "PerformSearch",
         "DocumentView",
         "CustomEvent"
        ],
        "metricFilters": "",
        "dimensionsSort": [
         "originLevel1",
         "customEventType"
        ],
        "metricsHeaders": {},
        "bindOnLastSearch": true,
        "dimensionsHeaders": {},
        "editMode": false
       },
       {
        "id": "34FF",
        "href": "",
        "title": "Events sending a Client ID",
        "sortBy": "DocumentView",
        "filters": "(clientid!~'null' AND clientid!~'' AND clientid!=null)",
        "metrics": [
         "DocumentView",
         "CustomEvent",
         "PerformSearch"
        ],
        "cardType": "DetailedStatistics",
        "position": {
         "col": 1,
         "row": 7,
         "sizex": 2,
         "sizey": 4,
         "minSizex": 1,
         "minSizey": 2
        },
        "ascending": false,
        "showCount": false,
        "dimensions": [
         "customEventType",
         "originLevel1"
        ],
        "headerHref": "",
        "showHeader": true,
        "metricsSort": [
         "PerformSearch",
         "DocumentView",
         "CustomEvent"
        ],
        "metricFilters": "",
        "dimensionsSort": [
         "originLevel1",
         "customEventType"
        ],
        "metricsHeaders": {},
        "bindOnLastSearch": true,
        "dimensionsHeaders": {},
        "editMode": false
       },
       {
        "id": "BEA1",
        "href": "",
        "title": "Events leveraging a third-party cookie",
        "sortBy": "PerformSearch",
        "filters": "(c_third_party_cookie_set==true)",
        "metrics": [
         "DocumentView",
         "CustomEvent",
         "PerformSearch"
        ],
        "cardType": "DetailedStatistics",
        "position": {
         "col": 3,
         "row": 7,
         "sizex": 2,
         "sizey": 4,
         "minSizex": 1,
         "minSizey": 2
        },
        "ascending": false,
        "showCount": false,
        "dimensions": [
         "customEventType",
         "originLevel1"
        ],
        "headerHref": "",
        "showHeader": true,
        "metricsSort": [
         "PerformSearch",
         "DocumentView",
         "CustomEvent"
        ],
        "metricFilters": "",
        "dimensionsSort": [
         "originLevel1",
         "customEventType"
        ],
        "metricsHeaders": {},
        "bindOnLastSearch": true,
        "dimensionsHeaders": {},
        "editMode": false
       },
       {
        "id": "2AB6",
        "href": "",
        "style": "info",
        "title": "Events sending Client ID",
        "value": "The table below needs to be identical to the \"All events\" table. If there are missing events, it means those events are not sending a Client ID, which is now required.\n",
        "cardType": "NoteCard",
        "position": {
         "col": 1,
         "row": 6,
         "sizex": 2,
         "sizey": 1,
         "minSizex": 1,
         "minSizey": 1
        },
        "eventType": "join",
        "headerHref": "",
        "isMarkdown": true,
        "editMode": false
       },
       {
        "id": "DBCE",
        "href": "",
        "style": "info",
        "title": "Events leveraging third-party cookie",
        "value": "The table below needs to be empty. If it's not empty, it means that a search hub is still leveraging a third-party cookie to set the Visitor ID.\n",
        "cardType": "NoteCard",
        "position": {
         "col": 3,
         "row": 6,
         "sizex": 2,
         "sizey": 1,
         "minSizex": 1,
         "minSizey": 1
        },
        "eventType": "join",
        "headerHref": "",
        "isMarkdown": true,
        "editMode": false
       },
       {
        "id": "A1D6",
        "href": "",
        "style": "info",
        "title": "All events",
        "value": "The event count in this table should always be the sum of the event counts from the two other tables in this dashboard.",
        "cardType": "NoteCard",
        "position": {
         "col": 1,
         "row": 1,
         "sizex": 4,
         "sizey": 1,
         "minSizex": 1,
         "minSizey": 1
        },
        "eventType": "join",
        "headerHref": "",
        "isMarkdown": true,
        "editMode": false
       }
      ],
      "editMode": false
     }
    ],
    "active": true,
    "editMode": false
   }
  ],
  "filters": "$",
  "version": 6
 },
 "allAnalyticsViewer": true,
 "filters": []
}