# Welcome !

Discover capabilities of Commanders Act X

Learn how to use the platform to collect, enrich, validate and integrate your customer data with hundreeds of solutions.

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td><a href="/pages/7uj7Hwv72EtWCs50k8Ru"><strong>Getting started with Commanders Act</strong></a></td><td>Learn about the platform, interfaces, ...</td><td></td><td><a href="/pages/7uj7Hwv72EtWCs50k8Ru">/pages/7uj7Hwv72EtWCs50k8Ru</a></td><td><a href="/files/E5jo3L8Tdb1YEl010cda">/files/E5jo3L8Tdb1YEl010cda</a></td></tr><tr><td><a href="/pages/-MlTiu0MQ5WLdhdhd_cs"><strong>Integrating your data</strong></a></td><td>How to setup your account</td><td></td><td><a href="/pages/-MlTiu0MQ5WLdhdhd_cs">/pages/-MlTiu0MQ5WLdhdhd_cs</a></td><td><a href="/files/eoRroNy97HnrEbHqsHOY">/files/eoRroNy97HnrEbHqsHOY</a></td></tr><tr><td><a href="/pages/-MlPzJwoo66-T7eewPbO">What's new</a></td><td>Discover last release notes</td><td></td><td><a href="/pages/-MlPzJwoo66-T7eewPbO">/pages/-MlPzJwoo66-T7eewPbO</a></td><td><a href="/files/291L5EG32rwOQTi8IkEQ">/files/291L5EG32rwOQTi8IkEQ</a></td></tr><tr><td><a href="https://community.commandersact.com/customer-success/expand-your-uses/server-side"><strong>Discover our use cases</strong></a></td><td>Extract values from your data</td><td></td><td><a href="https://github.com/TagCommander/PlatformX/blob/master/broken-reference/README.md">https://github.com/TagCommander/PlatformX/blob/master/broken-reference/README.md</a></td><td><a href="/files/fMPp81NxZvkuoaw53WRk">/files/fMPp81NxZvkuoaw53WRk</a></td></tr><tr><td><a href="https://adloopwiki.atlassian.net/wiki/spaces/AHEN/pages/1770553367/I+-+Start+your+Adloop+discovery">Adloop documentation</a></td><td>Smart reco to optimise your campaign performance</td><td></td><td><a href="https://adloopwiki.atlassian.net/wiki/spaces/AHEN/pages/1770553367/I+-+Start+your+Adloop+discovery">https://adloopwiki.atlassian.net/wiki/spaces/AHEN/pages/1770553367/I+-+Start+your+Adloop+discovery</a></td><td><a href="/files/1vF3lL4tbtrCPpDcA7kA">/files/1vF3lL4tbtrCPpDcA7kA</a></td></tr></tbody></table>


# Platform updates

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td></td><td>Announcements</td><td></td><td><a href="/pages/qrJaBX6e2uG8iVkxXMOE">/pages/qrJaBX6e2uG8iVkxXMOE</a></td></tr><tr><td></td><td>Documentation updates</td><td></td><td><a href="/pages/-MlPzXdbulvHkMurwtxV">/pages/-MlPzXdbulvHkMurwtxV</a></td></tr><tr><td></td><td>Releases notes</td><td></td><td><a href="/pages/-MlPzJwoo66-T7eewPbO">/pages/-MlPzJwoo66-T7eewPbO</a></td></tr></tbody></table>


# Announcements

## 16/12/2022 - End of life of Platform version 7

Dear Customer,

As you know, we have created the new **Platform X**, which was launched in May 2022 to provide you with a range of new and improved features, including a higher-performance architecture, modern, fast and user-friendly interfaces, and enhanced functionalities to make your daily life easier.

In light of this, **we will be closing the old platform (version 7) on June 30th 2023**.

Here are the closing steps on the v7 in 2023:

* End date for adding new containers: April 30
* Maintenance end date: June 30
* Support end date: June 30
* Complete closing of the platform: June 30
* Server-side v1 collection/processing end date: December 31

Many of you have already switched to the platform X and are already enjoying its benefits. If you have not yet had the chance to explore the new platform, we invite you to come and discover it for yourself. We would be happy to provide you with a presentation and show you all that it has to offer.\
\
We are very proud of our new platform and are delighted with the positive feedbacks we have received so far. This reinforces our choice to provide you this new unified platform, ready for the future !

Thank you for your continued support.

Sincerely,\
The Commanders Act Team


# Documentation updates

The latest updates made to our documentation articles

## 14/08/2026

Destination documentation (updates):

{% content-ref url="/pages/WH6Qlv6UtTBWjddXVIaA" %}
[Pinterest](/features/destinations/destinations-catalog/pinterest)
{% endcontent-ref %}

## 31/07/2026

Destination documentation:

{% content-ref url="/pages/smyqCKz2fs6YNTYE1329" %}
[Azure Event Hub](/features/destinations/destinations-catalog/azure-event-hub)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/8HPGgV8IMFkRQcQKkx8g" %}
[Amazon Events API](/features/destinations/destinations-catalog/amazon/amazon-events-api)
{% endcontent-ref %}

{% content-ref url="/pages/ol52AIcauxs4Mfs4W6g1" %}
[LinkedIn Conversions API](/features/destinations/destinations-catalog/linkedin_capi)
{% endcontent-ref %}

{% content-ref url="/pages/7f2lHzxxsW4Y0Vs8jcDr" %}
[OpenAI Conversions API](/features/destinations/destinations-catalog/openai-conversions-api)
{% endcontent-ref %}

## 17/07/2026

Destination documentation:

{% content-ref url="/pages/tuiodev9IEuq3UyScxZe" %}
[Spotify Conversions API](/features/destinations/destinations-catalog/spotify-conversions-api)
{% endcontent-ref %}

## 10/07/2026

Destination documentation (updates):

{% content-ref url="/pages/7tPZmjyTnYFaeYqDxkDs" %}
[Exactag](/features/destinations/destinations-catalog/exactag)
{% endcontent-ref %}

## 03/07/2026

Destination documentation (updates):

{% content-ref url="/pages/s80aI7IegVNppY0j8BCY" %}
[Piano Analytics Collection API](/features/destinations/destinations-catalog/piano-analytics/at-internet)
{% endcontent-ref %}

## 26/06/2026

Destination documentation (updates):

{% content-ref url="/pages/F546e2FzuEwYVoW9iBbI" %}
[Google Enhanced Conversions for Leads](/features/destinations/destinations-catalog/google/google-enhanced-conversions-for-leads)
{% endcontent-ref %}

{% content-ref url="/pages/zh3p9p87dFqqnpE8Tepe" %}
[TikTok Events API](/features/destinations/destinations-catalog/tiktok/tiktok)
{% endcontent-ref %}

## 19/06/2026

Destination documentation (updates):

{% content-ref url="/pages/zh3p9p87dFqqnpE8Tepe" %}
[TikTok Events API](/features/destinations/destinations-catalog/tiktok/tiktok)
{% endcontent-ref %}

{% content-ref url="/pages/xWc9aytdpTM0Y3g4wy0u" %}
[Clinch](/features/destinations/destinations-catalog/clinch-conversions-api)
{% endcontent-ref %}

## 12/06/2026

Destination documentation:

{% content-ref url="/pages/7tPZmjyTnYFaeYqDxkDs" %}
[Exactag](/features/destinations/destinations-catalog/exactag)
{% endcontent-ref %}

## 29/05/2026

Destination documentation:

{% content-ref url="/pages/F65YpIMvB4HiCO9joPR9" %}
[Google Ads Store Sales](/features/destinations/destinations-catalog/google/google-ads-store-sales)
{% endcontent-ref %}

## 22/05/2026

Destination documentation:

{% content-ref url="/pages/xWc9aytdpTM0Y3g4wy0u" %}
[Clinch](/features/destinations/destinations-catalog/clinch-conversions-api)
{% endcontent-ref %}

## 08/05/2026

Destination documentation:

{% content-ref url="/pages/7f2lHzxxsW4Y0Vs8jcDr" %}
[OpenAI Conversions API](/features/destinations/destinations-catalog/openai-conversions-api)
{% endcontent-ref %}

{% content-ref url="/pages/he12lbulAKD91A9FL9rg" %}
[AppsFlyer Mobile Events API](/features/destinations/destinations-catalog/appsflyer/appsflyer-mobile-events-api)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/T79avmoFSGYGFeUMgRIv" %}
[Piano Analytics Catalogs API](/features/destinations/destinations-catalog/piano-analytics/piano-analytics-enrichment-api)
{% endcontent-ref %}

## 24/04/2026

Destination documentation (updates):

{% content-ref url="/pages/-MlQhw-4y-Aga5NeE3Oj" %}
[Facebook Conversions API](/features/destinations/destinations-catalog/facebook/facebook-conversions-api)
{% endcontent-ref %}

## 10/04/2026

Destination documentation:

{% content-ref url="/pages/8HPGgV8IMFkRQcQKkx8g" %}
[Amazon Events API](/features/destinations/destinations-catalog/amazon/amazon-events-api)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/GeXafo8zZogeVslw39zy" %}
[Microsoft Conversions API](/features/destinations/destinations-catalog/microsoft/microsoft-conversions-api)
{% endcontent-ref %}

{% content-ref url="/pages/i0tfOpK0RvVOGrWMdwFZ" %}
[Reddit Conversions API](/features/destinations/destinations-catalog/reddit-conversions-api)
{% endcontent-ref %}

## 03/04/2026

Destination documentation (updates):

{% content-ref url="/pages/odKIZLszlcT2haicHIcW" %}
[Kwanko](/features/destinations/destinations-catalog/kwanko)
{% endcontent-ref %}

## 27/03/2026

Destination documentation:

{% content-ref url="/pages/4ZYA88A39NmLOkFUrrkh" %}
[AppsFlyer PC/Console/CTV Events API](/features/destinations/destinations-catalog/appsflyer/appsflyer-pc-console-ctv-events-api)
{% endcontent-ref %}

## 13/03/2026

Destination documentation (updates):

{% content-ref url="/pages/ol52AIcauxs4Mfs4W6g1" %}
[LinkedIn Conversions API](/features/destinations/destinations-catalog/linkedin_capi)
{% endcontent-ref %}

Destination documentation:

{% content-ref url="/pages/v4BAIH9HG4zjv7MWfyxE" %}
[Adobe Analytics Classic](/features/destinations/destinations-catalog/adobe/adobe-analytics-data-insertion-api)
{% endcontent-ref %}

## 06/03/2026

Destination documentation:

{% content-ref url="/pages/GeXafo8zZogeVslw39zy" %}
[Microsoft Conversions API](/features/destinations/destinations-catalog/microsoft/microsoft-conversions-api)
{% endcontent-ref %}

## 20/02/2026

Destination documentation (updates):

{% content-ref url="/pages/zh3p9p87dFqqnpE8Tepe" %}
[TikTok Events API](/features/destinations/destinations-catalog/tiktok/tiktok)
{% endcontent-ref %}

## 13/02/2026

Destination documentation (updates):

{% content-ref url="/pages/WH6Qlv6UtTBWjddXVIaA" %}
[Pinterest](/features/destinations/destinations-catalog/pinterest)
{% endcontent-ref %}

Destination documentation:

{% content-ref url="/pages/W7d2PIhBRBj7bBEls0ku" %}
[Eulerian Marketing Platform](/features/destinations/destinations-catalog/eulerian-marketing-platform)
{% endcontent-ref %}

## 19/12/2025

Destination documentation (updates):

{% content-ref url="/pages/atWFMuTcAHDE1W087fyr" %}
[Facebook Lead Ads](/features/destinations/destinations-catalog/facebook/facebook-lead-ads)
{% endcontent-ref %}

## 05/12/2025

Destination documentation (updates):

{% content-ref url="/pages/i0tfOpK0RvVOGrWMdwFZ" %}
[Reddit Conversions API](/features/destinations/destinations-catalog/reddit-conversions-api)
{% endcontent-ref %}

## 21/11/2025

Destination documentation (updates):

{% content-ref url="/pages/r03DuL4ZNvWybxkpBHwO" %}
[Salesforce Marketing Cloud - Profile Sync (API)](/features/destinations/destinations-catalog/salesforce/salesforce-marketing-cloud-data-extension-upsert-row)
{% endcontent-ref %}

## 14/11/2025

Destination documentation (updates):

{% content-ref url="/pages/-MlQhw-4y-Aga5NeE3Oj" %}
[Facebook Conversions API](/features/destinations/destinations-catalog/facebook/facebook-conversions-api)
{% endcontent-ref %}

## 07/11/2025

Destination documentation:

{% content-ref url="/pages/sXbWvk2gTjRU3PzIrxJY" %}
[TikTok Sync Order Information](/features/destinations/destinations-catalog/tiktok/tiktok-sync-order-information)
{% endcontent-ref %}

## 31/10/2025

Destination documentation (updates):

{% content-ref url="/pages/r03DuL4ZNvWybxkpBHwO" %}
[Salesforce Marketing Cloud - Profile Sync (API)](/features/destinations/destinations-catalog/salesforce/salesforce-marketing-cloud-data-extension-upsert-row)
{% endcontent-ref %}

## 17/10/2025

Destination documentation:

{% content-ref url="/pages/r03DuL4ZNvWybxkpBHwO" %}
[Salesforce Marketing Cloud - Profile Sync (API)](/features/destinations/destinations-catalog/salesforce/salesforce-marketing-cloud-data-extension-upsert-row)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/tfdemz95AlU5wlS9IO89" %}
[Awin](/features/destinations/destinations-catalog/awin)
{% endcontent-ref %}

## 03/10/2025

Destination documentation (updates):

{% content-ref url="/pages/elbS4y8dUfuFtX5EUbyL" %}
[X (Twitter) Conversion API](/features/destinations/destinations-catalog/x-twitter-conversion-api)
{% endcontent-ref %}

## 19/09/2025

Destination documentation (updates):

{% content-ref url="/pages/s80aI7IegVNppY0j8BCY" %}
[Piano Analytics Collection API](/features/destinations/destinations-catalog/piano-analytics/at-internet)
{% endcontent-ref %}

## 22/08/2025

Destination documentation:

{% content-ref url="/pages/hNEz1uuPtfoWFlJ3KSng" %}
[Econda](/features/destinations/destinations-catalog/econda)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/-MlQi-BDfcCD1uWPa-XD" %}
[Google Analytics 4](/features/destinations/destinations-catalog/google/google-analytics-4)
{% endcontent-ref %}

## 27/06/2025

Destination documentation (updates):

{% content-ref url="/pages/i0tfOpK0RvVOGrWMdwFZ" %}
[Reddit Conversions API](/features/destinations/destinations-catalog/reddit-conversions-api)
{% endcontent-ref %}

## 13/06/2025

Destination documentation (updates):

{% content-ref url="/pages/-MlQi-BDfcCD1uWPa-XD" %}
[Google Analytics 4](/features/destinations/destinations-catalog/google/google-analytics-4)
{% endcontent-ref %}

## 30/05/2025

Destination documentation (updates):

{% content-ref url="/pages/-MlQhw-4y-Aga5NeE3Oj" %}
[Facebook Conversions API](/features/destinations/destinations-catalog/facebook/facebook-conversions-api)
{% endcontent-ref %}

{% content-ref url="/pages/zh3p9p87dFqqnpE8Tepe" %}
[TikTok Events API](/features/destinations/destinations-catalog/tiktok/tiktok)
{% endcontent-ref %}

## 23/05/2025

Source documentation (updates):

{% content-ref url="/pages/ImoSb61tf3bNF6Z57SDt" %}
[Shopify](/features/sources/sources-catalog/web/cashopapp)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/M49exCZvXnNDVBV91QY1" %}
[Google Display & Video 360](/features/destinations/destinations-catalog/google/google-display-and-video-360-and-search-ads-360)
{% endcontent-ref %}

{% content-ref url="/pages/tfdemz95AlU5wlS9IO89" %}
[Awin](/features/destinations/destinations-catalog/awin)
{% endcontent-ref %}

{% content-ref url="/pages/suWKJNvEqdHrMmuX0gpq" %}
[Tradedoubler](/features/destinations/destinations-catalog/tradedoubler)
{% endcontent-ref %}

## 09/05/2025

Destination documentation (updates):

{% content-ref url="/pages/suWKJNvEqdHrMmuX0gpq" %}
[Tradedoubler](/features/destinations/destinations-catalog/tradedoubler)
{% endcontent-ref %}

## 02/05/2025

Destination documentation (updates):

{% content-ref url="/pages/IkHPO70fNc1TWXXWYUU2" %}
[Google BigQuery](/features/destinations/destinations-catalog/google/google-bigquery)
{% endcontent-ref %}

{% content-ref url="/pages/Zz9VMkBYEoir3Hcc9BUg" %}
[Amazon Ads Conversions API](/features/destinations/destinations-catalog/amazon/amazon-ads-conversions-api)
{% endcontent-ref %}

## 18/04/2025

Destination documentation (updates):

{% content-ref url="/pages/-MlQi-BDfcCD1uWPa-XD" %}
[Google Analytics 4](/features/destinations/destinations-catalog/google/google-analytics-4)
{% endcontent-ref %}

{% content-ref url="/pages/F546e2FzuEwYVoW9iBbI" %}
[Google Enhanced Conversions for Leads](/features/destinations/destinations-catalog/google/google-enhanced-conversions-for-leads)
{% endcontent-ref %}

## 16/04/2025

Update about GPC implementation

{% content-ref url="/pages/vO9IzCgUjerhCSQVCqD7" %}
[CCPA & Global Privacy control](/features/consent-management/knowledge-base/ccpa-and-global-privacy-control)
{% endcontent-ref %}

## 11/04/2025

Update for React Native (Mobile) Source

{% content-ref url="/pages/ywBz1Loo7FzIWhlaU8n4" %}
[React native](/features/sources/sources-catalog/mobile-app/react-native)
{% endcontent-ref %}

Update for Plugin Commanders Act Assistant

{% content-ref url="/pages/jz3o63RI2mGMapMucspT" %}
[Plugin Commanders Act Assistant](/features/sources/sources-catalog/web/containers/user-guides-for-browser-side-platform/container/plugin-commanders-act-assistant)
{% endcontent-ref %}

Source documentation:

{% content-ref url="/pages/ImoSb61tf3bNF6Z57SDt" %}
[Shopify](/features/sources/sources-catalog/web/cashopapp)
{% endcontent-ref %}

Destination documentation:

{% content-ref url="/pages/eRrLD04YKZJhxq7H8Mdy" %}
[Button](/features/destinations/destinations-catalog/button)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/IkHPO70fNc1TWXXWYUU2" %}
[Google BigQuery](/features/destinations/destinations-catalog/google/google-bigquery)
{% endcontent-ref %}

## 28/03/2025

Destination documentation (updates):

{% content-ref url="/pages/-MlQhw-4y-Aga5NeE3Oj" %}
[Facebook Conversions API](/features/destinations/destinations-catalog/facebook/facebook-conversions-api)
{% endcontent-ref %}

{% content-ref url="/pages/uTokaHPL1JSDUNpjuKTQ" %}
[Effinity](/features/destinations/destinations-catalog/effinity)
{% endcontent-ref %}

## 18/03/2025

New documentation for Storage Settings UI

{% content-ref url="/pages/EWrr9xbFbCb2vKC0kzxB" %}
[Storage Settings](/features/enrichments/storage-settings)
{% endcontent-ref %}

## 05/03/2025

New documentation for the latest version of our Chrome Extension

{% content-ref url="/pages/jz3o63RI2mGMapMucspT" %}
[Plugin Commanders Act Assistant](/features/sources/sources-catalog/web/containers/user-guides-for-browser-side-platform/container/plugin-commanders-act-assistant)
{% endcontent-ref %}

## 31/01/2025

Destination documentation (updates):

{% content-ref url="/pages/ObfJYIUdoj9nE90wBarw" %}
[RTB House Audience](/features/destinations/destinations-catalog/rtb-house-audience)
{% endcontent-ref %}

{% content-ref url="/pages/ol52AIcauxs4Mfs4W6g1" %}
[LinkedIn Conversions API](/features/destinations/destinations-catalog/linkedin_capi)
{% endcontent-ref %}

## 21/01/2025

{% content-ref url="/pages/AGpCo51HOkA0HfwJypJS" %}
[Server IP Whitelisting](/developers/tracking-and-integrations/server-ip-whitelisting)
{% endcontent-ref %}

## 13/12/2024

Destination documentation (updates):

{% content-ref url="/pages/-MlQhw-4y-Aga5NeE3Oj" %}
[Facebook Conversions API](/features/destinations/destinations-catalog/facebook/facebook-conversions-api)
{% endcontent-ref %}

## 06/12/2024

Destination documentation:

{% content-ref url="/pages/ObfJYIUdoj9nE90wBarw" %}
[RTB House Audience](/features/destinations/destinations-catalog/rtb-house-audience)
{% endcontent-ref %}

## 29/11/2024

Destination documentation:

{% content-ref url="/pages/i0tfOpK0RvVOGrWMdwFZ" %}
[Reddit Conversions API](/features/destinations/destinations-catalog/reddit-conversions-api)
{% endcontent-ref %}

## 22/11/2024

Destination documentation:

{% content-ref url="/pages/epn1avBzzmZK7pWYZu2A" %}
[Batch Audience](/features/destinations/destinations-catalog/batch)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/zWLBgQW9ZRkFidZYr8uW" %}
[The Trade Desk Conversions API](/features/destinations/destinations-catalog/the-trade-desk/the-trade-desk-conversions-api)
{% endcontent-ref %}

## 27/10/2024

New destination Logs exporter:

{% content-ref url="/pages/RbRGQ9RwwOks37z6KSHL" %}
[Destination Logs Exporter (closed beta)](/features/destinations/destinations-catalog/destination-logs-exporter-closed-beta)
{% endcontent-ref %}

## 24/10/2024

Updated documentation for new features of cookie scanner:

{% content-ref url="/pages/ub1KzgKXqNFV0OkxHcNy" %}
[Cookie Scanner 1.0](/features/consent-management/extensions/cookie-scanner)
{% endcontent-ref %}

## 21/10/2024

CDN 1st new documentation:

{% content-ref url="/pages/fbMcdZn4esFhdqQrp8Pv" %}
[First party hosting](/configure/administration/domain-management/cdn-1st)
{% endcontent-ref %}

## 18/10/2024

Destination documentation:

{% content-ref url="/pages/F546e2FzuEwYVoW9iBbI" %}
[Google Enhanced Conversions for Leads](/features/destinations/destinations-catalog/google/google-enhanced-conversions-for-leads)
{% endcontent-ref %}

## 09/08/2024

Destination documentation (updates):

{% content-ref url="/pages/LGSZzlkpAhgXXOjdA25m" %}
[Broken mention](broken://pages/LGSZzlkpAhgXXOjdA25m)
{% endcontent-ref %}

## 02/08/2024

Destination documentation:

{% content-ref url="/pages/lrjSihpGZ4G7mDePTgUg" %}
[Affilae](/features/destinations/destinations-catalog/affilae)
{% endcontent-ref %}

## 26/07/2024

Destination documentation (updates):

{% content-ref url="/pages/zh3p9p87dFqqnpE8Tepe" %}
[TikTok Events API](/features/destinations/destinations-catalog/tiktok/tiktok)
{% endcontent-ref %}

## 19/07/2024

Destination documentation:

{% content-ref url="/pages/JgXkABaQZmcz7WRpJwE1" %}
[Kelkoo](/features/destinations/destinations-catalog/kelkoo)
{% endcontent-ref %}

## 12/07/2024

Destination documentation:

{% content-ref url="/pages/L1huq1tacLInenX4UQmL" %}
[Nextdoor Conversion API](/features/destinations/destinations-catalog/nextdoor-conversion-api)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/BB96osG9O0qqGGK9eAKY" %}
[Matomo](/features/destinations/destinations-catalog/matomo)
{% endcontent-ref %}

## 05/07/2024

New commands available to use our Javascript SDK API with our TMS

{% content-ref url="/pages/-MlTkReRWwr70OwbPL\_o" %}
[Javascript SDK](/features/sources/sources-catalog/web/js-sdk)
{% endcontent-ref %}

*\*see specific section*\
[*https://doc.commandersact.com/features/sources/sources-catalog/web/js-sdk#use-javascript-sdk-in-tms*](https://doc.commandersact.com/features/sources/sources-catalog/web/js-sdk#use-javascript-sdk-in-tms)

## 28/06/2024

Destination documentation (updates):

{% content-ref url="/pages/elbS4y8dUfuFtX5EUbyL" %}
[X (Twitter) Conversion API](/features/destinations/destinations-catalog/x-twitter-conversion-api)
{% endcontent-ref %}

## 21/06/2024

Destination documentation:

{% content-ref url="/pages/shLlyO9aZXEOnmggIuKq" %}
[Quora Ads Conversion API](/features/destinations/destinations-catalog/quora-ads-conversion-api)
{% endcontent-ref %}

## 07/06/2024

Destination documentation:

{% content-ref url="/pages/RYcqmxY32GhetdWo30Tc" %}
[Branch Events](/features/destinations/destinations-catalog/branch-events)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/s80aI7IegVNppY0j8BCY" %}
[Piano Analytics Collection API](/features/destinations/destinations-catalog/piano-analytics/at-internet)
{% endcontent-ref %}

{% content-ref url="/pages/YjB2Z798KAYviB1oCrG5" %}
[Dynamic Yield](/features/destinations/destinations-catalog/dynamic-yield)
{% endcontent-ref %}

## 31/05/2024

Destination documentation (updates):

{% content-ref url="/pages/YjB2Z798KAYviB1oCrG5" %}
[Dynamic Yield](/features/destinations/destinations-catalog/dynamic-yield)
{% endcontent-ref %}

## 17/05/2024

Destination documentation (updates):

{% content-ref url="/pages/-MlQi-BDfcCD1uWPa-XD" %}
[Google Analytics 4](/features/destinations/destinations-catalog/google/google-analytics-4)
{% endcontent-ref %}

{% content-ref url="/pages/s80aI7IegVNppY0j8BCY" %}
[Piano Analytics Collection API](/features/destinations/destinations-catalog/piano-analytics/at-internet)
{% endcontent-ref %}

## 15/05/2024

Cookies page updated

{% content-ref url="/pages/67c7tssfeBBWNmoxqzzT" %}
[Cookies](/configure/cookies)
{% endcontent-ref %}

Tracking First

{% content-ref url="/pages/DI6lZRRP7E7YhtdzvhBg" %}
[First domain tracking (Phoenix)](/configure/cookies/first-domain-tracking-phoenix)
{% endcontent-ref %}

## 10/05/2024

Destination documentation:

{% content-ref url="/pages/atWFMuTcAHDE1W087fyr" %}
[Facebook Lead Ads](/features/destinations/destinations-catalog/facebook/facebook-lead-ads)
{% endcontent-ref %}

## 03/05/2024

Destination documentation (updates):

{% content-ref url="/pages/WoL7TuOnco1bsTm4w24b" %}
[Google Enhanced Conversions](/features/destinations/destinations-catalog/google/google-enhanced-conversion)
{% endcontent-ref %}

## 19/04/2024

Destination documentation (updates):

{% content-ref url="/pages/8VAY4houbuJnZjWEMfOI" %}
[Snapchat Conversions API v2](/features/destinations/destinations-catalog/snapchat/snapchat-conversions-api)
{% endcontent-ref %}

{% content-ref url="/pages/YjB2Z798KAYviB1oCrG5" %}
[Dynamic Yield](/features/destinations/destinations-catalog/dynamic-yield)
{% endcontent-ref %}

{% content-ref url="/pages/tfdemz95AlU5wlS9IO89" %}
[Awin](/features/destinations/destinations-catalog/awin)
{% endcontent-ref %}

## 14/04/2024

Cookies page updated

{% content-ref url="/pages/67c7tssfeBBWNmoxqzzT" %}
[Cookies](/configure/cookies)
{% endcontent-ref %}

## 29/03/2024

Destination documentation (updates):

{% content-ref url="/pages/s80aI7IegVNppY0j8BCY" %}
[Piano Analytics Collection API](/features/destinations/destinations-catalog/piano-analytics/at-internet)
{% endcontent-ref %}

{% content-ref url="/pages/Pm8zfF6sC8yKbRIr6JfN" %}
[Criteo - Events](/features/destinations/destinations-catalog/criteo/criteo-events)
{% endcontent-ref %}

## 08/03/2024

Destination documentation:

{% content-ref url="/pages/elbS4y8dUfuFtX5EUbyL" %}
[X (Twitter) Conversion API](/features/destinations/destinations-catalog/x-twitter-conversion-api)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/ol52AIcauxs4Mfs4W6g1" %}
[LinkedIn Conversions API](/features/destinations/destinations-catalog/linkedin_capi)
{% endcontent-ref %}

## 27/02/2024

[Facebook CAPI offline conversion : add a "How to" section](/features/destinations/destinations-catalog/facebook/facebook-conversions-api#how-to-send-offline-conversion)

## 26/02/2024

New documentation homepage with especially a link to Adloop documentation

## 16/02/2024

Update documentation and screenshot on Data Quality

## 05/02/2024

Update section Domain Management

{% content-ref url="/pages/H8e4daDUPxoQu4EhSKL6" %}
[Domain Management](/configure/administration/domain-management)
{% endcontent-ref %}

## 30/01/2023

Update for new native feature Google Consent Mode

{% content-ref url="/pages/FfvbQ9rU82HiGLczKWKs" %}
[Google Consent Mode in Commanders Act CMP](/features/consent-management/setup-guides/tag-manager/google-consent-mode-in-commanders-act-tms)
{% endcontent-ref %}

## 26/01/2024

Destination documentation:

{% content-ref url="/pages/M7gIgLClnk19QHFJBVci" %}
[Google Search Ads 360 Enhanced Conversions](/features/destinations/destinations-catalog/google/google-search-ads-360-enhanced-conversions)
{% endcontent-ref %}

## 12/01/2024

Destination documentation:

{% content-ref url="/pages/Zz9VMkBYEoir3Hcc9BUg" %}
[Amazon Ads Conversions API](/features/destinations/destinations-catalog/amazon/amazon-ads-conversions-api)
{% endcontent-ref %}

## 05/01/2024

Destination documentation:

{% content-ref url="/pages/ol52AIcauxs4Mfs4W6g1" %}
[LinkedIn Conversions API](/features/destinations/destinations-catalog/linkedin_capi)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/Pm8zfF6sC8yKbRIr6JfN" %}
[Criteo - Events](/features/destinations/destinations-catalog/criteo/criteo-events)
{% endcontent-ref %}

## 21/12/2023

Information page about Google new requirements

{% content-ref url="/pages/LmP3ryIL0W32ZscH7R4H" %}
[Google ACM requires IAB TCF](/features/consent-management/knowledge-base/google-acm-requires-iab-tcf)
{% endcontent-ref %}

## 17/11/2023

Destination documentation:

{% content-ref url="/pages/aiHS4Hapcd2NnVwFe4XA" %}
[Moebel](/features/destinations/destinations-catalog/moebel)
{% endcontent-ref %}

## 10/11/2023

Data retention duration new page

{% content-ref url="/pages/sM2UY4qMmuDHUTn71HJR" %}
[Data retention duration](/configure/data-management/data-retention-duration)
{% endcontent-ref %}

Update: add the section "**Debug mode**" in Live Event Inspector

{% content-ref url="/pages/1djSU6NVfnMXsK9wKZon" %}
[Source Live Event Inspector](/features/sources/live-event-inspector)
{% endcontent-ref %}

{% content-ref url="/pages/tT0wO99rJrdwQ2QZxsqe" %}
[Destination event inspector](/features/destinations/live-event-inspector)
{% endcontent-ref %}

Implementation guide of Consent Banners in GTM

{% content-ref url="/pages/AD1dsrqgL8uXWtLlDjab" %}
[Google Tag Manager (GTM)](/features/consent-management/setup-guides/tag-manager/google-tag-manager-gtm)
{% endcontent-ref %}

Destination documentation:

{% content-ref url="/pages/T79avmoFSGYGFeUMgRIv" %}
[Piano Analytics Catalogs API](/features/destinations/destinations-catalog/piano-analytics/piano-analytics-enrichment-api)
{% endcontent-ref %}

## 03/11/2023

Destination documentation:

{% content-ref url="/pages/JeFxgW3wG8McBAjj7LYT" %}
[Piwik PRO](/features/destinations/destinations-catalog/piwik-pro)
{% endcontent-ref %}

## 20/10/2023

Destination documentation (updates):

{% content-ref url="/pages/tfdemz95AlU5wlS9IO89" %}
[Awin](/features/destinations/destinations-catalog/awin)
{% endcontent-ref %}

## 06/10/2023

Destination documentation:

{% content-ref url="/pages/zWLBgQW9ZRkFidZYr8uW" %}
[The Trade Desk Conversions API](/features/destinations/destinations-catalog/the-trade-desk/the-trade-desk-conversions-api)
{% endcontent-ref %}

## 04/10/2023

Add a openAPI spec file (aka swagger) at the bottom of the [http tracking API documentation](/features/sources/sources-catalog/server/http-tracking-api)

## 28/09/2023

Explanation and workflow examples on Environments inside the platform

{% content-ref url="/pages/ufIKpCVOrGbRG0BazBEw" %}
[Prod and Testing environments](/getting-started/platform-interface/prod-and-testing-environments)
{% endcontent-ref %}

## 20/09/2023

Update Adobe Analytics for authentication token

{% content-ref url="/pages/wyDzg1oa3lqQEj5eFqgg" %}
[Adobe Analytics](/features/destinations/destinations-catalog/adobe/adobe-analytics)
{% endcontent-ref %}

## 08/09/2023

Destination documentation (updates):

{% content-ref url="/pages/WH6Qlv6UtTBWjddXVIaA" %}
[Pinterest](/features/destinations/destinations-catalog/pinterest)
{% endcontent-ref %}

## 01/09/2023

Destination documentation:

{% content-ref url="/pages/cDwNyjPAfoCQgKdYjOMl" %}
[Alphalyr Marketing Studio](/features/destinations/destinations-catalog/alphalyr-marketing-studio)
{% endcontent-ref %}

## 04/08/2023

Destination documentation (updates):

{% content-ref url="/pages/s80aI7IegVNppY0j8BCY" %}
[Piano Analytics Collection API](/features/destinations/destinations-catalog/piano-analytics/at-internet)
{% endcontent-ref %}

## 28/07/2023

Destination documentation:

{% content-ref url="/pages/JPRBhbDIWV2LT1RGQ5TE" %}
[Google Conversion Adjustments](/features/destinations/destinations-catalog/google/google-conversion-adjustments)
{% endcontent-ref %}

## 07/07/2023

Destination documentation (updates):

{% content-ref url="/pages/-MlQi-BDfcCD1uWPa-XD" %}
[Google Analytics 4](/features/destinations/destinations-catalog/google/google-analytics-4)
{% endcontent-ref %}

First party tracking : CloudFlare tutorial updates:

{% content-ref url="/pages/9e710bUcoleHJObaVL1q" %}
[WAF Proxy (CloudFlare,...)](/configure/administration/domain-management/waf-proxy-cloudflare)
{% endcontent-ref %}

## 30/06/2023

Destination documentation (updates)

{% content-ref url="/pages/-MlQi-BDfcCD1uWPa-XD" %}
[Google Analytics 4](/features/destinations/destinations-catalog/google/google-analytics-4)
{% endcontent-ref %}

## 09/06/2023

* [Google Analytics 4 documentation](/features/destinations/destinations-catalog/google/google-analytics-4) enhanced
* Proxy mode of GA4 enriched with a quick [setup guide](/features/destinations/destinations-catalog/google/google-analytics-4/google-analytics-4-proxy-mode#quick-setup)

## 01/06/2023

Update Event Delivery documentation ([filtered events](https://doc.commandersact.com/features/destinations/event-delivery#2-key-metrics))

## 30/05/2023

* [Codes examples of events](https://doc.commandersact.com/developers/tracking/events-reference) has been improved, the following languages has been added:\
  Swift, Objective-C, Kotlin, Dart (Flutter), json
* Improvements for connectors documentation

## 26/05/2023

Destination documentation:

{% content-ref url="/pages/sVVc4rbkoX2O2AQvlNVB" %}
[TikTok Offline Events](/features/destinations/destinations-catalog/tiktok/tiktok-offiline-events)
{% endcontent-ref %}

## 23/05/2023

* Revamping the [How works the platform](/getting-started/concepts) page and [Integrating your data](/getting-started/integrating-your-data) page
* Grouping by categories from now on in [source catalog](/features/sources/sources-catalog)
* Adding a dedicated [OneTag tutorial](/getting-started/integrating-your-data/onetag-tutorial) page
* Reshaping [Mobile App](/features/sources/sources-catalog/mobile-app) page

## 19/05/2023

Destination documentation:

{% content-ref url="/pages/IkHPO70fNc1TWXXWYUU2" %}
[Google BigQuery](/features/destinations/destinations-catalog/google/google-bigquery)
{% endcontent-ref %}

{% content-ref url="/pages/fPsFrxBmQbKOVyuapyes" %}
[Taboola Events](/features/destinations/destinations-catalog/taboola/taboola-events)
{% endcontent-ref %}

## 12/05/2023

Destination documentation:

{% content-ref url="/pages/YjB2Z798KAYviB1oCrG5" %}
[Dynamic Yield](/features/destinations/destinations-catalog/dynamic-yield)
{% endcontent-ref %}

## 05/05/2023

Destination documentation:

{% content-ref url="/pages/rNio3oW53mzhQ37Q12np" %}
[TradeTracker](/features/destinations/destinations-catalog/tradetracker)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/s80aI7IegVNppY0j8BCY" %}
[Piano Analytics Collection API](/features/destinations/destinations-catalog/piano-analytics/at-internet)
{% endcontent-ref %}

## 07/04/2023

Destination documentation (updates):

{% content-ref url="/pages/-MlQi-BDfcCD1uWPa-XD" %}
[Google Analytics 4](/features/destinations/destinations-catalog/google/google-analytics-4)
{% endcontent-ref %}

Also added:[ analyses, suggestions and report's impact to our GA4 proxy](https://doc.commandersact.com/platform-updates/pages/8b5yoXFZP5Tq17CynL9J#3.-impact-analysis-and-open-suggestions) documentation

{% content-ref url="/pages/zh3p9p87dFqqnpE8Tepe" %}
[TikTok Events API](/features/destinations/destinations-catalog/tiktok/tiktok)
{% endcontent-ref %}

## 31/03/2023

Destination documentation:

{% content-ref url="/pages/3dJJigouIigNV76MuwA5" %}
[Adform](/features/destinations/destinations-catalog/adform)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/7PfRq9Z2jgZW4jHNKk6q" %}
[Rakuten Events](/features/destinations/destinations-catalog/rakuten/rakuten-events)
{% endcontent-ref %}

{% content-ref url="/pages/UpVzXjE94uXULzDcJTdD" %}
[Partnerize](/features/destinations/destinations-catalog/partnerize)
{% endcontent-ref %}

{% content-ref url="/pages/RBZreGw2EYSwOWshkqPg" %}
[Tutorial - How to build a server destination with the JS sandbox](/features/destinations/destination-builder/javascript-destination-builder/tutorial-how-to-build-a-server-destination-with-the-js-sandbox)
{% endcontent-ref %}

{% content-ref url="/pages/8b5yoXFZP5Tq17CynL9J" %}
[Google Analytics 4 - Proxy Mode](/features/destinations/destinations-catalog/google/google-analytics-4/google-analytics-4-proxy-mode)
{% endcontent-ref %}

## 24/03/2023

Destination documentation (updates):

{% content-ref url="/pages/ZK7Qw71UsGWiF3rBwg3r" %}
[Mapp](/features/destinations/destinations-catalog/mapp)
{% endcontent-ref %}

## 25/02/2023

Add the [Facebook CAPI through GTM](/features/destinations/destinations-catalog/facebook/facebook-conversions-api/facebook-capi-through-gtm) documentation

## 24/02/2023

Destination documentation:

{% content-ref url="/pages/vUIsB7jDq8yORzL5ZR7f" %}
[Equativ Audience](/features/destinations/destinations-catalog/equativ-audience)
{% endcontent-ref %}

## 21/02/2023

New feature documentation: Destination Builder

{% content-ref url="/pages/reBPpbAALO0AzM9GnqH4" %}
[Destination builder](/features/destinations/destination-builder)
{% endcontent-ref %}

## 09/02/2023

Event enrichment documentation (updates):

{% content-ref url="/pages/lqsJnaD5tX1V64H8qrad" %}
[Events enrichment](/features/enrichments/events-enrichment)
{% endcontent-ref %}

Destination and source live event inspector documentation (updates):

{% content-ref url="/pages/1djSU6NVfnMXsK9wKZon" %}
[Source Live Event Inspector](/features/sources/live-event-inspector)
{% endcontent-ref %}

{% content-ref url="/pages/tT0wO99rJrdwQ2QZxsqe" %}
[Destination event inspector](/features/destinations/live-event-inspector)
{% endcontent-ref %}

## 03/02/2023

Destination documentation:

{% content-ref url="/pages/7PfRq9Z2jgZW4jHNKk6q" %}
[Rakuten Events](/features/destinations/destinations-catalog/rakuten/rakuten-events)
{% endcontent-ref %}

## 13/01/2023

Destination documentation (updates):

{% content-ref url="/pages/-MlQi-BDfcCD1uWPa-XD" %}
[Google Analytics 4](/features/destinations/destinations-catalog/google/google-analytics-4)
{% endcontent-ref %}

## 30/12/2022

Destination documentation:

{% content-ref url="/pages/WH6Qlv6UtTBWjddXVIaA" %}
[Pinterest](/features/destinations/destinations-catalog/pinterest)
{% endcontent-ref %}

## 20/12/2022

Add a [changelog](/developers/changelogs/web-container-generator) section on the web container generator

## 16/12/2022

* Add an [*announcements* ](/platform-updates/announcements)section in Platform updates menu
* Add [*web performance*](/use-cases/website-performance) in use cases section
* Enhance the [*Concepts* ](/getting-started/concepts)section
* Give more visibility to [*Sources* ](/features/sources)and [*Destinations* ](/features/destinations)menus, following your feedback
* Enhance the [event reference](/developers/tracking-and-integrations/tracking/events-reference) page to clarify and enlarge tables, following your feedback
* Enhance the home page
* Add [video events](/developers/tracking-and-integrations/tracking/events-reference/video-event-reference) spec

## 09/12/2022

Destination documentation:

{% content-ref url="<https://github.com/TagCommander/PlatformX/blob/master/platform-updates/broken-reference/README.md>" %}
<https://github.com/TagCommander/PlatformX/blob/master/platform-updates/broken-reference/README.md>
{% endcontent-ref %}

## 06/12/2022

* Re-arrangement of menus to find sources/destinations more easily
* Event reference better arranged to simplify reading:

{% content-ref url="/pages/-MlQ-WQ5wrvJAqVy\_xTe" %}
[Events reference](/developers/tracking-and-integrations/tracking/events-reference)
{% endcontent-ref %}

## 02/12/2022

Destination documentation (updates):

{% content-ref url="/pages/WoL7TuOnco1bsTm4w24b" %}
[Google Enhanced Conversions](/features/destinations/destinations-catalog/google/google-enhanced-conversion)
{% endcontent-ref %}

{% content-ref url="/pages/JDdWOqBeSvPczK5emaOP" %}
[Commission Junction](/features/destinations/destinations-catalog/commission-junction)
{% endcontent-ref %}

## 30/11/2022

Destination builder documentation update:

{% content-ref url="/pages/reBPpbAALO0AzM9GnqH4" %}
[Destination builder](/features/destinations/destination-builder)
{% endcontent-ref %}

## 04/11/2022

Destination documentation (updates):

{% content-ref url="/pages/zh3p9p87dFqqnpE8Tepe" %}
[TikTok Events API](/features/destinations/destinations-catalog/tiktok/tiktok)
{% endcontent-ref %}

## 21/10/2022

Revamp **Identity resolution** documentation

{% content-ref url="/pages/-MlQgUI\_5AZoiUWLuHWt" %}
[Identity resolution](/features/identity-resolution)
{% endcontent-ref %}

Enrich Data cleansing **transformation functions** documentation

{% content-ref url="/pages/VRjb6QP4Zfqbqvuzx4Dj" %}
[Supported transformation functions - Data cleansing](/features/data-quality/data-cleansing/supported-transformation-functions)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/8VAY4houbuJnZjWEMfOI" %}
[Snapchat Conversions API v2](/features/destinations/destinations-catalog/snapchat/snapchat-conversions-api)
{% endcontent-ref %}

## 30/09/2022

Added a data quality indicators description in Source Overview

{% content-ref url="/pages/tgc83Vx5uGogxvt0RuIi" %}
[Sources Overview](/features/sources/overview)
{% endcontent-ref %}

## 22/09/2022

Documentation on how to migrate from serverside v1

{% content-ref url="/pages/XCh86toK8MscLknccTf7" %}
[Migration guides to the Platform X](/getting-started/integrating-your-data/migration-guides-to-the-platform-x)
{% endcontent-ref %}

## 16/09/2022

Destination documentation:

{% content-ref url="/pages/JDdWOqBeSvPczK5emaOP" %}
[Commission Junction](/features/destinations/destinations-catalog/commission-junction)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/s80aI7IegVNppY0j8BCY" %}
[Piano Analytics Collection API](/features/destinations/destinations-catalog/piano-analytics/at-internet)
{% endcontent-ref %}

{% content-ref url="/pages/zh3p9p87dFqqnpE8Tepe" %}
[TikTok Events API](/features/destinations/destinations-catalog/tiktok/tiktok)
{% endcontent-ref %}

{% content-ref url="/pages/uTokaHPL1JSDUNpjuKTQ" %}
[Effinity](/features/destinations/destinations-catalog/effinity)
{% endcontent-ref %}

## 13/09/2022

* Destination documentation (updates)

{% content-ref url="/pages/DQkEgKAlRndS6RexoywI" %}
[Xandr](/features/destinations/destinations-catalog/xandr)
{% endcontent-ref %}

\+ 2 others

## 01/09/2022

* Destination settings -> *Advanced mapping* updated to *Properties transformation*:

{% content-ref url="/pages/PAj5mjjE6gP9i8gKwwmD" %}
[Mapping and Properties transformation](/features/destinations/advanced-mapping)
{% endcontent-ref %}

* Destination documentation (updates):

{% content-ref url="/pages/QYAoqkM88dB3QiSPz1nQ" %}
[AbTasty](/features/destinations/destinations-catalog/abtasty)
{% endcontent-ref %}

\+ 10 others

## 26/08/2022

Destination documentation:

{% content-ref url="/pages/BB96osG9O0qqGGK9eAKY" %}
[Matomo](/features/destinations/destinations-catalog/matomo)
{% endcontent-ref %}

{% content-ref url="/pages/ZK7Qw71UsGWiF3rBwg3r" %}
[Mapp](/features/destinations/destinations-catalog/mapp)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/8VAY4houbuJnZjWEMfOI" %}
[Snapchat Conversions API v2](/features/destinations/destinations-catalog/snapchat/snapchat-conversions-api)
{% endcontent-ref %}

## 22/08/2022

Data quality documentation:

{% content-ref url="/pages/UfbyaUkM35TB2QnbfTv9" %}
[Data Quality](/features/data-quality)
{% endcontent-ref %}

{% content-ref url="<https://github.com/TagCommander/PlatformX/blob/master/platform-updates/broken-reference/README.md>" %}
<https://github.com/TagCommander/PlatformX/blob/master/platform-updates/broken-reference/README.md>
{% endcontent-ref %}

{% content-ref url="/pages/-MlQgnQwkPtyj-Ot8jUI" %}
[Sources data quality](/features/data-quality/data-quality)
{% endcontent-ref %}

{% content-ref url="/pages/RZ1ZM2LnT8M8w4im3l6P" %}
[Data cleansing](/features/data-quality/data-cleansing)
{% endcontent-ref %}

## 19/08/2022

Destination documentation (updates):

{% content-ref url="/pages/zh3p9p87dFqqnpE8Tepe" %}
[TikTok Events API](/features/destinations/destinations-catalog/tiktok/tiktok)
{% endcontent-ref %}

## 12/08/2022

Destination documentation (updates):

{% content-ref url="/pages/8VAY4houbuJnZjWEMfOI" %}
[Snapchat Conversions API v2](/features/destinations/destinations-catalog/snapchat/snapchat-conversions-api)
{% endcontent-ref %}

## 05/08/2022

Destination documentation:

{% content-ref url="/pages/uTokaHPL1JSDUNpjuKTQ" %}
[Effinity](/features/destinations/destinations-catalog/effinity)
{% endcontent-ref %}

{% content-ref url="/pages/odKIZLszlcT2haicHIcW" %}
[Kwanko](/features/destinations/destinations-catalog/kwanko)
{% endcontent-ref %}

## 01/08/2022

Events collection documentation:

{% content-ref url="/pages/E1R32QbJ0Weg60qccF1V" %}
[Events collection](/configure/data-management/events-collection)
{% endcontent-ref %}

## 29/07/2022

Destination documentation:

{% content-ref url="/pages/suWKJNvEqdHrMmuX0gpq" %}
[Tradedoubler](/features/destinations/destinations-catalog/tradedoubler)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/WoL7TuOnco1bsTm4w24b" %}
[Google Enhanced Conversions](/features/destinations/destinations-catalog/google/google-enhanced-conversion)
{% endcontent-ref %}

{% content-ref url="/pages/8VAY4houbuJnZjWEMfOI" %}
[Snapchat Conversions API v2](/features/destinations/destinations-catalog/snapchat/snapchat-conversions-api)
{% endcontent-ref %}

{% content-ref url="/pages/tfdemz95AlU5wlS9IO89" %}
[Awin](/features/destinations/destinations-catalog/awin)
{% endcontent-ref %}

## 22/07/2022

Destination documentation:

{% content-ref url="/pages/zh3p9p87dFqqnpE8Tepe" %}
[TikTok Events API](/features/destinations/destinations-catalog/tiktok/tiktok)
{% endcontent-ref %}

Destination documentation (updates):

{% content-ref url="/pages/s80aI7IegVNppY0j8BCY" %}
[Piano Analytics Collection API](/features/destinations/destinations-catalog/piano-analytics/at-internet)
{% endcontent-ref %}

## 15/07/2022

Destination documentation (updates):

{% content-ref url="/pages/WoL7TuOnco1bsTm4w24b" %}
[Google Enhanced Conversions](/features/destinations/destinations-catalog/google/google-enhanced-conversion)
{% endcontent-ref %}

{% content-ref url="/pages/s80aI7IegVNppY0j8BCY" %}
[Piano Analytics Collection API](/features/destinations/destinations-catalog/piano-analytics/at-internet)
{% endcontent-ref %}

{% content-ref url="/pages/tfdemz95AlU5wlS9IO89" %}
[Awin](/features/destinations/destinations-catalog/awin)
{% endcontent-ref %}

## 08/07/2022

Documentation updates for template [Commanders Act | OnSite CMP API](https://tagmanager.google.com/gallery/#/owners/CommandersAct/templates/GTM-OnSite-API):

{% embed url="<https://community.commandersact.com/trustcommander/setup-guides/tag-manager/consent-mode-in-gtm>" %}

Destination documentation:

{% content-ref url="/pages/Pm8zfF6sC8yKbRIr6JfN" %}
[Criteo - Events](/features/destinations/destinations-catalog/criteo/criteo-events)
{% endcontent-ref %}

{% content-ref url="/pages/8VAY4houbuJnZjWEMfOI" %}
[Snapchat Conversions API v2](/features/destinations/destinations-catalog/snapchat/snapchat-conversions-api)
{% endcontent-ref %}

{% content-ref url="/pages/tcTdCUoH5hwkPPnksCi3" %}
[Kameleoon Events](/features/destinations/destinations-catalog/kameleoon/kameleoon-events)
{% endcontent-ref %}

## 05/07/2022

Mobile sources updates:

{% content-ref url="/pages/BK76uJkMqZYIIG0wArX5" %}
[iOS](/features/sources/sources-catalog/mobile-app/ios)
{% endcontent-ref %}

{% content-ref url="/pages/MBLvPV5xFqkjFRgCyZ4S" %}
[Android](/features/sources/sources-catalog/mobile-app/android)
{% endcontent-ref %}

Mobile APP global setup guide:

{% content-ref url="/pages/PCMnpKASXPQW8eQD4BH6" %}
[Mobile APP](/features/sources/sources-catalog/mobile-app)
{% endcontent-ref %}

## 30/06/2022

Webhook documentation:

{% content-ref url="/pages/AYmN94VqVEP2degRnyNa" %}
[Webhook](/features/destinations/destinations-catalog/webhook)
{% endcontent-ref %}

## 29/06/2022

Segment stats article:

{% content-ref url="/pages/ODZ4Y7QOO5RtrLBoSDHb" %}
[Segment stats](/features/customers/segment/segment-stats)
{% endcontent-ref %}

Data quality feature:

{% content-ref url="/pages/-MlQgnQwkPtyj-Ot8jUI" %}
[Sources data quality](/features/data-quality/data-quality)
{% endcontent-ref %}

## 23/06/2022

Add a description of automatic added properties for Web events (JS SDK and Web container):

{% content-ref url="/pages/IBBpouyARPFQCzYeaDTl" %}
[Web event specificity](/developers/tracking-and-integrations/tracking/about-events/js-sdk-event-specificity)
{% endcontent-ref %}

Update automatic added properties for Mobile SDK:

{% content-ref url="/pages/jIy9aJOvYox9wPTn3nc7" %}
[Mobile App event specificity](/developers/tracking-and-integrations/tracking/about-events/mobile-sdk-event-specificity)
{% endcontent-ref %}

## 21/04/2022

Events enrichment article:

{% embed url="<https://community.commandersact.com/platform-x/features/enrichments/events-enrichment>" %}

Product catalog files importer details:

{% embed url="<https://community.commandersact.com/platform-x/features/integrations/sources/sources-catalog/product-catalog/product-catalog-files-importer-ftp>" %}

## 19/04/2022

Bulk articles update :

{% embed url="<https://community.commandersact.com/platform-x/developers/tracking/javascript-sdk>" %}
Add more details
{% endembed %}

{% embed url="<https://community.commandersact.com/platform-x/getting-started/integrating-your-data>" %}
Complete with third party tools
{% endembed %}

{% embed url="<https://community.commandersact.com/platform-x/getting-started/>..." %}

{% embed url="<https://community.commandersact.com/platform-x/features/integrations/concepts>" %}
Add concept introduction and links
{% endembed %}

{% embed url="<https://community.commandersact.com/platform-x/developers/tracking/about-events/mobile-sdk-event-specificity>" %}
Adding sdk event spec
{% endembed %}

{% embed url="<https://community.commandersact.com/platform-x/developers/config-api>" %}
Adding dedicated API link
{% endembed %}

{% embed url="<https://community.commandersact.com/platform-x/features/integrations/sources/sources-catalog/gtm>" %}
Adding source GTM
{% endembed %}

{% embed url="<https://community.commandersact.com/platform-x/features/integrations/sources/sources-catalog/product-catalog>" %}
Adding a specific domentation for catalog import
{% endembed %}


# Release notes

All details about the updates or new features of each new release updated by our Product team!

## Release 10.0.36 - June - 2026

#### Real Time Cookie Scanner updates:

#### 🏷️ Custom Category Labels

You can now rename standard cookie categories (Essential, Marketing, Analytics) to match your organization's terminology. You can use your standard own CMP categories, or enter a custom name.

**Why it matters:**\
Create a more consistent privacy experience by aligning cookie categories with your internal naming conventions across all Cookie Scanner interfaces.

#### 🌍 Universal CMP Compatibility

Real Time Cookie Scanner is now compatible with any Consent Management Platform (CMP).

**Why it matters:**\
Whether you use a commercial CMP or a custom-built solution, consent status can now be integrated seamlessly into Cookie Scanner.

#### 🔔 Domain-Specific Alerts

Alerting has become more flexible with support for domain-level filters. You can configure multiple alerts, based on specific domains.

**Why it matters:**\
Monitor only the domains that matter most to your teams and receive more relevant notifications.

#### 📅 Cookie History with Date Filtering

A new date picker allows you to explore cookies detected during a specific time period.

**Why it matters:**\
Quickly verify whether a cookie was present during a given timeframe and simplify compliance investigations.

#### 📊 New UI: Compliance Summary

The new Compliance Summary introduces a website compliance score.

**Why it matters:**\
Gain an instant overview of your site's compliance health and prioritize remediation efforts more effectively.

#### 🔍 Enhanced Cookie Visibility

Several improvements have been added to cookie monitoring:

* Occurrence rates are now displayed for active cookies
* Last scanned URL is available for active cookies
* Automatic subdomain discovery is supported
* CSV/XLS exports now include consent flags

**Why it matters:**\
Investigating cookie behavior is now faster and more actionable.

***

#### Consent dashboards improvements

#### 📈 Daily Consent Statistics Export

Consent Dashboard graphs can now be exported with day-by-day statistics.

**Why it matters:**\
Build your own reports, monitor trends over time, and analyze consent performance with greater precision.

***

#### CDP & Audience Activation updates

#### 🧭 New Profile Explorer & Unified Profile

A new Profiles section provides a complete view of individual customer profiles.

**Included insights:**

* Identities & devices
* Segments
* Activities & purchase history
* Computed attributes

**Why it matters:**\
Understand exactly how your CDP consolidates customer data and simplify audience validation before launching campaigns.

#### 🔒 Consent Filtering for Audience Destinations

Audience Destinations now support consent-based filtering directly within the destination configuration.

**Why it matters:**\
Apply privacy rules where activation happens, reduce segment duplication, and ensure only consented users are shared with partners.

#### 📂 Smarter Segment Management

The Segment Overview has been redesigned with folders, labels, and duplication capabilities.

**Why it matters:**\
Organize audiences more efficiently, navigate large segment libraries faster, and create audience variations with fewer clicks.

***

#### Data Management & Enrichment

#### 📦 Product Enrichment Without CDP

Product Enrichment can now use a Data Store directly as a source.

**Why it matters:**\
Enrich server-side events with product information such as margin data without requiring a CDP Product Catalog.

#### 🏷️ Clearer Data Store Naming

"Storage Settings" has been renamed to "Data Store" throughout the platform, with improved enrichment descriptions.

**Why it matters:**\
Reduce confusion and make enrichment configuration easier to understand.

#### 🤖 AI-Powered CSV Mapping (Beta)

The CSV Importer can now automatically suggest mappings based on both column names and data content.

**Why it matters:**\
Accelerate onboarding and reduce manual configuration effort.

***

#### Platform & Infrastructure

#### 🌐 Expanded Commanders Act Gateway Integration

Commanders Act Gateway is now more deeply integrated into the platform.

**What's included:**

* First-party hosting for web containers
* First-party hosting for CMP banners
* Partner library hosting
* Phoenix hit routing through Gateway

**Why it matters:**\
Simplify first-party deployments and prepare for broader Gateway adoption across hosting and tracking use cases.

#### 🔍 Improved Destination Catalog Navigation

A new destination-type filter and clearer destination labels have been added.

**Why it matters:**\
Find the right destination faster and navigate large catalogs more efficiently.

#### 🔐 Improved Password Security Flow

Password updates now use a single secured workflow across the platform.

**Why it matters:**\
A more consistent and secure password management experience.

#### 📊 Improved Credit Usage Filtering

A redesigned site selector makes it easier to analyze credit usage on large accounts.

**Why it matters:**\
Better visibility and simpler account monitoring.

***

#### New & Updated Destinations

#### 🪟 Microsoft Conversions API

Now available for all customers.

**Why it matters:**\
Track conversions, build audiences, enable automated bidding, and integrate with Microsoft advertising services using a modern server-side implementation.

#### 📱 AppsFlyer Mobile Events API (Beta)

Support for Android and iOS server-to-server event tracking.

**Why it matters:**\
Measure mobile app activity more reliably while reducing dependency on client-side integrations.

#### 🎮 AppsFlyer PC / Console / CTV Events API (Beta)

Support for connected TV, gaming consoles, and desktop platforms.

**Why it matters:**\
Expand event measurement across 14 supported platforms, including Roku, LG webOS, Samsung Tizen, Steam, and Amazon Fire TV.

#### 🎯 Google Customer Match Enhancements

Google Customer Match now supports User IDs and Mobile Device IDs in addition to Contact Information.

**Why it matters:**\
Align audience activation capabilities with Google's latest supported identifiers.

***

#### Mobile SDK Updates

#### 📲 New Consent Banner Experience

Both iOS and Android SDKs now include a modern inline consent banner experience.

**Why it matters:**\
Allow users to manage consent without leaving their current screen, creating a smoother user experience.

#### ⚡ Performance & Documentation Improvements

Additional SDK enhancements include:

* Improved consent management performance
* Better handling of consent expiration
* Updated documentation
* Faster package distribution for iOS developers

**Why it matters:**\
Simpler implementation, improved maintainability, and a better developer experience.

***

## Release 10.0.36 - March - 2026

✨ **New Features**

📊 **Credit Usage — Improved Export**

The Credit Usage export has been updated to simplify analysis and reporting.

* The first sheet now mirrors the Credit Usage table with **raw values only**
* Intermediate totals have been removed
* The format has been adjusted to better support reporting workflows

→ Makes Excel analysis easier and speeds up preparation of client usage reports and internal calculations.

***

🔎 **Event Inspector — Extended Search Capabilities**

Search capabilities in the **Event Inspector** have been significantly expanded.

* All event properties are now searchable
* Applies to all standard properties and up to **100 custom properties per event**
* Only a few heavy fields remain excluded from indexing (headers and `context.device`)

→ Enables faster debugging and more powerful investigations when analyzing event flows.

***

🧬 **Event Enrichment — Improved Observability**

New metadata is now attached to events to better track enrichment outcomes.

* `context.enrichment.status` indicates whether enrichment succeeded or failed
* `context.warnings.detail` explains the reason for enrichment failures (missing\_key, no\_data, timeout, api\_error, etc.)
* `context.dataquality.violations` flags violations of rules defined in the Event Specification

All fields are indexed and **visible in the Live Event Inspector**.

→ Makes it much easier to diagnose enrichment issues, filter problematic events, and prevent sending incomplete data to destinations.

♿ **Privacy Center — WCAG 2.2 Accessibility Compliance**

A new **Privacy Center template compliant with WCAG 2.2 accessibility standards** is now available for all customers.

Key improvements include:

* Accessibility attributes added to banner elements
* Improved default UI settings (button layout, colors, links, close icon)
* Better keyboard and screen-reader support

→ Helps brands comply with **digital accessibility regulations** and improves usability for all visitors.

Activation is simple: select the new Privacy Center template in your banner settings, regenerate the banner, and deploy.

***

🛍 **Amazon Consent Mode — Now Available for All Customers**

Amazon Consent Mode is now generally available.

* Works similarly to Google Consent Mode
* Requires the GeoLoc API for correct regional behavior

→ Enables compliant tracking and activation with Amazon advertising integrations.

📘 Documentation:\
<https://doc.commandersact.com/features/consent-management/setup-guides/tag-manager/amazon-consent-signal>

***

📊 **Destination Overview — Advanced Filtering**

A new **“More filters”** component has been added to destination listings.

* Opens a side panel with additional filters
* Includes a filter to display **destinations running in Dry Mode**

→ Makes it easier to navigate large accounts and isolate specific configurations.

***

📁 **Realtime Cookie Scanner — Excel Export**

Cookie list exports now support **Excel (.xlsx)** format in addition to CSV.

→ Avoids encoding issues and allows teams to use exports immediately in reporting workflows without conversion.

***

📧 **Alerts — External Email Recipients**

Alerts can now be sent to **external email addresses**, even if the recipients are not users of the platform.

* Simply type an email address in the recipient field and press Enter
* Works across all alert types (Realtime Cookie Scanner, Event Delivery, etc.)

→ Enables notifications to shared inboxes, IT teams, DPOs, monitoring systems, or ticketing tools.

***

## Release 10.0.35 - February - 2026

✨ **New Features**

🍪 **Realtime Cookie Scanner — Compatibility with OneTrust & Didomi**

Realtime Cookie Scanner is now compatible with **third-party CMP banners**, including **OneTrust** and **Didomi**, without requiring custom code.

* Detects all types of storage (cookies, localStorage, etc.)
* Tracks consent states across key user interactions (before consent, after refusal, etc.)
* **One-click activation** — no setup required, the CMP in use is detected automatically

→ Allows customers using external CMPs to benefit from Realtime Cookie Scanner while keeping their existing banner.

***

📊 **Consent Performance Dashboard v2.0 — Comprehensive Analytics Suite** The Consent Analysis has been completely transformed from a data table into a high-end strategic dashboard. It provides actionable insights into how privacy settings impact traffic and tracking quality.

**📈 Historical Trend Charts** The historical analysis module is now live, providing a day-by-day view of your performance evolution.

* **Evolution of Explicit Consent:** Track daily variations of Global Consent vs. Explicit Consent (Trust Metric).
* **Traffic Volume Overlay:** Integrated bars to correlate consent behavior with traffic peaks.
* **Visual "Trust Gap":** Instantly identifies how much "noise" (ghost traffic) impacts overall collection.

***

**🎯 Decision Journey & Strategic Insights** A new intelligence layer helps interpret user behavior beyond raw percentages.

* **Decision Journey (Funnel):** Dynamic SVG widget visualizing the path from Exposure to Interaction and final Opt-in.
* **Ghost Traffic Identification:** Separates structural non-human traffic (bots, crawlers, bounces) that cannot be optimized.
* **Real Confidence Metric:** Focuses exclusively on human visitor trust to provide a true adherence rate.
* **UX Opportunity Analysis:** Highlights explicit refusals to identify specific levers for A/B testing.

***

**⚙️ Advanced Interface & Controls**

* **Executive KPI Cards:** Weighted averages across all selected banners with automated **Period-over-Period (PoP) comparisons**.
* **Geographic Impact Widget:** Instant performance breakdown between Europe (GDPR) and the Rest of the World.
* **Device Analysis Widget:** Comparison of consent rates across Desktop, Mobile, and Tablet to identify screen-specific friction.
* **New Filtering Engine:** Top 10 banners (>1,000 views) selected by default; advanced segment filters for Device and Location.

***

**🛡️ Real-time Cookie Scanner Integration** A live compliance audit is now directly embedded into the analytics workflow.

* **Live Compliance Status:** Pulse badge and timer confirming the active scan.
* **Health Score & Violations:** Real-time alerts if unauthorized cookies (e.g., `_ga`) are detected before user choice.

→ Moves from simple reporting to a decision-making center, providing clear optimization targets to recover lost tracking and ensure total compliance.

📘 Documentation:\
[https://doc.commandersact.com/features/consent-management/consent-performance-dashboard](https://doc.commandersact.com/features/consent-management/user-guides/consent-analysis)

## Release 10.0.34 - January - 2026

✨ **New Features**

🤖 **Realtime Cookie Scanner — AI Description Generator**\
A new AI-powered button is available for cookies missing descriptions.

* Automatically searches the web for relevant information
* Generates contextual descriptions
* Falls back to logical suggestions if needed
* Suggestions can be edited before saving
* Automatically available in all configured languages

→ Faster completion of cookie inventories with higher-quality, consistent descriptions.

***

🔓 **Realtime Cookie Scanner — Standalone Modes (Beta)**\
Realtime Cookie Scanner can now operate independently depending on the client’s stack.

Three levels available (beta / closed beta):

* CMP independence (any CMP)
* TMS independence (any TMS)
* Full CMP + TMS independence via simple JS snippet

→ Positions RCS as a true standalone product and expands deployment flexibility.

***

🧪 **Destination Builder — Improved Sandbox Experience**

You can now save custom sample payloads directly in the Sandbox.

* Create, store, and reuse test payloads
* Faster validation of mappings and transformations

→ Streamlines server-side destination development and reduces testing time.

***

📢 **Amazon Consent Mode Integration (Beta)**\
A new native integration for Amazon Consent Mode is now available.

* Simple activation
* Works with server-side destinations
* Requires banner and container regeneration

→ Simplifies compliance when using Amazon Consent Mode.

***

🧩 **Commanders Act Assistant — Plugin Update**

* New “Refresh” button to retrieve the latest generated version
* Improved override handling on Tags tab

→ More reliable QA workflows.

***

🧹 **Client-Side TMS — Tag Cleaner Update**

The Tag Cleaner is now disabled by default.

→ Prevents unintended tag removals and aligns with consulting best practices.

***

## Release 10.0.33 - December - 2025

✨ **New Features**

🔍 **Destinations — View History & Audit Trail**\
A new **View history** button is now available on destinations.

* Displays all past edits in a dedicated side panel
* Shows who changed what and when
* Includes a compact before/after comparison

→ Provides a clear audit trail for faster debugging and smoother collaboration.

***

📜 **Activity Logs API — Advanced Filtering**\
The Activity Logs API now supports filtering by feature (Destinations, Sources, Enrichments, Data Cleansing, etc.).

→ Makes audits, compliance checks, and troubleshooting significantly easier, with full transparency across platform activity.

***

📊 **Adloop — Data-Source Setup UX Revamp (Google / Bing / Amazon)**\
The setup flow for Google, Bing, and Amazon data-sources has been redesigned.

* Clearer distinction between quick import and custom setup
* All setup steps visible at all times
* Larger and more readable configuration window

→ A simpler, faster, and more user-friendly onboarding experience.

***

📁 **Adloop — sFTP Export with Secure Key Support**\
sFTP export destinations now support advanced security key protocols.

* Supported keys: RSA, DSA, ECDSA, DH, Ed25519, OpenSSH

→ Enables stronger security compliance and deeper integration within enterprise ecosystems.

***

🍪 **Realtime Cookie Scanner — “Cookies by Category” View**\
A new page allows cookies to be displayed by standardized families (Marketing, Essential, Analytics, etc.).

→ Helps legal and DPO teams quickly identify compliance issues and better understand cookie distribution.

📘 Documentation:\
<https://doc.commandersact.com/features/realtime-cookie-scanner/cookies-by-category>

***

🍪 **Realtime Cookie Scanner — UX & Compliance Improvements**

* New **“Exempt” flag** for cookies
* Cookie Notice settings configurable directly from the side panel
* Categories standardized across the new UI
* Improved visuals and extended details in “Cookies by Category”

→ More consistent compliance workflows and smoother navigation.

***

🌍 **Realtime Cookie Scanner — “Translate by AI”**\
You can now automatically translate cookie descriptions into any language.

* Translate a single cookie or all cookies in one click
* 200 free translations per day
* Remaining credits counter displayed
* Works across all configured interface languages

→ Speeds up multilingual compliance management and reduces manual effort.

***

## Release 10.0.32 - November - 2025

✨ **New Features**

📤 **New Destination — Salesforce Marketing Cloud: Profile Sync (API)**\
A streamlined **real-time** destination for Salesforce Marketing Cloud is now available.\
It allows customers to **upsert profiles in real time** into Data Extensions using Salesforce’s official API, powering use cases such as abandoned cart flows, journey triggers, and continuous profile synchronisation.\
Setup is simple, with intuitive field selection and batch-compatible processing.

***

🧮 **Data Cleansing — Full-Screen Formula Editor**\
The formula editor has been completely redesigned for a more powerful and comfortable experience.

**What’s new:**

* Full-screen editing in a side panel
* Integrated Property Picker
* Function catalog with one-click insertion
* **Live Formula Tester** with instant feedback
* Built-in AI copilot (**JarvX**) to create, modify, or explain formulas

→ A faster, more intuitive workflow for all users.

***

🔧 **Destinations — Simplified Inputs & Smarter Editing**\
Destination setup is now easier and more consistent across all connectors.

**Highlights:**

* Removal of old dual-mode inputs (text mode vs formula mode)
* Each field now has two optional actions:
  * **Property Picker** to inject dynamic values
  * **Formula Editor** for advanced transformations
* Cleaner UX aligned with modern server-side standards
* More power thanks to integrated formulas & transformations

→ Faster setup, fewer mistakes, and easier onboarding for all users.

***

🔗 **Destinations — Smart Mapping**\
Mappings are now easier to understand and configure.

**Improvements include:**

* Display of labels, descriptions, and technical names
* Guided Property Picker for selecting or changing mapped fields
* Search capabilities for instant access to the right property

→ Makes mapping self-explanatory and prevents configuration errors.

***

🔢 **Enhanced Data Types in Destinations**\
Destination connectors now provide more advanced handling of property types (numbers, booleans, strings, etc.).\
Users can still explicitly cast types using `STRING()` or `NUMBER()` when required.

→ Adds flexibility for advanced users with specific formatting or API integration needs.

***

🕓 **View History for Destinations**\
A new **View history** button summarises all modifications applied to a destination.

**Includes:**

* Who made the change
* What was updated
* When it occurred
* A compact before/after comparison

→ Enables faster investigations, smoother collaboration, and clearer audit trails.

***

📜 **Activity Logs API — Now Filterable**\
The Activity Logs API can now filter activity based on any feature of the platform, including:

* Destinations
* Sources
* Enrichments
* Data Cleansing
* Data Models
* Consent
* Configuration updates
* …and more

→ Makes it easy to isolate specific events for troubleshooting, compliance reviews, and operational audits.

***

🔍 **Event Inspector for Audience-Based Destinations**\
Audience-based destinations now include a dedicated **Event Inspector** tab.\
Until now, Event Inspector was only available for event-based destinations.\
Customers can now review in realtime **exactly what is shared with each partner in real time** when sending audiences.

→ Easier debugging, full visibility on outbound payloads in realtime, and faster troubleshooting for consultants and support teams.

***

## Release 10.0.31 - October - 2025

✨ **New Features**

🍪 **Realtime Cookie Scanner**\
A new version of the Cookie Scanner is now available in the **Health** section.\
This redesigned module introduces a modern interface, improved navigation, and prepares the transition away from the legacy Cookie Scanner.

***

🍪 **Realtime Cookie Scanner – Feature Upgrades**\
Significant enhancements have been added to the new version:

* **Real-time alerting** when new cookies are detected
* **Excel export** of the full cookie list (with filtering support)
* **Redesigned Cookie Notice interface** for improved clarity and navigation
* **Expandable rows** giving immediate access to detailed information
* **Smarter cookie information**, with improved vendor/category/description detection

→ Faster detection, clearer insights, and more audit-ready compliance reporting.

**What’s next?**\
The Realtime Cookie Scanner will continue to evolve with **new dedicated views** designed to give a more complete picture of cookie behaviour and compliance across your digital properties.\
These upcoming screens will progressively enrich the module with extended monitoring, origin tracing, categorisation, and more advanced compliance diagnostics.

📘 Documentation:\
[Realtime Cookie Scanner – EN](https://doc.commandersact.com/features/realtime-cookie-scanner)\
[Realtime Cookie Scanner – FR](https://doc.commandersact.com/fr/fonctionnalites/realtime-cookie-scanner)

***

📈 **Adloop – Automatic Tracking Templates for Google Ads**\
Google Ads tracking is now handled automatically by Adloop.

* Automatic installation of tracking parameters on campaigns
* Option to apply parameters to existing and future campaigns
* Alerts when tracking is missing or when reconnection is required
* Unified Google Ads source replacing multiple variants (Search, PMax, Display…)
* Much faster Transaction ID report loading, even on large accounts

→ Simplifies setup, reduces errors, and ensures consistent data quality.

***

💡 **CMP – Banner Editor Optimization**\
The banner editing interface now loads significantly faster, even with large privacy configurations or custom code.\
→ Smoother workflows for advanced CMP setups.

***

📊 **Facebook CAPI – Easier Access to the “Performance” Tab**\
The Performance tab now automatically reuses the credential created during destination setup.\
→ No more login prompts, easier access to quality metrics.

***

⚡ **CMP – Banner Loading Optimization**\
CMP banners now load on **DOMReady**, improving website performance and reducing their impact on Core Web Vitals.\
This optimization becomes active when customers regenerate and redeploy their containers.

***

🧩 **Commanders Act Assistant v3.2.1**\
New improvements to the QA Chrome Extension:

* Simplified **container version replacement**
* One-click **“Stop override”** action
* Cleaner layout with more vertical space for tag review

→ Faster and more intuitive QA experience.

***

🧱 **New Source – Effinity (Adloop)**\
Adloop now supports the **Effinity** affiliate source, enabling automatic import of affiliate conversion data.\
→ Extends attribution and reporting for affiliate programs.

***

#### 🛠️ Improvements

🖥️ **Server-Side Infrastructure Enhancements**\
Optimizations applied across server-side pipelines to deliver:

* Faster and more consistent event processing
* Higher scalability under heavy traffic
* Improved stability across destinations

🎨 **General UX & Performance Polishing**\
Additional interface refinements and micro-performance improvements deployed across the platform.

***

#### 🛠️ Updates

🛡️CMP — The IAB TCF template has been upgraded to version 2.3, ensuring full compliance with the IAB deadline of February 28, 2026.

***

## Release 10.0.30 - September - 2025

✨ **New Features**

🧪 **Dry Mode for Destinations (General Availability)**\
Dry Mode, previously in closed beta, is now available to all customers.

* Simulate event delivery without sending data to the destination
* Outbound HTTP requests are mocked
* Full payloads visible in **Event Inspector**\
  → Safer setups, faster validation, and more confidence when going live.

📊 **Data Cleansing — Aggregation Functions**\
You can now apply **aggregation functions** directly on array properties of events:

* Functions: **AVERAGE, MIN, MAX, SUM, COUNT**
* Use cases: calculate margin per transaction, total order value, enrich events with margin data from product catalog
* Bonus: added **STRING()** function to convert numbers into strings

⚙️ **Data Cleansing — Execution Timing**\
Decide **when** your transformations run:

* At event reception (default)
* After enrichments (new)\
  → Enables margin-enriched events for advanced segmentation, exports, or POAS steering.\
  Currently in closed beta (open on request), rollout to all customers soon.

📤 **New Destination — Reddit Conversions API**\
Send your conversion data directly to Reddit via its Conversions API.

* Share web conversions with Reddit Ads
* Measure & optimize campaign performance
* Easy configuration with predefined templates

***

**🛠️ Improvements**

🧩 **Commanders Act Assistant v3.2.0**

* Container version switching via dropdown
* Hide empty variables for a cleaner view
* Automatic internationalization (FR/EN)
* Bugfix: `tC.event.*` no longer executes incorrectly on current page

🗑️ **TMS — Soft Delete**

* Deleted containers & branches kept in backup for **30 days**
* Restore available by support/devops after accidental deletion
* Past versions preserved for investigation\
  → Peace of mind for customers & support teams.

💸 **Server-Side Architecture Optimization**

* **Faster event processing**, even under peak traffic
* **Higher scalability**, ensuring smoother onboarding for large volumes
* **Improved stability**, with fewer resource constraints

📚 **Documentation in French**

* Product documentation now available in **French**: [doc.commandersact.com/fr](https://doc.commandersact.com/fr/)

***

## Release 10.0.29 - August - 2025

✨ **New Features**

📤 **New Destination — Econda (Server-Side)**\
Implement **Econda Analytics** via server-side as an alternative to client-side scripts.\
Includes support for **On-Site Campaigns** and **Rich Media (Video) Tracking**.

***

#### 🛠️ Improvements

⚙️ **Infrastructure & Performance Upgrades**\
This month, our teams have delivered a set of behind-the-scenes improvements to make the platform even more robust and ready for the future:

* Optimized data pipelines for **higher throughput** and smoother handling of peak traffic
* **Security hardening** across core services to further protect customer data
* Introduction of a smarter **backup system** with multiple redundancy points, ensuring rapid recovery in case of unexpected issues
* Continuous performance tuning of backend services to reduce latency
* Scalable foundations laid to support upcoming product features without service disruption

These upgrades are mostly invisible in the daily UI, but they strengthen the platform’s foundation and ensure customers benefit from **greater stability, performance, and security**.

***

### Release 10.0.28-bis - July - 2025

✨ **New Features**

🛒 **New Source — Shopify (Web) + App**

* Capture Shopify standard & custom events
* Respect **Shopify Customer Privacy API**
* Preserve original payloads for **Smart Mapping** & **Property Transformations**
* Easy install via dedicated Shopify App

🧮 **Adloop — Post-View Attribution**\
A new **probabilistic attribution model** is now available. It reallocates part of conversions initially credited to **SEO or Direct traffic** towards **Social Media campaigns** (Facebook, TikTok, etc.) when these campaigns likely influenced the conversion path.

The mechanism evaluates:

* **Advertising intensity** (campaign pressure & exposure)
* **Engagement metrics** (views, interactions, clicks)

→ This results in **fairer attribution** for social channels, correcting long-standing underestimation issues and helping marketers make **better budget allocation decisions**.

📘 Full documentation of the mechanism is available here: [Post-View Mechanism Documentation](https://community.commandersact.com/adloop/vii-adloop-tracking-and-attribution/post-view-mechanism)

***

#### 🛠️ Improvements

📊 **Adloop — Transaction ID Report**

* **Micro-conversions** now visible in the side panel for each touchpoint
* Report load time reduced to **1–2 seconds** for most clients

📱 **Flutter SDK Plugins Update**\
Forwarding of **Firebase events & consent signals** to Flutter apps (Android/iOS).

***

### Release 10.0.28-ter - June - 2025

✨ **New Features**

⚡ **Instant Interfaces — Phase 1 & 2**\
Massive speed improvements across the platform:

* **Instant** rendering (lists, tag creation, destinations, sources, event specification, enrichment, storage settings, properties list, segment stats & overlap)
* **Faster** UIs overall (\~25% on average, up to ×10 for container generation)\
  → First available internally in June, then **rolled out to all users on July 1st**.

***

#### 🛠️ Improvements

🧭 **CMP Contextual Side Nav**\
Dedicated sidebar for all privacy-related features → mirrors the TMS side-nav for a consistent UX.

🍪 **Cookie Scanner — Group Peek**\
Hover on grouped cookie names to instantly see the **5 most frequent cookies** in the group.

***

### Release 10.0.28-quater - May - 2025

✨ **New Features**

🧰 **Adloop — BigQuery as an Attribution Data-Source**\
Adloop can now run attribution on **BigQuery datasets** (alongside GA4 & Piano Analytics).\
→ Ideal for **large volumes** and **more precise raw data**.

📤 **New Destination — BigQuery (Server-Side)**\
Export server-side events to **Google BigQuery** in real time with:

* Easy connection to your GCP project
* Automatic schema mapping
* Optional table structure auto-discovery

📤 **Adloop — BigQuery Export Destination**\
Send **all Adloop data** (including conversion paths) directly to BigQuery for deeper analysis with BI tools.

***

#### 🛠️ Improvements

🔌 **Adloop — Simplified Data-Source Setup**

* Google & Bing (Shopping, Search, PMax…) and Meta accounts now easier to add
* **Simplified mode** (normalized metrics/dimensions) or **Expert mode** (extra options, filters, custom conversions)\
  → Faster onboarding, especially for agencies or clients with many accounts.

🛡️ **GDPR — Revoked User Logs**\
Automatic anonymization of all user logs older than **12 months post-revocation**.

🧪 **Tag Assistant (Chrome Extension)**

* Full **Data Layer** visibility (internal & external vars)
* **Container & Site names** displayed
* **Access control** enforced (only see what you’re allowed)
* UX refinements (collapsible panels, tc\_events history, login bug fix, etc.)

### Release 10.0.28 - April - 2025

✨ **New Features**

🔎 **Tag Assistant Chrome Extension**\
Perform faster, more secure QA with our browser plugin:

* See all tags triggered in one place
* Quickly access containers
* Security enhancements with login widget
* Test your Branches directly\\

  <figure><img src="/files/xKqyebQm9Rm7iQVFFdRy" alt=""><figcaption></figcaption></figure>

📱 **New Source:** **Mobile Server-Side Events via React Native**\
Easily send server-side events from mobile apps using the React Native framework. A perfect fit for many of our customers.\\

🧠 **AI-Powered Support (Early Access)**\
The AI journey begins with new tools to assist your daily work:

* *JarvX* auto-generates comments
* Formula generator pop-in for advanced setups
* Side panel guidance for Commanders\\

  <figure><img src="/files/MLgoV9ExcIUpIg6OC4a7" alt=""><figcaption></figcaption></figure>

***

#### 🛠️ **Improvements**

📤 **Destination Builder – Direct Publishing**

* Users can now **publish Custom Destinations instantly**
* Built-in safety checks to prevent errors\
  → **Greater autonomy & faster go-live**\\

  <figure><img src="/files/CYNUDgGbfumQiNFi4fyB" alt=""><figcaption></figcaption></figure>

🗑️ **TMS – Branch Deletion Confirmation**

* Added confirmation pop-up before branch deletion\
  → **No more accidental deletions**\\

  <figure><img src="/files/PDiV2UdNaeyCBfvdzflF" alt=""><figcaption></figcaption></figure>

🗃️ **Custom Data Store & Storage Settings**

* Retain and reuse event data (up to 730 days)
* Store specific object properties
* Fully configurable UI with safety warnings\
  → **Enrich future events with past context**\\

  <figure><img src="/files/pHgmRubtRcCPfBigBTGW" alt=""><figcaption></figcaption></figure>

***

#### 📌 **Beta / Closed Tests**

📁 **CSV Conversion Importer**\
Still in closed alpha – enabling 1st-party library hosting for **Google Ads + GA4** integrations.

🧪 **AI Features**\
Currently limited to selected users (Commanders) in closed beta. Public availability coming soon.

***

🎉 **New Destinations: (alpha versions)**

* Button
* Floodlight Mobile App Conversion

🛠️ **Destinations updates:**

* FB CAPI destinations: updated EMQ score via “Integration Quality” API (Performance tab)
* FB CAPI Advanced: fallback support for standard fields user.email and user.email\_sha256
* Effinity: support for custom properties and input fields for landing parameters
* Awin: encoded product names
* Piano Analytics: Enrichment API: value in the “Enrichment Configuration” instead of property name
* Snapchat CAPI: support for “invite” and “reserve” events.

That’s all for this update! Stay tuned for more improvements, and as always, let us know your feedback! 🚀🌟

## Release 10.0.27 - February - 2025

🍾 1st Party Hosting Now Available for All Customers!

What is it? Customers can now use their own URL (via CNAME) to host privacy files & web containers.

Why is it important? Ensures better data control while maintaining compliance.

<figure><img src="/files/uoYneIlDNAReQFsyaFWK" alt=""><figcaption></figcaption></figure>

***

🚨 TMS Modernization & Performance Boost

Web container generation is now faster and supports larger containers (though smaller is still best practice!).

New TMS UI with contextual side nav

<figure><img src="/files/igljIUW8N7SAbzybWaWc" alt=""><figcaption></figcaption></figure>

***

🔒 Cookie Scanner Update: Teaser Alert Module Added

Prepares for future alerting features – get notified immediately when new cookies are found.

Competitive Advantage – Unlike competitors, our scanner provides real-time alerts (no waiting 24h for a crawler!).

<figure><img src="/files/t7e5AVOmHYDPGZvqwsbR" alt=""><figcaption></figcaption></figure>

***

🛠️ UX Enhancement: Filter Categories for Sources & Destinations

Find specific sources/destinations faster.

Easier workspace overview – Quick visibility on available integrations.

<figure><img src="/files/DIIAnxnV2Ey3bitsUPm2" alt=""><figcaption></figcaption></figure>

***

🌟 IAB Banners: Total Vendors Now Displayed

Market alignment with Google CMP Partner requirements.

Easier vendor visibility – Just regenerate & deploy the banner to update.

<figure><img src="/files/FAIpMOYITiGdFR5rKadB" alt=""><figcaption></figcaption></figure>

***

TMS API Update:

Added mapping variables for tags in API calls

<https://commandersact.github.io/api_doc/#tag/Web-Containers>

***

🎉 CMP Template Update in GTM

Use IAB TCF consent to manage part of the Google Consent Mode signal.

For customers using our CMP in GTM – Just enable it in Advanced Features.

<figure><img src="/files/hhDWFV3UzrLxCg5uyIBB" alt=""><figcaption></figcaption></figure>

***

🌟 TMS API Update – Retrieve Destination Mappings

New API capability – Customers can now retrieve destination mapping properties for data governance audits.

Technical Documentation:[ Commanders Act API Docs](https://commandersact.github.io/api_doc/#tag/Web-Containers)

***

🤖 AI-Based Commenting on Container Generation (Beta)

Faster comment generation (still optimizing for larger changesets).

Smarter summaries – Improved clarity.

Now translated UI – Not just in English anymore!

<figure><img src="/files/d1ymisUdy1FsZAZo2TYb" alt=""><figcaption></figcaption></figure>

***

🔥 Event Specification (aka Normalized Datalayer) is Live for All Customers!

New Feature Name – Renamed based on Sales & Consulting feedback.

Customers can now set up their own validation rules.

<figure><img src="/files/ushqwgXmapMqYQ4UbmAd" alt=""><figcaption></figcaption></figure>

***

🌟 Source Data Quality Enhancements

New Features:

Pagination added for event lists.

Event details now open in a side panel.

Search bar for easier filtering.

Benefits:

No more freezing or bugs with large event lists.

Faster page load times (side panel optimizations coming soon).

<figure><img src="/files/GNO8217OTD7j1kKAkodd" alt=""><figcaption></figcaption></figure>

***

🎉 New Destination: RTB House Audience

Leverage RTB House Audience API to share audiences efficiently.

[Full integration guide available](/features/destinations/destinations-catalog/rtb-house-audience).

***

That’s all for this update! Stay tuned for more improvements, and as always, let us know your feedback! 🚀🌟

***

## Release 10.0.26 - December 16 - 2024

Modernization of TMS client-side interfaces!

-Simplified Navigation, with contextual side nav\
-Improved TMS steps

Pages Revamped:\
-Containers Overview\
-Tags Overview\
-Tags Library\
-Container settings\\

<figure><img src="/files/OXHJS4qAgTZTO9o1eb96" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/xD5ezJvOpjHW0UMsHnUv" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Sa3LRWhCarnSfEj7hjQS" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/X4xSwjW0P6IBBePQXAK0" alt=""><figcaption></figcaption></figure>

## Release 10.0.25 - October 2024

🍪🔍**Enhanced Cookie Scanner: Automatic Filtering & Unmatched Usability**

Our Cookie Scanner now delivers an unmatched user experience, combining the most exhaustive cookie capture on the market with powerful enhancements for usability and insight. Already leveraging data from tens of thousands of real users to capture a truly comprehensive view of cookies—something no virtual crawler can match—this update automatically filters out rare and irrelevant cookies, while adding advanced investigation and filtering capabilities for a more streamlined analysis.

* **Smart Filtering**: By default, cookies detected in fewer than 5% of sessions are now filtered out, allowing clients to focus on frequently relevant cookies while eliminating noise.
* **Flexible “Rare Cookies” Toggle**: A new toggle enables users to view all cookies, including rare ones, by adjusting an interactive frequency setting for tailored insights.
* **Automatic Pattern-Based Grouping**: Cookies with similar names are grouped when three or more share a pattern (e.g., `cookie_name...`), simplifying cookie lists and making analysis easier.
* **Enhanced Filters by Type and Domain**: New filters for cookie storage type and 3rd-party domain allow for more precise targeting in analyses.
* **Frequency Display for Insight**: Each cookie now includes an occurence frequency percentage, giving immediate insight into detection rates and relevance.
* **Detailed Tracking for 1st Party Cookies**: Full URLs of recent detections are displayed for first-party cookies, helping identify exact points of origin.
* **Improved Cookie Descriptions**: Enhanced descriptions clarify cookie types, offering clients a better understanding of cookie purposes.
* **Updated Documentation**: Detailed guidance on using these new features is available in our [documentation](https://doc.commandersact.com/features/consent-management/extensions/cookie-scanner) for a seamless user experience.

***

🔍📊 **Introducing the Destination Logs Exporter: Full Transparency for Outgoing Requests**

Our new **Destination Logs Exporter** feature, now in closed beta, complements our Live Event Inspector by providing a more comprehensive monitoring solution. While the Event Inspector samples data during high-traffic periods, the Destination Logs Exporter allows users to export *all* outgoing requests from selected destinations. Each log includes detailed information, including the originating events, status, errors, etc. setting a new standard in data transparency and control.

* **Full Log Export to SFTP**: This feature captures every outgoing request, exporting raw logs to an SFTP server for secure access and long-term storage.
* **Detailed Event Tracing**: Logs provide comprehensive insights into outgoing requests, including the originating events, enabling precise data flow tracking and easier troubleshooting.
* **Seamless Integration**: Configurable directly within the destination catalog, ensuring quick setup and intuitive management.

Explore the full feature details in our [documentation](https://doc.commandersact.com/features/destinations/destinations-catalog/destination-logs-exporter) as we refine this tool during the closed beta phase.

***

👁️ **Enhanced Login Accessibility**

* You can now view your password while logging in! This small addition aims to enhance accessibility for all users.\\

  <figure><img src="/files/SIlvswyenDTwJNuIUBfe" alt="" width="283"><figcaption></figcaption></figure>

***

🔗 **Improved Navigation for Sources**

* The navigation menu now includes a shortcut to our Sources Catalog, saving you a click and making it even easier to locate the resources you need.\\

  <figure><img src="/files/QknRmVC4x9fYQ3hygPuE" alt="" width="185"><figcaption></figcaption></figure>

***

🔄 **General UX Enhancements**

* **Loader Spinner:** Added to additional TMS client-side interfaces for smoother interactions.
* **Destination Overview:** Destinations in “dry mode” now display a clear label, reducing uncertainty about destination status.
* **Event Delivery:** Similar “dry mode” labels are added here too, so you’ll always know if a destination is live.
* **Augmented User Attribute:** Removed redundant “visitor” tags in sub-universes for clarity.
* **Source Data Quality:** Action buttons are now available to help quickly address errors in data sources.

***

:medal: **1st party hosting**

* **What’s New:** WebContainers and Privacy Banners can now use your customer domain to host files via CNAME, keeping data on our servers without external hosting. This will help bypass ad blockers and increase data collection while staying RGPD-compliant. The feature can be opened on customers account, on request.\
  Explore the full feature details in [our documentation](/configure/administration/domain-management/cdn-1st)

***

🔐 **New User Access Rights**

* We’ve added 3 new access rights for destination UIs, providing more secure access for all Custom Profiles users.\\

  <figure><img src="/files/LCaCVNytPXWG3gGQfLL0" alt=""><figcaption></figcaption></figure>

## Release 10.0.24 - September 2024

#### 🎯 ***Facebook CAPI Advanced*****&#x20;Destination**

**Key Updates:**

* **Smart mapping:** Visualise all the data sent to Meta with default mapping you can customize
* **Enable App Tracking**: A new option to manage automatically to send all mobile data needed by Meta with dedicated app properties smart mapping.
* **More advanced options**: send automatically search event with page\_view if needed, and test mode\
  **Benefit**: You get the most configurable and user-friendly Facebook CAPI solution available on the market, tailored to fit advanced needs.

***

**New Destinations and Integrations**

* **Facebook Lead Ads**: Unlock lead optimization by [sharing CRM data back to Meta](https://doc.commandersact.com/features/destinations/destinations-catalog/facebook/facebook-lead-ads).
* **X (Twitter) Conversion API** Global opening : [Track conversions](https://doc.commandersact.com/features/destinations/destinations-catalog/x-twitter-conversion-api) without the website code.
* **Microsoft Advertising UET**: Available for all clients, offering features like [conversion tracking and auto-bidding](https://doc.commandersact.com/features/destinations/destinations-catalog/microsoft-uet).

***

🔧 **Javascript SDK new setProperty command**\
Now, you can set permanent property values, just like in our mobile SDK.\
**Why it’s useful:** This update allows you to save values more efficiently, simplifying processes for all customers.\
👉 For more details, check out our documentation [here](https://doc.commandersact.com/developers/tracking/properties-reference/permanent-properties).

***

🌟 **Enhanced cact API**\
A new cact('emit') API has been introduced to send browser-side events, replacing the older `tC.event.XXX` functions.\
**Why it’s better:** This new method ensures smoother integration with our tools and reduces errors when sending custom events. For more details, read [our documentation](https://doc.commandersact.com/features/sources/sources-catalog/web/js-sdk#browser-side-events)

***

#### 🔧 **Privacy-Related Custom Triggers**

We’ve added a set of [privacy-related events](https://doc.commandersact.com/features/consent-management/onsite-api) you can use to trigger custom actions in your tags.\
New triggers include:

* `consent_ready`
* `consent_updated`
* `consent_revoke`
* `banner_show/hide`
* `privacy_center_show/hide`

**Benefit**: Greater control over privacy actions within your tagging structure.

***

📦 **Server-Side Tracking as a Custom Trigger**\
The `cact('trigger', 'page_view')` method now launches [custom event tracking](https://doc.commandersact.com/features/sources/sources-catalog/web/js-sdk#custom-tag-triggers), streamlining your server-side and client-side event handling.\
**Benefit:** Enhance your event tracking setups with more precision and flexibility, especially useful for consultants handling complex multi-site environments.

***

🔧 **Tag Context Variables**\
We’ve introduced [Context variables](https://doc.commandersact.com/features/sources/sources-catalog/web/js-sdk#tag-context-variables) like `cact_container.id_site` and `cact_event.type` that can be used directly in your tags.\
**Why it’s helpful:** These additions make it easier to manage and track events across different sites and containers.

***

💾 Event enrichment from **Custom Data Store (Beta)**\
For our Beta customers, Storage Settings for [Custom Data Store](https://doc.commandersact.com/features/enrichments/events-enrichment#enrichment-from-custom-data-store) now allows a longer duration (30 days), improving data retention capabilities.\
Global opening : end of september

<figure><img src="/files/8Lnx49VpYSgJwJeN6bZM" alt=""><figcaption></figcaption></figure>

***

#### 🖇️ **TMS UX Enhancements (Closed Beta)**

Our TMS interface has been modernized to provide a smoother, more intuitive user experience. Now available for beta testing with some customers!

**New Features Include**:

* **Breadcrumb Navigation**: Stay on top of your position within the TMS with easy access to your containers (and soon your branches)
* **Contextual Side Navigation:** shortcuts to reach all webcontainer's related page's in a single click
* **Expanded Editing Space**: More room to modify tags, with a clearer "Tags Overview" UI for faster workflows.
* **A new interface and 3 revamped ones:**

  * Tags Overview,
  * Tag Catalog,
  * WebContainers Overview,
  * Container Settings\\

  \\

  <figure><img src="/files/XpxUZL8nWC4T2pKqoYKN" alt=""><figcaption><p>Web containers UI</p></figcaption></figure>

  <figure><img src="/files/mICVlaeZ2oA5wkcRoln2" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/mWQxxPIS0yMpCfpQSZo3" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/rEblLYIaHA6cIV36MH3n" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/9LN0jS59E17k82joUxXz" alt=""><figcaption></figcaption></figure>

***

#### 🛡️ **Google CMP Partnership: Gold Tier**

We are officially a **Gold Tier** partner for Google’s CMP partner Program. This recognition underscores our commitment to the highest Google's standards in consent management.

***

Thank you for your attention and continuous engagement!\
We look forward to your feedback on these improvements.

***

## Release 10.0.23 - May 2024

#### May Release Notes 🌟

#### 📱 New Mobile Release

**Android**

* **Consent 5.3.2:** Automatic JSON update when receiving a new one from the CDN.\
  \&#xNAN;*Benefit: Ensures continuous compliance and accuracy.*

**iOS**

* **Consent 5.3.0 / Core 5.4.0 / IAB 5.1.0:**
  * **Unified TCConsent Module:** Now there's only one module instead of separate ones for IAB and non-IAB.\
    \&#xNAN;*Benefit: Simplifies consent management.*
  * **Remove Refused Vendors from TCUser:** When no consent is available.\
    \&#xNAN;*Benefit: Cleaner consent handling.*

***

#### 💳 Credit Usage UI Improvements

**What's New:**

* **Time Split:** View by day for periods < 30 days, by week for periods < 90 days.\
  \&#xNAN;*Benefit: More precise credit usage tracking.*
* **New Metric Names:** Closer to those on customer invoices.\
  \&#xNAN;*Benefit: Better data understanding.*
* **UI Enhancements:** Improved sorting order, labels, and colors.\
  \&#xNAN;*Benefit: More intuitive and navigable interface.*

**👥 Target Audience:** Sales team & customers with "account administrator" rights.

<figure><img src="/files/v8hEmduUvKzy1kOlpdFh" alt=""><figcaption></figcaption></figure>

***

#### 🧼 Data Cleansing UX Improvement

* **Show More Than 10 Cleansings on a Single Page.**\
  \&#xNAN;*Benefit: Improved organization and management of cleansings.*

<figure><img src="/files/PAYiqW1zIm5QRYQ4BSRL" alt=""><figcaption></figcaption></figure>

***

#### 🍪 Technical Session Cookies Update

* **Renaming Cookies for 1st Party Tracking:** Previously named "phoenix".\
  \&#xNAN;*Benefit: More accurate and understandable nomenclature.*

[More information here](https://doc.commandersact.com/configure/cookies).

***

#### 🔧 Cookie Scanner Fix

* Better detection of first-party session cookies

***

#### 🔍 Anti-Adblocking Enhancement

**Key Changes:**

* **Adblocker Detection:** Now included in web containers.\
  \&#xNAN;*Benefit: More comprehensive data collection despite adblockers.*

**👥 Target Audience:** Customers using oneTag.\
You need to generate/redeploy all containers containing a oneTag tag.

***

#### 📈 Google Analytics 4 Enhanced Conversions

* **New Feature:** Send user-provided data along with the user identifier to improve behavior and conversion measurement.

***

#### 🛠 Amazon Ads CAPI Update

**Key Changes:**

* No longer in closed beta, open to all customers.
* More user-friendly setup: Add a new conversion definition directly within the destination settings.

**✨ Benefits:**

* Officially the easiest and most user-friendly Amazon CAPI setup

***

#### 📊 Facebook - Conversion API Advanced (closed beta)

**Key Changes:**

* **Dynamic Fields:** Allows dynamic values for Pixel ID and token.
* **Smart Mapping:**
  * Easier to review/master all data shared with Facebook
  * Option to send all properties as custom data or define them manually.
  * Option to send **App events** and review/edit app specific properties sent to Facebook
* **Advanced Settings:** Options for content type, custom data, test code and additional PageView events.\
  \
  \&#xNAN;*Benefit: Greater control over data shared with Facebook, more options, and flexibility.*

**🎯 Why These Changes:**

* Integration of requested features and customer feedback

***

#### 🚀 New Destination: Outbrain

* **Server-Side Event Tracking:** Enabled for more accurate performance measurement.\
  \&#xNAN;*Benefit: Enhanced tracking capabilities.*

***

Thank you for your attention and continuous engagement!\
We look forward to your feedback on these improvements.

***

## Release 10.0.22 - March 2024

**Mobile SDK Consent 5.2.1**\
🔧 Resolved a potential crash with Vendors details drop-down.\
➕ Added the Privacy Manifest file for enhanced security.\
🔨 Fixed Layout Constraints warnings on the purposes screen.\
🖼️ Ensured the Illustrations button always displays correctly.

*Benefits:*

* Smoother navigation without crashes.
* Enhanced privacy with manifest file integration.
* Improved layout stability for a seamless user experience.

***

**Mobile SDK Core 5.3.4, ServerSide 5.4.3, IAB 5.0.2**\
➕ All modules now feature the Privacy Manifest file.

*Benefits:*

* Heightened privacy measures across all platforms.

***

**New Destination: LinkedIn Conversions API**:link:\
🎉 Introducing the [LinkedIn CAPI](/features/destinations/destinations-catalog/linkedin_capi) for direct marketing data connection.\
\&#xNAN;*Benefits:*

* Track campaign performance anywhere for optimized results.
* Better attribution and cost efficiency with complete data sets.

***

**New Destination: Firebase Analytics for Mobile Applications** :bulb:\
📱 Introducing a new informative configuration page for Firebase Analytics integration.\
\&#xNAN;*Benefits:*

* Seamless bridge between CMP & Firebase Analytics.
* Easy implementation of Google Consent Mode with Firebase Analytics (GA4).

<figure><img src="/files/g7vl3chrklJRva4BCxDp" alt="" width="563"><figcaption></figcaption></figure>

***

**Security Enhancement!** :shield:\
🔒 Native platform login has been exclusively streamlined with SSO.

*Benefits:*

* Enhanced security with SSO-only access.
* Improved user experience without confusion.

***

**Speed Boost!** :fast\_forward:\
🚀 TMS client-side now limits displayed container versions at the generation step for efficiency.

*Benefits:*

* Eliminates timeouts and crashes during version generation.
* Clients can still access the latest 100 versions effortlessly.

***

**Real-time Destination's settings updates** :rocket:\
🚀 Modifications now propagate instantly across all servers for faster updates (settings, filters, activation, dry mode, etc.).

*Benefits:*

* No more waiting times, changes take effect instantly.
* Easy testing iterations for seamless destination adjustments.

***

**Introducing new "Reset Password" Page!** :key:\
🔑 Enjoy a user-friendly password reset experience.

*Benefits:*

* Simplicity: Visual widget for accurate input and ability to use passphrase
* Smartness: Progress bar for security evaluation.
* Solidity: Compliance with new standards for passphrase usage.

<figure><img src="/files/eVsxxlGBZWG3ONjPjeJX" alt="" width="375"><figcaption></figcaption></figure>

***

**New Destination: Taboola Events**\
🎉 New destination now available for server-side event tracking with [Taboola](/features/destinations/destinations-catalog/taboola).

*Benefits:*

* Track conversions without client-side pixel installation.

***

Your feedback matters! Let us know how these updates enhance your Commanders Act experience. :smiley: <https://www.commandersact.com/en/contact/>

## Release 10.0.21 - February 2024

🔧 **GA4 Source Update (Adloop)** 🔧

* All GA4 conversion events now selectable as main conversions in Adloop
* Events conditionable by custom variables (customEvent, customUser)

💡 **Benefits**:

* Comprehensive GA4 data-source connector
* Clients easily locate diverse GA4 conversions & events in Adloop
* Precise attribution calculation for better performance insights

***

🔍 **Dry mode enhancement** 🔍\
We had a smart credential cache management on our (closed beta) [dry mode](https://doc.commandersact.com/features/destinations/dry-mode-lab) feature on destinations.\
💡Benefits: Allow to not have Event Delivery polluted by false errors when you switch to OFF the dry mode

***

🚀 **Source Data Quality Boost** 🚀\
🔍 Here's what's new:

🛠️ Faster interface loading for seamless user experience\
🛠️ Simplified menu for quicker access\
🛠️ Sneak peek into the Alerting system (closed beta)\
🛠️ Shortcut buttons for validation rules & Data Cleansing

✅ **Why it rocks**:

* Increased productivity with lightning-fast loading
* Simplified workflows for easier navigation
* Immediate issue detection for data quality perfection

<figure><img src="/files/3eTWKQlOL7JATHk1vCRD" alt=""><figcaption></figcaption></figure>

***

🛡️ **New Privacy Template "popin accessibility"** 🛡️\
🔒 New offerings for enhanced privacy & UX:

🔹 Ready-to-use privacy template for WCAG compliance\
🔹 Streamlined UX with improved information display

💡 **Why it's great**:

* WCAG compliance made simple
* Enhanced opt-in rates with new popin template
* Improved clarity for better user engagement

<figure><img src="/files/iEhONBXZ3CoA6nJAqABg" alt=""><figcaption></figcaption></figure>

***

🚀 **Customer Spotlight: Amazon CAPI Integration** 🚀\
🌟 Big shoutout to the team for wowing users with our CAPI integration! 🌟

## Release 10.0.20 - January 2024

🌟 **Vue.js Wrapper Version Update** (TMS)🌟\
🔗 [Explore the Latest Release](https://github.com/CommandersAct/vue-tag-commander)

* **Compatibility Enhanced**: Now fully compatible with Vue3, ensuring a smoother integration for your web applications.
* **Why This Matters**: Seamless updates mean less downtime and more productivity for developers leveraging Vue.js in their projects.

***

🔍 **Live Event Inspector Enhancements** 🔍

* **Test Code Events Bypass**: Events with the `test_code` property can now bypass the standard sampling limit (2 millions stored logs max), guaranteeing visibility in high-traffic scenarios.
* **Increased Visibility for Test Code Events**: For events marked with `test_code`, there is now a generous sampling allowance of 100 events per minute per event type. This guarantees the visibility of these events for testing and validation purposes.
* **Filterable Test Codes**: The `test_code` property has been made searchable and filterable, simplifying the QA process.
* **Targeted Benefit**: Ideal for server-side feature users needing comprehensive event tracking, like mobile app production tests.

***

📦 **Amazon CAPI Destination Beta** 📦\
🔗 [Closed Beta Access](https://doc.commandersact.com/features/destinations/destinations-catalog/amazon/amazon-ads-conversions-api)

* **Exclusive Early Access**: Initially available to some customers, with potential openings for eager customers.
* **Why Join the Beta**: Influence the development of our Amazon CAPI destination and get a head start on leveraging this powerful integration.

***

🔧 **Smart Mapping for Google Enhanced Conversions** 🔧

* **Intuitive Automation**: Automatic mapping with the option for manual adjustments enhances data accuracy and utility.
* **Why It's Great**: Spend less time on setup and more on Data Governance with this smart, flexible feature.

<figure><img src="/files/ksa7ebBvpqXDbITckoCJ" alt="" width="375"><figcaption></figcaption></figure>

***

🛠 **UX Enhancements Across Destinations** 🛠

* **Error Prevention**: Fields now have helpful prompts in red for incorrect inputs, reducing errors and improving data quality.
* **Why It Matters**: A more user-friendly interface leads to fewer mistakes and a smoother operation for our clients.

<figure><img src="/files/Z869DoOt0prxyJ6X1uv1" alt="" width="274"><figcaption></figcaption></figure>

***

📈 **Significant User Enrichment Feature Upgrade** 📈

* **Advanced Data Enrichment**: Create complex formulas for dynamic [**user scoring**](/features/enrichments/augmented-user-attributes) and attributes, all with a no-code approach.
* **Business Impact**: Drive targeted marketing actions and advanced customer segmentation, leading to improved ROI and analytics capabilities.

<figure><img src="/files/5KsyDYt2JyW0kL4o037H" alt="" width="331"><figcaption></figcaption></figure>

<figure><img src="/files/7R25p3YjkHkkPjRnMumE" alt="" width="375"><figcaption></figcaption></figure>

***

📣 **CMP Feature Release: Google Consent Mode V2** 📣

* **Effortless Implementation**: Activate Google Consent Mode v2 easily, enhancing data collection quality while ensuring compliance.
* **Who Benefits**: Any client using Commanders Act Consent banners with Google tags, aiming for hassle-free RGPD compliance.

***

🌱 **Server-Side Architecture Eco-Efficiency** 🌱

* **Increased Efficiency**: We've optimized our architecture to process events more efficiently, significantly improving performance while minimizing our environmental footprint.

***

🔧 **Segmentation Engine v1 Update** 🔧

* **Refined Performance**: We've made incremental but meaningful updates to the Segmentation Engine v1, improving the efficiency of segment calculation times. This enhancement ensures smoother site personalization experiences.
* **Site Personalization Impact**: These improvements will subtly enhance the speed for websites to customize pages for each visitor, ensuring a more seamless user experience.
* **Looking Ahead**: Our development focus is on the Segmentation Engine v2 (currently in QA phase), which is set to bring groundbreaking performance and modernization that will take segmentation to the next level.

***

📲 **Facebook CAPI Now Supports Offline Conversions** 📲

* Send your offline conversion through your purchase event (type: offline)

***

📱 **Google Consent Mode Update for Android & iOS** 📱

* **Firebase Users**: Ensure seamless integration with the latest versions tailored for Android and iOS platforms.

***

🎹 **Piano Analytics Enrichment API Destination Released** 🎹

* **Data Enrichment Made Easy**: Seamlessly update transaction statuses or values, enriching your data landscape.

## Release 10.0.19 - December 2023

* 🔧 **Advanced Flexibility in Destination’s Consent Filters:** Get more flexibility for complex privacy setups\
  \
  You managing consent through our CMP while also utilizing a competitor's solution for different websites on the same account?\
  \
  You can now employ native privacy filters from either our CMP or an external solution within the same account !\\

  <figure><img src="/files/iQqjGv0cXgNzA1A46qUh" alt="" width="517"><figcaption></figcaption></figure>
* 📊 **Enhanced Event Collection Charts: Now More Insightful.** It's such easier to see the type of events collected! \\

  <figure><img src="/files/fjjvOCufPFSKzyliIbZY" alt=""><figcaption><p><br></p></figcaption></figure>
* 🔒 **Data Governance: Introducing 'Tag & Data Sharing' Page.** In a quick view, control the shared Datas through the Client-Side TMS tags.\
  \&#xNAN;*\*Please note: This is the preview v0 of this page. A nicer version is coming soon!*\\

  <figure><img src="/files/zcFmDLug4tWASkAisLfi" alt=""><figcaption></figcaption></figure>
* 🔑 **Streamlined Platform Administration Access**: Instant Workspace Access. No more need to log out and re login when you get access to a new site\
  \
  As an administrator, you granted access to a workspace to one of your colleague? He just need to refresh the page to see the site into the search bar's list. No need to log out and re-login anymore!\\

  <figure><img src="/files/RiX8QnGh7rx2g3zMoGZO" alt="" width="329"><figcaption></figcaption></figure>
* 🌟 **Consistent and Upgraded Chart Styles Across the Platform** is now applied to all graphs!

  All our customers can enjoy a better visualization with this enhancement of standardization on our platform.\\

  <figure><img src="/files/ovyqpWaSn50utclYvyfx" alt="" width="188"><figcaption></figcaption></figure>

## Release 10.0.18 - November 2023

* **Ability to search by source-key** in the Source Overview & Destination Overview UIs:

<figure><img src="/files/7KcQXpYjSvQBpM7Rq4Xg" alt=""><figcaption></figcaption></figure>

* **New version of the Source Data Quality** UI: It's even easier to see the quality of your data at a glance !\
  "*What proportion of events have errors to need to be fixed?*" The new Overview chart give you the answer in realtime.\
  You will also be able to filter by environment (by default Production environment is shown) and by source.\\

  <figure><img src="/files/D69C46WRiDJAfhlOzael" alt=""><figcaption></figcaption></figure>
* **Platform**
  * User Management UI: speed increase x3 \\
* **Destinations**
  * GEC destination enhancement: Avoid random "failed\_get\_conversion\_id" errors in Event Delivery.
* **Mobile**
  * **React-Native:**
    * add `useLegacyUniqueIDForConsentID` & `useLegacyUniqueIDForAnonymousID`
    * startScreen for privacy center choose your launch on the Vendors or Purposes UI

      \\
* **Documentation**
  * [Easy setup guide for Privacy in GTM](https://doc.commandersact.com/features/consent-management/setup-guides/tag-manager/google-tag-manager-gtm)
  * [Data retention duration](https://doc.commandersact.com/configure/data-management/data-retention-duration)

## Release 10.0.17 - 24/10/23

* **Platform**
  * Security enhancement : passwords now required a minimum of 12 characters
  * Proxy configuration (Cloud Flare, etc.) in domain management UI

<figure><img src="/files/9Nq9uX1DuSdQhl1QVpdo" alt=""><figcaption></figcaption></figure>

* **TMS/CMP interfaces:**
  * Slightly increase UI loading time on TMS pages​
  * UI random errors fixed\\
* **Server Side**

  * **Event Inspector** UX improvement: user properties (standard and custom) are now searchable by default

  <figure><img src="/files/xDNMvHkkTrbSZTmILsfc" alt=""><figcaption></figcaption></figure>

  * **Destination Event delivery** UX improvement:​ Longer duration for conservation of error details​

  <figure><img src="/files/B8IFa8lDJ93McCw0HUQb" alt=""><figcaption></figcaption></figure>

  * **Destination Properties Transformations** option UX improvement: allows the same transformations as the Data Cleansing UI​

  <figure><img src="/files/DAGsnq53lGjpVMrmqUto" alt=""><figcaption></figcaption></figure>
* **Debug Mode for Source/Destination Live Event Inspector**\
  Adding a special parameter to you events allows you to have them visible in Event Inspector, even on production environment with billions of events. This debug parameter will allows you to bypass the "Intelligent Sampling".\
  <https://doc.commandersact.com/features/sources/live-event-inspector#debug-mode>\\
* **Mobile**
  * **Consent​**

    Android & iOS: ​

    * iAB new function to get the number of IAB vendors​
      * iAB remove consentOutdated callback migrating to iabv2.2​

    Android: do\_not\_track parameter as a boolean inside the payload​

    IOS: illustrations fix on privacy center​

    ​
  * **Core​**
    * Android & iOS: translations fix on migrating to iab v2.2​
  * **Server Side​**

    * Android & iOS: ​
      * language and country code from the device​
      * 2 function to use legacy ID TC\_UNIQUEID​

    ​
* **New destinations**
  * The Trade Desk: CAPI
  * Piwik PRO
  * Alphalyr Marketing Studio
  * TradeTracker
* **Destinations​ updates**
  * Awin: support for “Smart Mapping” and “Custom Event Properties”.​
  * Mapp: support for "Independent parameters“.

## Release 10.0.16 - 24/09/23

* **TMS/CMP ​interfaces:** Add a loading indicator to TMS/CMP interfaces\\
* **Copy Manager​**: When you duplicate a site (aka workspace), you can now copy Server Side configurations (PlatformX activation, Sources, Destinations, Data Management, Enrichments, etc...)

<figure><img src="/files/ZFsRxWTbS5YuViDro9b6" alt=""><figcaption></figcaption></figure>

* **Interface speed improvements​** on the following pages:
  * TMS: Container overview => +22%​
  * TMS: External variable => +41%​
  * Mix: Attribution option => + 46%​
  * CMP: Privacy banners overview => +38%​
  * Admin: Profile management => +21%
  * Segment overview => +40%
* **Files imports:** The fields mapping now support conditionnal value transformation with [Data cleansing formulas​](/features/data-quality/data-cleansing/supported-transformation-functions)\\
* **Data Activation: Variables** **UI** can now be reached from Segment overview\\

  <figure><img src="/files/TabeatlVnmG5bhrc5HEr" alt=""><figcaption></figcaption></figure>
* **Mobile​**\
  Android & iOS: add language & region​\
  Android & iOS: Firebase Destination (for Analytics)​\
  IOS: Fix for non-IAB Privacy​\\
* **Destinations​ updates**
  * Adobe Analytics​ authentication token. You can see our [updated documentation here](https://doc.commandersact.com/features/destinations/destinations-catalog/adobe/adobe-analytics)
  * Pinterest: support for "click\_id“ and "view\_item" mapped to "page\_visit“.​
  * Piano Analytics Collection API: removed useless “ref” parameter.​

## Release 10.0.15 - 24/08/23

* **New API "Users Activities logs"**\
  This new API allows administrators to get all users activities history (who has changed what, when, etc...). Read the technical [API documentation](https://commandersact.github.io/api_doc/#tag/AdminActivityLogs) to start using it.\\
* **Live Report Builder: enhancement on UI**\
  The filters are now directly visible as before, and the data set limitation (if any) is visible on mouse over only on the flag "limited dataset"

  \\

  <figure><img src="/files/0wigfSJJ1wlHjg3UZ3kk" alt=""><figcaption></figcaption></figure>
* **Data Cleansing: new function "GET(property\_name)"**\
  Allows to work on a property name that contains special characters incompatible with formula. For example if your property name contains a `-` like `page-count` you will not be able to write this formula because it is interpreted as a minus sign :\\

  ```
  page-count-5
  ```

  Now you can, just write :\\

  ```
  GET("page-count")-5
  ```

  \
  You can read our dedicated [documentation here](https://doc.commandersact.com/features/data-quality/data-cleansing/supported-transformation-functions)\\
* **Consent dashboards: new metric for "Global Privacy Control"**\
  This new metric will help you to identify the amount of "Optout All" registered through a GPC parameter turned ON\\

  <figure><img src="/files/ImEsVp1VkGJmbESVuML6" alt=""><figcaption></figcaption></figure>
* **Consent banners: IAB TCF v2.2 compliance**\
  Our customers can now be compliant with the latest framework of IAB TCF (v2.2)\
  It is available for Web & Mobile apps !\
  If you need more information about migration please check [this section of our documentation](https://doc.commandersact.com/features/consent-management/knowledge-base/iab-tcf-v2.2-release-details)\\
* New destination : [Google Ads Conversion Adjustment](/features/destinations/destinations-catalog/google/google-conversion-adjustments) (*closed beta*)\\
* Normalized Datalayer (closed beta)*:* Add an option to not consider missing properties as an issue (not impacting quality score). Accept unspecified properties without warning\\
* UX enhancements and speed up of Destination's interfaces (destination list, etc.)

## Release 10.0.14 - 24/07/23

* **Performance tab of Facebook CAPI destinations**\
  For more information, you can have look to our new documentation's [dedicated page](https://doc.commandersact.com/features/destinations/destinations-catalog/facebook/facebook-conversions-api/performance-tab-event-match-quality)\\

  <figure><img src="/files/uwjFY5jZEIxHgo5AxUC4" alt=""><figcaption></figcaption></figure>
* **Live Report Builder: 2 new charts**\
  We added two new type of charts in LRB : bar chart and pie chart.\
  You can retrieve them in the edition part of a LRB report !\\

  <figure><img src="/files/eEpb4RsRLUvCwg3vl2ci" alt=""><figcaption></figcaption></figure>

  <figure><img src="/files/3uZefdZ0XLJjfMqNUpv9" alt=""><figcaption></figcaption></figure>
* **Live Report Builder: UX enhancement**\
  The filters are now directly visible as before, and the data set limitation (if any) is visible on mouse over only on the flag "limited dataset"\\

  <figure><img src="/files/0wigfSJJ1wlHjg3UZ3kk" alt=""><figcaption></figcaption></figure>
* **Mobile: New SDK version released for IAB TCFv2.2**\
  For more details, please read our [documentation page](https://community.commandersact.com/consent-management/knowledge-base/iab-tcf-v2.2-release-details/iab-tcf-v2.2-migration-guide-app)\
  For technical instructions, you can refer to our Github : [Android](https://github.com/CommandersAct/AndroidV5/tree/master/TCIAB) &[ IOS](https://github.com/CommandersAct/iOSV5/tree/master/TCIAB)

## Release 10.0.13 - 24/06/23

* **New Source: Pixel Tracking API**\
  Pixel Tracking API, also known as 1x1 gifs, or clear gifs, allows you to send data to Commanders Act with a HTTP GET request from your server, your local console or any development framework.\
  You can have a look to [our dedicated documentation](https://doc.commandersact.com/features/sources/sources-catalog/web/pixel-tracking) page for more details.\
  \
  ![](/files/C0RrV5cYCdMI5txOED0F)\\
* **Data Cleansing: New functions available**\
  9 new functions related to dates:\
  DATEPARSE ; DATEFORMAT ; DATEADD ; DATESUB ; DATEDIFF ; AGE ; \[YEAR, MONTH, DAY, HOUR, MINUTES, SECONDS] ; TIMEZONE ; TODAY\
  \\

  <figure><img src="/files/T3E32Ounwt5HbtkU2nfE" alt="" width="563"><figcaption></figcaption></figure>
* **Consent: New setting "Global Privacy Control"**\
  Setting to be configured at the banner level. Required for CCPA banners\
  For further information, you can read [this page](https://community.commandersact.com/consent-management/knowledge-base/ccpa-and-global-privacy-control)\\

  <figure><img src="/files/kiMykU9rLXBH6RvbuEVV" alt="" width="485"><figcaption></figcaption></figure>
* **Destinations: New section 'events filtered' on Event Delivery tab**\
  For all destinations, on Event Delivery tab, there is a new section with number of filtered events (consents, conditions defined)\\

  <figure><img src="/files/szdzN0VCe4GOQBXBKFwk" alt=""><figcaption></figcaption></figure>
* **Destinations: Dry Mode (lab) - Closed Beta**\
  The Dry mode allows you to simulate sending events, **but events are not sent** to the destination.\\

  <figure><img src="/files/cKZJKWfUlFgzluYT1wYC" alt=""><figcaption></figcaption></figure>
* **Destinations: update on Facebook Conversion API**\
  We released a Performance tab with Event Match Quality score\
  The Performance tab can now display Event Match Quality insights, coming from Facebook.\
  It represents the matching quality, referring to the quality of events sent (completeness of data, like events with email, phone, fbp, fbc...). More identifiers are present on events sent, better is the score.\
  You can have a look to our [documentation ](https://doc.commandersact.com/features/destinations/destinations-catalog/facebook/facebook-conversions-api/performance-tab-event-match-quality)\\

  <figure><img src="/files/3JwCLVY1alIChMRIE3lw" alt=""><figcaption></figcaption></figure>
* **UI Improvements: Statistics on weather icons**\
  On hover of weather icons, you can see the percentage of accepted/refused events\\

  <figure><img src="/files/E0ah1KwiCA22Uw143SwY" alt=""><figcaption></figcaption></figure>

## Release 10.0.12 - 24/05/23

* **Event delivery improvement for Audience based destinations**\
  Event Delivery errors messages for Audience connectors (API connectors such as Facebook Custom Audience, Google Customer Match...) now provide more detailed information about errors encountered.

  <figure><img src="/files/Zyt8i3fZ0ylXMei9jxFT" alt=""><figcaption></figcaption></figure>
* **Sources: update on GTM Bridge**\
  A Commanders Act source key is now required in the bridge configuration. As, in the future, events without a source key will be discarded, it is important that you apply the update.\
  If it is not already done, please update it as soon as you can, following the instructions available in our [documentation](https://doc.commandersact.com/features/sources/sources-catalog/gtm).\
  \\

  <figure><img src="/files/43WZTp3A1DRwNQkQpi8z" alt=""><figcaption></figcaption></figure>
* **Destinations settings enhancement:**\
  New dynamic text input component on settings fields (except Smart Mapping for the moment)\
  \\

  <figure><img src="/files/Gssjx1nIcGgYUYuIozrv" alt=""><figcaption></figcaption></figure>
* **Mobile:**
  * **Video Events are now natively supported**\
    For more informations about video events, you can have a look to [our documentation](https://doc.commandersact.com/developers/tracking/about-events/mobile-sdk-event-specificity)
  * **the property 'do not track' has been added**\
    Required by CNIL for Consent Statistics exempted. For more information check [our documentation](https://community.commandersact.com/consent-management/knowledge-base/consent-cookies-exemption/implementation-guide-for-exempted-consent-statistics-fr-market)
  * **Flutter SDK minor updates**\\
* **New destinations releases:**\
  \
  [**Adform**](/features/destinations/destinations-catalog/adform)**:**\\

  <figure><img src="/files/vz0zPvB1hwVlkxE69Eu6" alt="" width="226"><figcaption></figcaption></figure>
* **Destinations updates:**\
  \
  **Equativ:** improvements and user/cookie sync fix\\

  <figure><img src="/files/66hL6UouhoTQzXJctPAu" alt="" width="230"><figcaption></figcaption></figure>

  **GA4:** send all properties option, automatic session id.\
  Proxy mode is open to more beta customers. Global opening on 25/05\\

  <figure><img src="/files/RMohhD75HucHcXsT9rpC" alt="" width="227"><figcaption></figcaption></figure>

  **Piano Analytics:** send all properties\\

  <figure><img src="/files/812b866yLunMbAo5yJTV" alt="" width="241"><figcaption></figcaption></figure>

  **TikTok:** “Smart Mapping” support\\

  <figure><img src="/files/oIAhnKd96CGYAcfvTd2z" alt="" width="227"><figcaption></figcaption></figure>

  **Partnerize:** field encoding fixes\\

  <figure><img src="/files/hTMCKWWmDzgmlWWUd6CD" alt="" width="229"><figcaption></figcaption></figure>

  **Awin:** dynamic fields support

  <figure><img src="/files/4bBaIyAlvStnyhV0No1N" alt="" width="230"><figcaption></figcaption></figure>

  \
  **Commission Junction:** dynamic fields support

  <figure><img src="/files/ekJtPeAU9HjOTiz6EUK1" alt="" width="230"><figcaption></figcaption></figure>

## Release 10.0.11 - 24/04/23

* **A new item has been added to the navigation menu of our platform: 'Data Governance'**.\
  For the moment, you will find the pages related to your privacy banners configuration's in the tab 'Consent Management'.\
  More pages are coming soon!

  <figure><img src="/files/tHyxaPpmxIWgdLvfokcA" alt="" width="181"><figcaption></figcaption></figure>
* **Data Cleansing: 2 new function for your formulas:**\\

  <figure><img src="/files/whZjFwGVifV8arSoQVVl" alt="" width="422"><figcaption></figcaption></figure>

  <figure><img src="/files/8xUJxcmggtRzmEMgGhKq" alt="" width="419"><figcaption></figcaption></figure>
* **New destinations releases**\
  \
  **Data Activation Legacy:** Only for Data Activation customers. Gives you the possibility to map the format of the events to the format of the data activation (Data Commander variables). To go deeper, you can consult our [online documentation](https://doc.commandersact.com/features/destinations/destinations-catalog/data-activation-legacy) \\

  <figure><img src="/files/aT5QsMTWHXfxRfXm51Kg" alt=""><figcaption></figcaption></figure>

  **GA4 Proxy Mode:** The proxy mode option allows you to anonymize data before to send it to Google.\
  \*We also added analyses, suggestions and report's impact in our [online documentation](https://doc.commandersact.com/features/destinations/destinations-catalog/google/google-analytics-4/google-analytics-4-proxy-mode#3.-impact-analysis-and-open-suggestions)\
  \\

  <figure><img src="/files/zlOIPSn9bx1kO0Mi5GJQ" alt=""><figcaption></figcaption></figure>
* **Destinations updates**\
  \
  **GA4:** Send all properties in one click to Google\\

  <figure><img src="/files/gazJB8zJ3Fxgpe4OCttP" alt="" width="308"><figcaption></figcaption></figure>

  \
  \
  **TikTok:** Offers a smart mapping option

<figure><img src="/files/2j7CyBEjYa3tbe6JAnNZ" alt=""><figcaption></figcaption></figure>

* **Bridge updates**\
  \
  GTM bridge: a Commanders Act source key is now required in the bridge configuration. As, in the future, events without a source key will be discarded, it is important that you apply the update.\
  For further information, read the bridge’s [updated documentation](https://doc.commandersact.com/features/sources/sources-catalog/gtm).

## Release 10.0.10 - 24/03/23

* **Formula component enhancement (Data Cleansing, Event Enrichment, ...)**\
  The field now resizes automatically according to the size of the formula, to facilitate the reading and writing of complex formulas. Users can also resize the field themselves if needed

<figure><img src="/files/czr9mTa5J8ckjgXntX3H" alt=""><figcaption></figcaption></figure>

* **New User Rights**\
  3 new user rights have been added in Rights management interface to manage the *Destination Builder* feature

<figure><img src="/files/TpAavjXBJoGyxx4JsnvY" alt=""><figcaption></figcaption></figure>

* **New SDKs:**\
  \
  SDK for **Flutter** is launched\
  For further informations, please check our github\
  [https://github.com/CommandersAct/tcserverside-plugin\
  https://github.com/CommandersAct/tc-consent-plugin\
  https://github.com/CommandersAct/TCMobileDemo-flutter](https://github.com/CommandersAct/tcserverside-pluginhttps://github.com/CommandersAct/tc-consent-pluginhttps://github.com/CommandersAct/TCMobileDemo-flutter)\
  \
  SDK **Angular 15** is available\
  Note : it's also compatible with Angular 14.\
  Check our GitHub for more informations :\
  <https://github.com/CommandersAct/ngx-tag-commander>\
  <https://github.com/CommandersAct/ngx-tag-commander/blob/master/README.md>\\
* **Filters enhanced on destinations**

  * quick/easy filter with autocomplete
  * more operators (contains, match regex, etc.)
  * advanced mode with formula (ability to create very complexe filter, applying our formula function to any condition)\\

  <figure><img src="/files/axCcSxIpBTFUu0O9tRIS" alt=""><figcaption></figcaption></figure>
* **Data Quality indicators and trend graph are now displayed on all sources**\\

  <figure><img src="/files/wnjjxjWqQ7iB4cRwCjeA" alt=""><figcaption></figcaption></figure>
* **New option on LRB report**\
  you can now choose to do not display the "non attributed" line in a report

  <figure><img src="/files/wfC9TE7EDeLVgYN6in89" alt=""><figcaption></figcaption></figure>
* **New destinations releases**\
  \
  **Partenerize**\
  Note : this destination allows a dynamic field\ <img src="/files/iN7HvrXz0GTbuawVPBIJ" alt="" data-size="original">\
  \
  **SmartAd Server**\
  ![](/files/4po8B6zEWmQejrlEg5gg)\
  \
  **Rakuten Events**\
  ![](/files/JpZPOvW6LlZHeGzcIX1M)\\
* **Destinations updates**\
  \
  **Mapp:** usability improvements\
  ![](/files/KmBgRivttcS2dlsxRoLD)\
  \
  **Partnerize:** Advanced operations added\
  ![](/files/MzNUZ2lrZ6NzV1un3s8F)\
  \
  **Snapchat:** SmartMapping support\
  ![](/files/aZswYPzBYGiP2qCDU5OX)

## Release 10.0.9.1 - 22/02/23

* **Destination builder - Javascript sandbox**\
  Create your own custom destination using basic javascript code !\
  You can create event-based or audience-based destination.\
  ![](/files/g2u8rvqSgvlQGn4eTRje)![](/files/56pDX7fYhmOWoM8GqefR)![](/files/qnHYbWcYXMlOqUCeKS6s)![](/files/cQXRbUhjis7hvOknqttS)

\
More information here:

{% content-ref url="/pages/reBPpbAALO0AzM9GnqH4" %}
[Destination builder](/features/destinations/destination-builder)
{% endcontent-ref %}

* **UI enhancement**\
  Data Cleansing and Event Enrichment features benefit for a even more userfriendly autocomplete property selector component. Find quicly your property or create a new one in a click.\
  ![](/files/FH77PB1GWcQMXReXDkpU)
* **Data Cleansing – new functions added​**

  [JSON\_PARSE() and VALUE\_FROM\_JSON()​](/features/data-quality/data-cleansing/supported-transformation-functions#available-functions)
* **Events reference update**

  [video events](/developers/tracking-and-integrations/tracking/events-reference/video-event-reference) has been added
* **New destinations:**
  * [Pinterest](/features/destinations/destinations-catalog/pinterest)
  * [Equativ ](/features/destinations/destinations-catalog/equativ-audience)(audience)
  * [Partnerize](/features/destinations/destinations-catalog/partnerize)
  * Updates: Matomo, Kwanko, Google Universal Analytics
* **Consent management - Exempted statistics** ​
  * New tag in the library to facilitate the setup​
* **Event Replay -** *Closed alpha​*
* **New source:**
  * **Flutter - for mobile App** – *Closed beta*​
* **Campaign analysis ​**
  * Campaign Overlap enhanced => possibility to go back up to 30 days​\
    ![](/files/0bQ3DRuUYT9QBMjIkz2w)
  * Make it possible to send a timestamp with the incoming hit​ of your campaigns collection

## Release 10.0.9 - 14/02/23

* **27% increase in the speed** of the interfaces listed below:
  * Client-side TMS UIs
  * Segments UIs
  * Admin UIs
  * Campaign options UIs
  * Banner builder and consent Dashboard UIs

## Release 10.0.8 - 24/01/23

* **Product enrichment** & **External API -** *Public opening*\
  Enrich your events in real time with data transmission from your product catalog or from an external API. It does not requires any data storage\
  ![](/files/e3elSFzUF1MqbrNXcUok)\\
* **OnSite API:**

  [5 new commands](https://community.commandersact.com/consent-management/onsite-api/consent.onready) are available, to help you on consent behaviour management:

  * cact('consent.onReady', (consent) => console.log(consent))
  * cact('consentBanner.show')
  * cact('consentBanner.hide')
  * cact('consentCenter.show')
  * cact('consentCenter.hide')
* **Destinations:**
  * **Adobe Analytics**: beta
  * **Pinterest**: beta
  * **Piano Analytics**: improvement you can now set the Piano Site Id parameter with a dynamic value

## Release 10.0.7 - 24/12/22

* **Event enrichment** – **External API** Version 1.0 closed alpha. *Public opening on 12 Jan.*\
  Enrich your events with instantaneous data transmission from an external API - no data storage required\
  ![](/files/e8hQvvbBbUMERPKraubZ)
* **Destinations:**
  * Easier debug in Event delivery and Event inspector, now both shows information when a javascript error raise in the destination code. Usefull when you build your own destination using the [Destination builder's Javascript Sandbox](/features/destinations/destination-builder):

    <figure><img src="/files/i3nOHuKjdfb7KqZTqjR0" alt=""><figcaption></figcaption></figure>
  * **Google Universal Analytics** (GA3): beta
  * **Adobe Analytics**: closed beta
  * **Audience based destinations :** All "closed beta" or "closed alpha" destinations are now open to everybody.\
    Also, all these audience-based destinations benefit from the [Event Delivery](/features/destinations/event-delivery) feature and Threshold [Alerting](/features/destinations/event-delivery#alerting) feature\\
* **Explore:** Enhancement of LRB integrations in the platform\\

  <figure><img src="/files/MF8tKhFruEjf5VzkXxPg" alt=""><figcaption></figcaption></figure>

## Release 10.0.6 - 24/11/22

* Data Management – New feature:​
  * **Data Cleansing** no-code : **Rename event** public opening.\
    ​![](/files/XLeurVkdmLnTIIR1dDot)
  * **Campaign analytics** interfaces: public opening
  * **Event collection** UI : add a **global counter​**\
    ![](/files/Yv6AkAOVKHwgNbJm6O1h)
* **Event enrichment** – **product catalog** enhancement (closed alpha)​ *Public opening on 12 Jan.*\
  ![](/files/EToCI5J8P53Hz15Oo81I)
* Destinations:​
  * Destination builder **Sandbox JS**: Closed alpha\
    ![](/files/SissKRo3WYUnYoY2r1mY)
  * **Google Enhanced Conversion** connector now supports more events​
  * **Commission Junction** : smart mapping adjustments and public opening​
  * **Google Univers Analytics**: closed beta
  * **Partnerize**: closed alpha
  * **TikTok**: Add **Smart Mapping** : closed alpha
  * **Adobe Analytics** : closed alpha
* Global Platform X:​
  * **Even faster interfaces** on : CMP UI, client-side TMS UI, Administrations UI, Campaigns Analytics UI => closed alpha. *Public opening on 13 Jan.*
  * **Data Activation** features: public opening

## Release 10.0.5 - 24/10/22

* **Data management - new feature:**
  * [**Data Cleansing**](/features/data-quality/data-cleansing) **no-code :** Clean, fix, refine your event data with a userfriendly interface (closed beta) *Public opening on 21 Nov.*\ <img src="/files/DTy6K69QbwtYxhOwLh8t" alt="" data-size="original">![](/files/FNm6OlZdi16uJeVAjOUu)
* **Enrichment - new feature:**
  * **Event enrichment from your Product catalog:** Copy in realtime time any properties of your imported product catalog to your choosen event.\
    Use case example: send a purchase event with only product ids and enrich your events on the server with all the product properties you have in your product catalog for these ids.\
    (closed beta) *Public opening on 08 Dec.*\\

    <figure><img src="/files/F3zaZQk4UVuvaOlHBEAo" alt=""><figcaption></figcaption></figure>
* **Destinations improvements:**

  * New destinations: [Commission Junction](/features/destinations/destinations-catalog/commission-junction) (closed alpha), Partenerize (closed alpha),[ Google Customer Match](/features/destinations/destinations-catalog/google/google-customer-match) (public beta)
  * New feature : **smart mapping** (closed alpha) : visualize/edit the data mapping done automatically by the system between your event properties and the destination's API.\
    \&#xNAN;*This feature will be progressively open on each destination during next months.*\\

  <figure><img src="/files/30ME7mmdvwjh0ApNCgHC" alt=""><figcaption></figcaption></figure>

  * Enhancement on existing destinations: Tradedoubler, Criteo conversion, Snapchat, GEC, TikTok, Kwanko
  * Event delivery: error's labels enhancement, easier to understand what is wrong
* **Sources enhancements:**
  * Web container : Add a summary/setup guide step.
* **Campaign analytics - new feature:**
  * New **whitelist** feature for landing page redirections (closed beta)

## Release 10.0.4 - 24/09/22

* **Global Platform enhancement**:
  * Help icon: a new menu that allows you to quickly find helps or send feedbacks\
    ![](/files/On9gS6VTzir4EvZGkCCk)
  * **Onboarding tour:**\
    Interactive tutorials have been added to discover the platform features. You can access to it through the help icon at the top right\ <img src="/files/ge24WeCqJYv7UR8oGx6f" alt="" data-size="original">
* **Source improvements:**
  * Trend graph and quality indicator for HTTP Tracking API sources.\
    ![](/files/Iwg4hcX6KwMA4TZh1wyh)
  * Quality indicators have also been added to Source Data Quality view. For each event you can now see at a glance if an event has a quality issue.\ <img src="/files/a5AfKlqXUyl6nqf6O9u9" alt="" data-size="original">
  * iOS SDK: Core 5.1.1 ServerSide 5.1.2
    * Supporting TVOS Consent 5.1.2
    * Disclosure for IAB's vendors
* **Destinations improvements:**
  * Event delivery detail popin now shows also the intial events beside the destination hit and response. It allows to easily understand if there is wrong or missing properties in the original event\ <img src="/files/xaJfeYBEqXCo3g8dlmeH" alt="" data-size="original">
  * Event inspector now show initial event too in each log
  * Enhancement on existing destinations : Piano Analytics
* Explore improvements:
  * Live report builder: you can now change in live the attribution model without having to edit the report\
    ![](/files/BKOD5CUDtUBXmDBToqcO)

## Release 10.0.3 - 24/08/22

* Sources improvements:
  * Live Events Inspector for sources, available both in Sources menu (for all sources) and on each source (tab Event Inspector). It allows to inspect/debug your incoming events​
* Destinations improvements: ​
  * *Advanced mapping* feature evolves to Event [*Properties transformation*](/features/destinations/advanced-mapping) feature.
    * Ability to create new property and map them to existing one for a specific destination
    * Ability to remove event properties for a specific destination\
      ![](/files/yZ5We7IEOAi1myp3GbhX)
  * [*Alerting* ](/features/destinations/event-delivery): *Event delivery* alerting is now open to everybody on channels *email*, *Slack* and *Microsoft Teams*.\
    Be alerted in real-time when one of your destination delivery drop below your threshold.\
    ![](/files/xV36Unnd0IW7sT3BzI9A)\\
  * Enhancement on existing destinations : Piano Analytics, Snapchat and Google Enhanced conversions
  * [Webhook ](/features/destinations/destinations-catalog/webhook)enhancement : ability to use properties, static values, or a melt of both, everywhere (url, body, headers)​
  * New destinations :
    * [Matomo](/features/destinations/destinations-catalog/matomo)
    * [Mapp](/features/destinations/destinations-catalog/mapp)
  * Template importer (closed alpha) : import in the destination catalog your custom destination template build with the [sandbox JS](/features/destinations/destination-builder/javascript-destination-builder)\
    (Compatible with GTM templates)
* Campaign analysis -> Live Report builder look and feel enhancements
* Minor UI enhancements:
  * tooltip on all destinations or sources logo in overview UI
  * Increase clarity of labels on some UI
  * Add technical base for future onboarding features

## Release 10.0.2 - 24/07/22

* Event collection​\
  ![](/files/q6Pab3M582xRuMmrFA4I)\
  Follow your events arriving at the platform in near-realtime, understand which source send it and which destinations are using it.​\
  Analyze past event count, up to one year ago, to master your event collection and associated cost\\
* Sources improvements: ​

  * Duplicate a source (except web containers)​
  * Link/unlink destinations to a source (create and edit)​

  ![](/files/HpBHSBk5KtG1QRUHgLOg)
* Destinations improvements: ​
  * Duplicate a destination to edit it in another environment​
  * Activate/ deactivate switch​, to pause a destination
  * Userfriendly way to select a specific sources to a destination (create and edit)​
  * Advanced mapping​ on each destination
  * TikTok connector (Web mode only, App mode in September)​
  * Piano Analytics, Snapchat, Criteo, GA4 enhancements/fix​
  * Matomo Analytics in closed alpha test\
    ![](/files/ZRtKZCnDO5YyjAXD28e9)![](/files/7LzhnqzxhIgdcDcpEQY1)

## Release 10.0.1 - 24/06/22

* Sources improvements: ​
  * Source data quality in health menu (global) and in a tab for each source​
  * Adding new sources, currently in closed alpha (Shopify, pixel tracking, cost imports…)​
  * Source event inspector : inspect each event individually (intelligent sampling)
  * Adding new environment: ‘development’​
* Destinations improvements: ​
  * Consent categories dropdown on destination’s filters​​
  * Destination description: what you will need & supported sources sections​
  * Adding new environment: ‘development’​
* Improvements on 2FA​
* Integration of segment stats interface​
* New connectors: Criteo Events, Tradedoubler, Xandr\*, Appnexus\*, Tableau\*​
* Destination enhancements:​
  * Webhook v2 (more methods, and more formatting data possibilities)​
  * Google Enhanced Conversion v2 (new Google API)​
  * Google Analytics 4 (more options)​
  * AT Internet (cookie server)​
  * Awin (more advanced affiliation property option)

(\*) audience based destination

## Release 10.0.0 - 21/01/2022

* Serverside v2 interfaces - closed beta 1

## Release 0.0.12 - 01/02/1970

* Removed humans, they weren't doing fine with animals.
* Animals are now super cute, all of them.

## Release 0.0.1 - 01/01/1970

* Introduced animals into the world, we believe they're going to be a neat addition.


# How the platform works

Commanders Act is a cookieless platform that allows you to **collect, normalize/fix, enrich, check and send** in real time your first-party customer data.

<figure><img src="/files/BANSmIV9l19uhuUk4NF6" alt=""><figcaption></figcaption></figure>

Basically, the platform libraries/API ([Source](#source)) collects user actions ([Event](#event)) on your website/app/etc.\
These events are sent to the platform servers and are then (in this order) [fixed](/features/data-quality/data-cleansing), [normalized](/features/data-quality/event-specification), [enriched](/features/enrichments), [checked](/features/data-quality), filtered and translated in each tool ([Destination](#destinations)) format, so that they can be sent to your chosen destinations.

<figure><img src="/files/ek8LnmEphLSY3cBn4W4V" alt=""><figcaption></figcaption></figure>

Platform servers can also store events, users and custom data in the Commanders Act database ([Data store](#data-store)) and send this data to your storage system (by FTP, email, S3, ...), BI system, etc.\
The user storage is based on a realtime [identity resolution system](/features/identity-resolution) that give you a cross-device single view of your users (profiles), allowing you to build segments and use audience-based destination.

## Event

An [event ](/developers/tracking-and-integrations/tracking/about-events)represents an action made by a user on your website or application. To track that action, you send an event that contains the data and will be received by Commanders Act.

## Source

A [source ](/features/sources)is an emitter of events. It can represents your website, your mobile app, a point of sale (POS) etc. Defining your sources allow you to easily manage and monitor where your events are coming from.\
See more on:

{% content-ref url="/pages/-MlTiu0MQ5WLdhdhd\_cs" %}
[Integrating your data](/getting-started/integrating-your-data)
{% endcontent-ref %}

{% content-ref url="/pages/xAzhUXoBtU9jeZhC3xev" %}
[Sources Catalog](/features/sources/sources-catalog)
{% endcontent-ref %}

## Destination

[Destinations ](/features/destinations)are the partners/tools where you eventually want the collected data to go. Commanders Act provide a library of many destinations ready to be used, like GA4, Facebook CAPI or Google Enhanced Conversion.\
See our [destination catalog here](/features/destinations/destinations-catalog).

## Data store

Data store is the name of Commanders Act BigData database. You can store here your events and your [imported data](/getting-started/integrating-your-data#imports) (product catalog, etc.)\
Storing data inside the Data store allows you then to [enrich ](/features/enrichments/events-enrichment)your events by retrieving additional data in any storage universe. It also allows you to create user [segments](/features/customers/segment) and to benefit from analysis and insights.

## Data layer

A data layer is a specification of your data for tracking customer interactions. This can include data from websites, mobile apps, connected devices, and offline sources. The data layer enables your third-party vendor solutions and serves as the basis for your data-focused initiatives.

{% content-ref url="<https://github.com/TagCommander/PlatformX/blob/master/getting-started/concepts/broken-reference/README.md>" %}
<https://github.com/TagCommander/PlatformX/blob/master/getting-started/concepts/broken-reference/README.md>
{% endcontent-ref %}


# Glossary

Our market and solution use many technical concepts, but our goal is also to democratize and explicate these notions to all.

### **Cookie first**

A first-party cookie is a cookie managed by the website owner to track users' activities and remember preferences. It is opposed to third-party cookies which are not owned by the website but partners (advertising partners, for example). Ad blockers and browsers are blocking more and more third-party cookies, that's why first-party cookie is a great workaround to keep a continuity on tracking users.

### **A-record**

It indicates the IP address of a given domain. 'A' for address, it is the most fundamental DNS record type (Domain Name System = website domain). By adding Commanders Act on your A-record, it allows Commanders Act to launch tags as first-party cookies, avoiding ad blockers and limitations regarding third-party cookies.

### **Cookie client-side**

A client-side cookie (HTTP cookie, browser cookie) is a small piece of data that a server sends to a user's web browser. These cookies are stored on the browser.

### **Cookie server-side**

A server-side cookie (session) is a unique Session Identifier stored on the browser and cookie information are stored on the server. The Session Identifier is used to match the request with the data stored on the server.

### **ITP**

Intelligent Tracking Prevention is a feature on browser Safari (Apple) to restrict the use of cookies to track consumers.

### Public cloud

With public cloud, companies don't have to purchase, manage and maintain heavy and expensive infrastructures. All of this is managed by third-party providers, and companies only pay for what they consume.

### ETL capabilities

An ETL (Extract - Transform - Load) is a system that can extract the data from a source, transform the data (normalization, cleaning...) and load, insert the data to a destination.

### Normalized data layer

A normalized data layer refers to ready-to-use data: after collection and normalization, the data quality is ensured, data is clean and ready to be sent to destinations.

### Augmented data layer

From collected data, it is possible to enrich the data layer with computed data: create new properties from existing properties to create a sum, count, average, ratio... This allows to create high value properties to send to destinations for a better segmentation or personalization.\
For example, it is possible to count the total value of purchases per user or the average basket value per user.

### Enrichment

When an event is collected, it is possible to enrich it from stored data to add more information on the event before to send it to destinations. For example, a purchase event can be enriched with data coming from CRM, like hashed email address or any other relevant information. It can also be enriched with information coming from the product catalog, from the product ID we can add product details, color, weight, materials...

### Identity resolution

The goal of Identity resolution is to create a unified customer profile, whatever devices (desktop, mobile) or channels used (online and offline). To achieve this goal, we built a real-time proprietary reconciliation algorithm to create the complete view of customers.


# Condensed platform concepts

## CAX Platform : Features and Functions

Commanders Act: Cookieless platform for first-party customer data collection, normalization, enrichment, and real-time transmission.

### Components:

* Source: Libraries/APIs collect user actions (events) from various platforms (websites, apps, POS).
* Event: User actions tracked from sources and sent to CAX.
* Destination: Tools/partners receiving the collected data in suitable format. Examples include GA4, Facebook CAPI, Google Enhanced Conversion.
* Data store: Commanders Act's BigData database for storing events and imported data. Enables event or user enrichment, user segmentation, and data analysis.
* Identity resolution
* Data Insights : Campaign analysis, Automatic Ads budget optimisation (Adloop), Customer analytics, Control group

### Data Integration:

* Real-time tracking: Via OneTag, Javascript SDK, Google Tag Manager, Mobile SDKs, Rest API.
* Third-party tools: Connectors catalog, destination builder, webhook.
* Imports: Regular automated file imports (csv) for CRM users, offline conversions, product catalog, custom storage universe.
* Data API: Specific data transmission via Data JSON APIs.

### Data Quality:

* Confidence: In-app reporting and daily email digests for invalid event action.
* Normalized Datalayer UI: Interface for data schema definition and validation rule creation (event specs).
* QA automation: Event specification writing for QA process automation and real-time alert definition.
* Data Cleansing UI : Live data transformation feature for quick data error response.
* Event Delivery UI: Quality check for data transmission and event delivery history view.
* Event Inspector UI: Source and destination inspectors for specific event analysis/QA/debug

## OneTag

1. Add OneTag from tag library in web container. Options: Builder (no code) and Custom (manual code).
2. Setup tag. Use `cact('trigger')` to record user actions. Format: `cact('trigger', '<event_name>', {<event_data>}, [config], [callback]);`. Events have names, properties. Example:

   ```
   cact('trigger','sign_up', {
     method: 'email', 
     user: {
         consent_categories: [1,3,4,6]
     }
   });
   ```
3. Event types: standard (recommended, predefined names, parameters) and custom (user-defined). Use standard properties in custom events.
4. User consent automatically included in all events with Commanders Act CMP. With other CMP, manually add `consent_categories` inside `user`.
5. Override default parameters (`collectionDomain`, `sourceKey`, `siteId`) if needed. Set globally for all events with `cact('config')`.
6. Check functionality with Event Inspector.
7. Setup first destination. Add in Commanders Act platform, configure, choose source, manage user consent, save, check.
8. Server-side consent management: event sent to destination only if match between user consent categories and destination consent category.


# Platform interface

Discover the [synopsis concept behind the platform](/getting-started/concepts) and explore our [features](/features/sources) below.

![](/files/ynjJjF49PTKalRRVY8It)


# Prod and Testing environments

The Commanders Act platform allows you to manage data sources, destinations, transformations across different environments. These environments—namely Production, Staging, and Development—help you organize and control your data flow more efficiently.

### What Are Environments?

Environments are labels can be applied to sources, destinations, and transformations. These labels help you categorize and manage how data flows and is processed within the system. By selecting an environment, you can specify the context in which a particular source, destination, or transformation should operate.\
The default three primary environments are:

* **Production**: This is the live environment (on which to be very carreful)
* **Staging**: Often used for testing and quality assurance.
* **Development**: Used to build and test things

### Workflow Examples

#### Use Case 1: Team-wide Testing of a New Destination

* **Scenario**: Your team needs to validate a new destination configuration.
* **Steps**:
  1. Create a destination in the Development environment and label it "Team\_Test\_Destination."
  2. Connect only Development sources that are sending known, controlled events.
* **Outcome**: The team can collectively test and validate the new destination using controlled, lower-volume data.

#### Use Case 2: Testing Data Transformations on a Smaller Scale

* **Scenario**: You've developed a new data transformation logic and want to test its impact before applying it to your live data.
* **Steps**:
  1. Create a source in the Development environment and label it "Transformation\_Test."
  2. Direct only a subset of your events, preferably test events, to this source.
  3. Create a transformation in the Development environment and connect it to the "Transformation\_Test" source.
* **Outcome**: You can validate the new data transformation logic using controlled, lower-volume data without affecting the Production environment.

#### Use Case 3: Verifying a Mobile App Update

* **Scenario**: You're releasing a new version of your mobile app and want to ensure it works as expected.
* **Steps**:
  1. Create a source in the Development environment specifically for the new mobile app version.
  2. Initially, connect this source to destinations in the Development environment.
  3. Once verified, connect it to Production destinations.
* **Outcome**: You can test the new app version in a controlled, lower-volume setting before rolling it out to your user base.

#### Use Case 4: Role-based Access Control (soon)

* **Scenario**: You want to control who can make changes in different environments.
* **Steps**:
  1. Assign roles to team members, specifying permissions for Production, Staging, and Development.
  2. Implement these roles to restrict or grant access to specific sources, destinations, or transformations.
* **Outcome**: Only authorized team members can make changes in sensitive environments, enhancing security and accountability.

{% hint style="info" %}
In the near future, the platform will introduce user permission management that will allow you to define who can modify or create elements in each environment. This adds an extra layer of control and security, ensuring that only authorized personnel can make changes to critical environments like Production.
{% endhint %}

### Advantages of Using Environments

#### Data Isolation

Isolating data between environments minimizes the risk of errors and data corruption. For example, testing a new feature in the Development or Staging environment will not affect your live data in Production.

#### Enhanced Security

Production data is isolated from Development and Staging, reducing the risk of unauthorized access or data leakage.

#### Improved Testability

New features or data transformations can be thoroughly tested in the Staging or Development environment before being rolled out to Production.

#### Streamlined Deployment

Moving new features from Development to Staging and finally to Production becomes more straightforward, reducing the chances of errors during deployment.

#### Team Collaboration

Environments facilitate better collaboration between development, testing, and operations teams by providing dedicated spaces for each phase.

#### Future Feature: User Permission Management

It allows you to define who can modify or create elements on production, staging, etc. This adds an extra layer of control and security, ensuring that only authorized personnel can make changes to critical environments like Production.

### How to Use Environments

1. **Creating a Source or Destination**: You have the option to label it with an environment tag—either Production, Staging, or Development. This helps you categorize and manage how data flows and is processed within the system.
2. **Data Cleansing Transformations**: While creating a transformation, you can choose to apply it to a specific environment, giving you more control over your data flow.

{% hint style="info" %}
**Create Your Own Environments**: In addition to the default Production, Staging, and Development environments, a **future** update will allow you to create your own custom environments. This will provide even more flexibility in managing data flows and transformations, allowing you to tailor the platform to your specific needs.
{% endhint %}


# Productivity tools


# Commander's AI

Technical documentation on the use of artificial intelligence in the platform

## 1. Introduction

### 1.1. Overview of Commander's AI

**Commander's AI** is a set of artificial intelligence features integrated into the **Commanders Act** platform.\
These features leverage advanced language models (**LLM**) to optimize and automate various tasks.\
Its goal is to simplify and optimize tag management, data handling, insights, file import and destination configurations through natural language processing models.

The functionalities of Commander's AI are designed to:

* Improve user efficiency by automating repetitive tasks.
* Simplify data management and transformation.
* Ensure tag and destination compliance with privacy regulations.
* Assist users in optimizing configurations through intelligent suggestions.
* Accelerate and simplify complex tasks for users.
* Improve the quality and standardization of configurations/data.

{% hint style="info" %}
All Commanders AI suggestions are non-binding and subject to human validation. Users remain responsible for verifying any AI-generated content before applying it in production.
{% endhint %}

### 1.2. Key AI Features

Commanders AI includes several advanced functionalities (some are limited to beta testers) :

1. [**Automatic Change Summary**](#id-2.1-automatic-change-summary-in-web-containers): Generates a summary of modifications when generating a web container in the Tag Management System.
2. [**Cookie description translation/categorisation**](/features/realtime-cookie-scanner): Find missing description/categorisation in Realtime Cookie Scanner, translate cookie descriptions in other languages
3. [**AI Copilot for Data Cleansing**](#id-2.2.-ai-copilot-for-data-cleansing-closed-beta) : Conversational assistant to generate or explain data transformation formulas.
4. [**Smart Suggestions**](#id-4.-smart-suggestions-for-names-and-descriptions-closed-alpha) (closed alpha): Optimized naming and description proposals for destinations and segments.
5. [**Automated Privacy Category Classification**](#id-5.-automatic-privacy-category-selection-closed-alpha) (closed alpha): Intelligent assignment of privacy categories when adding a tag or destination.
6. [**AI-assisted File Import Configuration**](#id-2.5.-ai-assisted-file-import-configuration): Automatic detection of file structure and suggested mapping between CSV columns and purchase event properties.

***

## 2. AI Features Description

### 2.1. Automatic Change Summary in Web containers

#### Feature Overview

When a user generates a web container in the **Tag Management System (TMS)**, Commander's AI analyzes the modifications and provides an automatic summary of the changes made since the last container generation.

<figure><img src="/files/NGFey8fBExkZ8kO9wcRm" alt="" width="305"><figcaption></figcaption></figure>

#### How It Works

1. The AI identifies changes made: additions, deletions, or modifications of tags, variables, triggers, etc.
2. An AI-based summarization algorithm generates a concise and readable description of the modifications.
3. The summary is displayed before the container is generated for user validation.

#### Customization and Validation

Users can manually edit the proposed summary before validation. This ensures the content meets expectations and facilitates team collaboration.

#### Personalization Options

Users have access to additional customization options via the gear icon ⚙️:

* **Summary Length**: Choose between short, medium, or detailed summaries.
* **Custom Prompting**: Define specific formatting rules or content guidelines for the AI to follow when generating summaries. Users can specify formatting or content preferences, such as writing in uppercase, adding emojis, structuring summaries with bullet points, (e.g., "Write in uppercase with emoticons with max 5 bullet points"). This allows for greater adaptability to specific workflows or reporting standards.

<figure><img src="/files/NTzBppMOmgTBhXfq4wdo" alt="" width="354"><figcaption></figcaption></figure>

***

### 2.2. Cookie Description and Translation Assistance

**Feature Overview**

Commanders AI assists users in the **Realtime Cookie Scanner** by helping them complete and translate cookie descriptions.

When a cookie description is missing, the user can click an AI button to request a suggested description. The AI uses the cookie name and any other available information, and may perform Internet searches to propose the most relevant description.

The proposed description can also be automatically translated into the languages selected by the user.

**How It Works**

1. The Realtime Cookie Scanner identifies cookies with missing descriptions.
2. For missing descriptions, the user can ask Commanders AI to generate a suggested description.
3. For existing descriptions, whether manually entered by the user or natively pre-filled by the Cookie Scanner, the user can request translation into one or more languages.
4. The user reviews the generated content, then validates it or edits it manually.

**Use Cases**

* Generating missing cookie descriptions.
* Translating cookie descriptions when adding new languages to a cookie notice.
* Reducing manual work when maintaining multilingual cookie documentation.

**Validation**

AI-generated descriptions and translations are suggestions only. Users remain responsible for reviewing, editing, and validating the content before publication or compliance use.

### 2.3. AI Copilot for Data Cleansing

#### Feature Overview

Commanders AI includes a **conversational assistant (aka AI copilot)** that enables users to formulate queries for generating/explaining data transformation formulas tailored to specific data cleansing needs.

#### How It Works

1. The user interacts with the AI Copilot using natural language to describe a data transformation or asking an explanation.
2. The AI copilot interprets the request and suggests a transformation formula / explaination.
3. The user can test, modify, and apply the formula before final integration.

#### Use Cases

* Conditional values
* Converting date formats.
* Cleaning invalid values...

#### Verification and Adjustment

Users can edit and test the generated formulas to ensure they meet their requirements before applying them. Each generation includes a reminder that the result should be validated by the user.

***

### 2.4. Smart Suggestions for Names and Descriptions (closed alpha)

#### Feature Overview

When configuring destinations, segments in Commanders Act, Commanders AI suggests names and descriptions based on usage context.

#### How It Works

1. When a relevant field is detected (destination name, segment description, etc.), the AI analyzes existing data and suggests suitable content.
2. The user can accept, modify, or ignore the suggestion.
3. Suggestions adapt based on usage trends and best naming practices.

#### Use Cases

* Generating a destination name based on destination's settings and filters.
* Proposing a detailed description for a segment

***

### 2.5. Automatic Privacy Category Selection (closed alpha)

#### Feature Overview

When a user adds a **client-side tag in the TMS** or configures a **destination**, Commanders AI automatically suggests an appropriate privacy classification.

#### How It Works

1. The AI analyzes the tag or destination metadata.
2. A **privacy category** is suggested based on best practices and applicable regulations.
3. The user can validate, adjust, or modify the suggestion before final approval.

#### Customization and Validation

Users retain full control over the classification and can adjust the suggestion as needed.

***

### 2.6. AI-assisted File Import Configuration

#### Feature Overview

When configuring a file import source for conversion imports, Commanders AI can assist users by analyzing the sample file provided during setup.

The AI helps detect the file structure and proposes a pre-filled configuration to reduce manual setup effort and configuration errors.

#### How It Works

1. The user provides a sample file during the file import source configuration.
2. Commanders AI analyzes the structure of the file.
3. The AI suggests the appropriate column separator and item separator.
4. The AI proposes a pre-filled mapping between the CSV columns and the purchase event properties to be created.
5. The user reviews, adjusts, and validates the proposed configuration before activation.

#### Use Cases

* Accelerating setup of recurring conversion imports.
* Reducing configuration errors during import source creation.

#### Customization and Validation

The proposed configuration is only a suggestion. Users must review and validate the detected separators and proposed mappings before saving or activating the import source.

Users remain responsible for ensuring that the sample file is appropriate for AI processing and should avoid providing unnecessary personal data in sample files whenever possible.

## **3. Transparency and Accountability**

#### **3.1. Clear Identification of AI-Generated Content**

All **Commanders AI** features include explicit labels indicating AI usage:

* **Visible UI labels/icon** such as "AI-Generated", "AI Suggestion", "AI Copilot" or ✨icon
* **User Control**: Users can modify/verify AI-generated content to prevent unwanted automation.

#### **3.2. Human Oversight**

Users **always retain final control** over actions suggested or performed by **Commander's AI**. The AI does **not make irreversible autonomous decisions**.

#### **3.3. Data Privacy and Security**

Commanders AI complies with **GDPR** and the **AI Act**:

✔ **Transparency**: Explicit labeling of AI-powered functionalities.\
✔ **Human Oversight**: No AI action is irreversible.\
✔ **Data Privacy**: Generated suggestions and content are not stored/used for training purposes. User data remains within the scope of its intended use and is not shared externally.\
✔ **Technical Documentation**: Full traceability and governance of AI models are maintained.

Commanders AI processes inputs exclusively within EU-hosted infrastructure using vendors that guarantee strict data isolation, non-retention and full alignment with GDPR and the EU AI Act. No model provider receives any customer data for training or reuse.

#### 3.4. Scope of AI Usage and Data Boundaries

As of today, Commander's AI does **not process or analyze any personal data or event payloads** collected via the Tag Management System (TMS) or the Customer Data Platform (CDP).

Depending on the feature, Commanders AI may process configuration-level metadata, user-provided prompts, structural fields, or sample data explicitly provided by the user for configuration purposes.

Its usage is limited to assistance scenarios such as:

* Generating summaries of tag management changes.
* Assisting in writing regex, expressions, or formulas based on metadata or structural fields.
* Suggesting field names or descriptions based on metadata.
* Classifying tags or destinations based on structural criteria.
* Analyzing user-provided sample files to detect file structure, separators, and suggest mappings for file import configurations.

For the AI-assisted file import configuration feature, Commanders AI may analyze the sample file provided by the user in order to detect its structure and suggest a mapping between CSV columns and `purchase` event properties.

Commanders AI does not autonomously activate imports, create production configurations, or make irreversible decisions. All AI-generated configuration suggestions must be reviewed and validated by the user before use.

Users are responsible for ensuring that any sample file submitted for configuration assistance contains only the data necessary for setup purposes. Where possible, sample files should be anonymized, minimized, or limited to representative structural data.

**Applicability of German Works Council (Betriebsrat)**\
Commanders AI is designed to provide configuration assistance and does not aim to monitor employees, evaluate employee performance, or profile individual users. It does not make autonomous decisions about users or employees.\
If the scope of Commanders AI were to expand in the future to process behavioural data or data that could be used for employee monitoring, this would be documented and communicated accordingly.

#### 3.5. EU AI Act Compliance

Commanders AI falls under the **low-risk category** as defined by the European AI Act.\
It provides only configuration assistance and suggestions, with **no autonomous or irreversible decisions**.\
This means that the existing measures already described (transparency, human oversight, governance, EU hosting) ensure full compliance with the obligations applicable to low-risk AI systems.

#### 3.6. Summary for DPOs, Datenschutz and Works Councils

This section summarises the key compliance questions typically required by DPOs and German Works Councils (§87 BetrVG).

**Which AI models are used?**\
Commanders Act uses advanced Large Language Models (LLMs) selected for reliability and compliance.\
For security and contractual reasons, and because our underlying models may evolve over time or be combined to improve performance and reliability, we do not publicly disclose individual model names or vendors.\
All models we use operate under the strict EU hosting, GDPR and AI Act rules described on this page.

**What data do the models have access to?**\
Depending on the feature used, AI models may access configuration-level metadata, user-provided prompts, structural fields, or sample files explicitly provided by the user for configuration assistance, such as:\
– tag names, cookie descriptions, segment descriptions\
– transformation formulas\
– structural metadata\
– sample CSV content provided during file import source configuration\
– column names and representative values used to suggest mappings\
For AI-assisted file import configuration, the AI analyzes the sample file only to detect its structure and propose a mapping between CSV columns and purchase event properties.

AI models do not access customer databases directly and do not autonomously retrieve event payloads from the platform. Any sample file analyzed by the AI is provided by the user for the purpose of configuring the import source.

**Where is the AI hosted?**\
All processing related to Commanders AI is fully hosted within the European Union.\
No data leaves the EU at any stage.

**What data is used to train the models?**\
No customer data is ever used to train or fine-tune any model.\
All models are pre-trained by their providers on public or generic corpora only.

**Where is data stored, and for how long?**\
Commanders AI is designed around strict non-retention principles for AI processing.\
As described above, model providers do not retain customer data for training or reuse.\
This page describes the AI processing scope only. For any retention that may apply at the platform level (for example support handling, audit, or operational logs), please refer to your contractual and security documentation.

## 4. AI Model Governance and Updates

### 4.1. Models Used

Commanders AI is based on a combination of **advanced language models (LLMs)** carefully selected for their efficiency in **data management and tag management tasks**. These models may evolve over time and can be combined depending on the use case, in order to continuously improve performance, reliability, and relevance for our users. Any future models will be selected in accordance with the same security, compliance, and data protection commitments outlined in this documentation.

### 4.2. Updates and Monitoring

* Models are regularly updated to ensure **accuracy and relevance**.
* Validation tests are performed before each deployment to reduce biases and improve reliability.

### 4.3. Security and Privacy

Commanders AI ensures full compliance with European regulations (AI Act, GDPR) by enforcing strict rules on data processing, model selection, and infrastructure localization.

* AI-generated content is not stored for reuse or retraining.
* We do **not** fine-tune models on customer data and select only vendors that guarantee data isolation and full alignment with EU laws (GDPR, AI Act).
* Suggestions are based solely on technical and contextual criteria, including configuration metadata, structural fields, user-provided prompts, or user-provided sample files when required for a specific configuration assistance feature.

### 4.4. Model Origin and Hosting Transparency

Commanders AI uses Large Language Models chosen under strict criteria for performance, privacy, and legal compliance.

* **Model provider location:** **If** a model is provided by a non-European vendor, we ensure that it is **hosted entirely within the EU**.
* User data never leaves the EU (no transfer, no storage outside the EU).

\
To illustrate this approach, some of the models we evaluate or integrate may be provided by European players such as **Mistral**, when they meet the same high standards. However, the determining criterion remains EU hosting and compliance with our security and regulatory requirements, regardless of the provider’s origin.


# Integrating your data

There are several ways how to get your data into Commanders Act platform.

## Real-time Commanders Act tracking

|                            |                                                                                                                                                                       |
| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Web container (OneTag)** | You can use the [OneTag](/getting-started/integrating-your-data/onetag-tutorial) to send events via our tag manager system.                                           |
| **Javascript SDK**         | You can use the [Javascript SDK](/features/sources/sources-catalog/web/js-sdk) to track events directly from your website code/CMS/TMS.                               |
| **Google Tag Manager**     | If you are using GTM client-side container, you can use our serverside platform by using the [Commanders Act GTM template](/features/sources/sources-catalog/web/gtm) |
| **Mobile SDKs**            | The [Mobile SDKs](/features/sources/sources-catalog/mobile-app) are the best way to simplify tracking in your iOS/Android apps.                                       |
| **Rest API**               | If you need to build your custom solution, have a look to the [http tracking API](/features/sources/sources-catalog/server/http-tracking-api).                        |

## Third party tools

Commanders Act also offers connectors to third party tools, visit the [source catalog](/features/sources/sources-catalog) to explore the full list.

## Imports

It is possible to import data to Commanders Act through regular automated file imports (csv), such as:

* [CRM users](/features/sources/sources-catalog/import-crm-users/users-file-importer)
* [Conversions](/features/sources/sources-catalog/import-conversions/conversions-files-importer) and [Product catalog](/features/sources/sources-catalog/product-catalog)
* Custom storage universe

## Data API

You can send your specific data through our [Data JSON APIs](/developers/tracking-and-integrations/tracking/data-api).


# GTM Tutorial

Quick Setup: From GTM Client-Side to Commanders Act Server-Side

This guide shows you how to quickly set up server-side event forwarding for GA4 in Google Tag Manager (GTM) using Commanders Act. With this setup, your GA4 events can be routed to multiple destinations like Facebook CAPI, Google Enhanced Conversions, and others.

1. **Create a GTM Source** in Commanders Act.
2. **Update the GA4 URL** in GTM.
3. **Set Up Domain Delegation** for first-party data collection (strongly recommended).

{% hint style="info" %}
**Alternative Approach for Event Tracking**

Instead of using GA4 to transfer events, you can add **Commanders Act tags** directly in GTM for each event you want to track. While this method takes more time to set up, it gives you full control over which events are sent, independent of GA4, and works even if GA4 is not used.

For more details, check the [Commanders Act GTM template documentation](https://doc.commandersact.com/features/sources/sources-catalog/web/gtm).
{% endhint %}

## Step 1: Create a GTM Source in Commanders Act

1. Log in to **Commanders Act**.
2. Go to the **Sources** section and create a new **Google Tag Manager** source.\
   ![](/files/SWJxN4J6uUR1hUFWouiR)
3. **Copy the Source Token** displayed.

<figure><img src="/files/3ZzFSpBY0si0oH8NLUfj" alt=""><figcaption></figcaption></figure>

## Step 2: Update GA4 in Google Tag Manager

1. Open your **GTM** workspace.
2. Find your **GA4 Configuration Tag**.
3. In the **Tag Configuration** window, under **Fields to Set**, add a new field with the following values:

   * Field Name: `server_container_url`
   * Value:

     ```bash
     https://collect.commander1.com/events?tc_s={siteId}&token={sourceKey}&&ga_url_param=
     ```

   Replace:

   * **{siteId}**: Your Commanders Act site ID.
   * **{sourceKey}**: The Source Token from Commanders Act.

**Note:** This URL uses Commanders Act’s default domain (`commander1.com`) to get you up and running quickly. For better data quality, it’s strongly recommended to use your own custom domain (see Step 3).

<figure><img src="/files/27PyEOnVqHlE4iePMKBZ" alt=""><figcaption></figcaption></figure>

4. **Save** and **Publish** your changes in GTM.

## Step 3: Set Up Domain Delegation for First-Party Data Collection

For enhanced data accuracy and first-party tracking, we recommend setting up a custom domain through **domain delegation**. This ensures the data is collected and processed as first-party, improving tracking reliability and compliance with privacy regulations.

#### How to Set Up Domain Delegation:

1. Go to the **Domain Management** section of Commanders Act (find detailed instructions [here](/configure/administration/domain-management)) and follow the steps to configure a custom subdomain such as <https://collect.yourdomain.com>
2. In GTM, update `server_container_url`with your subdomain url such as:

   ```bash
   https://collect.yourdomain.com/events?tc_s={siteId}&token={sourceKey}&&ga_url_param=
   ```

   Replace `collect.yourdomain.com` with your own subdomain.

Using a custom domain not only improves tracking precision but also helps ensure better compliance with browser and privacy policies.

### Step 4: Event Forwarding to Multiple Destinations

Once GA4 events are sent to Commanders Act, they can be forwarded to various destinations, such as: Facebook CAPI, Google Enhanced Conversion, Bing Ads, TikTok, Awin, ... And many more through the Commanders Act plug\&play destinations catalog.

## Going Further: Bypassing Ad-Blockers with GTM Script Proxification

For users looking to optimize server-side tracking, Commanders Act provides also an option to **proxify the GTM JavaScript file** to bypass ad-blockers. This solution ensures that consented data can still flow to your analytics tools or partners without being unfairly blocked by ad-blockers that might indiscriminately block GTM scripts, even when used responsibly.

#### How It Works:

* Instead of using the default GTM URL (e.g., `https://www.googletagmanager.com/gtm.js?id=XXX`), the script is served from your own domain (e.g., `https://track.yourdomain.com/custompath.js`) with a unique path modifier to avoid detection by ad-blockers.
* This process helps ensure that **only user-consented data** is collected and forwarded, in strict compliance with privacy regulations such as GDPR.

#### A Privacy-Respectful Approach:

Our server-side infrastructure is designed with **privacy, consent, and user control** at its core. By proxifying the GTM script, you're simply ensuring that **consented data** can be processed and sent to trusted tools and partners, in line with the user’s preferences. This aligns with best practices in privacy and GDPR compliance, ensuring that ad-blockers do not unfairly interrupt responsible data flows.

If you're interested in setting this up, please **contact your account manager** for more information.


# OneTag Tutorial

Sending an event from a [web container](/features/sources/sources-catalog/web/containers) is as easy as adding a tag : the OneTag.

{% hint style="info" %}
If you haven’t already, you should read the [platform explanations](/getting-started/concepts)!
{% endhint %}

## 1. Add the OneTag from the tag library

From your web container, add a tag from the tag library, searching **Commanders Act OneTag**

You will find 2 tags to choose from :

1. The ***OneTag - Builder***: it will guide you without having to write code
2. The ***OneTag - Custom**:* for those who prefer to manually write complex event data using javascript

<figure><img src="/files/xeldMicZWemHOjjmYQWQ" alt=""><figcaption></figcaption></figure>

## 2. Setup the tag

If you choose the *builder* version of the tag, you can go to the next step, you just have to follow the instructions.\
If you choose the *custom* one, here is how it works:\
\
The `cact('trigger')` function is what allows you to record any actions your users perform, along with any properties that describe the action.\
Each action is known as an [event](/getting-started/concepts#event).

Here’s the format of a typical `trigger` call:

<pre class="language-javascript"><code class="lang-javascript"><strong>cact('trigger', '&#x3C;event_name>', {&#x3C;event_data>}, [config], [callback]);
</strong></code></pre>

Each event has a name, like **page\_view**, and properties. For example, a **page\_view** event might have properties like `page_name` or `page_type`.

Here is an example

```javascript
cact('trigger','page_view', {
  page_type: 'product_list',
  page_name: 'Best sellers', 
  //...
});
```

{% hint style="info" %}
`config` and `callback` parameters are optional
{% endhint %}

### Standard events and custom events

You can implement two types of events:

* **Recommended** [***standard events***](/developers/tracking-and-integrations/tracking/events-reference) are events that you implement yourself, but that have Commanders Act-predefined names and parameters.

{% hint style="warning" %}
**We strongly recommend the use of standard events**, as it allows you to benefit from plug\&play features, automatic-mapping, automatic-QA-alerting, etc. but also future features/reporting.
{% endhint %}

* ***Custom events*** are events that you name and implement yourself. Before implementing a custom event, check that there is not a [recommended event](/developers/tracking-and-integrations/tracking/events-reference) that already provides what you need. With custom events, best practice is to use recommended properties that you can find in our [event references](/developers/tracking-and-integrations/tracking/events-reference) (ex: revenue, currency, ...) beside your custom properties.

{% hint style="info" %}
Inside a standard events, you can add custom properties beside standard properties
{% endhint %}

{% hint style="info" %}
Inside custom events, it is recommanded to put standard properties. Of course, custom properties can also be added
{% endhint %}

### User Consent in each events

If you use Commanders Act CMP, the user consent is automatically retrieved and **put inside all events** in the `user` property.

If you use another CMP, you will have to add manually a property `consent_categories` inside a `user` property, following this example :

```javascript
cact('trigger','sign_up', {
  method: 'email', 
  user: {
      consent_categories: [1,3,4,6]
  }
});
```

`consent_categories` is the user's consents list and is mandatory to manage consents in each destinations (aka server-side consent) See [how work server-side consent management](#how-work-server-side-consent-management).

### Advanced options: Overriding default parameters

There are 3 default parameters that you can override if needed:

* `collectionDomain`: if not set, the default value correspond to your first party domain (if you setup one) or `collect.commander1.com`
* `sourceKey`: if not set, the default value is the [source key](/features/sources#source-key) of the currently running web container.
* `siteId` : if not set, the default value is the site id of the last web container loaded (`tC.id_site`)

To override a parameter, you can add a config object to your cact('trigger') function (4th parameter) like this:

```javascript
cact('trigger', 'purchase', {   id:'1234',  currency: 'EUR',  //...},{
    collectionDomain: "my.firstdomain.com",
    siteId: "1234",
    sourceKey: "abcd"
});
```

You can also set globally these parameters for all triggered events with the `cact('config')` method. See the [Javascript API documentation](/features/sources/sources-catalog/web/js-sdk) for more information.

## 3. Check that everything is working

After configuring your OneTag (at lease one event triggered) and deploying your web container, you can refer to the [Event Inspector](/features/sources/live-event-inspector) tab for the Source to verify that it generates the expected event data.

The Source Event Inspector serves as a live tool that aids in validating the arrival of events originating from your website, mobile application, or servers to your Commanders Act Source. This enables you to promptly examine the reception of calls by your source and troubleshoot without the need to await data processing.

<figure><img src="/files/PcXdb9HvrBOL2s97D7Eb" alt="" width="563"><figcaption></figcaption></figure>

## 4. Setup your first destination

Once you have verified the inflow of data from your fresh source, it's the perfect moment to create your first destination:

* Navigate to your Commanders Act platform, click on Destinations-> Overview, and select 'Add Destination' to list all the available destinations in the catalog.
* Look for the destination of your preference. For example Facebook Conversion API.
* Click on the card representing the destination to obtain more information about it.
* Initiate the configuration by clicking on 'Configure'
* Choose the source that you had previously setup, or select all sources.
* In the settings screen, name your destination, choose an environment and enter required information.
* Then in the filter tab, manage the user consent by selecting the appropriate consent categories for that destination (for example "Advertising" category for Facebook CAPI)
* Save and go checking that everything is going well in the Event Delivery and/or Event Inspector tab, or directly in your tool.

## FAQ

### How work server-side consent management

When you add a destination (aka serverside tag), you manage the user consent by selecting the appropriate consent categories for that destination (for example "Advertising" category for Facebook CAPI).\
\
As a result, since each event entering the platform contains information about the user's consent, **the event will only be sent to the destination if there is a match between the categories consented by the user and the consent's category associated to the destination.**

<figure><img src="/files/fTfIoqnCTKFZa3Juf5bX" alt=""><figcaption></figcaption></figure>


# Migration guides to the Platform X

How to migrate from the old platform (v7) to the new platform (Platform X)

1. [How to send data from my web container ?](/getting-started/integrating-your-data/onetag-tutorial)
2. [How to migrate from the serverside v1 (server to server) ?](/getting-started/integrating-your-data/migration-guides-to-the-platform-x/migrate-from-ssv1-to-ssv2)
3. [How to migrate my mobile app data collection ?](/getting-started/integrating-your-data/migration-guides-to-the-platform-x/migrate-from-old-mobile-sdk)


# Migrate from SSv1 to SSv2

Migration from the serverside v1 feature (platform 7 to platform X)

## Serverside v1 to Serverside v2

Severside v1 (aka SSv1) is the serverside tag management feature of the old platform (v7). It is now deprecated.\
In this section, we'll see how to migrate from a SSv1 setup to the new platform (aka SSv2)

## Tree steps to migrate

1. [Send data to serverside v2](/getting-started/integrating-your-data/migration-guides-to-the-platform-x/migrate-from-ssv1-to-ssv2/send-data-to-serverside-v2) (aka Platform X)
2. [Check your data quality](/features/sources/source-data-quality)
3. [Add your first destination](/features/destinations)


# Send data to serverside v2

## 1. New concepts

On the new platform (aka Platform X), everything is Source/Event/Destination.\
\
[Sources](#source) (your website, app or server) collect your user actions by sending [events](#event).\
These events are sent to the platform servers and are then enriched, normalized and translated in each tool ([Destination](#destinations)) format, so that they can be sent to your chosen destinations.\
\
You can learn more in the [Concepts ](/getting-started/concepts)section.

## 2.How to send events (standard / custom)

* From a **server**, use our [HTTP tracking API](/features/sources/sources-catalog/server/http-tracking-api).

{% hint style="info" %}
Your data has to be sent to a [new url](/features/sources/sources-catalog/server/http-tracking-api#track), following a [new format](#3.-format-events).
{% endhint %}

* From a **mobile application**, you can either use one of our SDK ([Android](/features/sources/sources-catalog/mobile-app/android), [IOS](/features/sources/sources-catalog/mobile-app/ios), ...) or use our [HTTP tracking API](https://community.commandersact.com/platform-x/features/integrations/sources/sources-catalog/http-tracking-api) if you don't want to use a SDK.

## 3. Format events

* Events are the new format of your data. As explain in the [event documentation](/developers/tracking-and-integrations/tracking/about-events), common events have to be sent in the **standard format** (name and properties) to benefit from plug\&play features.

{% hint style="info" %}
For specific events, **custom events** name is possible. Nevertheless, please use **standard properties** in custom events, as far as possible, to benefit from automatic mapping, automatic QA, and plug\&play features.
{% endhint %}

* Standard event format can be found in our [event reference documentation](https://community.commandersact.com/platform-x/developers/tracking/events-reference)
* Go through this [**example,** ](/getting-started/integrating-your-data/migration-guides-to-the-platform-x/migrate-from-ssv1-to-ssv2/send-data-to-serverside-v2/purchase-event-example-ssv1-to-ssv2)**based on the ssv1 format** : [purchase event example](/getting-started/integrating-your-data/migration-guides-to-the-platform-x/migrate-from-ssv1-to-ssv2/send-data-to-serverside-v2/purchase-event-example-ssv1-to-ssv2)


# Purchase event example (ssv1 to ssv2)

Here are an example of a serverside v1 hit :\
\
Booking Confirmation :

```json
{
    "method": "GET",
    "event_page_name_detailed": "page.Checkout.Confirmation",
    "booking_order_number": 9179124954957,
    "product_list_pricing_price_base_amount": 295.82,
    "product_list_pricing_currency_displayed": "USD",
    "event_page_funnel_location": 70,
    "point_of_sale_eg_brand_name": "magicOne",
    "event_page_p_line": "F",
    "privacy_ccpa_consent": true,
    "privacy_gdpr_consent": true,
    "product_list_product_id_1": 4521812,
    "product_list_product_name_1": "Luggage compartment",
    "product_list_product_id_2": 5721913,
    "product_list_product_name_1": "Lifeline",
    "request_request_url": "https://www.domain.com/Checkout/V1/MultiItemBookingConfirmation",
    "user_sha256_email_address": "4a0a303e33c11f496a9312a77309133325af1527a26d9d95cf74b81feba9c955",
    "facebook_fbp":"fb.1.1596403881668.1116446470",
    "device_information_user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62",
    "timestamp": "11/01/2022 14:32",
 
}
```

It should be sent to the serverside v2 in this format (adding maximum of recommanded properties) :

```json
{
    "event_name": "purchase",
    "properties": {
        "id": 9179124954957,
        "revenue":295.82,
        "value": 300.00,
        "currency": "USD",
        "point_of_sale_eg_brand_name": "magicOne",
        "p_line": "F",
        "items": [
            { 
             "discount":1.99,
             "quantity": 2,
             "product":{ "id":"4521812", "name":"Luggage compartment"}
            },
            {
             "discount":1.99,
             "quantity": 1, 
             "product":{ "id":"5721913", "name":"Lifeline"}
             }
        ],
        "user": {
            "id": "61be2261-8701-4b4d-af97-60ea4329c7aa",
            "email_sha256": "4a0a303e33c11f496a9312a77309133325af1527a26d9d95cf74b81feba9c955",
            "consent_categories": [
                1,
                2,
                3
            ]
        }
    },
    "page": {
        "location": "https://www.domain.com/Checkout/V1/MultiItemBookingConfirmation",
        "title" : "page.Hotels.Checkout.Confirmation",
    },
    "device": {
        "user_agent": "Mozilla/5.0 (X11; CrOS x86_64 14268.67.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.111 Safari/537.36",
        "cookie": "_fbp=fb.1.1596403881668.1116446470;_fbc=fb.1.233356.5656565;"
    },
    "event_timestamp": 1641907920000
}
```

### Standard parameters :

{% hint style="warning" %}
Other standard recommanded parameters should be added to the purchase event, following the [purchase event documentation](https://community.commandersact.com/platform-x/developers/tracking/events-reference#purchase)
{% endhint %}

{% hint style="info" %}
Cookies should be sent through the`device.cookie`parameter.\
For example, if you use Facebook CAPI, you'll have to send *\_fbp and \_fbc* cookies
{% endhint %}

{% hint style="warning" %}
RGPD: User **consents have to be sent in each events**, inside the `user.consent_categories` parameter
{% endhint %}


# Migrate from old mobile sdk

How to migrate to the old platform sdk (Platform 7) to the new platform (Platform X)

To track mobile app on the new platform, you can either install our new SDK ([Android](/features/sources/sources-catalog/mobile-app/android) and [iOS](/features/sources/sources-catalog/mobile-app/ios)) or use our [HTTP tracking API](https://community.commandersact.com/platform-x/features/integrations/sources/sources-catalog/http-tracking-api).

## Steps to follow for migration from SDK v4 to SDK v5

### Create your Mobile Source(s)

In the Sources Catalog, create your new Sources.\
`Sources > Overview > Add Source`

<figure><img src="/files/tAneVVCu1IsOCUxmmn0P" alt=""><figcaption></figcaption></figure>

At the last step of the Source setup, you will obtain a Source Key, required for the initialization methods of our SDK

<figure><img src="/files/95dowsIRIBLIU3Jvro5J" alt=""><figcaption></figcaption></figure>

### Replace SDK Modules

Our SDK files have changed. You must replace the old ones. Get our latest versions :

Android : <https://github.com/CommandersAct/AndroidV5#latest-available-versions>\
iOS : [https://github.com/CommandersAct/iOSV5#latest-available-versions](https://github.com/CommandersAct/iosV5#latest-available-versions)

{% hint style="info" %}
Some names of our modules have also evolved, here are their correspondences :

TCSDK -> TCServerSide

TCPrivacy -> TCConsent
{% endhint %}

### Modify initialization methods

The way you initialize our SDK is now different, your old methods will not be recognized anymore.

* You don't need container ID anymore, all is on the same site ID. Instead of a container ID you'll need a specific key to define the source.
* You don't need to put any TCServerSide instance in your Consent implementation anymore.
* You might need to use the TCUser class to forward relevant information about your users.

{% hint style="info" %}
There’s a code example you can check here:

[https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide#example\
https://github.com/CommandersAct/iosV5/tree/master/TCServerSide#example](https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide#examplehttps://github.com/CommandersAct/iosV5/tree/master/TCServerSide#example)
{% endhint %}

{% hint style="success" %}
If your mobile app use our SDK modules only for Privacy your migration is done at this point.

\
If you want to benefit of all the advantages of tracking with server-side destinations, or if you were using server-side v1 containers to send data to your partners, please follow the next steps!
{% endhint %}

### Replace container calls by events

With the old platform, you were used to send a container call, with all the variables. It's not compatible anymore.\
Instead, you have to send events with properties.

Here’s a code example of how to execute an event:

```swift
let event = TCPageViewEvent(type: "product list")
	event?.pageName = "Best sellers"
	serverside?.execute(event)
```

{% hint style="info" %}
You can have a look on all events code's examples [here](https://doc.commandersact.com/developers/tracking/events-reference)\
For more information about events specificity, please refer to [this page](https://doc.commandersact.com/developers/tracking/about-events/mobile-sdk-event-specificity#fields-details) of our documentation.
{% endhint %}

For technical documentation about how integrating events, please visit to our GitHub:\
<https://github.com/CommandersAct/iOSV5/tree/master/TCServerSide#executing-events>\
<https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide#executing-an-event>

### Upgrade your data layer

The new platform is using standard properties, so we recommend to upgrade your mobile application’s data layer by using our standard properties as much as possible

### Create your destinations

You can now use our platform to [create new destinations](https://doc.commandersact.com/features/destinations/add-destination) and send data to your partners

### Test & validation

A Quality Assurance Test & validation is strongly recommended before launch in production ! Here’s a few references to help you on this point:

* Testing => tips how to test

  [https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide#testing](https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide)

  [https://github.com/CommandersAct/iosV5/tree/master/TCServerSide#testing](https://github.com/CommandersAct/iosV5/tree/master/TCServerSide)
* Debugging => list of methods to display logs in your app\
  [https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide#debugging](https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide)\
  [https://github.com/CommandersAct/iosV5/tree/master/TCServerSide#debugging](https://github.com/CommandersAct/iosV5/tree/master/TCServerSide)
* Common errors list

  [https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide#common-errors](https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide)

  [https://github.com/CommandersAct/iosV5/tree/master/TCServerSide#common-errors](https://github.com/CommandersAct/iosV5/tree/master/TCServerSide)

{% hint style="success" %}
Your migration is done !

Maybe you have some specific needs ? Don’t forget to check the following FAQ
{% endhint %}

## FAQ

### Should my data layer be identical for my website & my app ?

It’s a good practice !\
We strongly recommend to have the same data layer for web & mobile application\
Main benefit: setup only 1 destination for both sources!\
Your destination’s setup will be recognized by web and mobile

### How can I obtain the IDFA/AAID ?

Our SDK doesn’t collect automatically the IDFA/AAID anymore, but we offer a simple method to track this information:

[Android](https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide#getting-aaid) `ServerSideInstance.addAdvertisingIDs());`\
[iOS](https://github.com/CommandersAct/iosV5/tree/master/TCServerSide#getting-idfa) `[ServerSideInstance addAdvertisingIDs];`

### Can I create custom events ?

Yes it’s possible !

For further information, have a look to this part of our documentation:\
[https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide#custom-events](https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide)\
[https://github.com/CommandersAct/iosV5/tree/master/TCServerSide#custom-events](https://github.com/CommandersAct/iosV5/tree/master/TCServerSide)

### Can I use additional parameters ?

Yes it’s possible ! If you need to send more data then just the required properties, simply use the "additional property" method, as follow:

[Android example:](https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide#customising-events)

```
TCPageViewEvent pageViewEvent = new TCPageViewEvent("Consent");
pageViewEvent.pageName = "Configuration";
pageViewEvent.addAdditionalProperty("currentConsent", "refused");
```

[iOS example:](https://github.com/CommandersAct/iosV5/tree/master/TCServerSide#customising-events)

```
TCPageViewEvent *pageViewEvent = [[TCPageViewEvent alloc] initWithType: @"Consent"];
pageViewEvent.pageName = @"Configuration";
[pageViewEvent addAdditionalProperty: @"currentConsent" withStringValue: @"refused"];
```

### Can I add Persisting variables ?

Yes it’s possible !

If you need to set a persistent variable, please refer to this doc:\
[https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide#persisting-variables](https://github.com/CommandersAct/AndroidV5/tree/master/TCServerSide)[https://github.com/CommandersAct/iosV5/tree/master/TCServerSide#persisting-variables](https://github.com/CommandersAct/iosV5/tree/master/TCServerSide)

{% hint style="info" %}
Persisting variable’s definition: it’s a key/value which will remains the same as long as the app is opened\
(example : Google account ID)
{% endhint %}

### Do I need to change/update my Json file ?

It’s not required !\
Your current json is still valid for our new SDK

### Do I need to change/update my callbacks for consent statistics ?

It’s not required !\
Your current setup is still valid for our new SDK


# Sources

Check out the [Sources catalog](/features/sources/sources-catalog) if you merely want to look at the Commanders Act sources and how each is implemented.

## Sources vs Destinations <a href="#sources-vs-destinations" id="sources-vs-destinations"></a>

The platform has [Sources](/features/sources) and [Destinations](/features/destinations). Sources send data *into* the platform, while Destinations receive data *from* the platform.

{% hint style="info" %}
A source is an emitter of events, more information [here](/getting-started/concepts#source).
{% endhint %}

## Source key

The source key is a unique identifier for each Source. It allows Commanders Act to identify which Source is transmitting the data and which destinations should be the recipients of that data. It is also employed to deactivate a source when necessary.

To locate a source key, you initially need to have or create a source like a website, server, or mobile source.

Next, within the Source, navigate to “Settings", and then proceed to “source key".


# Sources Overview

## What is a source ?

A source is an emitter of events, more information [here](/getting-started/concepts#source).

## Source list

In *Sources / Overview*, you will find the full list of sources already configured.

You can search a source by name and filter on environment (production, staging, ...), status (active or inactive) and per destination

You can easily edit a source by clicking its name or the pencil icon.

{% hint style="info" %}
**Web containers** are special client-side sources, when editing them you will be redirected to dedicated interfaces
{% endhint %}

![](/files/FLJbEDG8rUcTxZM3orx3)

## Trend and data quality

The trend represents the evolution of number of events received on the last month.

The data quality indicator allows to quickly visualize the status of the source, if data are of good quality (<img src="/files/ydgoDrHpISakJWJxtLd1" alt="" data-size="line">) or not (<img src="/files/hz50j2umynd8tYaK5oA0" alt="" data-size="line">) on the last hour.

The quality score of events is represented by a weather icon:

* <img src="/files/ydgoDrHpISakJWJxtLd1" alt="" data-size="line">sunny if the percent of correct events is equal to 100%
* <img src="/files/jDuGSX6yLehApk4GZuLW" alt="" data-size="line">cloudy between 95% and 99.99%
* <img src="/files/oT4gfkjrm5BBX6A1exLr" alt="" data-size="line">rainy between 90 and 95%
* <img src="/files/hz50j2umynd8tYaK5oA0" alt="" data-size="line">stormy below 90%


# Sources Catalog

Find on this page a full list of sources you can use to gather infomation on your traffic. Sources are sorted per categories (Web, Mobile, Push notification, CRM, etc).

You can use the search bar to find the source you are looking for. Cannot find the source you want? Fill our request form to ask our team to add a new source to the list.

All requested sources are viewable by clicking the “Request” tab on the left.

To have more information on a source simply click on it and you'll get all details to use and install the souce.

![](/files/PRF1o4MxsAKrqQKO9QNK)


# Web


# Web container

The container associated with a Tag Manager account.

A web container is the browser-side component of *Commanders Act* Enterprise Tag Management system.\
It is composed of a set of browser-side tags, rules, triggers and enriched web data layer. It is represented by a container javascript file that is put on each pages of your website.\
For information about how users setup and maintain containers, see the [dedicated Web container guide](https://community.commandersact.com/web-container/).

## Connect serverside destinations to a web container <a href="#onetag" id="onetag"></a>

Sending data from your web container to serverside destinations offers a lot of advantages (web performance, security, data accuracy/quality, etc.)

To start sending data, there is only one easy step to follow : [adding the *Commanders Act* **One Tag**](/getting-started/integrating-your-data/onetag-tutorial).

> The last tag that you will ever setup.

The *One Tag* allows you to send all your events to the Commanders Act platform in a normalized way, and once and for all, to benefit from all the serverside advantages that offer the platform.

## Recommandations for setup

In order to take advantage of all the benefits offered by a Web container, it is essential to [implement a datalayer](/features/sources/sources-catalog/web/containers/setup-guides-for-developers/datalayer-setup) on every page of your website.

Moreover, the [implementation of events](/features/sources/sources-catalog/web/containers/setup-guides-for-developers/browser-side-events-setup) on your site will allow you to obtain a more powerful and better quality tracking

{% hint style="info" %}
Please note : the following section concerns standard html implementation.\
If you're using a specific technology, don't hesitate to refer to our dedicated githubs to obtain our wrappers

[Angular](https://github.com/CommandersAct/angular-tag-commander)

[Vue js](https://github.com/CommandersAct/vue-tag-commander)

[React](https://github.com/CommandersAct/react-tag-commander)

[Ngx](https://github.com/CommandersAct/ngx-tag-commander)
{% endhint %}

## Extensions

It is possible to extend Commanders Act TMS with additional modules:

| Module             | Description                                                        | Type        |
| ------------------ | ------------------------------------------------------------------ | ----------- |
| **TagPerformance** | A tool to measure onsite performance of Tags.                      | Client-Side |
| **Deduplication**  | A tool to selectively attribute conversions to marketing channels. | Client-Side |
| **TagFirewall**    | A tool to black- or whitelist Tags.                                | Client-Side |

{% hint style="info" %}
These modules are set up and configured by a Commanders Act consultant.
{% endhint %}


# User guides for browser-side platform


# Container

The browser-side **container** is a “box” containing all your partner solutions’ tags. Thus, tags that were formerly placed in your site’s source code are now all concentrated and managed in the same place – the container – for more **effective control** and **faster deployment**.

<figure><img src="/files/367rY3gLw9GsZUKRmjKT" alt=""><figcaption></figcaption></figure>

Note: in order to satisfy operational and organisational requirements or solve performance issues, you may have to use **multiple containers** for your site.


# Hosting

### Hosting types

We offer two ways for your container's hosting:

* Via our **CDN** (Content Delivery Network): provides you a total autonomous deployment. Our CDN is having a 99.9% of SLA\
  It's compatible with First Party hosting, please read [this page](/configure/administration/domain-management/cdn-1st) for further info!
* Via your site’s **web servers**, managed by your IT department or outside technical provider. With this hosting option, you can choose a **synchronization method** (automatic or manual) for transmitting the modifications made for your site in the Commanders Act interface.\
  \
  In all cases : for a new workspace, you will be must to configure the connector on the platform. Use the menu Administration => Connector Credentials to add a new connector

<figure><img src="/files/ukSh5kCAe7MbB6Nda9hp" alt=""><figcaption></figcaption></figure>

### FTP connector configuration

Simply fill in all fields of the form:\
**Name:** Give an explicit name to your connector\
**Containers:** Select any client-side containers you want to associate with the connector\
**Protocol:** Select the type of File Transfer Protocol you need. We recommend to using SFTP, for security reasons\
**Host:** Enter the main domain or IP address of your FTP repository\
**Port:** Enter your standard port ID (SFTP is 22, FTP is 21, FTPS is 21...)\
**Path:** Enter the path of your repository. Should end with a "/" (see below example)\
**User:** Login to access of your FTP\
**Password/Key:** if there's a password or a key associated to your FTP, enter this information here

<figure><img src="/files/kRxyI5KoNVqGKJ5r96Gf" alt="" width="563"><figcaption></figcaption></figure>

### CDN connector configuration

It's almost identical to the FTP connector, there is only 2 more steps:\
Select a CDN vendor (EdgeCast or Akamai)\
Setup the "Purge" part (use the Account ID, Token and Purge URL provided by your CDN vendor)

<figure><img src="/files/vMdlZ29dVPMnN9xA5Vq7" alt="" width="509"><figcaption></figcaption></figure>

### URL connector configuration

Just give an explicit name, enter the correct URL and select any client-side container(s) you want to associate with the connector

<figure><img src="/files/16NKSWciKx6h3IDyUmS3" alt="" width="539"><figcaption></figcaption></figure>

### Amazon S3 connector configuration

It's almost identical to the FTP connector. However, it requires a bucket as the host:

<figure><img src="/files/5SnuqxoQJwyDYHhKFMKJ" alt=""><figcaption></figcaption></figure>

### Google Cloud Storage connector configuration

fill in all fields of the form:\
**Name:** Give an explicit name to your connector\
**Bucket:** Enter the main domain or IP address of your FTP repository\
**Path:** Enter the path of your repository. Should end with a "/" (see below example)\
**Project ID:** Enter the id of the project in Google Cloud Storage. Can be found in Google Cloud JSON Key file\
**Private key ID:** Enter your private RSA Key Id for Google Cloud Services. Can be found in Google Cloud JSON Key file\
**Private key:** Enter the password associated to your Private Key ID. Still can be found in Google Cloud JSON Key file\
**Google Account Email:** Enter the client Google Cloud Services email used for authentication. You can find it in Google Cloud JSON Key file\
**Client Id:** Enter the client Google Cloud Services Id. Still can be found in Google Cloud JSON Key file\
**Client X509 Cert URL:** Enter the client custom X509 URL for Google Cloud Services. Can be found in Google Cloud JSON Key file\\

<figure><img src="/files/W73mUqjGvENy3SI9rlLx" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
The Private Key field must include the comments 'BEGIN PRIVATE KEY' and 'END PRIVATE KEY'\
\
All the characters "`\n"` present in the Private Key must be replaced by "enter" (jump line)
{% endhint %}

```
//example for the private key:

-----BEGIN PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxp
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy0
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzA
aaaaaaaaaaaaaaaaaaaaaaa=
-----END PRIVATE KEY-----
```

### Bing Ads connector configuration

Simply follow the step by step guide provided by Bing:

<figure><img src="/files/uuvVP957sj3pcpGcqo3C" alt="" width="311"><figcaption></figcaption></figure>

### Facebook Ads connector configuration

Simply follow the step by step guide provided by Facebook:

<figure><img src="/files/bfFERC9nItNWseG092SQ" alt="" width="392"><figcaption></figcaption></figure>

### Criteo connector configuration

Simply follow the step by step guide provided by Criteo:

<figure><img src="/files/40aoe4SrP1WbLluHo3lb" alt="" width="326"><figcaption></figcaption></figure>

### Google Ads connector configuration

Simply follow the step by step guide provided by Google Ads:

<figure><img src="/files/jU4a0WBF4ZoDkZKO3cvx" alt="" width="407"><figcaption></figcaption></figure>

###

{% hint style="info" %}
Please note! Deletion of this connector credential is final. By removing access to a login, you will no longer be able to use it for this or any other site. This means you'll have to create a new one if you need it in the future.

If destinations from other sites use this identifier, they too will no longer work.

In case this login is currently used by at least one destination, our interface will display a list of the concerned destination(s) (only for the current site, it may affect some destinations on other sites)
{% endhint %}

### Snapchat connector configuration

Simply follow the step by step guide provided by Snapchat:

<figure><img src="/files/Ilm9WcymPW3kF92z7bYJ" alt="" width="343"><figcaption></figcaption></figure>

### Adobe Analytics connector configuration

Simply follow the step by step guide provided by Adobe:\
For more information, please refer to the [dedicated page](/features/destinations/destinations-catalog/adobe/adobe-analytics)

<figure><img src="/files/iQw85EC76uc5Dt51vQWy" alt="" width="415"><figcaption></figcaption></figure>

### Equativ connector configuration

Simply follow the step by step guide provided by Equativ:

<figure><img src="/files/s0n318fn1f5db30fnSFL" alt="" width="340"><figcaption></figcaption></figure>

### Test & Debug

Once your connector configuration is done, you can click on the Test button to check that it's working properly.\
If it is correct, then you will see the following message:

<figure><img src="/files/ZPSLqyb91IXQY9UA3dcy" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Common errors:\\

* your directory is not writable
* mistake on host/port/path
* Insufficient space
* Network outage = server/ or network problem
  {% endhint %}


# Creation and modification

To create/add a container, go to the “**Web Containers**” tab on the platform and click “**ADD CONTAINER**”:

<figure><img src="/files/LW9eyi3YvsrKNFcNUDUg" alt=""><figcaption></figcaption></figure>

A configuration window will appear with 3 main tabs:

* “[**General**](#general)“: to manage basic container options, such as naming your container
* “[**Synchronization**](#synchronization)“: to manage container updating options
* “[**Advanced**](#advanced)“: to manage advanced container options

After configuring the various container options, click “Add”

### **General**

<figure><img src="/files/21fOFBygZMiQL3a5AwHM" alt=""><figcaption></figcaption></figure>

Simply fill the “**Name**“ field with Container’s wanted name

### **Synchronization**

<figure><img src="/files/qkvBfqgYSLAVpOYEdQpi" alt=""><figcaption></figcaption></figure>

Mode: Synchronization modes for the container:

* **FTP/CDN**: This mode hosts the container on an FTP or CDN server (the server must be previously configured in Administration => Connector Credentials). By clicking this option, the “**Set as deployed and send to FTP**” synchronization mode will be proposed in the “**DEPLOY**” step.
* **Amazon S3**: This mode hosts the container on an FTP or CDN server (the server must be previously configured in Administration => Connector Credentials). By clicking this option, the “**Set as deployed and send to AWS**” synchronization mode will be proposed in the “**DEPLOY**” step.
* **Update by batch from permanent link**: this mode activates a permanent link to the last container version deployed. This mode can be useful when manually updating the container on your site or if you use a batch that regularly restores the last container version on the site. By clicking this option, the “**Set as deployed and use external URL**” synchronization mode will be proposed in the “**DEPLOY**” step.
* **Custom URL**: this mode calls a URL when deploying the container (the URL must be previously configured in Administration => Connector Credentials). This URL refers to a script placed on your servers (created by you) that must perform the operations necessary to launch the container. By clicking this option, the “**Set as deployed and call the URL**” synchronization mode will be proposed in the “**DEPLOY**” step.
* **Manual**: this mode allows you to load the container directly from the interface so that you can then deploy it manually on your site. You can check the “**Add unminified version**” function in order to load the container in either compressed (minified) or uncompressed (unminified) mode. By clicking this option, the “**Set as deployed and get JavaScript file**” synchronization mode will be proposed in the “**DEPLOY**” step.
* **Send an email**: this deployment mode complements the other 4 modes. It is used to send a notification email to specified users when a deployment is carried out.

Recurring synchronization:

Recurring synchronization is used to automatically deploy a container on a regular basis via the deployment mode desired (FTP, batch or send by email).

Two programming modes are available: Simplified mode and expert mode:

* “Simplified mode”: Simplified mode is used to program recurring synchronization by the day and hour (e.g. recurring synchronization every day at 2 p.m.).
* “Expert mode”: Expert mode is used to program recurring synchronization with more precision, by minute, hour, day, week and month (e.g. recurring synchronization every two weeks of the month on Tuesdays at 11:35 a.m.).

<figure><img src="/files/fO5VUx7cWEbNqMkjLkrt" alt=""><figcaption></figcaption></figure>

### **Advanced**

<figure><img src="/files/uq3ffCdH7Nr7SncNEhJ2" alt=""><figcaption></figcaption></figure>

**NoScript support**: This option is used to create a noscript version of the container that allows both the container and its tags to execute for users without JavaScript activated on their browser.

You can also define a JavaScript version and noscript version for each tag.

**Verification by MD5 file:** This option is linked to the “Manual” deployment mode and associates an MD5 code with a container version in either compressed (minified) or uncompressed (unminified) mode in order to verify the integrity of the container before putting it into production. It does this by comparing TagCommander’s MD5 code with the MD5 code calculated by your technical team upon receiving the container.

**Include jQuery (at the test step):** This option allows you to include the JavaScript jQuery library in the test step so that you won’t have any errors linked to its absence if it is indeed present on your site.

**Display block for old tc\_event function:** This option allows to show/ hide the old TagCommander event section. It is hidden per default.

**Default expiration date:** This option allows you to set a default expiration date for all the tags to be added to the container (in this case, the tags will be deactivated). If necessary, it also allows you to send an expiration report to selected users when a tag expires (the report is sent 2 weeks and 1 week before the tags expire).

**Container default trigger:** Container Load is the value by default, you can modify it if needed

**Linked sub-domain(s) for Phoenix:** Enter your sub-domains for Phoenix, which enables you to persist 1st party cookies for longer durations to reduce the impact of ITP on your website and business.

**Force Cookie SameSite setting:** all cookies created through the container will get the SameSite parameter

**Force Cookie Secure setting:** all cookies created through the container will get the Secure parameter

\*Note: this setup can be modified at any time.\
Simply click the 'parameter' icon:\\

<figure><img src="/files/TNzx7BFdPAZ8Z8R0jh4F" alt=""><figcaption></figcaption></figure>


# Generation

For more information about the generation step, please refer to the Generation Page of the section Tags


# Testing

The “**TEST**” step seeks to prevent problems in production by testing the version of a container and diagnosing its compatibility and reliability.

At first, it will block deployment of the faulty container, but you can ignore some of the errors found, such as those resulting from incompatible JavaScript elements with old versions of browsers (IE8 for example).

A total of 8 browsers/OS are tested:

* The latest version of Edge
* The latest version of Chrome
* The latest version of Firefox
* The latest version of Opera
* The latest version of Safari (for the Mac OS)
* The latest version of Safari (for tablets)
* The latest version of Android (for tablets)

Tests are performed on five levels:

* Container: The container’s code (the JavaScript file) is tested globally
* Data layer: The data layer (internal and external variables, etc.) is tested in isolation
* Custom JS blocks: The static and dynamic JavaScript files are tested in isolation
* Tags: All tags are tested, and errors are displayed by tag
* Events: All events are tested, and errors are displayed by event

If no errors are detected, your version is “**DEPLOYABLE”**:

<figure><img src="/files/JSnjDeXeWuVaAfokcSdY" alt=""><figcaption></figcaption></figure>

If an error is detected in your container, it will be indicated by a red “**X**” under the browser returning the error and on the line of the element the error was found in (Data layer, Custom JS blocks, Tags, Events); it will also appear on the Container line .

In this case, your container version is “**NOT DEPLOYABLE**” until you correct or ignore the error.

We recommend that you correct the errors detected in the Data layer, Custom JS Blocks, Tags, and Event before correcting the Container errors since the latter will most often disappear after the other four levels are corrected.

To display and correct errors, click on a red “X”.

<figure><img src="/files/ZSII1R6A7FxGrjGIgOkP" alt=""><figcaption></figcaption></figure>

A window will appear displaying the test error details. Below is an example of a possible tag error:

<figure><img src="/files/ksKek73hUWxwP3y5t7Qt" alt=""><figcaption></figcaption></figure>

Error message details returned by the tested browser

Tag name and line number where the error is found. Clicking the button redirects you to the “Edit” step where you can correct your tag’s code directly.

Note: Do not hesitate to contact your personal consultant or the Commanders Act support team (<support@commandersact.com>) if you need help correcting an error.

Finally, the “**TEST**” step allows you to consult the error history for the different container versions generated. This history is displayed at the bottom of the “Test” page, where you can click the red “**X**“s again to display the error details:

<figure><img src="/files/fbrGyFWktvzyIPZEWN3M" alt=""><figcaption></figcaption></figure>


# Deployment and roll back

A container can be deployed at the “**DEPLOY**” step:

<figure><img src="/files/LUsR0mMO0TU9p6WhkoAR" alt=""><figcaption></figcaption></figure>

Before deploying a container version, you can:

* Display all the modifications made to your container since its last deployment (technical logs) (1) in the “**MODIFICATIONS SINCE LAST DEPLOYMENT**” section
* View the history of generated versions in the “**DEPLOY BY VERSION**” section.

For each version generated, you will find his version number, creation date, status (“deployed” when it is the version currently deployed and/or “live” when it is the version currently called for the site) , the name of the person who generated the version, a comment, and the container’s size. You will also be able to load your selected container version directly from the interface or via a permanent link:

<figure><img src="/files/dQHwTBdn5c6hNnTWh55F" alt=""><figcaption></figcaption></figure>

Additional information:

The “Weight Detail” section shows the container’s size (in GZIP format), its change in size since the last deployment as well as the percentage of space occupied by each of the following container elements:

* Core: The weight of the content necessary to execute the container
* Tags: Tags’ weight
* Events: Events’ weight
* Rules: Rules’ weight
* Privacy: Privacy module’s weight (if activated)
* Internal variables: Internal variables’ weight
* Deduplication channel: Deduplication channel’s weight (if activated)

<figure><img src="/files/1HndwPpYjyFsOfEsd3CT" alt=""><figcaption></figcaption></figure>

Deploying a new container version or rolling back a container is done in two steps:

* Choose the version to deploy.

Note: to roll back the container, just select a previous container version.

* Choose the deployment method.

Note: the deployment method depends on your container’s hosting and synchronization, which are defined at the project’s start with your personal consultant.

<figure><img src="/files/jY6R8YOKQfFkukbjzjA3" alt=""><figcaption></figcaption></figure>

Once the version and deployment method are selected, a window summarizing the deployment will appear. Click “**Deploy**” to validate:

<figure><img src="/files/rKXIdbtICMvvgh5kXzvq" alt=""><figcaption></figcaption></figure>

Additional information

Depending on the hosting and synchronization methods defined at the project’s start and configured in the interface, different deployment options are available in the drop-down menu under “Choose the deployment method”:

<figure><img src="/files/266hLq52IkqXvKK0wPtK" alt=""><figcaption></figcaption></figure>


# Deletion

To delete a container, click “More”, next to the blue Edit button while on the Dashboard, in the container list section.

<figure><img src="/files/wWQkgubn87Om4IbUaJaC" alt=""><figcaption></figcaption></figure>

In the new window, you will see the containers’ list, the container you selected will be highlighted. To delete it click the red “Delete” button to the right.

<figure><img src="/files/Gp1BD7Kzsfyqo7sBLOwP" alt=""><figcaption></figcaption></figure>

A confirmation message will appear

<figure><img src="/files/rIK5qvXpEdMqgV8bxwdC" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Warning: this operation cannot be undone.
{% endhint %}


# Statistics

To display container statistics click “More”, next to the blue Edit button while on the Dashboard, in the container list section.

<figure><img src="/files/GAVg5NUiMNn2q3adYj4w" alt=""><figcaption></figcaption></figure>

These statistics allow you to monitor container calls, view important information and make sure they continue to be called on your site.

You can find your container list on the left side of the “**Container firing**” interface.

Click a container’s name to see its statistics: the deployed version number, the live version number, the last modification date and the tags’ default expiration period.

You can also display each container’s call statistics. These statistics are divided into four time periods: last day, last 7 days, last 30 days, and last year. Pass the pointer along the curve to see display detailed statistics.

<figure><img src="/files/Gn35nQj1Jshzz9qugoGK" alt=""><figcaption></figcaption></figure>


# Modification history

All modifications done on the containers and privacy banners **in the last 36 months** are recorded on the Modification History page\
You can access to this menu by the tab Administration => Modification History

<figure><img src="/files/Z0FMf15C83XIS33I0qMR" alt=""><figcaption></figcaption></figure>


# Javascript block

## Adding static JavaScript code

Commanders Act allows you to include “free” JavaScript in the tag container, with no character limit, in two places named “Static JavaScript Code”.

The “Static JS codes” allow you to perform different types of actions, notably:

– Fixing data layer issues.

E.g. If your external variable “page\_name” contains values with special characters, you can delete or replace them in the Static JavaScript code (e.g. change “&” into “and” as follows:

<figure><img src="/files/SDgxX0o9AMRKKLcMg87T" alt=""><figcaption></figcaption></figure>

Thus, you can continue to use your external variable “page\_name” in tags by removing its special characters via the Static JS code.

– Recovering data absent in the data layer from the site pages’ source code.

E.g. You can recover JQuery form fields in your Static JS block in the following manner:

<figure><img src="/files/wxkO15WymI3UPdRs6dwA" alt=""><figcaption></figcaption></figure>

The “Static JS codes” appear in two places in the left menu of the “EDIT” step interface:

– The first Static JS code is placed before the declaration of internal variables in the order that elements in your site’s container are executed.

– The second Static JS code is placed after the declaration of the internal variables (you can thus reuse previously declared internal variables in this position):

<figure><img src="/files/qYRdBGWl00DUnQFF8tof" alt=""><figcaption></figcaption></figure>

The same user interface is used for the Static JavaScript code regardless of whether it executes before or after the internal variables. Just enter the JavaScript code you desire and click “SAVE”.

## Adding dynamic JavaScript files

Commanders Act allows **dynamic** **JavaScript** file(s) to be included in a tag container, in two places named “**Dynamic** **JavaScript** **File(s)**“.

Unlike “**Static** **JavaScript** **codes**“, “**Dynamic** **JavaScript Files**” are JavaScript files **outside** Commanders Act that are **downloaded** and then **added** or updated in the container each time it is generated.

The “**Dynamic JavaScript File(s)**” allow you to perform different types of actions.

For example, you can use them to import a JavaScript file containing a **JQuery** library (if it is not already called on your site) or a JavaScript currency converter file into your container. By importing these files into Commanders Act, you can add them to your solutions or use them to create new variables (for example, you can automatically update currencies in your solutions’ tags).

“Dynamic JavaScript File(s)” appear in two places in the left menu of the “**EDIT**” step:

* The **first** Dynamic JavaScript File(s) is placed before the declaration of the internal variables, in the order that the elements of the container on your site are executed.
* The **second** Dynamic JavaScript File(s) is placed after the declaration of the internal variables (you can thus reuse previously declared internal variables in this position):

  <figure><img src="/files/zkmARaxe7seli6oTAwe9" alt=""><figcaption></figcaption></figure>

The same user interface is used for the Dynamic JavaScript File(s) regardless of whether they execute before or after the internal variables. Just enter the URL of your JavaScript file and click “**SAVE**”.

You can perform this operation again for all the JavaScript files to be included in your tag container.

Caution: adding JavaScript files to the container will **increase** its size and thus increase the time for the pages to load.

You can update your dynamic file **manually** (by clicking “Refresh”), display its contents (“View”) or delete it (“Remove”):\\

<figure><img src="/files/BrxvtooB3H8ijC2gqeI5" alt=""><figcaption></figcaption></figure>


# Branches

## Introducing the new "Branches" feature

Are you ready to take your TMS experience to the next level? We are thrilled to introduce our latest feature: **Branches**. This powerful tool is designed to elevate your team’s efficiency, allowing multiple users to work simultaneously on the same project without stepping on each other's toes. Imagine a workspace where you can confidently make changes, test them in isolation, and merge them seamlessly—all while keeping your Main project intact. Let’s dive into what makes this feature a game-changer.

## What is "Branches"?

Branches allow you to create a separate, partitioned work environment—a safe space where your work is your own. You can make changes without worrying about interrupting your colleagues’ progress. When you're ready, simply merge your work back into the Main project with confidence, knowing that everything aligns perfectly.

### **Key Benefits**

* **Work independently:** No more waiting for colleagues to finish their tasks. With Branches, everyone can contribute simultaneously without conflicts.
* **Reduce errors:** By isolating changes, you can avoid the dreaded “unfinished work” being deployed to production. Test and validate your changes in a secure environment before merging.
* **Streamlined merging:** Our intuitive interface makes merging a breeze. View changes side-by-side with our diff checker, ensuring nothing slips through the cracks.

### :heart: Why you’ll love Branches :heart:

**Say goodbye to workflow interruptions!**

Previously, if two users worked on the same account, their changes would overlap, leading to potential conflicts during container generation. This often resulted in errors that stalled the deployment process, or worse—unfinished work going live. With Branches, you’ll experience a smoother, more controlled workflow. Your team can now focus on what they do best, without the hassle of managing conflicting changes.

### **A seamless User Experience**

* **Visual indicators:** It’s easy to know where you are. When you’re working on the Main (your actual web container), all menu elements are cherry red.\
  Switch to a Branch, and everything turns blue, signaling that you’re in a safe zone to make changes.
* **Effortless Branch creation:** Whether you’re starting a new project, creating a new Branch is just a click away. Our intuitive panel guides you through the process, from naming your Branch to diving straight into editing.
* **Real-time notifications:** Stay updated with any changes made into the Main while you’re working on a Branch. You’ll receive a prompt with options to update your Branch or continue working—keeping you in control at all times.

### Glossary

* **Main:** your usual container, considered as "parent" in a Branch context
* **Branch:** a duplication of your Main to work without impacting your Main configuration
* **Merge:** action to bring the modifications from your Branch live in your Main container

## How it works ?

### **Branch Creation**

To open the Branch creation UI use the button in the breadcrumb menu (identified as "Main" when you are on your regular container, or by the Branch name if your are in Branch context).\
The list of your branches will appears. Click on "Create new branch".\
Just define a Branch name, you can also add a description if needed,\
You can create up to 5 Branches for each container!

<figure><img src="/files/Zb9UxsL3rFvsRaSrZLPY" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/vD4OXlKUqvgJ5u3YhcWG" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/BF8BNWsz85UgrErfOZac" alt=""><figcaption></figcaption></figure>

On save, you will redirected in your new Branch environment

Once your Branch is created, all changes you make are isolated to this environment. The blue color of the navigation elements shows you are in a Branch.

<figure><img src="/files/Ck8D3ZMECIBCtopNcuk5" alt=""><figcaption></figcaption></figure>

You can edit or modify any of the elements as if you were in a normal container.

{% hint style="warning" %}
**Limitations**

-Rules cannot be permanently deleted in a Branch, only "Archive" action is possible.\
-Old events formats (deprecated tc\_events) cannot be deleted in a Branch

Be careful on your WebDatalayer modification(s), it may impact all your site

If you create an internalvar in your Branch, you must link it with the Main as well, because internalvars aren't merged
{% endhint %}

### **Branch Comparison with the Main**

At any time you can have clear view of the work done on each Branch.\
Simply click on the link "See changes"

<figure><img src="/files/bWQVsIzgsrAuEyuZxjqR" alt=""><figcaption></figcaption></figure>

The "Comparison" pop in will appears:

<figure><img src="/files/YsWHj29nXZtrXeeDVhPi" alt=""><figcaption></figcaption></figure>

You can unfold elements to get details

<figure><img src="/files/dF5IzqOjeeIZNIdZz654" alt=""><figcaption></figcaption></figure>

### **Existing Branch Edition**

To access an existing Branch, click on "pen" icon.\
**This pop in is also useful to go back to your Main container.**

<figure><img src="/files/eU0ujdUFhMdqw0PU4osA" alt=""><figcaption></figcaption></figure>

Edit/modify any elements as if you where in a regular container.

### Branch Update

If your Branch is not up to date with the newest Main changes, you will see this warning message, inviting you to update your Branch

<figure><img src="/files/0iU0c65VDRSj85CJnY1I" alt=""><figcaption></figcaption></figure>

On click, the pop in "Update" will be displayed, a diff checker.\
You are allowed to keep or discard the changes.\
The checked items will be bring into your Branch.\
If you don't wish to update your Branch now, then click on cancel.

<figure><img src="/files/lBIsZ7iZEMLaoMOak1Qn" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
Be careful on items with the items with label "conflict"\
It means there is modification(s) on the Main and on the Branch too

By default they are unchecked. Take time to compare and choose if you wish to keep the modification from the Branch or from the Main
{% endhint %}

<figure><img src="/files/hMGuL8yYjWAldymS43xQ" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
We recommend to bring all the changes from the Main into your Branch. If you refuse to update some elements, you may impact the Main container on merging.
{% endhint %}

### Branch QA & Test

You can generate your Branch as a regular container.

Once your Branch has been merged, you can do your Quality Assurance by 2 different ways: Deploy your Branch in your UAT environment, or use our Chrome Plugin "Commanders Act Tag Assistant"

#### Test on your UAT environment

When you’re ready, deploy your changes in your UAT environment, ensuring everything works flawlessly before merging.

There's a main difference for Branches containers at the deloy step: deployment on Production environment isn't allowed.\
That's why the deploy step has been renamed as "QA - Merge" in Branch context!

The UAT deployment option will push your Branch version on the UAT URL of the Main container.

It means that you can test your Branch directly on your UAT site without IT intervention.

<figure><img src="/files/W0DuUiGTlLvl0H38k15y" alt=""><figcaption></figcaption></figure>

#### Test with our plugin

Our Commanders Act Assistant is compatible with Branches!

Download it from Chrome Extension Store, once it is installed on your browser, you can use the button "preview" to test your Branch on your website.

<figure><img src="/files/Wi6f2aAsOri21LQJ1HKb" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/KXh2zbIiV19hXu0u9RZ5" alt="" width="488"><figcaption></figcaption></figure>

For a detailed documentation about our plugin, please [read the following page](/features/sources/sources-catalog/web/containers/user-guides-for-browser-side-platform/container/plugin-commanders-act-assistant)

### Merge Branch

Ready to bring your changes from Branch into the Main? Use our “Merge” feature, where you can review the differences, see a detailed comparison, and complete the merge effortlessly.

<figure><img src="/files/GbIvcdb6YCGQsn9Ar2BC" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Merge doesn't consider the generation versions. The UI for merging will ever display the latest updates of your Branch
{% endhint %}

<figure><img src="/files/SPfCM1FRTnGMFlLmOyXL" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
If your Branch is not up to date, Merge will be blocked.
{% endhint %}

Take the time to update your Branch now with the latest Main changes!

<figure><img src="/files/cMsiScO6dW7i4qmaYQgb" alt=""><figcaption></figcaption></figure>

### After merge

Once you merged your Branch, **the Branch will be deleted** and you will be redirected to your Main

All modifications from Branches are now logged in your Main with \[Branch\*] prefix

<figure><img src="/files/YJVIk4HDbVGKxK3hFbFg" alt=""><figcaption></figcaption></figure>

At any time after merge, you can view all modifications logs from the merged Branch on your Main Modification History.

{% hint style="success" %}
Don't forget to re-generate your Main container to bring your changes in Production!
{% endhint %}

## Custom User Rights

The native roles 'Administrator', 'Technical' and 'Marketing' are allowed to create, edit and merge branches.

If you want to manage these access rights more closely, you can use the dedicated rights in Profile Management, Custom Profile.

<figure><img src="/files/jQQKFLOKE5WwQDkHzkaO" alt=""><figcaption></figcaption></figure>

## Looking ahead

**Future-Proof Your Workflow**

Although direct production deployment from a Branch is not available, our new QA plugin (currently under development), will offer you another way of testing your Branches, even in a production environment.


# Plugin Commanders Act Assistant

## Introduction

We are excited to introduce the latest version of our browser extension, **Commanders Act Assistant (CAA)**! Designed to streamline your testing and debugging processes, CAA is fully compatible with **Google Chrome** and **Microsoft Edge**, offering seamless integration into your workflow.

[Download it now in the Chrome Extension Store](https://chromewebstore.google.com/detail/commanders-act-assistant/lfaifjhjdolnpnlgeohohaalbeidhlpj)

\*Availability in the Microsoft Edge Store is coming soon!

## Key Features

### Replace Web Containers easily

With CAA, you can effortlessly **switch between Web Containers versions without a container deployment.** You can test directly on your production website, allowing for quality assurance without disrupting your live environment.\
\
:heart: It's also **compatible with** [**Branches** ](/features/sources/sources-catalog/web/containers/user-guides-for-browser-side-platform/container/branches)feature! :heart:

<figure><img src="/files/zfkS2dZuhu2Gpt2OCEC4" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/QWcdZfsRCzBBheKYL3cT" alt=""><figcaption></figcaption></figure>

### How to replace your(s) Web Container(s)

#### Inside the plugin

You can select the version you need to test directly in the drop down on the right side

<figure><img src="/files/qeoAp92o1P9CENoq8N8j" alt="" width="302"><figcaption></figcaption></figure>

You haven't seen your latest version? Use the refrseh buttons to update the dropdown with the latest version

<figure><img src="/files/gaa6poynRAgmBbAYZZJl" alt="" width="375"><figcaption></figcaption></figure>

#### Through the platform (for Branches testing)

You can **test directly using the dedicated buttons** visible on the steps **"Generate," "Test," and "Deploy"** within the Commanders Act platform, making it easier to validate your configurations.

{% hint style="success" %}
Plugin must be active on your browser to see these buttons
{% endhint %}

<figure><img src="/files/kmyMm1qwLp68l4PT22P5" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/S6636iwFniGX4D5H0Lis" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/hsqp1SVNAIgbfPGlboPq" alt=""><figcaption></figcaption></figure>

On click, you will be invited to enter the expected landing page for your test session, then click 'OK' to be redirected to your site.

<figure><img src="/files/A7p9KoG9pHwfdwhHI5Wc" alt=""><figcaption></figcaption></figure>

### Stop Web Container(s) replacement

To **turn off the override**, simply click the **button "stop override" on the plugin**.

<figure><img src="/files/3QkxbbQbUINIaDfrHePR" alt="" width="290"><figcaption></figcaption></figure>

### Monitor Tags in Action

Easily **view the list of triggered tags** as they fire on your website, giving you a clear overview of your tracking implementation in real time. Simply unfold the "web containers" section to see the list

<figure><img src="/files/t3dM1tLsEvisplcZx8H2" alt="" width="431"><figcaption></figcaption></figure>

### Reach your Web Container in 1 click

Use the icon aside the Site Name - Container Name to reach in just one click your Web Container on our Platform

<figure><img src="/files/LegxUcxG0yrMyroPMUaz" alt="" width="431"><figcaption></figcaption></figure>

### See the full Data Layer state on each page load

On every new page load, you can see the state of the Data Layer!

Simply unfold "External variables" or "Internal variables" to see it.

<figure><img src="/files/XkQVjStGvGYfwL4K0yLR" alt=""><figcaption></figcaption></figure>

### Events tab to watch the triggered events

Open the tab "Events" to see your tags triggered on events.\
The Data Layer state is also visible on this tab.\
If some "event variables" are fed up, you will see them as well

<figure><img src="/files/TltqDjlLG3BEeXIy4qqp" alt="" width="435"><figcaption></figcaption></figure>

Customs Events are also visibles, with the proper name of each custom event.

<figure><img src="/files/oYUfFO5T0cdO04gMXkvp" alt=""><figcaption></figcaption></figure>

### Keep a History Across Pages

CAA **records events across multiple pages**, ensuring you have a complete history of tag activations for a comprehensive debugging experience.

<figure><img src="/files/CARbB7WwKBDstjNNOKaz" alt="" width="432"><figcaption></figcaption></figure>

{% hint style="info" %}
Need to clear your history ? You can **clear** by stopping the **"record across pages"** option, reloading the page, and turning it on again.\
This process will be improved in an upcoming update!
{% endhint %}

### Login required

To preserve confidentiality, our plugin requires to be logged on our platform.

{% hint style="info" %}
Once you are logged, only the Sites and the Web Containers that you have access are visible through the extension
{% endhint %}

It's also compatible with SSO

<figure><img src="/files/gdLFxY3zmRGU2l6wtNYp" alt=""><figcaption></figcaption></figure>

### Limitations

While CAA is a powerful tool, here are some current limitations to keep in mind:

* 🌍 **Consistent Web Container URLs:** The Web Containers URLs must remain the same across all pages for the plugin to function correctly.\\
* ⚡ **SPA Compatibility:** On **Single Page Applications (SPA)**, the list of triggered tags is only filled on the **first "custom event" hit** collected by the plugin. On each page change, the tags are added to the list\*.\
  The Data Layer is updated on each new "page load"\
  \
  \*This behavior will be improved in an upcoming update, so stay tuned!

### Future Enhancements of our extension

CAA is **continuously evolving**, with new features and improvements planned to further enhance your testing experience. Keep an eye out for future updates that will make debugging and optimization even easier!

Coming soon

* Improved SPA website management (for custom events "page load")


# Tags

A tag is a piece of **code** executed on your **site** that allows **information** regarding the site or its visitors to be sent to a digital marketing solution.

Example: **Digital analytics** tags collect information on site **page views**, **visitors**, and **conversions** in order to propose analysis of your site’s performance. **Retargeting** tags collect information on **products viewed** or **added to the cart** by visitors in order to retarget them to other sites via banners that highlight the products they browsed.

Additional information

Here is an example of a tag (basic 'custom event' Commanders Act OneTag):

<figure><img src="/files/4qsN171i7sLjZsk12RaN" alt=""><figcaption></figcaption></figure>


# Add tags

### From the select step

The first step of the deployment process “**SELECT**” displays the tags present in your container and allows you to add new ones.

The main area of the “**SELECT**” interface displays all the tags already present in your container. Each block represents one tag: You can edit or delete your tag by clicking on the respective icons in the block.

You can search for a previously added tag by solution name using the “All vendors” filter in the drop-down menu or by searching for the tag name via the search box:

<figure><img src="/files/Lh6kSVizHMUV87eiBYzP" alt=""><figcaption></figcaption></figure>

Click the blue “**ADD TAG(S)**” button to add a new tag to your tag list:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/ADD_T_BUTTON.png)

<figure><img src="/files/zHdnpnvG40d22ZVzvgw8" alt=""><figcaption></figcaption></figure>

The Commanders Act tag library window will appear displaying the pre-configured tags in the interface. The tag library is composed of the following elements:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/LIBRARY.png)

<figure><img src="/files/NHiMb7tMLdy1WJTMwGoA" alt=""><figcaption></figcaption></figure>

“**Search a tag**“: Search box for finding a tag in the library by its name

“**All vendors**“: Filter for finding tags by solution name

**Search** by letter: Tags in the library are sorted in alphabetical order (by tag name)

**Tag library**: All the tags in the library (click the tag(s) you want to add to your container)

“**Add tag(s)**“: Click this button to add the selected tag(s) to the container

To add one or more tags to your container, check the desired tags and click the green “**ADD TAG(S)**” button. Your new tags will appear in the list of tags present in the container.

### From the edit step

Go to the “**EDITION**” section. Follow the same steps then from the "**SELECT**" page

<figure><img src="/files/C7HyMpimpduxHgZwCeMm" alt=""><figcaption></figcaption></figure>

The blue **ADD TAGS** buttons will open the Commanders Act tag library.


# Configure tags

Once a tag is added, you can configure it in the “**EDIT**” step.

A list of your tags is displayed in the left menu of the “**EDIT**” interface. Tags that need to be configured or validated have a warning (/!\\) sign before their name.

Note: You can find a tag on the list by using the search box :[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/TAG_CONFIG_1.png)

<figure><img src="/files/gyxCpbqBa4QWPtwJ9V9z" alt=""><figcaption></figcaption></figure>

For each tag selected, a configuration window will appear in the center of the interface containing the following elements:

<figure><img src="/files/v8EthzLkFLzOo8ezsaIa" alt=""><figcaption></figcaption></figure>

**Expiration**: An expiration date can be applied to the tag

**Tag variable(s)**: Tag variables that need data layer data or static information linked to them

**Tag code**: The selected tag’s code

**Use** **Tag** **Cleaner**: JavaScript correction tool and preview button to see the tag’s code once its variables have been mapped with variables from the datalayer

**Previous** **version(s)**: The tag’s version history;

“**delete**” and “**save**” buttons

**Rules**: Shortcut to the tag’s rules configuration

## Expiration date

### Setting expiration on a tag

You can apply a custom **expiration** date to each tag. Check the box to activate this function and then select a date on the calendar or type it in the blank field.

<figure><img src="/files/4Gc9QO0v1gkNQXFLC9QC" alt=""><figcaption></figcaption></figure>

When you activate the expiration function, it automatically deactivates the tag into the container on the expiration date selected.

This function is useful if you have added a tag for a specific campaign and you want it to be deactivated once it ends, so that your container is not needlessly overloaded with tags.

## Mapping tags' variables

Important reminder: You must create a link between the information requested by the different tags in the container and the data available in the data layer. Adding data layer variables to tag variables is called “**mapping**“.

The tag variables to map are called “**dynamic variables**“, and they are designated in the following manner: **#variable#**.

They appear in the tag’s code, in blue boldface, as well as above the tag’s code .

You must map these dynamic variables with the data layer variables available in the drop down menus (example: user email, user ID) or a static value (example: method) :[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/MAPPING_TAGS_VARS.png)

<figure><img src="/files/jHKojwOrBgJDpSsVIHUV" alt=""><figcaption></figcaption></figure>

Additional information

If the tag’s code does not meet your needs, you can customize it directly in the “**JAVASCRIPT CODE**” section as well as the “**NOSCRIPT CODE**” section for browsers without JavaScript activated (this function will only work if you call the NOSCRIPT version of the container in your site’s source code):

\\

<figure><img src="/files/T3Q4tB7E9PRzGzfY7d39" alt=""><figcaption></figcaption></figure>

You can modify your tag directly by transforming the dynamic variables within the code into data of your choice.

Example:

If you wish to hard code the USER ID, just replace #user\_id# with the value of the ID:\
\ <img src="/files/gDCdesyD3xgnerdGBZHf" alt="" data-size="original"> ![](/files/KCjr9lV2yeDo2otv65f0)

You can also customize your tag’s code by changing the static elements into dynamic variables.

Example:\\

If you want to make all the values to be collected in a tag dynamically, simply leave them in between hashtags signs. Then save the tag after making this change and you will be able to map your variable with your data layer data:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/MATCHING.png)

<figure><img src="/files/3DRCPQpa8Lt396ORayAq" alt=""><figcaption></figcaption></figure>

Note: you can modify your tag anytime you want. However, please pay attention to its JavaScript structure: Dynamic elements must be placed between the ## and followed or preceded by a “+” if they are joined with static elements. The colored syntax in the tag code allows you to verify that there are no errors:

<figure><img src="/files/95fZ4Ubhkb4jjmjDjD4r" alt=""><figcaption></figcaption></figure>

## Configuring custom tags

A “**Free input (custom)**” tag can be used to add a tag to your container even if it is not listed in the tag library.

To configure your custom tag, just replace the default code in the “**JAVASCRIPT** **CODE**” with the code supplied by your partner solution and click “**SAVE**”.

<figure><img src="/files/ezbwkgFeUZBVV0bUDpFo" alt=""><figcaption></figcaption></figure>

In the vast majority of cases, you will see that your tag is rewritten so that its structure is compatible with that of the container and is called asynchronously. This is also done to prevent errors linked to certain JavaScript data structures such as “document.write”.

Tags are corrected by using the “**Use Tag Cleaner**” feature:

<figure><img src="/files/Q5EuRgJy2etwtLqrvYdn" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/65UjPzLOJwj7xjoONqza" alt=""><figcaption></figcaption></figure>

Uncheck the “**Use Tag Cleaner**” box if you do not want your tag to be rewritten.

## Returning to a previous tag version

Each time a container is generated, Commanders Act saves the tags present in the container, thus allowing you to return to an old tag configuration if necessary.

You can display previous versions of a particular tag by clicking “**PREVIOUS VERSION(S)**”:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/PREVIOUS_VERSIONS.png)

<figure><img src="/files/d0zBOXDQIQCJwNyXsh0n" alt=""><figcaption></figcaption></figure>

The “**PREVIOUS VERSION(S)**” window contains all the saved versions of your tag. The version displayed by default is the previous version of the tag.[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/PREVIOUS_V_DETAILS.png)

**Tag version**: number of the last tag version saved, name of the user who generated the version, and the date and time it was generated

“**Rollback**“: button allowing you to return to the tag version displayed

**Tag** **code**: selected tag code (JavaScript or NoScript code depending on the option selected in (3))

**Tag** **versions**: previous versions of the tag

To return to a previous tag version, select the version you want and click “**ROLLBACK**“.

## Applying a rule on the fly

You can add a tag activation rule directly in the “**EDIT**” step.

You have two options:

* You can select a previously created perimeter or constraint by clicking the drop-down menu:\
  \ <img src="/files/Emb5SJM2SEaxGyHCOZfB" alt="" data-size="original">
* You can create a new perimeter or constraint by clicking “+” ![](/files/OWkuqItZsrQ608CPFAXI)

The rule creation window will appear so that you can create your rules in the same way as in the “**RULES**” step.

For more information on creating rules, please refer to the [Rules](/features/sources/sources-catalog/web/containers/user-guides-for-browser-side-platform/tags/rules) section.

### Displaying the summary of tags and associated rules

To display a summary of all the tags present on your site along with their rules, go to the “**REPORTS**” tab > “**Tags’ Summary**“ \*this page is currently accessible only from Platform v7.

<figure><img src="/files/WIIjAgmB43EMFgvFItw6" alt=""><figcaption></figcaption></figure>

You can display the code, rules and expiration date for each tag.

You can also filter the containers or tags that you want to analyze.

This report can be useful for displaying which tags are present on your site at a given time and for sharing this information with others internally. It can also help you find a tag from the list of tags present on your site.

## Saving and removing a tag

Once you have finished configuring your tag, click “**SAVE**” to save your modifications.

You can also delete a tag you do not need any more by clicking “**DELETE**”.

Caution: a deleted tag cannot be recovered.

<figure><img src="/files/vf7o5zYMC23PSpZOKOy7" alt=""><figcaption></figcaption></figure>

## Tags' activation and execution order

To activate or deactivate tags in the “**GENERATE**” step, just check or uncheck each tag in the “**ACTIVATION**” column and generate a new container version (blue button in the upper right-hand side of the screen):[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/MANAGING_ACTIVATION.png)

<figure><img src="/files/GutiRfYHt2On2WJ4dRWv" alt=""><figcaption></figcaption></figure>

All checked tags are active and all unchecked tags are inactive. The advantage of deactivating a tag rather than permanently deleting it is that you can keep all the tag parameters (mapping, rules) and reactivate them at a later date without having to reconfigure everything.

Note: Since a deactivated tag will be visible in the interface but not in the container called for your site, your container will not become needlessly cluttered.

To modify the order in which tags are executed in a container in the “**GENERATE**” step, just drag and drop each tag in the “**RANK**” column and place them in the order in which you want them to execute on your site’s pages, and then generate a new container version (blue button in the upper-right hand side of the screen):\\

<figure><img src="/files/DhUWD398RGN9dyoQnkzR" alt=""><figcaption></figcaption></figure>

We recommend that you place the **most important tags** at the **top** of the container so that they have the best chance of executing if your visitors change pages quickly without waiting for them to fully load.

## Setting a timeout on a tag

To improve your site’s performance, Commanders Act suggests that you deactivate a tag if it takes too long to load. You can enter a maximum duration, in milliseconds, for a tag to execute. If the tag takes longer than this time to execute, it will be deactivated.

To add a timeout to tags in the “**GENERATE**” step, just enter a duration in milliseconds in the “**TIMEOUT MS”** column and generate a new container version:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/TIMEOUT.png)

<figure><img src="/files/YOUaAmRmNokkP8NGBQ1J" alt=""><figcaption></figcaption></figure>

## Customizing the tag library (whitelisting)

You can customize the tag library by restricting the number of tag templates available in the tag addition popin from the “Select” and “Edit” steps.

This “tags whitelist” feature is useful if you wish to limit access to the solutions in the library and only make some of them available to your staff. This aims at preventing users from placing tags you did not authorize into your containers.

The “Library management” interface is accessible to administrators and to custom users this interface was granted access to. The tags whitelist is managed from the “Admin” > “Library management” interface. This page is currently only available on platform v7.

All tags will be selected by default.

You can click the “Unselect all” option and then choose the tags you wish to make available in your library.

<figure><img src="/files/kZmDk3v3R5UfyHTk9ub5" alt=""><figcaption></figcaption></figure>

Select the site you wish to set up the tags white list for from the drop down menu.

You can Check/Uncheck relevant tags.

The “Select all” and “Unselect all” buttons allow you to check or uncheck many tags simultaneously.

You have the possibility to filter tags by name or alphabetical order.

Click the “SAVE” button to save your settings.

**Must know:**

* When a new tag is added to the tag library by Commanders Act’s staff, it is automatically unchecked if you have already created at least one tag whitelist for your site.
* You can copy a tags whitelist from one site to another from the “Administration” > “Copy management” menu.


# Rules

The “**RULES**” step allows you to create your tag activation rules.

You can manage how your tags and events are called by using the tabs displayed in the left menu:

* The “**Summary**” tab provides you with an overview of the created rules per tag and event.
* The “**Triggers**” tab allow you to create triggers for your tags.\
  **Triggers** are rules allowing to execute tags on different conditions: container loaded, DOM Ready, clicks, form submissions, scroll and custom events.
* The “**Perimeters**” tab allows you to create perimeters for your tags.\
  **Perimeters** are the page types for which you want to activate your tags (for example: the homepage, “my account” page, product page, etc.).
* The “**Constraints**” tab allows you to create constraints for your tags and events.\
  **Constraints** are rules based on criteria other than the page type (for example: rules based on visitor status, the type of browser or device, etc.)\
  Note: You must use **constraints** if you want to create a **rule** for an **event**.
* The “**Deduplication**” tab allows you to implement deduplication rules for your tags.
* The "**Privacy Banners Constraints**" tab allows you to setup rules for display your privacy banners

<figure><img src="/files/I4zcNM3kez4qrrbhwCb0" alt=""><figcaption></figcaption></figure>


# Basic actions

## Summary of rules for tags and events

You can use the “**Summary**” interface to assign previously created rules directly to the new tags you want to add to the container:

<figure><img src="/files/0uDDIX2FdKlQXBiaqx9K" alt=""><figcaption></figcaption></figure>

By **default**, a newly added tag is called on the **container loaded** trigger, on **all pages**, with **no constraints**.

You can use this interface to add perimeters and constraints alerady created to tags or events added afterwards or modify them from the “**Summary**” interface:

* To add a **perimeter** to a tag, you must check the box where the tag line and the perimeter column intersect.\
  You can also delete a tag’s perimeter(s) by checking the green “**All** **pages**” column. The tag will now activate on all pages.
* To add a **constraint** to a tag, click edit button (pencil icon) close to the triggers and use the existing constraints list to select those you wish to add to your tag.

Additional information:

You can add multiple triggers, perimeters and constraints to the same tag:

* The “**OR**” logic operates when multiple triggers are added to a tag. For example, if you check the “Container loaded” and “add to cart button” triggers, your tag will activate in one case **OR** the other, i.e. on the container loaded and at the click on the button.
* The “**OR**” logic operates when multiple perimeters are added to a tag. For example, if you check the “homepage” and “account creation page” perimeters, your tag will activate in one case **OR** the other, i.e. for the homepage and the account creation page.
* The “**AND**” logic operates when multiple constraints are added to a tag. For example, if you check the “logged user” and “mobile exclusion” constraints, your tag will activate only if the two conditions are met, i.e. only for logged users **AND** everything except a mobile device.
* The “**AND**” logic operates when a trigger, a perimeter and a constraint are added to the same tag. For example, if you check the “container loaded” trigger, the “homepage” perimeter and the “logged user” constraint, your tag will activate only if the three rules are valid, i.e. only at the container loaded AND on the homepage AND logged visitors.

## Adding rules

You can add 3 types of rules: **constraint**, **perimeters** and **triggers.**

* **Perimeters** are the **page types** you want to activate your tags for (example: the homepage, “my account” page, product page, etc.).
* **Constraints** are rules based on criteria other than the page type (example: rules based on visitor status, the type of browser or device, etc.).
* **Triggers** are rules allowing to execute tags on different conditions: container loaded, DOM Ready, clicks, form submissions, scroll and custom events.

To create a new trigger, click “**Trigger**” > “**ADD TRIGGER**”:

<figure><img src="/files/7yxBLS9l4KbcYHGNkSna" alt=""><figcaption></figcaption></figure>

To create a new perimeter, click “**Perimeters**” > “**ADD PERIMETER**”:

<figure><img src="/files/qLPufcjWxzBTFtVCdEa7" alt=""><figcaption></figcaption></figure>

To create a new constraint, click “**Constraints**”> “**ADD TAG CONSTRAINT**”:

<figure><img src="/files/gXBYgXalPTC2cMsyUGbT" alt=""><figcaption></figcaption></figure>

By clicking “**Add** **trigger**” a rule creation interface will appear. This interface allows you to create a trigger of your choice: container loaded, DOM ready, click, form submission, scroll and custom.

<figure><img src="/files/L4IvKwzNxNvovQ1uK1EV" alt=""><figcaption></figcaption></figure>

By clicking “**Add** **perimeter**” or “**Add** **tag** **constraint**“, a rule creation interface will appear. This interface can be seen as a “tool box” that allows you to create rules based on various elements: cookies, data layer variables, URLs, etc.

The “tools” available to you can be selected at the top of the rules creation interface, and various options allow you to create the most appropriate rule for your tag. For each new rule created, make sure to complete the “**Name**” field (rule name), check the boxes of the tags to which the rule applies and configure the rule.

<figure><img src="/files/alko4RK0jFw8HhZvtLWj" alt=""><figcaption></figcaption></figure>

Note: The perimeter and constraint creation interfaces offer the same options, but in the constraint creation interface you need to link the constraint to a specific trigger:

<figure><img src="/files/4inLX5cFSgGoZoTRSNG4" alt=""><figcaption></figcaption></figure>

## Modifying a rule

To modify a rule, click the “**edit**” icon (pencil icon).

<figure><img src="/files/3xfdLpiqQ7bfcU2bWGEN" alt=""><figcaption></figcaption></figure>

Note: you can modify the rule’s name and value. However, you must create a **new** rule if you wish to **change** its **type**: if you want to replace the “If Variable Equals” rule with “If Variable Is not Equal”.

## Deleting a rule

To delete a rule, click the “**trash**” icon (garbage bin icon):

<figure><img src="/files/mm31uG4idroUNZUnn77n" alt=""><figcaption></figcaption></figure>

Note: your rule will be saved in the trash, where you can recover or permanently delete it at any time:\\

<figure><img src="/files/RLQGMGdiTrdg9nuFNlmP" alt=""><figcaption></figcaption></figure>


# Triggers

## Default triggers

You can select a default trigger in the container options.

This means that each time you will add a tag to your container, the default trigger(s) will apply on this tag.

To select your default trigger(s), go in the container options, “advanced” part:

<figure><img src="/files/EVu0VLOULJsW7iMCgkrA" alt=""><figcaption></figcaption></figure>

## Container loaded

This trigger allows calling tags when the container is loaded on a page. It is the default trigger for all the tags you add to your container. This means that the tag will only be called when your JavaScript container loads on your site, but it will not be the case for other event types (such as a click, a page change within an “single page applications” environment, etc.).\
In order to trigger tags when a container loads on your page, all you need to do is selecting them from the list.

<figure><img src="/files/0SVDXccCaZ8SMiIOAZ0n" alt=""><figcaption></figcaption></figure>

## DOM Ready

This trigger allows calling tags when the page’s structure is built (on the “DOM Ready” event). To launch tags on this event, all you need to do is selecting them. They will be called on the DOM Ready event when the page loads.

<figure><img src="/files/l27Z8k8dZ2Tn1ZlHEWHP" alt=""><figcaption></figcaption></figure>

## Click

This trigger allows calling tags whenever elements of the page are clicked.\
Example: if you would like to call a tag when a user clicks a button (ex: “add to cart” button), select the desired tag(s) and enter the code allowing to target the button or the link on your page in the “CSS Selector” field.

<figure><img src="/files/DrjigtdXQnH5qPGjFJ28" alt=""><figcaption></figcaption></figure>

*Must know:*

* *To retrieve the CSS selector, open your browser’s console and use its targeting tool to target one of your page’s elements. Then right-click, the code appearing in your console, click “Copy” and “Copy selector”. All you have to do next is pasting this code in the interface.*

<figure><img src="/files/xNe9qAB3zeGjqzIxgvCJ" alt=""><figcaption></figcaption></figure>

* *You can enter many selectors in the interface; you will have to separate them with commas.*

## Form submission

This trigger allows calling tags when a user submits a form properly filled.\
Example: when they click the “submit” button or press the Enter key.\
To call a tag when a form is submitted, follow the same steps you followed to call a tag upon a click. Indicate your trigger’s name (ex: “account creation confirmation”), select the desired tag(s) and enter the code allowing targeting the form submission button on your page in the “CSS Selector” field.

<figure><img src="/files/B6x6gI5JfiO3KTXd4etU" alt=""><figcaption></figcaption></figure>

## Scroll

This trigger allows calling tags when a user scrolls the page vertically or horizontally. In order to execute a tag on scrolling, you will need to enter your trigger’s name (ex: “30% vertical scrolling”), select the desired tag(s), choose the scrolling type (horizontal/vertical) from the dropdown menu, the expected scrolling and measuring unit (page percentage or pixels).

<figure><img src="/files/eUwu5dQ89KcodYf7Qh2m" alt=""><figcaption></figcaption></figure>

## Custom

This trigger allows calling tags whenever a Commanders Act event function (tC.event.xxx) is identified on the page. If you wish to execute a tag on a custom eventm, please indicate your trigger’s name (ex: “add to cart click”), select the desired tag(s) and enter the implemented event function’s name (ex : “tC.event.add\_to\_cart”).

You can also use the [Javascript SDK](/features/sources/sources-catalog/web/js-sdk#use-javascript-sdk-in-tms) to track events & create custom triggers\\

<figure><img src="/files/LMJ3lufCTGxnGw9lkQiT" alt=""><figcaption></figcaption></figure>


# Perimeters & constraints

*Perimeters* and *Constraints* are two methods to **conditionally** fire your tags.

* Under the *Perimeter* panel, tags fire if at least **one rule** is true.
* Under the *Constraints* panel, tags fire if **all rules** are true.

## Variable

The “**Variables**” tab allows you to create rules based on your data layer variables (external variables, internal variables, events attributes, events variables):

**Condition and behavior**

“**If Variable Equals**“: Tag activated if the variable equals the specified value.

“**If Variable is Not Equal**“: Tag activated if the variable differs from the specified value.

“**OR Condition (One Variable)**“: Tag activated if the variable equals at least one of the specified values.

“N**AND Condition (One Variable)**“: Tag activated if the variable equals two or more specified values.

“**OR Condition (Up To Six Possible Variables)**“: Tag activated if at least one of the variables equals the specified value.

“**AND Condition (Up To Six Possible Variables)**“: Tag activated if all the variables equal all the specified values.

“**Greater than condition**“: Tag activated if the variable is greater than the specified value.

“**Less than condition**“: Tag activated if the variable is less than the specified value.

“**If Variable Contains**“: Tag activated if the variable contains the specified value.

“**If Variable Does Not Contain**“: Tag activated if the variable does not contain the specified value.

“**If Variable Matches**“: Tag activated if the variable matches the specified value (regular expressions allowed: \* to match any character and ^ for “variable begins with”).

“**If Variable Doesn’t Match**“: Tag activated if the variable does not match the specified value (regular expressions allowed: \* to match any character and ^ for “variable begins with”).\\

{% hint style="info" %}
In case of multiple values: enter all the values in the field separated by a comma ",". Don't use space between.
{% endhint %}

<figure><img src="/files/a4F406Bd16XDXO0Nvnfj" alt=""><figcaption></figcaption></figure>

**In which case using “external variables” for the mapping?**

When you want to create a rule based on a tc\_vars from the data layer implemented on your website.

Example: your technical team has implemented an env\_country variable, and you want to create a rule based on it:

<figure><img src="/files/PvIz5OZpfBepWOWV78Wu" alt=""><figcaption></figcaption></figure>

**In which case using “internal variables” for the mapping?**

When you want to create a rule based on a variable that you have created by yourself, from the internal variable interface.

**In which case using “event variables” for the mapping?**

When you want to create a rule based on a variable specific to an event.

Example: The following event is implemented in your site’s source code:

```
tC.event.add_to_cart(this, {"product_name":"iphone", "product_id":"1234"})
```

To call a tag only if the product name is “iphone”, you have to select the event variable named “product\_name” and configure it in the following manner:

<figure><img src="/files/4zm9Iqa2cT9X1R5fLqT8" alt=""><figcaption></figcaption></figure>

## Cookie

The “**Cookie**” tab allows you to create rules based on cookies you have previously created in the Commanders Act interface or which are available for your site’s domain name (first-party cookies).

**Condition and behavior**

“**If Cookie Equals**“: Tag activated if the cookie’s value equals the specified value.

“**If Cookie Is Not Equal**“: Tag activated if the cookie’s value differs from the specified value.

“**If Cookie Contains**“: Tag activated if the cookie’s value contains the specified value.\
In case of multiple values : enter all the values in the field separated by a comma ",". Don't use space between.

“**If Cookie Doesn’t Contain**“: Tag activated if the cookie’s value does not contain the specified value.\
In case of multiple values : enter all the values in the field separated by a comma ",". don't use space between.

Example with multiple values: In order to call a tag when your “consent\_status” cookie equals “exempt” or "optin", you must select the “If Cookie Equals” rule and configure it in the following manner:

<figure><img src="/files/mnSoYqdHxWBWhdl5sLDD" alt=""><figcaption></figcaption></figure>

## URL

This tab allows you to create rules based on your site’s URLs (note: we **recommend** that you use rules based on variables instead of URLs since the rule will become obsolete if your URL changes in the future):

**Condition and behavior**

“**If URL Equals**“: Tag activated if the URL equals the specified value.

“**If URL Contains**“: Tag activated if the URL contains the specified value.\
In case of multiple values : enter all the values in the field separated by a comma ",". Don't use space between.

“**If URL Doesn’t Contain**“: Tag activated if the URL does not contain the specified value.

“**If URL Matches**“: Tag activated if the URL matches the specified value (regular expressions allowed: \* to match any character and ^ for “variable begins with”).

“**If URL Doesn’t Match**“: Tag activated if the URL does not match the specified value (regular expressions allowed: \* to match any character and ^ for “variable begins with”).

Example: to call a tag when your URL indicates that the user is on the product page (providing your product page URLs are all structured the same: <https://www.site.com/$category$/$subcategory$/product\\_$product\\_ID$>), you have to select the “If URL Matches” rule and configure it in the following manner:

<figure><img src="/files/QqpHvN4metddGUnEe8wj" alt=""><figcaption></figcaption></figure>

## **Browser**

This tab allows you to create rules based on browsers.

**Condition and behavior**

“**If Browser Is**“: Tag activated if the browser is (choose from the list).

“**If Browser Is Not**“: Tag activated if the browser is not (choose from the list).

<figure><img src="/files/uialR4xV5emnPpEwDxBW" alt=""><figcaption></figcaption></figure>

## Mobile

This tab allows you to create rules based on the type of device.

**Condition and behavior**

“**If Device / OS Is**“: Tag activated if the device is (choose from the list).

“**If Device / OS Is Not**“: Tag activated if the device is not (choose from the list).

“**If Device / OS Is Android Tablet**“: Tag activated if the device is an Android tablet.

“**If Device / OS Is Android Mobile**“: Tag activated if the device is an Android mobile device.

“**If Device / OS Is Not Android Tablet**“: Tag activated if the device is not an Android tablet.

“**If Device / OS Is Not Android Mobile**“: Tag activated if the device is not an Android mobile device.

Example: to prevent a tag from being called on an Android mobile device, you must select the “If Device Is Not Android Mobile” rule and configure it:

<figure><img src="/files/aJEGOVYjRxzNHlHbp1Yn" alt=""><figcaption></figcaption></figure>

## DataCommander

This tab allows you to create rules based on the type of audience segments created in DataCommander.

**Condition and behavior**

“**DataCommander OR condition (up to six variables)**“: Tag activated if at least one of the audiences equals the specified value.

“**DataCommander AND condition (up to six variables)**“: Tag activated if all the audiences equal all the specified values.

“**DataCommander Event activation**“: Tag activated on an event

<figure><img src="/files/pDuQQc8g0NgP3lY4R8T9" alt=""><figcaption></figcaption></figure>

## Advanced rules

This tab allows you to create all types of advanced rules. For example, you can create sampling rules or even “**Custom**” rules:

**Condition and behaviour**

“**Sampling (1/X) (Page Based)**“: Tag activated in X% of page views.

“**Sampling (1/X) (Session Based)**” : Tag activated in X% of visits.

“**Sampling (1/X) (Visitor Based)**“: Tag activated for X% of visitors.

“**(A or B or C or D or E) AND (F or G or H or I or J)**“: Tag activated if at least one of the variables in the first group AND at least one of the variables in the second group equal the specified values.

“**(A and B and C and D and E) AND (F or G or H or I or J)**“: Tag activated if all the variables in the first group AND at least one of the variables in the second group equal the specified values.

“(**A and B and C and D and E) OR (F and G and H and I and J)**“: Tag activated if all the variables in the first group OR all the variables in the second group equal the specified values.

“**(A and B and C and D and E) OR (F or G or H or I or J)**“: Tag activated if all the variables in the first group OR at least one of the variables in the second group equal the specified values.

“**(A different than VALUE1) OR (B different than VALUE2)**“: Tag activated if the first variable is not equal to a value OR the second variable is not equal to a value.

“**(A different than VALUE1) OR (B equals VALUE2)**“: Tag activated if the first variable is not equal to a value OR the second variable is equal to a value.

“**(A different than VALUE1) AND (B different than VALUE2)**“: Tag activated if the first variable is not equal to a value AND the second variable is not equal to a value.

“**(A different than VALUE1) AND (B equals VALUE2)**“: Tag activated if the first variable is not equal to a value AND the second variable equals a value.

“**In Array**“: Tag activated if the variable is present in the variable array.

“**In Sub Array**“: Tag activated if the variable is present in a variable array key.

“**Array Intersectio**n”: Tag activated if two variables from two variable arrays are equal.

“**Custom**“: Custom rule (to define in JavaScript).

Example: In order to call a tag for 25% of site visitors, you must select the “Sampling (1/X) (Visitor Based)” and configure it in the following manner:\\

<figure><img src="/files/erg6WBGMP2po6XNND5Lg" alt=""><figcaption></figcaption></figure>


# Data layer and data types

The data layer represents all your available data. It consists of **information about your site** (e.g. page name, product ID) **and your visitors** (e.g. user ID, customer status) in the form of **JavaScript variables**.

<figure><img src="/files/NcZLccQdvi0ic2Pl4Z9R" alt="" width="271"><figcaption></figcaption></figure>

These variables have two uses:

– To populate the tags present in your container;

– To create activation rules for your tags.

Additional information:

The data layer can consist of two types of data:

– Data implemented by your IT department or your technical provider for all your web pages, based on the CSS, Backoffice and CRM. These data are called “**external variables**” and are displayed in your site’s source code as a **JavaScript object** containing all the variables used by your tags.

This is what the external variables look like in the source code:

```
<script type="text/javascript">
var tc_vars = new Array();
tc_vars["env_work"] = 'Prod';
tc_vars["env_channel"] = 'Web';
tc_vars["env_language"] = 'fr';
tc_vars["env_country"] = 'FR';
tc_vars['page_type'] = 'Homepage';
tc_vars["page_name"] = 'Tag Commander Market';
tc_vars["page_category_1"] = '';
tc_vars["page_category_2"] = '';
tc_vars["page_category_3"] = '';
</script>

/* Data layer is setup - call the Web Container Script underneath */

<script type="text/javascript" src="//cdn.tagcommander.com/674/my_web_container.js"></script>

```

– Data created in the interface by **Commanders Act staff** or **Commanders Act** users based on information available on the site’s pages (URL, cookies, HTML tags, external variables in the data layer, etc). They are called “**internal variables**” and are displayed in the **Commanders Act** **web container’s code**.


# External variables

These variables are called **external variables** because they are outside the Commanders Act web container: They are embedded directly in the source code of your site’s pages, in contrast with internal variables, which are created inside the **container** and therefore not visible in the page’s source code. **External variables** are added by your **technical teams** or the technical provider in charge of implementing Commanders Act web containers on your site.

**External variables** are **indispensable** since they contain most of the data sent to the solutions present in the container. Their function and number vary depending on the **site’s economic model** (for example, media sites will not have the same external variables as e-commerce sites).

The list of external variables must be considered and established **before** Commanders Act web container is implemented in order to meet the embedded solutions’ medium- to long-term needs. A summary of the external variables to implement on your site will be provided by your **Commanders Act consultant** during the **setup** phase of the TMS, in an Excel file named “**deliverables**” or “**tagging plan**“.

**External variables** must be declared in the **Commanders Act interface** before you begin configuring tags in your containers. See the “Adding external variables” article in this section to find out how to declare an external variable in the interface.

All declared external variables can be used:

– To pass information to the solutions embedded in the container (linking external variables and solutions is called mapping). See the “Mapping Tags’ Variables” article to find out how to map your external variables in a tag.

– To create activation rules for your tags. See the “Adding Rules” section to find out how to create rules based on your external variables.

Additional information

As with your container, external variables must be present on **all of your site’s pages** and assigned values suited to the context. For example:

– The value of the “**page template**” variable will be different for the most important page templates on your site: homepage, product page, confirmation page, etc.

– The value of the “**user id**” variable will change for each visitor that connects to your site.

External variables must be declared in your site’s source code **before the call to your containers** (=JavaScript files). If you have a header container, the external variables will thus be present in the \<head>; if you have a container in the body, they must be declared in the \<body> html tag.

Here is a sample list of external variables:

```
<script type="text/javascript">
var tc_vars = new Array();
tc_vars["env_work"] = 'Prod';
tc_vars["env_channel"] = 'Web';
tc_vars["env_language"] = 'fr';
tc_vars["env_country"] = 'FR';
tc_vars['page_type'] = 'Homepage';
tc_vars["page_name"] = 'Tag Commander Market';
tc_vars["page_category_1"] = '';
tc_vars["page_category_2"] = '';
tc_vars["page_category_3"] = '';
</script>

/* Data layer is setup - call the Web Container Script underneath */

<script type="text/javascript" src="//cdn.tagcommander.com/674/my_web_container.js"></script>

```

### Adding external variables

There are **two** situations in which you may need to declare your variables in the external variable management interface:

1\) You wish to install **Commanders Act** on a **new site**: prior to having your technical teams or technical provider implement the data layer/variables in your site’s source code, you need to **declare the variables** in the Commanders Act interface so they are **available for mapping**.

2\) **Information is missing** from your current tagging plan (e.g. customer status): Again, this **variable** must be **declared** in the interface **first**, before it can be used in your tags and rules.

Note: If necessary, you can click “**Download**“, to retrieve your external variables in JavaScript format and send them to your technical team or the technical provider in charge of implementing the variables in you site’s source code:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/DOWNLOAD_VEXT_BUTTON.png)

<figure><img src="/files/QUF8Z0AuZ0Gm5uDtkW8w" alt=""><figcaption></figcaption></figure>

Clicking “**Download**” will open a window containing the JavaScript code to insert in the site’s source code:

<figure><img src="/files/BZIh0g612kccH4UpCOsz" alt=""><figcaption></figcaption></figure>

To add an external variable, you must go to the “**Data Management**” > "**Web Data layer**" > “**External Variables**” and click “**ADD VARIABLE**”

The “**add variable**” window contains various fields:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/VEXT_DETAILS.png)

<figure><img src="/files/C5C7JJaZNfie23gTHG96" alt=""><figcaption></figcaption></figure>

“**Name**“: the variable’s name (mandatory field).

“**Category**“: used to categorize the variable according to its application (e.g. variable relative to users, product pages, confirmation pages, etc.) See the “Categorizing External Variables” article in this section.

“**Type**“: The type of variable. See the “Managing Variable Types” article in this section.

“**Use in noscript**“: Check the box so that the variable is present in the tag’s noscript code.

“**Description**“: A description of the variable, to clarify the variable’s name (e.g. “Page template” can be the description of the variable named “env\_template”).

“**Detailed description**“: A detailed description of the variable, to further clarify the variable’s name (e.g. “possible values: homepage/category/product/funnel\_confirmation” can be the detailed description of the “env\_template” variable).

Once the variable is added, it will appear on the variables list:

[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/VARIABLE_ADDED.png)

<figure><img src="/files/8dCSm70usefdR9mE8kKq" alt=""><figcaption></figcaption></figure>

### Categorizing external variables

Variables can be **categorized** for easier management.

**Categories** allow you to **classify** variables according to their application (e.g. variables relative to site users in the “Users” category, variables for product pages in the “Product page” category, generic cross-functional variables for the site in the “Environment” category, etc.)

Categories are managed by clicking the “**manage categories**” button to the left of the “ADD VARIABLE” button:

<figure><img src="/files/bGugb6uUQAXx44QbP5sX" alt=""><figcaption></figcaption></figure>

Once your category is created, it can be used in the window to **add** and **edit external variables;** you can edit them by clicking the pencil icon, delete them by clicking the cross and adding them by entering a name and clicking the blue "+" button :[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/CAT_WINDOW.png)

<figure><img src="/files/l7eyHQqiumwRK6YnAMce" alt=""><figcaption></figcaption></figure>

### Managing variable types

The variable “**type**” (also called “**processing function**“) allows you to modify the variable format on the fly when mapping your tags.

They are useful when one of your solutions requires a variable format that is different from the format used in the **external variables** by the technical teams in charge of implementing the data layer.

For example, if your “page\_name” variable contains **special characters** in the source code, the processing functions allow you to **correct** them so that your solutions can receive the value without special characters.

The most commonly used types are:

* **Order amount**: this allows you to modify the number format (amount) on the fly.

You can change separating commas into periods (e.g. “12,50” becomes “12.50”), choose the number of decimal places to retain (e.g. “12.50 becomes “12.5”), or convert the amount into pennies (“12.50 becomes “1250”).

* **Alphanumeric & Special chars**: this allows you to modify the character string format on the fly.

You can replace special characters with “\_” (e.g. “the company\&its values” changes to “the company\_its values”) or truncate a character string (e.g. limiting the variable’s value to 10 characters).

After assigning a variable type, you can modify its value on the fly, tag by tag, in the “**EDIT**” interface. Variables with a type added will have a blue symbol in front of their name (1):[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/PROCESSING_FUNCTpng.png)

<figure><img src="/files/r3VqSRSkOqMSXl8ecH8G" alt="" width="320"><figcaption></figcaption></figure>

Once you have mapped your variable, click the link **symbol**:

<figure><img src="/files/JsGeeoLxLQUTK32Sutfc" alt=""><figcaption></figcaption></figure>

A window will appear with a list of different operations corresponding to the type chosen. Check the box corresponding to the operation you want (for example, remove special characters and replace them by “\_”) and click “**SAVE**” :[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/STRING_OPS_PROSFUNC.png)

<figure><img src="/files/5wsNCnGbiRgtgh8WxeLh" alt="" width="399"><figcaption></figcaption></figure>

#### Advanced : 2-dimensional array

This type can be assigned to variables having a **two-dimensional array** as a value. On an ecommerce site, this will deal very often with “list\_product” and “order\_product” variables that return, respectively, **information** on **products** displayed on a **category page** or added to the cart.

We speak of “two-dimensional arrays” since these variables return an **array of values** for each **product** (e.g. for all the products on the site’s page, their ID, name, price, quantity, etc.).

Certain partner solutions may request that you send product data in their tag that are separated by a character called a “**separator**” (e.g. all product IDs separated by “**|**“, or all product prices separated by a **comma** in their confirmation tag).

The operation will be much easier if you select the “Two-dimensional array” processing function for your “order\_product” variable.

You will then be able to send your partners the information they expect without requiring any knowledge of JavaScript.

The first step in the configuration process is to select the “**Two-dimensional array**” type (1) for your variable:

<figure><img src="/files/zJmIYzi8tTghUSgCTrlY" alt=""><figcaption></figcaption></figure>

Once this type is added, click on the “**Lis**t” icon that appears next to your variable to see a summary of the external variables:

<figure><img src="/files/wIubbY0tT8ZUwWMMminG" alt=""><figcaption></figcaption></figure>

Enter all your array keys in the window that appears (e.g. if your main variable is “list\_products”, the keys will be characteristics of your products, i.e. the ID, name, price, etc.):

<figure><img src="/files/mf4M5R8tYvMugvrGs3OM" alt=""><figcaption></figcaption></figure>

After selecting the “**Two-dimensional array**” type for your variable go to the “**EDIT**” step. Click the symbol appearing to the left of the variable that you just mapped:

<figure><img src="/files/JsGeeoLxLQUTK32Sutfc" alt=""><figcaption></figcaption></figure>

Enter the array key in the configuration window (e.g. the product ID) and the separator:

<figure><img src="/files/g9zdwtQi8pc9a7K4CF7b" alt="" width="448"><figcaption></figcaption></figure>

You can also use the “**Two-dimensional array**” type to create internal variables that return product keys separated by the symbol of your choice. For more information, go to the “Adding Custom Internal Variables – Builder Mode” article.[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/TWO_DIM_ARRAY_WITH_INTERNAL.png)

<figure><img src="/files/TfK1zB6w8UamSBqFSJFD" alt=""><figcaption></figcaption></figure>

### Editing and deleting external variables

You can edit an **external variable** by clicking the “**Edit**” icon and delete it by clicking the trash can. The flag next to the variable’s name will tell you if it is mapped and the tag(s) it is mapped with:

Note: The variables used in a container (to be added to a tag, for example) cannot be deleted, and their names cannot be modified.

<figure><img src="/files/tfI4mrL9toT6zN66qtcY" alt=""><figcaption></figcaption></figure>

By clicking on the flag, you will see which container(s), tag(s) or rule(s) use this variable:

<figure><img src="/files/xt4DC6KRmynAAm29AZ1n" alt=""><figcaption></figcaption></figure>


# Internal variables

These variables are called **internal variables** because they are created inside the **Commanders** Act web container: They are integrated directly into your site’s container, in contrast with external variables, which are added into the page’s **source code** by the technical staff.

Internal variables are used to **collect data** to enrich data through the external variables. A library of **predefined internal variables is available**, but you can also create **your own**.

**Internal variables** must be created in the **Commanders Act interface** before they can be used in containers. See the rest of the articles in the “internal variables” section to know more about the different options available to create such variables.

All internal variables created can be used:

* To be added to the solutions embedded in the container (linking internal variables and solutions is called **mapping**). See the “Mapping tags’ variables” article to find out how to map your **internal variables** in a tag.
* To create **activation rules** for your tags. See the “Adding Rules” article to find out how to create rules based on your internal variables.

Additional information

Internal variables are all coded in JavaScript, but you **do not need** any **technical knowledge** of **JavaScript** in order to use the “**Predefined**” variables or the “**Builder**” modes, since the code is generated **automatically** by the **Commanders Act**. However, you will **need to know JavaScript** or seek help from the **Commanders Act support** team in order to create your own **custom internal variables**.

Here are some examples of predefined internal variables:

* Internal variable for retrieving the URL of the page:\\

  <table data-header-hidden><thead><tr><th></th></tr></thead><tbody><tr><td><pre><code>tC.internalvars.tc_url = document.location.href;
  </code></pre></td></tr></tbody></table>
* Internal variable for retrieving the URL of the previous page/site:\\

  <table data-header-hidden><thead><tr><th></th></tr></thead><tbody><tr><td><pre><code>tC.internalvars.tc_referrer = document.referrer;
  </code></pre></td></tr></tbody></table>
* Internal variable for retrieving what comes between the first “/” and second “/” of the URL:\\

  ```
  tC.internalvars.tc_url_1 =(function(){
  tC.internalvars.tc_url_1_tmp = document.location.href.split('?');
  tC.internalvars.tc_url_1_tmp2 = tC.internalvars.tc_url_1_tmp[0].split('/');
  return tC.internalvars.tc_url_1_tmp2[3];
  })();
  ```

## When to add an internal variable

There are several situations in which you may need to create an **internal variable** using the internal **variable management** interface:

* You want to **retrieve elements** available on your web pages, but they **do not** have **external variables** implemented by technical staff (for example: the value of a cookie, HTML tag, URL, etc.).
* You want to **create a new variable** based on the values of **external variables already implemented** by technical staff (for example: calculating the cart’s total before tax using the external variable that returns the cart’s total including tax).
* You want to create a lookup table based on an external variable (for example: when the external “country” variable is “FR”, you send an account number to your analytics tool that is different from when the variable is “IT”).
* Etc.

The link created between the internal variables and the solutions is called “**mapping**“. This is performed in the “**EDIT**” tab during the container deployment process.

## Types of internal variables

There are **two types** of internal variables: **predefined** and **custom**.

* Predefined internal variables, have already been created and are ready to use (e.g. variables that retrieve URL fragments).
* You can also configure your own internal variables, using pre-existing variables (e.g. external variables) or retrieving elements available on your sites’ pages (e.g. cookies).

To declare a predefined internal variable, click "**Data Management**” > "**Web Datalayer**" > “**Internal Variables**” > “**ADD PREDEFINED VARIABLE**”:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/ADD_PREDEFINED_INT_VAR.png)

<figure><img src="/files/1NHzacW7KvLf1bgRrLhX" alt=""><figcaption></figcaption></figure>

You will then be prompted to select a predefined variable universe.\\

<figure><img src="/files/Jt91yLeVnZx1xFBXxq05" alt=""><figcaption></figcaption></figure>

The “**add variable**” window contains various fields:

<figure><img src="/files/S1WFdFhfaCBsvQQN9Sys" alt=""><figcaption></figcaption></figure>

“**Predefined universe**“: Selection of predefined internal variable categories

“**Name**“: Variable’s name

“**Description**“: Variable’s description

“**Code**“: Variable’s code

**Checkbox**: The selection of predefined internal variables to add to the container (it is futile to include variables you do not wish to use).

**Four predefined variable universes (“Predefined universe”) are available:**

* **Common variables**: The most used variables by both Commanders Act consultants and customers.
* **Customer journey variables**: Variables that exploit the visitor’s customer journey (prerequisite: the "deduplication" module must be activated).
* **AT Internet plugin:** Variables that exploit data collected by the AT Internet digital analytics solution (prerequisite: the AT Internet solution must be present on your site).
* **Partner tags:** Code snippets adapted and adaptable to partner tags to increase their potential and perform additional actions.

## Add build-in internal common variable

You will find below a list of the variables available in the “**Common variables**” category and their description

**Page title:** it stores the title of the page (from the \<title> html tag).[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/PAGE_TITLE_INTERNAL_VAR.png)

*Example:*

*The value of this variable (on the <http://www.tagcommander.com/fr/>) page will be “Commanders Act – Tag Universel – Tag Management – Commanders Act”. It takes the value of the html \<title> tab.*

\*\*\*

**Page URL:** it stores the URL of the current page.[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/PAGE_URL_INTERNAL_VAR.png)

*Example:*

*The value of this variable for the “<http://www.tagcommander.com/fr/”> page will be “<http://www.tagcommander.com/fr/”>*

\*\*\*

**Previously Visited URL:** it stores the URL of the previous page

*Example:*

*If the visitor arrives at the Commanders Act site via the Google search engine, the value of this variable will contain “google.fr”*

\*\*\*

**Page URL without query string:** it stores the URL of the current page without the tracking parameters (Commanders Act will remove the “?” from the URL and everything after it.

*Example:*

*If the visitor is on the page “<https://www.google.fr/webh&#x70;**?**&#x74;ab=ww\\&ei=-ATjVPTyFaWqywOpqoHYDw\\&ved=0CAcQ1S4#q=inurl\\&start=10″>, the value of this variable will be “<https://www.google.fr/webhp”>*

\*\*\*

**Page query string only**: it stores the the current page’s URL parameters (Commanders Act a will save everything that follows the “?” without including it).

*Example:*

*If the visitor is on the page “<https://www.google.fr/webh&#x70;**?**&#x74;ab=ww\\&ei=-ATjVPTyFaWqywOpqoHYDw\\&ved=0CAcQ1S4#q=inurl\\&start=10″>, the value of this variable will be “tab=ww\&ei=-ATjVPTyFaWqywOpqoHYDw\&ved=0CAcQ1S4#q=inurl\&start=10”*

\*\*\*

**URL parameters:** it stores the current page’s array of URL parameters.

*Example:*

*If the visitor is on the page “<https://www.google.fr/webhp?**tab**=ww&**ei**=-ATjVPTyFaWqywOpqoHYDw&**ved**=0CAcQ1S4#q=inurl\\&start=10″>, this variable will contain the value of these three parameters: “tab”, “ei” and “ved”, and their values will be accessible in the following manner: “tc\_array\_url\_vars\[‘tab’]”, “tc\_array\_url\_vars\[‘ei’]” and “tc\_array\_url\_vars\[‘ved’]”*

\*\*\*

**Folder #1 in URL:** it stores the First “folder” in the current page’s URL

*Example:*

*If the visitor is on the page “<http://www.tagcommander.com/**fr**/fonctionnalites/tag-management”>, the value of this variable will be “fr”.*

\*\*\*

**Folder #2 in URL:** it stores the second “folder” in the current page’s URL

*Example:*

*If the visitor is on the page “<http://www.tagcommander.com/fr/**fonctionnalites**/tag-management”>, the value of this page will be “fonctionnalites”*

\*\*\*

**Folder #3 in URL:** it stores Third “folder” in the current page’s URL

*Example:*

*If the visitor is on the page “<http://www.tagcommander.com/fr/fonctionnalites/**tag-management**“>, the value of this variable will be “tag-management”*

\*\*\*

**Random value(integer 9 digits):** it creates and stores a random number composed of 9 digits

*Example:*

*With each pageview/loading of this variable, the variable will return a random 9-digit number; for example, “255103492”*

\*\*\*

**URL pathname without query string /…/…/….html:** it stores the current page’s URL without the parameters (including the “/”)

*Example:*

*If the visitor is on the page “<https://www.google.f&#x72;**/webhp**?tab=ww\\&ei=-ATjVPTyFaWqywOpqoHYDw\\&ved=0CAcQ1S4#q=inurl\\&start=10″>, the value of this variable will be “/webhp”*

\*\*\*

**Https protocol? “yes”/”no”:** Sends “yes” if the page uses the “https” protocol and “no” if it does not

*Example:*

*If the visitor is on the page “**https**://[www.google.fr/webhp?tab=ww\&ei=-ATjVPTyFaWqywOpqoHYDw\&ved=0CAcQ1S4#q=inurl\&start=10″](http://www.google.fr/webhp?tab=ww\&ei=-ATjVPTyFaWqywOpqoHYDw\&ved=0CAcQ1S4#q=inurl\&start=10″), the value of this variable will be “yes”*

\*\*\*

**Current domain name ([www.domain.com](http://www.domain.com)):** it stores the current page’s domain name

*Example:*

*If the visitor is on the page “<http://www.tagcommander.com/fr/fonctionnalites/tag-management”>, the value of this variable will be “[www.tagcommander.com”](http://www.tagcommander.com”)*

\*\*\*

**Main domain name without subdomains:** it stores the current page’s domain name without the subdomains

*Example:*

*If the visitor is on the page “<http://www.tagcommander.com/fr/fonctionnalites/tag-management”>, the value of this variable will be “tagcommander.com”*

\*\*\*

**Unix timestamp:** Current UNIX time (the number of seconds since January 1, 1970 00:00:00)

*Example:*

*The current UNIX time when this document was written was “142166467”*

\*\*\*

**Device:** This variable provides information regarding a user’s device based on their screen resolution.

## Adding built-in customer journey internal variables

You will find below a list of the variables available in the “**Customer journey variables**” category and their corresponding description:

Last touch name (channel): Channel of the last touchpoint saved (prerequisite: deduplication must be active on your site).

*Example:*

*For customer journey “SEO/Google -> SEM/Bing -> **Display**/Criteo” the value of this variable will be “Display”.*

\*\*\*

Last touch name (source): Source of the last touchpoint saved (prerequisite: deduplication must be active on your site).

*Example :*

*For customer journey “SEO/Google -> SEM/Bing -> Display/**Criteo**” the value of this variable will be “Criteo”.*

## Adding customer internal variables

You can create your own internal variable in **two** ways:

* Via the “**Builder**” tab: The “**Builder**” mode assists you in creating customized internal variables without any technical knowledge or expertise;
* Via the “**Custom**” tab: “**Custom**” is a completely customized mode used to write your own JavaScript code. This method requires technical knowledge and expertise (but your **Commanders Act consultant** or **support** team can create custom variables for you if necessary).

To create your own internal variable, click "**Data Management**” > "**Web Datalayer**" > “**Internal Variables**” > “**ADD VARIABLE**”:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/ADD_CUSTOM_INT_VAR.png)

<figure><img src="/files/HVDD1Mm9KhTwsttiyequ" alt=""><figcaption></figcaption></figure>

The “**add variable**” window contains various fields:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/CUSTOM_INTERNAL_VINT_CONFIG.png)

<figure><img src="/files/GUVxa8QkuRhdKc9MStOu" alt=""><figcaption></figcaption></figure>

“**tC.internalvars.**“: The variable’s name (caution: it must not contain any accents or special characters, especially “-“).

*Note: The variable’s name is always prefixed by “tC.internalvars.” in order to avoid conflict with other variables on your site. For example, to see the content of an internal variable directly on your site or use a variable on another site, do not forget to specify the full name of the variable, which includes the prefix “tC.internalvars.” along with the variable’s name.*

“**Builder**“/”**Custom**“: Select “Builder” or “Custom” creation mode

Area to create the variable (see details below for the Builder and Custom modes)

“**Type**“: The type of variable. Please refer to the article “Managing Variable Types“.

“**Description**“: A description of the variable, to clarify the variable’s name (e.g. “Product IDs separated by a /” can be the description of the variable named “tC.internalvars.concatid”)

“**Detailed description**“: A detailed description of the variable, to further clarify its name (e.g. “ID1/ID1/ID2…” can be the description of the variable named “tC.internalvars.concatid”)

### Builder mode

The “**Builder**” mode offers you three types of operations (1) that we describe below:

* “Join internal and/or external variable(s)”;
* “Join two-dimensional array variable(s)”;
* “Variable mapping”.

  <figure><img src="/files/DJvN5nFjhPfcTPQsK5L8" alt="" width="563"><figcaption></figcaption></figure>

#### **Join internal and/or external variable(s)**

This operation allows you to **join** internal or external **variables** with the **separator** of your choice.

*Example:*

*If you wish to join an external variable returning the order ID with another external variable returning the order amount, with everything separated by a “-“, select the “order\_id” variable in the “External variables” tab to the left and then enter and add your separator in the “add separator” field in order to finish the “order\_amount” variable in the “External variables” tab.*

<figure><img src="/files/m3QoseRWZbJsyxTns3dp" alt=""><figcaption></figcaption></figure>

#### **Join two-dimensional array variable(s)**

This operation allows you to join the array keys of a “**Two dimensional array**” variable.

*Example:*

*Your retargeting provider wants you to send all the prices of the products added to the cart separated by “|”. Begin by selecting the variable that contains the product information on the cart page (here the “user\_id” variable) (1), then the “order id” variable (here the “order\_confirmation\_id” key) and the separator “|”. For example, the value obtained might be: “<user@mail.com>|123456789AB”.*

#### **Variable mapping**

This operation allows you to create a lookup table for an input value (via an already existing internal or external variable) and an expected output value.

*Example:*

*You want to send a different account ID to your Digital Analytics solution depending on the work environment (pre-prod or prod). Select your reference variable (here the external variable “env\_work”), add its different input values in the “INPUT” field (e.g. “pre-prod” et “prod”) and then add the output account IDs of your analytics solution in the “OUTPUT” field. You can also add a default value if none of the values entered in the “INPUT” field have been foundj,yècr èuc.*

<figure><img src="/files/1wIQ9j2RqjzSBMTzZdeA" alt=""><figcaption></figcaption></figure>

*This operation allows you to automatically send the correct account ID to your analytics solution depending on the work environment.*

### Full custom mode

The “**Custom**” mode allows you to write your **own JavaScript** code to create the internal variable of your choice:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/CUSTOM_VAR.png)

<figure><img src="/files/pHyLcYkFOJ9suOyZWAWK" alt=""><figcaption></figcaption></figure>

Note: make sure that the variable’s JavaScript code always has the following syntax:\
`tC.internalvars.nameVariable = "yourCode";`

Also, make sure that **nameVariable** has the same name as the variable entered in the “**tC.internalvars**” field (see first screenshot with the variable **tC.internalvars.my\_custom\_var**):

Note: To avoid potential errors when the internal variable’s code is included, the “**TEST**” step of the container deployment process will test your internal variable on multiple browsers/operating systems.

## Managing variable types

The variable “**type**” (also called “**processing function**“) allows you to modify the variable format on the fly when mapping your tags.

They are useful when one of your solutions requests a variable format different from the format that you return in your **internal variable**. For example, if your “order\_discount” variable contains three decimal places, the processing functions will allow you to correct this so that your solutions receive the value with only 2 decimal places.

The most commonly used types are:

* **Order amount**: this allows you to modify the number format (amount) on the fly.

You can change separating commas into periods (e.g. “12,50” becomes “12.50”), choose the number of decimal places to retain (e.g. “12.50 becomes “12.5”), or convert the amount into pennies (“12.50 becomes “1250”).

* **Alphanumeric & Special chars**: this allows you to modify the character string format on the fly.

You can replace special characters with “\_” (e.g. “the company\&its values” changes to “the company\_its values”) or truncate a character string (e.g. limiting the variable’s value to 10 characters)

After assigning a variable type, you can modify its value on the fly, tag by tag, in the “EDIT” interface. Variables with a type added will have a blue symbol in front of their name:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/INT_VAR_LINK.png)

<figure><img src="/files/6QATwYLO48huvgw7M28B" alt=""><figcaption></figcaption></figure>

Once you have mapped your variable, click the link symbol:

<figure><img src="/files/2opoGx8m4NzZIZqbrASd" alt=""><figcaption></figcaption></figure>

A window will appear with a list of different operations corresponding to the type chosen. Check the operation you want (for example, encode an email in sha256) and click “**SAVE**”)[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/INT_PROSS_FUNC.png)

<figure><img src="/files/t1kuzuG8nbHkG1lM7Y7j" alt=""><figcaption></figcaption></figure>

## Categorizing internal variables

Since you can create a variable using other variables, it is important for you to be able to manage the order in which they are executed so as to avoid any problems.

Therefore, you must declare an internal variable A, on which an internal variable B is based, before variable B. Variable B needs variable A declared first in order to be executed without creating errors.

The variables’ order can be modified using the double-arrow icon:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/VINT_CATEGO.png)

<figure><img src="/files/HoUVlfl95So9yLm7wHoA" alt=""><figcaption></figcaption></figure>

To categorize an internal variable you must :

* Click the edit button (pencil icon to the right in the same row where the internal variable is located) and select the type from the drop down menu as depicted below. This applies **only** when you add a predefined variable.

  <figure><img src="/files/3vKQMteh6FWy8yH0QhAB" alt=""><figcaption></figcaption></figure>
* Select the type when you add a custom variable, whether with the “**Builder**” or ‘**Full Custom**” mode. (Similar window as the one above).

## Declare an internal variable in a container

You can link an internal variable to a container if you have multiple containers on your site.

By doing this action, you declare just once the internal variable code in the linked container(s).

Consequences:

* You reduce the weight of the other containers by avoiding to declare many times the code of one single internal variable.
* If you call 2 containers on the same page, you avoid to overwrite the variable value defined in the first container by the value defined in the second container (if the value can change during the page load)

Example: two containers are on the same page, one in the header and one in the body. If you link an internal variable to the header container you will reduce the code of the page as the variable won’t be declared twice, and keep the value of the variable defined in the header.

To link an internal variable to a container, select the container of your choice when you create or modify your variable in the “Declared in container” field:

<figure><img src="/files/0xX82BkjlHV8Pu2ySDga" alt=""><figcaption></figcaption></figure>

To realize a bulk action on multiple variables, check the variables of your choice, then choose the container(s) in the list:

<figure><img src="/files/3DtnUrePxyJDcFEx6xGN" alt=""><figcaption></figcaption></figure>


# Event variables

**Event variables** are the variables present in **Commanders Act browser-side events**. They are used primarily for tracking **user actions** (button clicks, links, etc.).

Event variables are useful if you want to send data specific to an event without having these data on your site pages as external variables.

Example: you wish to assign an event for the “**Send**” button on your form. The **event variables** could be the user’s last name, first name, email address and telephone number. These are data that are not available when the page is loaded; it only becomes available after the user has completed the fields on the form and clicked “Send”.

Event variables must be added in the Commanders Act interface before they can be used, and only for events, not tags.

**Event variables** must be created in the Commanders Act interface before they can be used in an event. See the “Adding event variables” article to find out how to create an event variable in the interface.

All event variables created can be used:

* To add information to the solutions embedded in Commanders Act (linking event variables and solutions is called mapping). See the “Mapping Tags’ Variables” article to find out how to **map** your variables in an event.
* To create activation rules for your events. See the “Adding Rules” section to find out how to create rules based on your event variables.

Additional information

**Event variables** must be implemented in the Commanders Act event function (**tC.events**).

Note: External variables that are already available on the page do not need to be implemented in your event. For example, you **do not** need to assign a “country” variable to an event if this information is **already** **present** in an **external variable**.

Here is an example of an event variable:

```
<a onclick="addtocart(0);{tC.event.addtocart(this, {'productID':123, 'user_email':'john@mail.com'})}">Add to cart</a>
```

## When to add an event variable

There are two situations in which you may need to declare your variables in the event variable management interface:

* You want to implement Commanders Act events on a new site. The variables that your technical staff or technical provider implement in the site’s source code (in the tC.events function) must be declared in the interface first in order to be available to be added to your tags and rules.
* Variables are for your current event functions are missing or you want to add a new event to your site. Again, this variable must be declared in the interface first before it can be used in your tags and rules.

## Adding event variables

To add an event variable, you must go to the "**Data Management**” > "**Web Datalayer**" > “**Event Variables**” and click “**ADD VARIABLE**”:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/ADD_EVENT_VAR.png)

<figure><img src="/files/2Blr50Fw29fIQ7VplUmI" alt=""><figcaption></figcaption></figure>

The “**add**” window consists of the following elements:

<figure><img src="/files/mBPZEf99hlcpJv8XwKil" alt=""><figcaption></figcaption></figure>

“**Name**“: the variable’s name (mandatory field)

“**Type**“: the variable’s type

“**Description**“: A description of the variable, to clarify its name (e.g. “Page template” can be the description of the variable named “env\_template”)

“**Detailed description**“: A detailed description of the variable, to further clarify tits name (e.g. “possible values: homepage/category/product/funnel\_confirmation” can be the detailed description of the “env\_template” variable)

## Editing or deleting variables

You can edit an internal variable by clicking the “**Edit**” icon and delete it by clicking the “**X**”:

<figure><img src="/files/5dKKu7aNAxLDv4ztyr6u" alt=""><figcaption></figcaption></figure>


# Data storage

Commanders Act **Data Storage** is a **cookie** stored on the user’s **browser**.

When you create data storage in the Commanders Act interface, a cookie with the same name is stored on the visitor’s browser. Data storage allows you to make use of the data it contains. Its use is described in the next articles in this section.

**Data storage** is useful for continually **storing data** about a visitor from one page to the next, from one visit to the next or for a **defined period of time** up to one year.

It is a **cookie** that **stores** **data** and allows to use it afterwards in many ways. Its uses are detailed in other articles in this section.

Additional information

Data storage that you create in the interface are **first-party cookies**, which are cookies set for **your site’s domain name**.

## Data storage usage

You can use the function below to see the content of data storage created for one of your site’s pages:

`tC.getCookie('cookie_name')`

You can use the following function to create **custom data storage**:\
\
`tC.setCookie('cookie_name', 'value', 'expiration')`

## Adding data storage

To add **data storage**, you must go to the “**Options**” tab > “**Data layer**” > “**Data Storage**” and click “**ADD DATA STORAGE**”:

<figure><img src="/files/KDWvCY5fB2ZIuklTrlEH" alt=""><figcaption></figcaption></figure>

The “**add**” window consists of the following fields:

<figure><img src="/files/N32Vf2Pw14i67SFz0VZQ" alt=""><figcaption></figcaption></figure>

**Name**: Name of the Data Storage\
**Container(s) to link:**&#x41; menu that unfolds and shows all available containers\
**Lifetime:** A menu to select the cookie’s lifetime\
**Type:** the type of cookie/what it is used for\
**Value:** the values the cookie will take (a and b for ab testing, many more for n testing …)

## Types of data storage

### **Unique ID**

Generates a unique ID for each visitor.

*Example: Commanders Act can become your visitors’ unique reference ID to replace or enrich the ID generated by your partner solutions.*

<figure><img src="/files/FDK8uIysrH79O2Hom6r5" alt=""><figcaption></figcaption></figure>

The “Do you want lifetime to be refreshed at each page view?” option changes the data storage’s lifetime based on the frequency of visits to the site. This option refreshes the data storage lifetime with each page view.

*Example: you have set the data storage lifetime to 30 days and checked this option. If a user visits the page at 12 p.m. on 05/01/2015, the cookie will remain on the visitor’s computer until 12 p.m. on 05/31/2015, i.e. 30 days later. The cookie’s lifetime will refresh with each page view.*

### **URL parameter saver**

Saves the value of a URL parameter.

*Example: if you want to save the value of the “utm\_source” parameter, i.e. “google” in the URL <https://www.site.com/landing?utm\\_source=google\\&utm\\_medium=cpc>, you must enter the name of the parameter to save, which in this case would be “utm\_source”*[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/DS_URL_PAR_SAV.png)

<figure><img src="/files/fuOPiEg8UPHrKHGFPjrS" alt=""><figcaption></figcaption></figure>

### **Scoring on page views**

Assigns a score based on the number of page views.

*Example: if you want to assign the score of “A” to visitors visiting 1 to 3 pages, a “B” to visitors visiting 4 to 7 pages and a “C” to visitors visiting 8 to 11 pages, you must enter the different ranges of page views and indicate each range’s score. The data storage value will be the score (A, B or C).*[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/DS_SCORING_PV.png)

<figure><img src="/files/qhUhMEW0hOQa9LTBy2np" alt=""><figcaption></figcaption></figure>

### **Page views counter**

Saves the number of page views for a given visitor.

*Example: you can use this data storage type if you want to save and send the user’s number of page views to one of your solutions or define a tag’s activation on the number of page views. Just select the “page views counter” data storage type, and the cookie’s value will increase automatically with each page view (1 page view: cookie value = “1”, 2 page views: cookie value = “2”, etc.)*[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/01/DS_PV_COUNTER.png)

<figure><img src="/files/HMdIteRjYTbHcBEnGM4h" alt=""><figcaption></figcaption></figure>

### **A/B testing**

Creating two visitor populations split 50/50.

*Example: if you want to activate solution A for 50% of your visitors and solution B for the remaining 50%, all you need to do is indicate the data storage values for population A, “vendor\_A” for example, and population B, “vendor\_B”.*

<figure><img src="/files/Fli5frA1A0vB25YNk8eq" alt=""><figcaption></figcaption></figure>

*You will then be able to create a rule during the deployment process in the “Rules” section that activates solution A’s tags when the data storage value is “vendor\_A”, and solution B’s tags when the value is “vendor\_B”.*

*Note: this method is used regularly for A/B tests of two competing retargeting solutions.*

### **N testing**

Creating N visitor populations of equal size.

*Example: if you want to launch an N test for 3 competing solutions, each solution will be assigned 33.3% of the traffic (100%/3); for 4 solutions, each solution will be assigned 25% of the traffic (100%/4), and so forth.*

*If you decide to activate solution A for 33.3% of your visitors, solution B for another 33.3% and solution C for the remaining 33.3%, you must enter the data storage value in each case. For example, “vendor\_A” for solution A, “vendor\_B” for solution B and “vendor\_C” for solution C (1). Each value must be separated by a comma in order to be processed.*

<figure><img src="/files/Udu88MwZoW8rMq4icEoi" alt=""><figcaption></figcaption></figure>

### **Variable Saver**

Saves a variable’s value.

*Example: if at some point you want to save a Commanders Act data layer variable or any other JavaScript variable present on the page, you must enter the name of the variable to save.*

*For example, data storage allows you to save visitors’ user\_id variables in order to recognize them if they return several days after leaving your site. To save the user\_id variable value, you must enter “tc\_vars\[“user\_id”]” or “tc\_vars.user\_id” (both formats are accepted) in the “Variable to save” field (1). If you want to save the value of an internal variable, you must enter the value using the following format: tC.internalvars.variable\_name.*

<figure><img src="/files/ybhCl3wmeXOBDcg2Hu7e" alt=""><figcaption></figcaption></figure>


# Deduplication

**Deduplication** is the conditional activation on the confirmation page of a website, of the tag(s) responsible for the conversion.

This activation is possible by capturing and reading the **parameters** of your **tracking** **URLs** through TagCommander.

Within our interface, tags can be deduplicated with configurable rules depending on their position throughout the **customer** **journey**: at the beginning, at the end, or anywhere.

For example, if before converting on your site a user saw and clicked a banner served by your retargeting partner, you can set up a rule to call only that partner’s confirmation tag on the confirmation page.

The deduplication module in Commanders Act is included in your **Commanders Act** offer.

It allows you to create rules to fire confirmation tags (mostly but not only) based on:

* A digital **marketing** **channel** (SEM, Display, Retargeting, Affiliation, etc).
* A **traffic** **source** linked to that channel (digital marketing solutions such as Criteo, Netaffiliation, Marin, Tradedoubler, etc).
* The position of the **touchpoint** throughout the **customer** **journey**.
* Whether a **click** or **impression** – or both – are involved.

**Note:** Channel and source information is read and captured from the parameters in your tracking URLs if you use our “Commanders Act TMS” product only. However, if you have subscribed to other options of our platform (like “Enrichment”), you can use Commanders Act redirects, in which case there would be no URL parameter capture.

There are many **benefits** from activating the deduplication module:

* Preserving information confidentiality: by activating solely the tag of the partner responsible for a conversion, you limit information leakage about your sales, leads, order amounts, among others, to all your providers, and communicate only what pertains to a specific conversion generated by a specific solution to that very partner.
* Saving time: Commanders Act’s deduplication module allocates conversions to partners in real time, helping you save time and not having to allocate conversions manually afterwards from information obtained through reports generated by your analytics tools and your partners.

{% hint style="warning" %}
If your are using an external CMP (else than Commanders Act CMP) please refer [to this page](/features/consent-management/setup-guides/using-a-third-party-cmp-with-commanders-act) to remains compliant RGPD
{% endhint %}


# Setup guide

## Prerequisites

Before you begin creating deduplication rules in the interface, you should define the following things and inform your Commanders Act consultant:

* The **digital marketing channels** you wish to include in the configuration of the deduplication interface. Commanders Act allows you to configure natural and paid channels to take into account for the deduplication rules.
* The **“*****cookie window*****” (*****lookback window*****)** settings you wish to configure for every channel: information on the channels that drove a user to your site are stored in a cookie whose lifetime usually is of 30 days. You can, for example, set it to 15 days for channel A and 30 days for channel B.

Setting deduplication rules is a **two-step** procedure:

1. Defining and configuring channel and sources recognition in the interface.
2. Applying deduplication and other rules to activate tags according to your needs.

/!\ If you wish to track impressions, you need to make sure a Commanders Act subdomain has been created for you and have your account manager confirm that the feature is enabled. Please note that setting up the subdomain and tracking impressions with our pixel is a paid service.

## Defining channels and sources

1. Go in the menu "Data Management" > "Web Datalayer" > "Deduplication Channels"

   <figure><img src="/files/je5rW3NwMmnWz2RK9MgX" alt="" width="256"><figcaption></figcaption></figure>

The Channel Identification menu will open, then

1. Click the ADD CHANNEL button.
2. Your channel will be displayed afterwards in the channels list.

   <figure><img src="/files/eRJYozakWbEJdgmDhIIf" alt=""><figcaption></figcaption></figure>

When you click “ADD CHANNEL”, a new window will be displayed to allow you to configure a new paid channel (natural channels are set-up by default).

You can configure channels with one or more “channel” parameters and one or more “source” parameters (or no “source” parameters at all).

### Configuring a channel with a single "channel" parameter

1. In the window that opens after you click “ADD CHANNEL”, enter your new channel’s name (Display, Affiliation, Retargeting, etc) – this is only a label to identify it in the Channel’s list in the interface – and click “ADD CONDITION”.

   <figure><img src="/files/w4i1gUsFXd80pswmwqf0" alt=""><figcaption></figcaption></figure>

In the menu that appears (see below)(2), select the parameter that will store the information defining the channel (there are default parameters such as those used by Google Analytics, AT Internet as well as the possibility to add custom parameters)(2).

Select the condition (whether the value of the parameter matches or doesn’t match the value you are about to enter)(3).

Enter the value that will identify the channel (4). /!\ If a parameter’s value is made of more elements than the one you require, you need to use a star (\*) to indicate what chunk is to be considered. For example, let’s say you only need “Retargeting” in this parameter: utm\_medium=Retargeting-A1B3C3-crt. You need to write “Retargeting\*” (values are case sensitive):

[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/03/C.png)Click ADD (5) on the line of the channel declaration to confirm the creation of the condition.

Click SAVE (6) at the bottom, right-hand corner of the window.

<figure><img src="/files/fs7UssUqL0uwZeBlvwSk" alt=""><figcaption></figcaption></figure>

###

### Configuring a channel with a single "channel" parameter and a "source" parameter

1. In the window that opens after you click “ADD CHANNEL”, enter your new channel’s name (Display, Affiliation, Retargeting, etc) – this is only a label to identify it in the Channel’s list in the interface – and click “ADD CONDITION”.

   <figure><img src="/files/w4i1gUsFXd80pswmwqf0" alt=""><figcaption></figcaption></figure>
2. In the menu that appears, select the parameter that will store the information defining the channel (there are default parameters such as those used by Google Analytics, AT Internet as well as the possibility to add custom parameters).
3. Select the condition (whether the value of the parameter matches or doesn’t match the value you are about to enter).
4. Enter the value that will identify the channel.

/!\ If a parameter’s value is made of more elements than the one you require, you need to use a star (\*) to indicate what chunk is to be considered. For example, let’s say you only need “Retargeting” in this parameter:

utm\_medium=Retargeting-A1B3C3-crt

You need to write “Retargeting\*” (values are case sensitive):

<figure><img src="/files/2Cesz4ZnRp02tTmLcP1d" alt=""><figcaption></figcaption></figure>

1. Click ADD on the line of the channel declaration to confirm the creation of the condition.
2. Click the pencil icon next to “Source: Will not be captured” to modify settings for the source to be captured.

   <figure><img src="/files/dWBpRf3gioEEVap9iI1v" alt=""><figcaption></figcaption></figure>
3. Select the capture method:

   <figure><img src="/files/LhiVDnOV6zPhqaklLOYJ" alt=""><figcaption></figcaption></figure>

* Taking all: the entire value of the URL parameter containing the source will be captured. For example, if the parameter in the URL is: “?utm\_source=criteo” and you use “Taking all”, all the parameter’s value will be taken. In this case, “criteo”.
* Splitting: splits the parameter’s value and takes the block you want. For example, if the parameter in the URL is: “?utm\_source=retargeting|criteo|123456&(…)” and you use the setting depicted in the image below, you will obtain “criteo”.

  <figure><img src="/files/7rHItIH7EZq7nkmjO70m" alt=""><figcaption></figcaption></figure>
* Cutting: cuts a part of the parameter’s value and returns it. For example, if the parameter in the URL is: “?utm\_source=criteo&”, you will obtain “cri” with the setting below.

  <figure><img src="/files/NGsEFqBHtdIeK5yTTUO3" alt=""><figcaption></figcaption></figure>

1. Select the parameter containing the source that will be captured.
2. Save
3. Add the channel

   <figure><img src="/files/lzXU1LfxmZHoKop4mrmS" alt=""><figcaption></figcaption></figure>

This will allow you to have the tag fire depending on the value of the channel AND the value of the source.

### Configuring a channel with two or more "channel" parameters and a single "source" parameter

1. In the window that opens after you click “ADD CHANNEL”, enter your new channel’s name (Display, Affiliation, Retargeting, etc) – this is only a label to identify it in the Channel’s list in the interface – and click “ADD CONDITION”.

   <figure><img src="/files/w4i1gUsFXd80pswmwqf0" alt=""><figcaption></figcaption></figure>
2. In the menu that appears, select the parameter that will store the information defining the channel (there are default parameters such as those used by Google Analytics, AT Internet as well as the possibility to add custom parameters).
3. Select the condition (whether the value of the parameter matches or doesn’t match the value you are about to enter).
4. Enter the value that will identify the channel. Repeat these steps for as many possible combinations of parameters/values that could identify a channel. In the example below, if the utm\_medium parameter in the URL takes the values “Retargeting”, “rtg”, “RTG”, **or** “retargeting”, the channel called/labeled “Retargeting” (1) will be recognized.

**/!\\** If a parameter’s value is made of more elements than the one you require, you need to use a star (\*) to indicate what chunk is to be considered. For example, let’s say you only need “Retargeting” in this parameter:

utm\_medium=Retargeting-A1B3C3-crt

You need to write “Retargeting\*” (values are case sensitive):

<figure><img src="/files/2Cesz4ZnRp02tTmLcP1d" alt=""><figcaption></figcaption></figure>

1. You can also create conditions based on the “AND” operator. For example: if the UTM\_MEDIUM parameter’s values are “Retargeting” or “rtg” AND the UTM\_CONTENT’s parameter’s value is “email”, then, the Retargeting channel will be recognized (see second screenshot below).

   <figure><img src="/files/mZ0zPqjvYPtLDFpJs7Hl" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/m6N1jySH1X7y9ZLDKFyw" alt=""><figcaption></figcaption></figure>

If you wish to base your conditions on sources too (B), for every condition defining a channel, you will need to select a source.

When everything is setup, click ADD in the bottom, right-hand corner of the window.

### Configuring condition groups with multiple "channel\[s]/source\[s]" combinations

In order to create groups of conditions combining “blocks” made of multiple channel+source parameters, follow the steps in C) (above), according to your needs. When you have created your first “block”, click the “ADD CONDITION GROUP” button to create a new set of parameters to be configured (1).

In the example below, the *Retargeting* channel will be recognized by the interface when either of the two conditions\* is met.

**\*Condition 1:** if utm\_medium = “retargeting” **or** “rtg” and the source is captured and matches the configured value (said value is configured in the [rules](#setting-up-deduplication-rules) step).

**OR**

**\*Condition 2:** if utm\_medium = retargeting **and** utm\_medium = email and the source matches the configured (said value is configured in the [rules](#setting-up-deduplication-rules) step).

<figure><img src="/files/krqk3fvanVPvZtS8IkzQ" alt=""><figcaption></figcaption></figure>

Note:

You can select the default parameters (below) but also enter custom parameters or use the “Advanced” option to add custom JavaScript.

<figure><img src="/files/RdXtkY4bASi62KXdRJ6R" alt=""><figcaption></figcaption></figure>

Example of custom parameter: “gclid” (SEM)

When you connect Google Adwords and Google Analytics, Google allows you to automatically link your two accounts by adding the “gclid” tracking parameter in your URL. This parameter replaces “utm\_source = SEM” and indicates that traffic is SEM-originated. You can use a custom parameter to set this up.

<figure><img src="/files/Jlg0kC50Mj897FoPGHhH" alt=""><figcaption></figcaption></figure>

When your channels and source-capturing methods are defined, you will return to the channel list and options.

### Configuring a channel based on MixCommander Tracking

You just need to write the iD values available on Mixcommander side. For each value you have to declare a channel. For example for the channel AFFILIATION, you have to create as many channels as IDs available on the mapping table ("Affiliation", "aff", "affiliate"). That's why it's very important when you create a campaign to use always the same id. Example : chn=affiliation.

<figure><img src="/files/GYMNFBl2LZjhpZ3yTstL" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/4lmxEuYphZcri15CBgQh" alt=""><figcaption></figcaption></figure>

### Channel prioritization and cookie window configuration

**Channel prioritization**

You can change the order of paid channels and move them up and down according to the priority you want to give to each one of them. Channels are detected in the exact same order they are listed in the interface and do not exclude each other. So, in the event in which two or more conditions are true, the last condition will be taken into account.

For example, if you have two channels (Email Retargeting and Retargeting) configured as below.

**Email Retargeting**

<figure><img src="/files/0MhHJUS5zzJxiVIzbQS8" alt=""><figcaption></figcaption></figure>

**Retargeting**

<figure><img src="/files/f9b3NRrOTKncsiHIyYuQ" alt=""><figcaption></figcaption></figure>

The interface will only pay attention to the last condition (if utm\_medium = retargeting) and will ignore the rest.

So if you have channels sharing one or more conditions, it is necessary that you place the channels with the least conditions first and those with the most conditions at the bottom of the queue so that all conditions are taken into consideration.

To reorder the channels, please use the handles to the left of the channel’s label.

<figure><img src="/files/Oc7vs4ankow9FphJdtLK" alt=""><figcaption></figcaption></figure>

**Cookie Window Configuration**

1. You can change the order of paid channels and move them up and down according to the priority you want to give to each one of them.
2. Check this box if the channel considers clicks.
3. Define the lifetime to the cookie storing click information (in number of days).
4. Check this box if the channel considers views.
5. Define the lifetime to the cookie storing views information (in number of days).
6. Define the number of touch points you want to store in the deduplication cookie. You can store no less than ten and no more than 50. The larger the amount of touchpoints, the heavier the cookie’s weight.
7. Enter the keywords for SEO brand identification, the full word or part of if (you can choose between “*contains*” or Regex). Declaring keywords is useful to differentiate branded and unbranded SEO in case one of both should be taken into consideration in the deduplication rules. Since some browsers, such as Google, have ceased to provide keywords – this is referred to as “not provided”-, the branded and unbranded SEO distinction is less complete than it used to be.
8. Add more keywords if necessary.
9. See the list of your keywords and how they are captured.
10. Configure your impression tracking pixel’s URL by replacing Channel with one of the channels you created and source with the desired parameter value.

    <figure><img src="/files/RlOFvrH9yJ3K5y67wDDL" alt=""><figcaption></figcaption></figure>

/!\ If you wish to track impressions, you need to make sure a Commanders Act subdomain has been created for you and have your account manager confirm that the feature is enabled. Please note that setting up the subdomain and tracking impressions with our pixel is a paid service.

For more information on these fees please contact your account manager. For more information about Commanders Act’s view pixel, please refer to the “Tracking impressions” and “Structure of Commanders Act's impression pixel” articles.

## Setting up deduplication rules

When your channels are defined in the interface and you have specified whether the parameter storing the source of traffic will be considered or not to launch a tag, you will need to go to the “RULES” step in the Commanders Act TMS interface.

Set-up your deduplication rules by following these steps:

1.When on the RULES step, click the “Deduplication” button on the menu to the left.

<figure><img src="/files/ZxrbVy5IszU7zWYv0SKf" alt=""><figcaption></figcaption></figure>

2.In the new window, click “ADD DEDUPLICATION RULE” to open the rule configuration window. If you click “MANAGE CHANNEL(S)” you will be taken to the Channel Identification interface again\
[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2016/03/S.png)3.When the window opens, select the tag on which you wish to apply a rule from the dropdown menu.Please note: Deduplication is used on confirmation tags only.

4.Select the touchpoint’s position in the customer journey (beginning, end, anywhere).

* First refers to the first touchpoint at the **beginning** of the customer journey (SEM/Google in the illustration below). A rule based on this position would call Google’s tag on the confirmation page and allocate the conversion to it.
* Last refers to the last touchpoint before the conversion, at the **end** of the customer journey (if we consider paid traffic, it would be RETARGETING/Criteo in the image below, and Direct Access overall). A rule based on this position, would call Criteo’s tag on the confirmation page and allocate the conversion to it.
* Any refers to any place throughout the customer journey (in the example below, all paid traffic solutions contributing to the conversion would be called on the confirmation page. That is Google, Tradedoubler and Criteo).\\

  <figure><img src="/files/IBZ1aSOpgHKWsE0miuAz" alt=""><figcaption></figcaption></figure>

5\. Select the nature of the touch point (click, view or both) you wish to include in your conversion attribution rules. For example, if you wish to consider only clicks, check that box and leave the view box unchecked. If you wish to consider them both, you should check both boxes.

6\. Select your channel(s) (you must declare them first in the Channel Identification section; you can select more than one channel).

7\. Select whether it corresponds or not to your channel.

8.State whether the source is ignored or (if you configured it to be captured in the channel identification interface) not. If not, define if all or only a part of it will be captured and if it has to match or not a certain value.

9.Enter the value of the parameter that will be compared to what was set in the interface, during the channel identification step, when you chose to capture the source.

10\. Click “ADD” to add the rule.

<figure><img src="/files/3sMjhuCWrAoLS2kgA6Sb" alt=""><figcaption></figcaption></figure>

After you create your rules, they will appear in the rules summary.

If your wish to edit a rule, click the pencil icon to the right on the line of each rule. If you wish to delete it, click the trash can.

<figure><img src="/files/O0IFDZVLr6HotQHvf5Kk" alt=""><figcaption></figcaption></figure>

The rules summary interface has a Deduplication column. A check mark will indicate what tags are deduplicated.

<figure><img src="/files/e8sdZGc3t0Hy0vsorMhX" alt=""><figcaption></figcaption></figure>

## Adding tags necessary to the proper operation of the deduplication module

In order to enable the deduplication module, you will need to place the “Commanders Act – Get dedup cookie” and “Commanders Act– Reporting Deduplication v1.2” tags inside your container.

**The “Commanders Act – Reporting Deduplication v1.2” tag**

The “Commanders Act – Reporting Deduplication v1.2” tag allows you to collect conversion-related data (order ID and amount) and display it in the “By Tag” and “By Conversion” deduplication reports explained [here](https://community.commandersact.com/en/category/manage/deduplication/deduplication-reports/).

You will then need to go to the tag library and add the tag to the container you placed in the confirmation page(s).

In the “Edit” section, map the “Commanders Act – Reporting Deduplication v1.2” tag with the corresponding variables from your data layer:

* \#TCIDORDER# (mandatory field) must be mapped with the data layer variable that collects the conversion ID (ex: tc\_vars\[“order\_id”]).
* \#TCAMOUNTORDER# (optional field) must be mapped with the data layer variable that collects the conversion amount (ex: tc\_vars\[“order\_amount”]). Whether you collect the order amounts excluding taxes or all taxes included is your choice.

  <figure><img src="/files/vjUAGvgwhYZ68EyF1eUZ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/u9ufNUPZsvvJKU1l0rK8" alt=""><figcaption></figcaption></figure>

In the “Rules” section, add a condition to your “Commanders Act – Reporting Deduplication v1.2” tag to call it only on your website’s confirmation page(s) (“confirmation page” perimeter).

<figure><img src="/files/wQsNrMD7CIVmyTNEKy1v" alt=""><figcaption></figcaption></figure>

**The “Commanders Act – Get dedup cookie” tag**

***Important note**: Before adding this tag, you need to make sure that a “commander1.com” subdomain has been added to your account from the “Admin”>”Domain management” interface (only administrators have access to this area). If the subdomain has not yet been created, please contact our support department (<support@commandersact.com>).*

The “Commanders Act – Get dedup cookie” tag lets you retrieve all the touch points from a user’s customer journey. These touch points are collected on the “commander1.com” subdomain that is associated to your account. This tag is indispensable if you track impressions for your deduplication rules.

Go to the tag library and add the tag to the container you placed in the confirmation page(s).

In the “Edit” section, make sure that the tag does indeed call your “commander1.com” subdomain (scriptElt1.src = “//domain.commander1.com/dg3/”). If it is not the case, please contact our support department ([support@commandersact.com](mailto:support@tagcommander.com)). No additional configuration is required for this tag.

<figure><img src="/files/MdvE5pgGbPzjl4AYQent" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ohx7mttZZKqWkz7YUN1G" alt=""><figcaption></figcaption></figure>

In the “Rules” section, add a condition to your “Commanders Act– Get dedup cookie” tag to call it on all but the conversion page among the conversion funnel pages. This will allow you to retrieve all information stored in the “commander1.com” subdomain (especially impressions) when a user engages in the purchase process. Your tags will thus be called depending on the user touch points that are identified.

<figure><img src="/files/LOC3aEgAc296yMTCAdjP" alt=""><figcaption></figcaption></figure>


# Setup example

## Defining channels and sources

You work with Retargeting solutions and your tracking URLs look like:

* mysite.com?utm\_medium=**RETARGETING**\&utm\_source=**Criteo**
* mysite.com?utm\_medium=**RETARGETING**\&utm\_source=**MyThings**

Where the utm\_medium parameter stores the channel and utm\_source stores the source (namely your partners).

In order to fire only the tag of the partner to whom the sale is attributed, you would need to follow these steps:

**Defining Channels and Sources**

Adding a Channel: click “Add Channel”

<figure><img src="/files/ToyZKavDoatw6EwvPQtO" alt=""><figcaption></figcaption></figure>

Name the channel and add the parameter that will store the value defining Retargeting (Add Condition)

<figure><img src="/files/Z3EbA8ApCBrLuzn3yK19" alt=""><figcaption></figcaption></figure>

Define the condition (Parameter Match or Not and the comparison value) and specify whether or not the value of the parameter containing the source will be captured (pencil icon).

<figure><img src="/files/RhCwl2e2CearUckzezf3" alt=""><figcaption></figcaption></figure>

Select the capture mode of the parameter containing the source (the whole value, or parts of it), then confirm the channel identification condition by clicking ADD.

<figure><img src="/files/myAcRJKtX4JdezJObmtR" alt=""><figcaption></figcaption></figure>

Save the source-capturing settings and save the Channel configuration (Click “SAVE”).

<figure><img src="/files/dJMjwa67HM4rCXyx2T9I" alt=""><figcaption></figcaption></figure>

## Setting up deduplication rules

Now that you have defined the retargeting channel, you can define firing rules for your retargeting tags Criteo and MyThings.

Click the edition tab and go to the Rules step. Once there, click “Deduplication” on the menu to the left.

<figure><img src="/files/zlhpoF1Ee47MYw3WM0jo" alt=""><figcaption></figcaption></figure>

In the new window, click “ADD DEDUPLICATION RULE” to open the rule configuration window.

When the window opens, select the Criteo OneTag Conversion tag from the dropdown menu (3).

Select “Last” among the options relating to the touch point’s position in the customer journey. This will fire the tag if it is the last paid solution in the customer journey, now you need to define if it is the last paid click, impression or both (4).

Let’s say you want to launch the Criteo OneTag Conversion tag only if it is the last paid click. Select “click” from the options (5).

Select whether it corresponds or not to your channel (6).

Select “RETARGETING” from the dropdown menu. All channels that you have defined will become available in this menu (7).

Select “EQUALS” for the source. When you configured the channel you indicated that the source of traffic (partner) would be captured by “taking all” the value of the “utm\_source” URL parameter. Since your tracking URL for Criteo looks like this:

[www.mysite.com?utm\\\_medium=\*\*RETARGETING\*\*\\\&utm\\\_source=\*\*Criteo](http://www.mysite.com?utm\\_medium=**RETARGETING**\\\&utm\\_source=**Criteo)\*\*

You will need to select “EQUALS”.

Enter the value of the parameter that will be compared to what was set in the interface (“Criteo”) (9)

Click “ADD” to add the rule (10).

<figure><img src="/files/3sMjhuCWrAoLS2kgA6Sb" alt=""><figcaption></figcaption></figure>

**Repeat** these steps for your **MyThings** Conversion tag.

When both your rules are created, they will appear in the rule summary.

If your wish to edit any of them, click the pencil icon to the right on the line of each rule. If you wish to delete it, click the trash can.

<figure><img src="/files/uYZ3dXkIY0HuCkLah1ov" alt=""><figcaption></figcaption></figure>

The rules summary interface has a Deduplication column. A check mark will indicate that your two tags are deduplicated.

<figure><img src="/files/UIiAmsEbWq5nmLqyKDeF" alt=""><figcaption></figcaption></figure>


# Deduplication reports

## Report by conversion

The “Report by Conversion” report provides information pertaining to the tags that were called for every conversion on your site, according to the rules you defined in the rules section, more specifically deduplication rules. Data is collected by the “Commanders Act – Reporting Deduplication v1.2” tag.

**Access**

To access the report, please click the “Deduplication by conversions” entry from the Health > Website Monitoring menu.

<figure><img src="/files/RZRQF9fq4gAkAkr4zvlf" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Gc7LEHAnwj6Zjk7bcaXO" alt=""><figcaption></figcaption></figure>

**Interface Description**

Calendar

The calendar allows you to select a period of time to display deduplicated tag calls. There are eight predefined periods (*Yesterday, Last Week, Last 30 days, Last Month, Last Quarter, Month-to-Date, Quarter-to-Date, Year-To-Date*) and you can customize the period you wish to see tag calls for. You also have the possibility to compare periods to have a clearer vision of the way tags’ performance has evolved from one period to another.

<figure><img src="/files/RXSqQgDh78xaaQ5qrJ0C" alt=""><figcaption></figcaption></figure>

“Report by Conversion” Table

This table displays the number of tag calls for every conversion:

* **“Conversion ID”**&#x63;olumn: displays your conversions’ IDs.
* **“Date”**&#x63;olumn: displays a conversions’ time and date.
* **“Revenue**”column: displays the conversions’ amounts (including or excluding taxes, depending on the amount you chose to collect with the “Commanders Act – Reporting Deduplication v1.2” tag).
* **“Tags”** column: lists all tags that were called per conversion. Rules affecting tags are all considered, especially deduplication rules.
* **“Detail”**&#x63;olumn: it displays a popin with the detailed customer journey per conversion. The popin is made of four columns.

1. Position: displays, in descending order, the position of every touch point within the customer journey associated to the conversion.
2. Type: displays the touchpoint’s type (click or impression).
3. Channel/Source: displays the channel (lever) and source (solution) corresponding to every touch point.
4. Date: displays every touch point’s time and date.

   <figure><img src="/files/KvZWPTULCHZPPT0DXyF3" alt=""><figcaption></figcaption></figure>

The search engine above the table allows you to easily and quickly find a conversion simply by typing its ID.

The “Advanced Filtering” button lets you filter results by tag to find a conversion faster.

Exporting the “Report by Conversion” table

The “export” icon on top of the table allows you to export the “Report by Conversion” report:

* If you click “CSV” you will receive the CSV report directly in your mailbox.
* If you click “Email”, you will be able to enter the email addresses of people you wish to send the CSV report to.

  <figure><img src="/files/W0r71bq7qUfwOOC78BX6" alt=""><figcaption></figcaption></figure>

## Report by tag

The “Report by Tag” report allows you to see, over a specific period of time, the number and evolution of calls to the tags that were placed on your confirmation page(s), more specifically those of deduplicated tags. Data is collected by the “Commanders Act – Reporting Deduplication v1.2” tag.

**Access**

To access the report, please click the “Deduplication by tags” entry from the Health > Website Monitoring menu.

<figure><img src="/files/c1v3UJ63EulMkWZAmvIn" alt=""><figcaption></figcaption></figure>

**Interface Description**

Calendar

The calendar allows you to select a period of time to display deduplicated tag calls. There are eight predefined periods (*Yesterday, Last Week, Last 30 days, Last Month, Last Quarter, Month-to-Date, Quarter-to-Date, Year-To-Date*) and you can customize the period you wish to see tag calls for. You also have the possibility to compare periods to have a clearer vision of the way tags’ performance has evolved from one period to another.

<figure><img src="/files/RXSqQgDh78xaaQ5qrJ0C" alt=""><figcaption></figcaption></figure>

“Tag calls’ evolution” graph

The “Tag calls’ evolution” graph displays calls to the tags checked in the “Tag Calls Detailed” table. If you wish to display data for other tags, simply check the corresponding box and click the table’s refresh icon. A curve with a specific color is associated to every tag. When you click the tag’s name in the graph’s legend, the curve corresponding to the tag whose name you clicked will disappear or reappear.

The arrow in the graph’s upper right-hand corner allows you to unfold or collapse the latter.

The button in the graph’s bottom right-hand corner lets you see calls to deduplicated tags on a daily or weekly basis.

<figure><img src="/files/rONneVASp1WflwjrxZME" alt=""><figcaption></figcaption></figure>

“Tag Calls Detailed” table

Tags listed in the “Tag Calls Detailed” table are tags placed on pages where the “Commanders Act – Reporting Deduplication v1.2” tag was included too.

The table displays the number of calls that were issued:

* The **“Conversions”** column indicates the number of times a tag was called over a given period of time. This number considers deduplication and other rules placed on your tags.
* The **“Conversion Share”** column displays the percentage of conversions a given tag participated in, according to the exact same rules as those considered in the **“Conversions”**
* The **“Detail”** column allows you to see the IDs of conversions a tag was called for, as well as the corresponding time, date and amount (including or excluding taxes, depending on the amount you chose to collect with the “Commanders Act –Reporting Deduplication v1.2” tag.

<figure><img src="/files/fxZW6SRPsCHnpnQlbRbY" alt=""><figcaption></figcaption></figure>


# TagPerformance (deprecated)

A Website’s performance is key to **SEO** and **user experience**; however, the increasing amount of tags used on websites nowadays has an impact on loading times.

In this context, tags’ **performance** has become a **strategic** matter.

Commanders Act's “**TagPerformance**” module offers the possibility to measure your site’s performance based on the tags that are placed on it. It acts as a complementary tool to those used by IT departments to measure loading times of websites’ key elements (images, CSS …)

TagPerformance’s main features include:

* A measuring tag executed on the end client’s browser and not by a robot.
* Analysis of the START RENDER, DOM READY and DOM LOADED events to measure performance.
* The possibility to visualize significant variations in tags and page types, free from the noise resulting from the analysis of micro-variations.
* Information on loading times of partner solutions in relation with the average loading times of other solutions to ensure loading times are correct.
* Data segmentation to identify sources of problems, if any, or to focus on a particular segment: container, page type (product, home page), device (mobile, tablet, PC), OS and browser.

TagPerformance is one of the additional modules for the **Commanders Act** product: if you wish to use it on your website(s), please contact your account manager or reach out to our Support Department (<support@commandersact.com>)

## Metrics

TagPerformance allows you to analyze three events:

* **START RENDER or FIRST PAINT**: This is when the first element is displayed on the page.

This metric is key to bounce rates (if initial visual elements take too long to load, users will most often leave a site) and SEO (“dwell time” metric).

* **DOM READY**: this is when a page’s structure is loaded and analyzed by the browser.
* **PAGE LOADING TIME or ONLOAD or DOM LOADED**: this is when the page’s content has finished loading. This metric is useful for SEO.

Loading order of a web page’s elements:

<figure><img src="/files/DUt1P48VMUfbzV1RfosR" alt=""><figcaption></figcaption></figure>

Example:

Page A and page B take both 12ms to load; DOM loaded is the same for both of them. However, Start Render and DOM Ready events are optimized for page A but not for page B.

<figure><img src="/files/VbLJW9AFMn0sOgpYEjWO" alt=""><figcaption></figcaption></figure>

## How it works ?

* The page **loads** with the Commanders Act container.
* The Commanders Act container calls the tags placed on the page and loads the “**Commanders Act – TagPerformance**” tag two seconds after the **DOM** **Loaded** event.
* The “Commanders Act – TagPerformance” tag captures information provided by the browser thanks to the **Navigation Timing API**, which is compatible with 88% of existing browsers. The information that is captured includes:
* Generic information about the page: Start Render, DOM Ready and DOM Loaded
* Information about every tag that is executed on the page: hits’ aggregated loading time before **Start Render, DOM Ready** and **DOM Loaded** happen (separately).

Example:

This is the structure of a page from a website:

<figure><img src="/files/3mwiiNhsCMHBwdODdvtq" alt=""><figcaption></figcaption></figure>

**“Tag 1” sends 4 hits:**

* One that loads before the Start Render event (300ms)
* One that loads before the DOM Ready event at (400ms)
* One that starts loading before DOM Ready and finishes loading during the DOM Loaded event (600ms)
* One that loads after the DOM Loaded event (100ms)

“**Tag” 2 sends 2 hits:**

* One that loads during the Start Render event (700ms)
* One that loads before the DOM Loaded event (200ms)

**With the “TagPerformance” tag, Commanders Act will count the following loading times for tag 1:**

* Hits’ aggregated loading time before the Start Render event (300ms).
* Hits’ aggregated loading time before the DOM Ready event: 1300ms (the first and second hit’s respective loading times of 300ms and 400ms are stored and added to the 600ms loading time of hit three, which is sent during the DOM Ready event).
* Hits’ aggregated time before the DOM Loaded event: 1300ms (all hits’ loading times are stored: 300ms, 600ms and 600ms for hits one, two and three, respectively).
* Total loading time of tag1 (1400ms)

**The “TagPerformance” tag will count the following loading times for tag 2:**

* Hits’ aggregated loading time before the Start Render event (700ms)
* Hits’ aggregated loading time before the DOM Ready event (700ms)
* Hit’s aggregated loading time before the DOM Loaded event (900ms)
* Total loading time of tag1 (900ms)

**It will also count generic loading times on the page:**

* Start Render (700 ms)
* DOM Ready (2000 ms)
* DOM Loaded (2800 ms)

All this data will populate TagPerformance’s reports.


# Setup guide

The TagPerformance tag must be included in **each and every one of your containers**.

If you have **many containers** on a given page and as many TagPerformance tags, only **one hit** containing information about your tags will be sent.

It is not necessary to place it in a particular order within your containers, as it will automatically execute two seconds after the DOM Loaded event, that is to say, after all the other tags have loaded.

* In the tag library, select the “Commanders Act – TagPerformance” tag.

  <figure><img src="/files/yyMZXCfS5iaIXWCy2jFm" alt=""><figcaption></figcaption></figure>
* There is nothing to configure in the “EDIT” step: Generate a new container version and deploy it.

  <figure><img src="/files/9PLfOcjqTysfbr9ZbNbw" alt=""><figcaption></figcaption></figure>

**Advanced – Customizing the “TagPerformance” tag:**

* It is **possible** to **force-measure a tag’s performance** (for example, that of a tag outside the container, that of a custom tag whose URL paths are not recognized by Commanders Act or that of a tag that is not present in the Commanders Act TMS tag library). If you wish to measure a new tag’s performance, place the following code block in the commented line 4 (1) tC.tagPerf.customPatterns.push({label:’Solution A’,p:’domain\\.com.\*js\\.js’})

  <figure><img src="/files/WqbW4lBAZDMe3t0YJd8w" alt=""><figcaption></figcaption></figure>

*Example:*

*tC.tagPerf.customPatterns.push({label:’exelate’,p:’loadm.exelator.com’});*

* You can also add **additional filters** (in addition to default filters page type, container, device, OS and browser). If you wish to add a custom filter, place the following code block in the commented line: tc\_vars\[“custom\_segment”] = #custom\_segment#;

Note: You can only add **one** additional filter.

*Example: to add a “page category” filter (tc\_vars\[“page\_cat1”]) :*

*tc\_vars\[“custom\_segment”] = tc\_vars\[“page\_cat1”];*

* Finally, you can **change the capturing method of the “Page Type” filter**, which is available in the reports. This filter is based on the tc\_vars\[“env\_template”] variable by default. If this variable is not available on your site, you can rely on a different variable by adding the following code block in the commented line (4) tc\_vars\[“env\_template”] = #page\_type#;

*Example: if you wish to replace tc\_vars\[“env\_template”] with tc\_vars\[“page\_type”] :*

*tc\_vars\[“env\_template”] = tc\_vars\[“page\_type”] ;*


# Report analysis

In order to be able to visualize TagPerformance reports, you have to request the activation of this module, not included in the basic Commanders Act offer. If you are interested in using TagPerformance, please get in touch with your account manager or our Support Department ([support@commandersact.com](mailto:support@tagcommander.com)).

To access the reports,

* Log in to the **Commanders Act** Interface and click the Health > Website Monitoring > TagPerformance menu

<figure><img src="/files/v6YD9rz4iORqP4Htb5fj" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/lvrPPWlYQ4QcsER1wohW" alt=""><figcaption></figcaption></figure>

## Dashboard

The “Dashboard” report provides an overview of tags’ performance on your site:

You will find below a detailed explanation of the report’s analysis windows.

**1)-The three** main indicators **(Start Render, DOM Ready, DOM Loaded):**

<figure><img src="/files/NZLxeod45ul5RICkRlq7" alt=""><figcaption></figcaption></figure>

* **Average Start Render (First Paint)**: average loading time on site of the Start Render event.
* **Average DOM Ready**: average loading time on site of the DOM Ready event.
* **Average Page loading time (on load)**: average loading time on site of the DOM Loaded event.

Note: These three metrics consider the following filters “page type”, “container”, “device”, “OS” or “browser”.

Example: These three pages are loaded on your site:

<figure><img src="/files/qQjtSryRLlQ8gEKxRAMq" alt=""><figcaption></figcaption></figure>

The three metrics would take the following values:

* “**Average Start Render (First Paint)**”: **5 sec** (700ms, 500ms and 300ms on average)
* “**Average DOM Ready**”: **8** **sec** (2000ms, 2200ms and 1100ms on average)
* “**Average Page loading time (on load)**”: **6** **sec** (2800ms, 2800ms and 2100ms on average)

**2)-The Pie Chart:**

<figure><img src="/files/QAxAqGxP3nT5tQ2kjDtb" alt=""><figcaption></figcaption></figure>

The pie chart highlights tags that take longer to load in terms of the selected level of analysis in the available filters: **Start Render, DOM Ready, DOM Loaded** or Cumulated loading time.

Example: the pie chart above appears once the “Tags impacting start render (First Paint)” level of analysis is selected. It shows that the “Lengow lead validation” tag is the tag that delays the most the Start Render event, because it takes about 17% of total time preceding the Start Render event.

By clicking the “Others” part, you will be able to obtain more details about the remaining tags affecting your site’s loading time.

Note: the pie chart that appears next provides the proportion of each tag in relation with the “Other”’s total.

Example: Here below, the “Effiliation” tag takes about 14% of the “Other”’s total loading time (14% of the 21% of global loading time, which “Others” account for).

<figure><img src="/files/gXNrAVp2DTA3Sw62Oqst" alt=""><figcaption></figcaption></figure>

**3)-Main Tag Variations:**

The “Main Tag Variations” graphs allow you to identify tags whose loading time has varied (+/-10%) over a selected period of time in terms of the selected level of analysis in the available filters: Start Render, DOM Ready, DOM Loaded or Cummulated loading time.

<figure><img src="/files/QiA2PM2ZeRVw0J2b3IQQ" alt=""><figcaption></figcaption></figure>

The tag’s variation measures gaps in tags’ loading times in relation with the median (and not the average, in order for it to be less sensitive to extreme values). Calculation is based on the six previous identical periods.

Example:

We wish to analyze the variation of tags affecting the Start Render event on May 22nd.

In the screenshot below, we can see a 65% increase in AB Tasty’s loading time for that day. The tag does indeed take 61.96ms to load, whereas the median for the six previous days was of 37.65ms. (May 16th: 48.05ms /May 17th: 30.30ms / May 18th: 35.77ms / May 19th: 27.44ms / May 20th: 64.11 ms / May 21st: 39.53ms).

<figure><img src="/files/IjPPLz2RnrBt04Buva83" alt=""><figcaption></figcaption></figure>

**4)-Main Page Type Variations:**

The “**Main Page Type Variations**” graphs allow you to identify the page types whose loading time has varied (+/-10%) over a selected period of time in terms of the DOM Loaded event only (the page’s loading time is defined with the arrival of the DOM Loaded event).

Note: The page type corresponds to the default “page type” filter available on the interface.

<figure><img src="/files/wDc1tg95cZgD0besYwzM" alt=""><figcaption></figcaption></figure>

The page type variation measures gaps in pages’ loading times depending on their type and in relation with the median (and not the average). Calculation is based on the six previous identical periods.

Example:

We wish to analyze variations in types on May 2nd.

In the screenshot below, we see a 31% reduction in loading times for the “newsletter” page type on that day. It takes 5.23ms to load whereas the median in the six preceding days was of 7.6ms (April 26th: 7.58 ms / April 27th: 5.31 ms / April 28th: 8.16 ms /April 29th: 7.62 ms / April 30th: 7.84 ms / May 1st: 6.02 ms).

<figure><img src="/files/5PVG1FNVj0yBoWtfSSf8" alt=""><figcaption></figcaption></figure>

## Report by tag

**1)-The four main metrics**

<figure><img src="/files/t1YS5oarJDGpAwcvAEEJ" alt=""><figcaption></figcaption></figure>

* **Average page loading time**: average loading time of your website’s pages (= DOM Loaded). This loading time is compared to that of the previous period (ex: the previous day or week according to the selected period).
* **Average tag loading time**: average loading time of the tags on your website according to the level of analysis that you selected in the filtering options (Start Render, DOM Ready, DOM Loaded, Cumulated loading time). This loading time is compared to that of the previous period (ex: the previous day or week according to the selected period).
* **Lowest impact tag**: tag that takes the least time to load according to the level of analysis that you selected in the filtering options (Start Render, DOM Ready, DOM Loaded, Cumulated loading time).
* **Highest impact tag**: tag that takes the most time to load according to the level of analysis that you selected in the filtering options (Start Render, DOM Ready, DOM Loaded, Cumulated loading time).

Note: These four metrics consider the selected filters among “page type”, “container”, “device”, “OS” or “browser”.

**2)-TagPerformance by tags**

<figure><img src="/files/ZSgn41cBCxjPfweBgCfM" alt=""><figcaption></figcaption></figure>

The graph shows information about tags’ loading time on your website.

To select tags to analyze with the graph (1), check the corresponding tag in the “Tags” report (2) and reload (3).

<figure><img src="/files/UROoyOE9DdAgTzpHgrhg" alt=""><figcaption></figcaption></figure>

You can compare this data to generic information about the page’s context. To do so, select the indicators you are interested in from the dropdown menu above the graph.

Metrics related to the analyzed tags:

* **Tag Loading time**: tags’ loading time according to the level of analysis that you selected in the filtering options (Start Render, DOM Ready, DOM Loaded, Cumulated loading time).
* **Tag firing**: number of times tags are loaded on the site (this metric is independent from the filters).

Metrics related to the page’s context:

* **Tag number**: number of tags present in the last generated version(s) of a container.
* **Average start render (First paint)**: average loading time of the tart Render on the site.
* **Average page structure building (DOM Ready)**: average loading time of the DOM Ready on the site.
* **Average page loading time (OnLoad)**: average loading time of the DOM Loaded on the site.

Note: These six metrics consider the selected filters among “page type”, “container”, “device”, “OS” or “browser”.

Example:

You wish to know if a tag loading during the Start Render event has an impact on the site’s global Start Render.

* Use the “Tags impacting Start Render (First Paint)” filter on your report:

<figure><img src="/files/1nOP19VHUr6cCa7rbo37" alt=""><figcaption></figcaption></figure>

* Select the tag to analyze:

  <figure><img src="/files/mBxhtQSlvZ0hYKKldnft" alt=""><figcaption></figcaption></figure>
* Select the following metrics from your graph: “Tag Loading Time” (the tag’s loading time) and “Average Start Render (First Paint)” (average loading time of the Start Render):\\

  <figure><img src="/files/i0cqhKF7GgvNmI5XJPlQ" alt=""><figcaption></figcaption></figure>

The result below shows that the selected tag has little impact on the site’s Start Render, as the increase in the tag’s loading time at 13h (1) did not cause the Start Render’s average loading time to increase as well at that very moment.\\

<figure><img src="/files/2FNL0wMrq8RuOvGA2HHg" alt=""><figcaption></figcaption></figure>

**3)-Tags**

<figure><img src="/files/BiG3BrikPe42RYJN9MJj" alt=""><figcaption></figcaption></figure>

The “Tags” section of the report provides deeper insight about the tags that are loaded on your site, according to the level of analysis you selected from the filters on the top left-hand side (Start Render, DOM Ready, DOM Loaded, Cumulated loading time) and top right-hand side of the page (“page type”, “container”, “device”, “OS” and “browser”).

You can analyze the following elements for each tag:

* **“Tag loading time” (ms**): Loading time in milliseconds
* **“Tag firing”**: Number of times a tag is loaded\
  \\

  <figure><img src="/files/sl8ZcOwlPsyp1x9vTSoc" alt=""><figcaption></figcaption></figure>

If you click a tag’s name, a graph appears showing these items:

* The tag’s loading time compared to the previous period (ex: previous day if the analysis is done by day).
* The tags’ average loading time compared to the previous period.
* The number of times a tag is loaded compared to the previous period (ex: previous day if the analysis is done by day).
* The number of times tags are loaded on the site compared to the previous period.

Note: The current period is always displayed in green and the period of comparison in blue.\\

<figure><img src="/files/VYCCc0WWvQxrmZHDqWH1" alt=""><figcaption></figcaption></figure>

## Piggybacking

“Piggybacking”, consisting in triggering a tag with another, has widespread exponentially with the appearance of programmatic. The subsequent data leakage has generated legal issues and financial losses for companies.

Amid this context, the “Tag Hierarchy” report provides a global insight of requests happening while your website and its content load. You can thus better control calls issued from your website and exchanged data.

**Report Structure:**

1/Page type filter:

This report is filtered by page type (“page\_type” option on the segmentation menu). The default selected page type is the first one appearing on the list (1) and is displayed on the top, left-hand side of the report (2):\
\\

<figure><img src="/files/we4t6ITCJRBm758WqHPT" alt=""><figcaption></figcaption></figure>

You can at all times apply filters on different page types or deselect enabled filters to have an overview of your site (please note that in this case, the report might take a little longer to load, as it will combine all domains called on your website).

2/Request type (script/iframe/pixel)

The report highlights the request’s nature/type:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2018/01/piggybacking_doc_2.png)

* Script (URL called with \<script> tag)
* Iframe (URL called with an \<iframe> tag)
* Pixel (URL called with an \<img> tag)
* “Other” (in case the request type is not identified)

<figure><img src="/files/s7c6QY6uuQCiB6PhFTbS" alt=""><figcaption></figcaption></figure>

3/Request Detail

The “Tag Hierarchy” report allows you to visualize all domains called from your main domain and all other domains they call on different levels:\\

<figure><img src="/files/W7j2nVYRfVY58MqG57Qy" alt=""><figcaption></figcaption></figure>

On the diagram above, sub-domain 2 (“sub-domain 2”) is called from your site’s main domain. It is a JavaScript file (blue circle) that in turn calls two pixels (green circles) and a JavaScript file. Waterfall calls stop here for this request, but this is not the case for sub- domain 1 (“Sub-domain 1”), which calls JavaScript files which in turn issue new requests.

In order to provide you with better readability, same-type “childless” requests (script/iframe/pixel) coming from the same domain are gathered under the same domain name, and a number between brackets next to the domain’s name indicates how many calls were issued from it:\\

<figure><img src="/files/dAbtSOsD8VrTb89rRbod" alt=""><figcaption></figcaption></figure>

By hovering over any of these domains (ex: ) you will see, with greater detail, which URLs are called by them:[<br>](https://community.commandersact.com/wp-content/uploads/sites/2/2018/01/2018-01-29_12h13_27.png)

<figure><img src="/files/uVeDvKDVsc3XhsDHyZQi" alt=""><figcaption></figcaption></figure>

You will also be able to see the URL structure and its parameters for certain requests, hence all the information sent to solutions called on your website:\\

<figure><img src="/files/6Y352X6zBMxOXEQ5n25o" alt=""><figcaption></figcaption></figure>

4/Report dates

Displayed data is collected over the past 24 rolling hours.

This export is currently unavailable.

## Filters

**1)-Select your level of analysis:**

<figure><img src="/files/4r97l7Qhfxe4Hij8azbK" alt=""><figcaption></figcaption></figure>

* **“Tags impacting start render (First Paint)”**: This corresponds to the aggregated loading time of hits that are sent prior to the Start Render event.
* **“Tags impacting page structure building (DomReady)”**: This corresponds to the aggregated loading time of hits that are sent prior to the DOM Ready event.
* **“Tags impacting page loading time (Onload)”**: This corresponds to the aggregated loading time of hits that are sent before the DOM Loaded event.
* **“Cumulated tag loading time”**: corresponds to the aggregated loading time of all hits (including those sent after the DOM Loaded event).

Example: The following diagram shows an extract of tags present on the site:\\

<figure><img src="/files/3mwiiNhsCMHBwdODdvtq" alt=""><figcaption></figcaption></figure>

These are the results you will obtain when you select the following levels of analysis:

* “Tags impacting start render (First Paint)”: *TAG1 (HIT1) + TAG2 (HIT1)*

  <figure><img src="/files/VBVEEVuL8CLPiYdssi8n" alt=""><figcaption></figcaption></figure>
* “Tags impacting page structure building (DomReady)”: *TAG1 (HIT1) + TAG2 (HIT1) + TAG1 (HIT2) + TAG1 (HIT3)*\\

  <figure><img src="/files/OAkOY5Nz4OpN64x66go3" alt=""><figcaption></figcaption></figure>
* “Tags impacting page loading time (Onload)”: *TAG1 (HIT1) + TAG2 (HIT1) + TAG1 (HIT2) + TAG1 (HIT3) + TAG2 (HIT2)*

  <figure><img src="/files/xmxiYrs5wfubBBOWSlBP" alt=""><figcaption></figcaption></figure>
* “Cumulated tag loading time”: *TAG1 (HIT1) + TAG2 (HIT1) + TAG1 (HIT2) + TAG1 (HIT3) + TAG2 (HIT2) + TAG1 (HIT4)*

  <figure><img src="/files/3mwiiNhsCMHBwdODdvtq" alt=""><figcaption></figcaption></figure>

If you wish to know more about the “Start Render”, “**DOM Ready**” and “**DOM Loaded**” concepts please refer to the Definition of TagPerformance Metrics article.

If you wish to know more about the technical elements that are captured by TagPerformance, please refer to the Advanced: Technical functioning of TagPerformance article.

**2)-Select, if need be, one of the default filters from the interface should you require a more detailed analysis of your site’s performance.**

* **The page type**: This filter allows you to display your tags’ performance in terms of the page template. It is based on the “env\_template” variable’s values, which are automatically captured by TagPerformance.

Note: If you do not have an env\_template variable on your site, you still can capture the values of other variables. Please refer to the Adding the TagPerformance Tag article.

* **The container name**: This filter allows you to display how tags within one or more specific containers are performing.
* **The device**: This filter allows you to display your tags’ performance in terms of the devices your visitors are using. The “device” metric is calculated automatically by our servers, based on the user agent.
* **OS**: This filter allows you to display your tags’ performance in terms of the devices your visitors are using. The “OS” metric is calculated automatically by our servers based on the user agent.
* **The Bowser**: This filter allows you to display your tags’ performance in terms of the browsers your visitors are using. The “browser” metric is calculated automatically by our servers based on the user agent.

Note: if you wish to add an additional filter, please refer to the Adding the TagPerformance Tag article.

**3)-Click “Apply” to obtain filtered results and a different level of analysis.**


# Troubleshooting

If you notice that a tag is slowing down your pages, please try the following:

* Have the tag load after the **DOM Loaded** event. Caution: not all tags are compatible with this method and the more you delay a tag’s execution the more you loose data in your reports.

This code block allows calling a tag during the **DOM Loaded** event:

tC\_ready = function(){

// Code du tag

}

if (window\.addEventListener)

window\.addEventListener(‘load’, tC\_ready, false)

else if (window\.attachEvent)

window\.attachEvent(‘onload’, tC\_ready)

* Get in touch with the tag’s editor and request they improve their tag in terms of size or server response. Note: it is possible to include the tag’s JavaScript file in the Commanders Act container while on the “EDIT” tab from the Commanders Act interface.

  <figure><img src="/files/MElaaajsxy0msiHmu8yM" alt=""><figcaption></figcaption></figure>
* Sample the tag from the “**RULES**” tab from the Commanders Act interface. This will improve the average loading time of your site’s pages.

  <figure><img src="/files/3vuBfb9yHwoObufo76aS" alt=""><figcaption></figcaption></figure>
* Shifting the tag’s execution order from the “GENERATION” tab from the Commanders Act interface (place the one taking longer to load at the end of the queue).\\

  <figure><img src="/files/WhLplgl4Rv69N40srKoC" alt=""><figcaption></figcaption></figure>
* Use a timeout on your tags from the “GENERATION” tab from the Commanders Act interface. This feature interrupts the tag’s execution if it takes too long to load.

  <figure><img src="/files/KgQqm9HvR8bPx5E11kCu" alt=""><figcaption></figcaption></figure>
* Deactivate the tag from the “GENERATION” tab from the Commanders Act interface\
  \\

  <figure><img src="/files/9qAzzOntxD5SIgekmTBk" alt=""><figcaption></figcaption></figure>
* Use your tag in a **serverside** configuration (this entails activating an **additional** module from the Commanders Act product, please contact your account manager or our Support Department for further information). Caution: not all tags are compatible with this method.

For more detailed information on how to set up these methods, please contact our Support Department (<support@commandersact.com>).


# Setup guides for developers

In this section you will find all our guides for implementation of a browser side tracking trough a web container


# Web container setup

A web container is a JavaScript file which has two purposes:

· To be able to use native functions & methods of the TMS

· To execute the partners solutions (tags) contained inside

It is possible, as it is often the case, to have several containers for the same site or even the same page.

The URL of each JavaScript Web Container file will be provided alongside the Container IDs and Container Names by a Commanders Act Consultant during the setup process.

### Implementation of the containers on the page

Web container are usually installed by implementing a `<script>` html node on every page of your website that holds a `src` attribute that points to the Container URL.

The containers can be placed in different locations in the page source’s code depending on their use and your type of business.

Here’s a common example with 3 containers:

| A/B-test (optional) | In the \<head>              |
| ------------------- | --------------------------- |
| Analytics           | At the beginning of \<body> |
| Marketing           | At the end of \</body >     |

\<head> container's location is usually used for AB test and should be load synchronously, to prevent flickering effect.

We recommended to implement all \<body> containers asynchronously. Simply use the async attribute in the \<script> element.

{% hint style="info" %}
Important : the datalayer must be declared before your containers calls. Otherwise, the tags in the container will not be able to use the variables
{% endhint %}

#### Installation of `<head>` Container

`<head>` Container are used to implement A/B-testing and personalisation Tags that usually impact the visual content of a website before it is presented to the user. Therefore it is important to place them as high as possible in the `<head>` section of your website.

```markup
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <script src="{{ head_container_URL }}"></script>
        (...)
    </head>
    (...)
</html>
```

Please ensure that the `<head>` Container file is loaded synchronously to avoid potential content flickering effects.

#### Installation of `<body>` Container

`<body>` Container are used to implement Tags that measure information. These Containers are therefore placed at the end of the `<body>` section to make sure they have minimal impact on the loading time of the content of the website.

```markup
<!DOCTYPE html>
<html>
    (...)
    <body>
        (...)
        <script src="{{ body_container_URL }}"></script>
    </body>
</html>
```

In contrast to the `<head>` Container it is possible to implement `<body>` Container asynchronously. For example it is possible to load them via JavaScript on the `onload` event of the page or it is possible to use the `async` attribute in the `<script>` element.

{% hint style="info" %}
**Installation via JavaScript Loaders**

It is possible to implement JavaScript Container files with JavaScript loaders like RequireJS or HeadJS. On the opposite it is not possible to bundle the JavaScript Container files with bundlers like Webpack or ParcelJS to make sure that the Container files are dynamically loaded from the CDN or server on each page request. Otherwise users will not be able to manage Commanders Act Web Container on their own.
{% endhint %}

### Testing

#### Via Browser Console

It is possible to log all loaded Container files on a site via the JavaScript console of the browser. The JavaScript object `tC.containersLaunched` provides information of each loaded Web Container.

Following you will find an example object including its most relevant information:

```javascript
{
    1234: { // Commanders Act Account ID
        1: { // ID of the 1st loaded Container
            g: 15,
            v: "5.15" // Version of the 1st loaded Container
        },
        5: { // ID of the 2nd loaded Container
            g: 20,
            v: "55.16" // Version of the 2nd loaded Container
        }
}
```

### Definitions

| **Account ID**         | Unique account ID of your workspace on our platform. Also called "Site ID". Log in into your Commanders Act account and look for the first numeric value in your address bar. e.g. with "<https://app.commandersact.com/en/1234/>", your account identifier is "1234". |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Container ID**       | Unique ID of the Container within your account. e.g. "15".                                                                                                                                                                                                             |
| **Container Name**     | Label of the Container. Can be configured in the "container settings" of TMS. e.g. "Header Container".                                                                                                                                                                 |
| **Container Filename** | Name of the Container JavaScript file, can be configured in the "container settings" of TMS. e.g. "tc\_header\_21.js".                                                                                                                                                 |
| **Container URL**      | Complete URL of the Container used for installation. Depends on the hosting method. e.g. "//cdn.tagcommander.com/1234/tc\_footer\_main\_20.js".                                                                                                                        |
| **Container Version**  | <p>Snapshot of a Container JavaScript file.<br>e.g. "55.16".</p>                                                                                                                                                                                                       |


# Datalayer setup

A Commanders Act Data Layer is a JavaScript object that holds metadata of a website as properties to make it available to Tags. In the platform this Data Layer is named "External Variables" to distinguish it from scripted "Internal Variables" that are generated within the Container JavaScript.

### Installation

To install a Commanders Act Data Layer it is necessary to implement a global JavaScript object `tc_vars` that holds the meta data of the page as direct properties. The required Data Layer properties are defined during the Commanders Act setup process, but you can find a list of common properties on [this page](/features/sources/sources-catalog/web/containers/user-guides-for-browser-side-platform/data-layer-and-data-types/external-variables).

{% hint style="info" %}
**Re-using an Existing Data Layer**

In case a website already has a Data Layer installed it is possible to transform it into a Commanders Act Data Layer. Please contact a Commanders Act consultant to implement the transformation.
{% endhint %}

The approach to fill the Data Layer with properties depends on the technology framework that is used on the website and can reach from JavaScript web scraping to templating to hardcoding.

```markup
<script>
    window.tc_vars = {
        env_template: "homepage",
        env_work: "prod",
        page_name: "Homepage",
        page_keywords: ["homepage", "home", "entrypage", "index"],
        product_name: "",
        (…)
    };

    window.tc_vars.user_name = "myuser";
</script>
<script src="{{ container_URL }}"></script>
```

The Data Layer needs to be filled with information before the Web Container file is loaded—otherwise information might not be available at the time the Container JavaScript executes.

{% hint style="warning" %}
**Race Conditions**

Race conditions between the Data Layer properties and the Container JavaScript can be difficult to identify and debug by Commanders Act users. It is therefore important to avoid them during installation!
{% endhint %}

In case multiple Containers are used on the same page it is possible to fill the Data Layer in multiple steps. Global information like the page type should be made available before the first Container is loaded. Information that is only relevant for a certain Container (e.g. product information) can be appended prior to the respective Container.

Following example outlines how a Data Layer can be installed in case both a `<head>` and a `<body>` Container are used on a website.

```markup
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <script>
            window.tc_vars = Object.assign({}, window.tc_vars, {
                env_template: "homepage",
                env_work: "prod"
            });
        </script>
        <script src="{{ head_container_URL }}"></script>
        (…)
    <head>
    <body>
        (…)
        <script>
            window.tc_vars = Object.assign({}, window.tc_vars, {
                page_name: "Homepage",
                page_keywords: ["homepage", "home", "entrypage", "index"]
            });
        </script>
        <script src="{{ body_container_URL }}"></script>
    </body>
</html>
```

{% hint style="info" %}
**Data Layer Naming Convention**

As outlined in the example above the properties of the Data Layer are usually grouped with a prefix notation. E.g. `env_` is used to group environment information and `user_` is used to group user information.

In case a property is not relevant for a certain page (e.g. `product_name` on the privacy policy page) it is recommended to fill it with an empty value (e.g. `""`, `0`, `[]` or `{}`).
{% endhint %}

### Testing

#### Via JavaScript Console

It is possible to investigate the Data Layer in the JavaScript console by logging `tc_vars`.

Following you will find an example output of a `tc_vars` Data Layer in the JavaScript Console.

```javascript
{
    env_template: "homepage",
    env_work: "prod",
    page_name: "Homepage",
    page_keywords: ["homepage", "home", "entrypage", "index"],
    product_name: "",
    (…)
}
```

#### Via Quality Assurance Tag

The Tag template *Commanders Act - Data Layer QA* in the Commanders Act Tag library automatically outputs Data Layer information to the JavaScript console on each page. This approach has the advantage that it logs a snapshot of the Data Layer at the exact time the Container JavaScript was executed. This allows to identify race conditions between the Data Layer properties and the Container JavaScript to make sure all necessary properties are available in time.


# Browser-side events setup

Commanders Act Events Triggers are onsite events that are used by Commanders Act users to dynamically execute Tags.

### Definitions

| Metric                 | Description                                                                                                 |
| ---------------------- | ----------------------------------------------------------------------------------------------------------- |
| **Trigger Label**      | Label for an event that is used by Commanders Act users to execute Tags. e.g. add\_to\_basket               |
| **Trigger Data Layer** | A JavaScript object that can be accessed by Tags that are executed on the related Trigger. e.g. product\_id |

### Installation

Commanders Act allows to set up common Trigger automatically without the involvement of technical team (e.g. *Container loaded*, *DOM ready* or *Vertical Scroll 25%*). In cases where the default Triggers are not sufficient it is possible for technical personnel to implement custom Triggers. The necessary Trigger are defined during the Commanders Act setup process, but you can find a list of native Trigger on [this page](/features/sources/sources-catalog/web/containers/user-guides-for-browser-side-platform/tags/rules/triggers).

To install a custom Trigger on the website it is necessary to call a JavaScript function with the following pattern:

```javascript
tC.event.{{ Trigger Label }}(this, {{ Trigger Data Layer }});
```

A typical example is an *Add to basket* event where the product id of the selected product is sent with the event:

```javascript
tC.event.add_to_basket(this, { product_id: "12345" });
```

{% hint style="info" %}
**Trigger Data Layer Properties**

A common approach for the Trigger Data Layer is to always use the same properties like `event_label`, `event_type` and `event_value`—so in case of an `add_to_basket` Trigger the `event_value` would hold the product id of the selected product and in case of a `video_play` event the `event_value` would hold the current position within the video timeline. This allows to avoid to create multiple custom variable names for each individual event and therefore makes Trigger more generic.
{% endhint %}

{% hint style="warning" %}
**Trigger Error Handling**

In some situations it might happen, that a user interacts with a custom Trigger before the Commanders Act Web Container file was loaded. In this case using the Trigger function would cause a JavaScript `ReferenceError`. Therefore it is recommended to check the availability of the Trigger function before using it.

```javascript
if (tC && tC.event && typeof tC.event.add_to_basket === "function") {
    tC.event.add_to_basket(this, { product_id: "12345" });
}
```

{% endhint %}

### Testing

#### Via Quality Assurance Tag

The Tag template *Commanders Act - Event QA* in the Commanders Act Tag library automatically outputs event Data Layer information to the JavaScript console when executed. Assigning this Tag with the Trigger allows to log a snapshot of the Data Layer when the respective Trigger is executed.\
\
Another way, more technical: you can type in your console tc\_arrray\_events when the event is executed. The Data Layer of the event variables will be displayed.


# AMP

Installation Instructions for Web container on AMP.

{% hint style="info" %}
Accelerated Mobile Pages (AMP) use the Server-Side version of our TMS
{% endhint %}

## AMP Definition

AMP, which stands for Accelerated Mobile Pages, is a technology issued from the open source Digital News Initiative (DNI) between Google and European publishers. AMP is a format allowing the creation of optimized mobile content in a bid to improve user experience.

If you wish to learn more about AMPs, click the following links:

\[FR] <https://www.ampproject.org/fr/learn/about-amp/>

\[EN] <https://www.ampproject.org/learn/about-amp/>

## Implementing Commanders Act on AMPs

AMP blocks synchronous JavaScript files called on your websites in order to increase mobile pages’ loading speed. For your Commanders Act container to be compatible, you need to adapt the way you set it up to be compliant with AMP’s requirements.

Below, you will find an example showing how to set up a Commanders Act container on your AMP pages. We recommend using the \<amp-analytics> tag (<https://www.ampproject.org/docs/reference/components/amp-analytics>) to define your data layer and the container.

**Important**: This operation calls for Commanders Act’s API and thus requires that a server-side container be setup in Commanders Act’s user interface.

### **Setup example with analytics tag**

```
<!doctype html>
<html amp lang=”en”>
<head>
<meta charset=”utf-8″>
<title>Commanders Act – AMP Analytics</title>
<link rel=”canonical” href=”http://example.ampproject.org/article-metadata.html” />
<meta name=”viewport” content=”width=device-width,minimum-scale=1,initial-scale=1″>
<!– Mandatory execution of the AMP Analytics Script “https://cdn.ampproject.org/v0/amp-analytics-0.1.js” –> 
<script async custom-element=”amp-analytics”
src=”https://cdn.ampproject.org/v0/amp-analytics-0.1.js“></script>
<style>body {opacity: 0}</style><noscript><style>body {opacity: 1}</style></noscript>
<script async src=”https://cdn.ampproject.org/v0.js”></script>
</head>
<body
<amp-analytics id=”commandersact”>
<!– JSON data structure containing the TagCommander data layer –> 
<script type=”application/json”>
{
“vars”: {
“tC_SiteID”: “3503”,
“tC_ContainerID”: “1”,
“env_template” : “homepage”,
“env_work” : “prod”,
“env_device” : “m”,
“env_country” : “IT”,
“page_name” : “amp_homepage”,
“user_id” : “”,
“user_newcustomer” : “”,
“order_id” : “”
},
<!– Call to Commanders Act’s API (server-side) –> 
“requests”: {
“tC_BaseURL“: “//serverside${tC_SiteID}.tagcommander.com/${tC_ContainerID}/”,
<!– Page variables mentioned in the “tC_PageTrack” element –> 
“tC_PageTrack“: “${tC_BaseURL}?&env_template=${template}&env_work=${work_environment}&env_device=${device}&env_country=${country}&page_name=${page_name}&user_id=${user_id}&user_newcustomer=${newcustomer}&order_id=${order_id}”,
<!– Event variables mentioned in the “tC_EventTrack” element. Note: “scroll” and other such variables are natively proposed in AMP pages–> 
“tC_EventTrack“: “${tC_PageTrack}&scrollY=${scrollTop}&scrollX=${scrollLeft}&height=${availableScreenHeight}&width=${availableScreenWidth}&scrollBoundV=${verticalScrollBoundary}&scrollBoundH=${horizontalScrollBoundary}${eventLabel}”
},
<!– Additional parameters mentioned in the “extraUrlParams” element. Note: the clientId function creates a unique ID per visitor (different from the regular TCIDs)–> 
“extraUrlParams”: {
“TCID_AMP”: “${clientId(TCID_AMP)}”,
“path”: “${ampdocUrl}”,
“type”: “${type|default:page}”,
“platform”: “AMP”,
“r”: “${random}”
},
<!– Execution of Commanders Act hits on the “triggers” element. “Pageview” sends the hit to the page viewed, the “clickPings” trigger sends the hit to an event defined in the “selector” –>
“triggers”: {
“pageview”: {
“on”: “visible”,
“request”: “tC_PageTrack”,
“vars”: {
“type”: “page”
}
},
“clickPings”: {
“on”: “click”,
“selector”: “.tC_events”,
“request”: “tC_EventTrack”,
“vars”: {
“type”: “event”
}
}
}
}
</script>
</amp-analytics>
<h1 id=”header”>AMP Page</h1>
<!– data-vars-event-label2 allows to collect additional variables, such as event variables –>
<span id=”event-test” class=”tC_events” data-vars-event-label2=”22″>
Click here to generate an event
</span>
</body>
```

AMPs also allow you to set up your tag management tool through an iframe. Please note that if the iframe has not loaded within 5 seconds, it will not be called. You will find below an a setup example through an iframe:

**Setup example with iframe**

```
<!doctype html>
<html amp lang=”en”>
<head>
<meta charset=”utf-8″>
<title>Commanders ACT – Serverside – AMP Analytics</title>
<link rel=”canonical” href=”http://example.ampproject.org/article-metadata.html” />
<meta name=”viewport” content=”width=device-width,minimum-scale=1,initial-scale=1″>
<!– Mandatory execution of the AMP iframe script “https://cdn.ampproject.org/v0/amp-iframe-0.1.js ” –>
<script async custom-element=”amp-iframe” src=”https://cdn.ampproject.org/v0/amp-iframe-0.1.js”></script>
<style>body {opacity: 0}</style><noscript><style>body {opacity: 1}</style></noscript>
<script async src=”https://cdn.ampproject.org/v0.js”></script>
</head>
<body>
<!– Call to the TagCommander iframe “https://academy.commandersact.com/AMP/iframe.php” containing the data layer variables. Note: the iframe must belong to a different domain from that of the website (except if the allow-same-origin parameter is added) and be https –>
<amp-iframe width=1 height=1 src=”https://academy.commandersact.com/AMP/iframe.php? env_template=homepage&env_work=prod&env_device=m&env_country=IT&page_name=amp_homepage&user_id=&user_newcustomer=&order_id=” sandbox=”allow-scripts allow-same-origin” layout=”fixed” frameborder=”0″>
<!– Adding content to the iframe is mandatory (a pixel in this case)–>
<amp-img src=”https://academy.commandersact.com/AMP/pixel.gif” height=1 width=1 layout=”fill” placeholder></amp-img>25
</amp-iframe>
<h1 id=”header”>AMP Page</h1>
<span id=”event-test” class=”tC_events” data-vars-event-label2=”22″>
Click here to generate an event
</span>
</body>
</html>
```


# Angular

Installation Instructions for Web container with Angular.

Commanders Act TMS offers dedicated Plug-Ins for all major Single Page Application (SPA) frameworks. Please refer to the Plug-In [documentation on GitHub](https://github.com/TagCommander/ngx-tag-commander) for detailed installation instructions for Angular.

{% hint style="info" %}
Angular uses the Client-Side (web container) version of the TMS Commander's Act

It is also possible to send server-side events. Simply use a 'Web Container' source.
{% endhint %}


# AngularJS

Installation Instructions for TagCommander with AngularJS.

Commanders Act TMS offers dedicated Plug-Ins for all major Single Page Application (SPA) frameworks. Please refer to the Plug-In [documentation on GitHub](https://github.com/TagCommander/angular-tag-commander) for detailed installation instructions for AngularJS.

{% hint style="info" %}
AngularJS uses the Client-Side (web container) version of the TMS Commander's Act

It is also possible to send server-side events. Simply use a 'Web Container' source.
{% endhint %}


# React

Installation Instructions for Commanders Act Web Container with React.

Commanders Act offers dedicated Plug-Ins for all major Single Page Application (SPA) frameworks. Please refer to the Plug-In [documentation on GitHub](https://github.com/TagCommander/react-tag-commander) for detailed installation instructions for React.

{% hint style="info" %}
React uses the Client-Side version of Commanders Act TMS.
{% endhint %}


# SPA implementation guide

### 1. W**hat is an SPA environment**? <a href="#id-1.-what-is-an-spa-environment" id="id-1.-what-is-an-spa-environment"></a>

An SPA (Single Page Application) is a website or a web application that loads elements dynamically according to user actions rather than loading new pages after every interaction. Commanders Act web container offers functions allowing you to load all or a part of the container within an SPA environment, allowing you to call desired tags on every action performed by a user. These functions need to be implemented in your site’s source code by either your technical partner or by your own technical staff.

### 2.**How to implement Commanders Act web container in an SPA environment**? <a href="#id-2.how-to-implement-tagcommander-in-an-spa-environment" id="id-2.how-to-implement-tagcommander-in-an-spa-environment"></a>

#### 2.1 Loading containers <a href="#id-2.1-loading-containers" id="id-2.1-loading-containers"></a>

Commanders Act web containers are loaded once upon page load within a Single Page Application Environment. In order to reload containers on user actions, you can use the following features:

* tC.container.reload() : this function allows you to reload all the containers on a page. Elements shared by containers (deduplication calculation, external variables initialization, internal variables calculation, calculation of cookies dropped with data storage and the initialization of the Privacy cookie) are only loaded once to optimize performance.

```
tC.container.reload({ exclusions: ["datastorage","deduplication","internalvars","privacy"], events: {label1: [{targeted_element},{event_variables}], label2: [{},{}]}})
```

This function allows to reload all of a page’s containers while excluding some of their elements. Elements to exclude need to be mentioned in the “exclusions” table.\
\
Ex: if you wish to reload the container without recalculating internal variables, you need to call this function: tC.container.reload({exclusions:\["internalvars"]})\
\
This function also allows to call the tC.event function that loads selected tags upon user action. The tC.event function is executed after the container elements reloading. label: specify the name you wish to call your function (ex : "click", "add\_to\_cart"…). targeted\_element: DOM elements on which the event applies. {} if not necessary.\
\
event\_variables: variables specific to the event. {} if not necessary.Ex:

`tC.container.reload({events: {label1: [{target: document.getElementById('targeted_element'}, {"page_name":"", "product_id":""}]}})`

* tC.container\_IDS\_IDC.reload() : this function allows loading a single container (to do so, you will have to specify the site’s and the container’s ID) on a page that contains more than one.

IDS : Commanders Act site ID\
IDC : Commanders Act container ID

* `tC.container_IDS_IDC.reload({ exclusions: ["datastorage","deduplication","internalvars","privacy"], events: {label1: [{targeted_element},{event_variables}], label2: [{},{}]} })`

This function allows loading a single container (to do so, you will have to specify the site’s and the container’s ID) on a page that contains more than one while excluding some of their elements. Elements to exclude need to be mentioned in the “exclusions” table, and event functions need to be mentioned in the “events” object, as for the `tC.container.reload({exclusions:["datastorage","deduplication","internalvars","privacy"]})` function.

#### 2.2 Loading tags <a href="#id-2.2-loading-tags" id="id-2.2-loading-tags"></a>

To load selected tags upon user action, you will need to implement this function:

* `tC.event.label()` : this function allows loading selected tags upon user action.

label: specify the name you wish to call your function.\
\
Ex: implement the tC.event.step2\_basket function if your wish to call specific tags on the 2nd step in the purchase cart.\
\
You can also set-up a “generic” function like tC.event.all on all of your virtual pages to call tags on all of your SPA sites (Analytics tags, for instance). You will then use perimeters and constraints from the Commanders Act interface to control other tags’ execution.

* `tC.event.label(this, {"page_name":"", "product_id":""})` : this function allows loading selected tags based on user action and to define variables specific to said action (ex : the name of a virtual page, a specific product id …).

#### 2.3 Going further: Structure of a Commanders Act web Ccontainer <a href="#id-2.3-going-further-structure-of-a-tagcommander-container" id="id-2.3-going-further-structure-of-a-tagcommander-container"></a>

You will find below a list of all the elements that load inside the Commanders Act web container upon first load, as well as the tC.container.reload,(tC.container\_IDS\_IDC.reload()) and tC.event.XXX() functions that are called.

| Container element                                                                       | Definition                                                                                                                                             | 1st container load | tC.container.rel oad() function | tC.container\_IDS\_IDC.reload() function | tC.event.XXX() function |
| --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ | ------------------------------- | ---------------------------------------- | ----------------------- |
| Deduplication functions                                                                 | They identify thevisitor’s traffic source                                                                                                              | yes                | Yes (once loaded)               | yes                                      | no                      |
| External variables initialization                                                       | They define all external variables that do not already exist                                                                                           | yes                | yes                             | yes                                      | no                      |
| Dynamic JS 1                                                                            | Calls an external JavaScript file prior to the internal variables’ declaration                                                                         | yes                | no                              | no                                       | no                      |
| Static JS 1                                                                             | Calls custom JavaScript code prior to the internal variables’ declaration                                                                              | yes                | no                              | no                                       | no                      |
| Internal variables                                                                      | Calculates internal variables                                                                                                                          | yes                | yes                             | yes                                      | no                      |
| Dynamic JS 2                                                                            | Calls an external JavaScript file after the external variables’ declaration                                                                            | yes                | no                              | no                                       | no                      |
| Static JS 2                                                                             | Calls an external JavaScript file after the internal variables’ declaration                                                                            | yes                | no                              | no                                       | no                      |
| Data storage                                                                            | Calculates the value of cookies created with the "data storage" module                                                                                 | yes                | yes                             | yes                                      | no                      |
| "Container loaded" & "DOM ready" & "Clicks"& "Form submission " & "Scroll" tags + rules | Executes tags called on the "Container loaded", "DOMready", "Clicks","Form submission" and"Scroll" triggers, as well as on the rules associated to the | yes                | no                              | no                                       | no                      |
| ​                                                                                       | container’s first load.                                                                                                                                | ​                  | ​                               | ​                                        | ​                       |
| "Custom" tags + rules                                                                   | Executes tags called on the "Custom"triggers, as well as on the rules associated to the container’s loading or reloading.                              | yes                | yes                             | yes                                      | yes                     |
| Events + rules                                                                          | Executes events triggered on the previous tc\_events function                                                                                          | yes                | no                              | no                                       | no                      |
| Privacy                                                                                 | Re-initializes the Privacy cookie to take into account users’ choices.                                                                                 | yes                | yes                             | yes                                      | No                      |
| Tag Hierarchy                                                                           | Identifies piggybacked tags (tags sideloaded by other tags in the"TagPerformanc e" module)                                                             | yes                | no                              | no                                       | no                      |
| Event listener                                                                          | Reloads event listeners (which allow to track actions performed by any userbrowsing the site (clicks, scrolls …))                                      | yes                | no                              | no                                       | no                      |


# VueJS

Installation Instructions for Commanders Act Web Container with VueJS.

Commanders Act offers dedicated Plug-Ins for all major Single Page Application (SPA) frameworks. Please refer to the Plug-In [documentation on GitHub](https://github.com/TagCommander/vue-tag-commander) for detailed installation instructions for VueJS.

{% hint style="info" %}
VueJS uses the Client-Side version of Commanders Act TMS.
{% endhint %}


# IOT & TV Apps

Installation Instructions for Commanders Act TMS for direct HTTP connections.

It is possible to send server-side events Commanders Act TMS container via a HTTP tracking API Source (e.g. for IOT and TV apps). Please refer to [this page](https://doc.commandersact.com/features/sources/sources-catalog/server/http-tracking-api) for more details

{% hint style="info" %}
IOT & TV apps use the server-side events of TMS Commanders Act.
{% endhint %}


# Best Practices


# FAQ

Some answers from your questions

## I cannot see my console.log, why ?

When you write a `console.log` within a tag to check if a tag is correctly triggered of to check a value, for example like this :

<figure><img src="/files/WXebgHggFT0sA7REvaxE" alt=""><figcaption></figcaption></figure>

When a new container version is generated, it re-writes the `console.log` as `tC.log`

To be able to read these `tC.log` you need to add this cookie within you browser :

<figure><img src="/files/bpBx6Dwt8dMaMoCASXPG" alt=""><figcaption></figcaption></figure>


# Common Container Strategies

Container strategies for common setups.

A Container Strategy is the layout of the Web Container of a site. Following you will find recommended Container Strategies for common types of websites and businesses.

## Ecommerce

Ecommerce websites require a mix of personalization, analytics and conversion Tags. To optimise website performance it is recommended to use three Containers.

| Container        | Type     | Placement                  | Tags                            |
| ---------------- | -------- | -------------------------- | ------------------------------- |
| Head Container   | `<head>` | All pages                  | A/B-testing and personalization |
| Body Container   | `<body>` | All pages or catalog pages | Analytics and tracking          |
| Funnel Container | `<body>` | Funnel pages               | Conversion                      |

With this setup it is possible to avoid conversion Tag JavaScript snippets on catalog pages—this results in smaller Container file sizes and therefore quicker loading times for SEO relevant catalog pages.

## Publisher

Publisher websites primarily require analytics Tags. Therefore it is recommended to only use one Container.

| Container      | Type     | Placement                  | Tags                   |
| -------------- | -------- | -------------------------- | ---------------------- |
| Body Container | `<body>` | All pages or catalog pages | Analytics and tracking |

Using one `<body>` Container helps to have minimal impact on the page loading time, which is crucial for SEO of Content pages like news articles.

In case A/B-testing and personalization Tags are used, the additional implementation of a `<head>` Container is recommended.


# Common Trigger Strategies

Data Layer strategies for common setups.

Following you will find common Commanders Act Trigger setups.

## Page View Trigger

In most cases page view events are covered by the inbuilt *Container loaded* and *DOM ready* Trigger within Commanders Act. Therefore it is only necessary to setup the Data Layer and the Container to execute Tags on page views. In case of JavaScript driven webpages it is sometimes necessary to further track "virtual page views", e.g. in case the process steps of a sales funnel (log-in, enter shipping details, enter payment details, confirm order, order success) are implemented via JavaScript functionally and not via individual pages with distinct URLs.

In this case it is common to track the initial page view with the *Container loaded* or *DOM ready* Trigger and subsequent virtual page views via a custom Trigger. For this scenario it would be necessary to follow these steps on each subsequent virtual page view.

#### **1. Update `tc_vars` Data Layer**

The Data Layer should be updated with the new metadata of the subsequent virtual page view.

```javascript
window.tc_vars = {
    env_template: "homepage",
    env_work: "prod",
    page_name: "Homepage",
    page_keywords: ["homepage", "home", "entrypage", "index"],
    product_name: "",
    (…)
};
```

**2. Reload the Container**

Some internal functionality of the Container (e.g. Internal Variables) are only calculated when the Container was initially loaded. To reload these with the updated Data Layer it is necessary to reload the Container via a JavaScript function.

```javascript
tC.container.reload();
```

**3. Execute Triggers**

After these steps it is then necessary to signal a custom Trigger to execute the related Tags.

```javascript
cact('emit', 'page_view', {});
```

To use event attributes, you can specify the event or the element as first argument.

```html
<a href="/home" onclick="cact('emit', 'pageview', { from: this, some_data: 'some_value' })">Home</a>
```

***Old Method***

```javascript
tC.event.pageview({}, {});
```

To use event attributes, you need to specify the event or the element as argument. `event` is a special variable that is always available inside of `onclick` and `on*` attributes.

```html
<a href="/home" onclick="tC.event.pageview(event, {}))">Home</a>
```

{% hint style="info" %}
Steps 2. and 3. are often used in conjunction therefore it is possible to combine them in one call. e.g. `tC.container.reload({ events: { pageview: [{}, {}] } });`
{% endhint %}

## Click Trigger

Click Trigger implementation depends on the scenario. e.g. *Is the user navigated to another site when he clicks an element?* and *Does the following page open in a new tab?*.

Following you will find a list of common scenarios for click Trigger.

### Scenarios

#### Click Navigates to an Internal Page

Links or interactions that navigate the user to another internal page are difficult to track. The reason for this is that Tags usually need more time to execute than the browser needs to navigate to the next page. This might accidentally cancel Tags execution and therefore its related tracking capabilities.

To successfully track these kind of scenarios it is important to align with the Tag vendor for a solutions. Typical solutions are:

* The Tag delays page navigation until the Tag finishes execution
* The Tag uses the Beacon Browser API, which sends tracking calls in the background

These options typically require configuration of the event Tag code.

#### Click Navigates to an External Page

External links are best opened in another browser tab by using the `target="_blank"` option on anchor links. This allows Tags to finish their work on the old tab, while users can already navigate the new external page in a new tab.

In case external links can not be opened in a new tab this scenario should follow the same advice than the prior scenario.

#### Click Does Not Navigate to Another Page

Some click events do not redirect to a new page. Typical examples are video transport controls or interactions with image carousels.

These click events can usually be tracked with less rissk due to Tags having enough time to execute on the same page.

### Setup

#### With Commanders Act Interface

Commanders Act users can setup common click Triggers with minimal effort via the Web Containers interface by selecting them with a CSS selector path.

This Trigger works in many scenarios but has two downsides:

1. Using a generic CSS selector path to setup a Trigger is unstable and can break on future releases of the website code when the CSS is updated.
2. Commanders Act can only identify elements that are loaded synchronously on the website. Elements that are loaded asynchronously cannot be watched by the predefined Commanders Act Trigger.

Good scenarios for setting up Commanders ActTriggers with the Interface are:

1. Onsite campaign that has to be measured for a short time period (couple of weeks)
2. General click tracking until the web development team can implement a custom Trigger.

#### With Custom Trigger

Technical personnel can implement custom Triggers to track clicks on a website. This approach is more stable compared to setting up a click Trigger with the interface, but usually requires some time until the web development team can implement them. Therefore it is recommended to implement intermediary Triggers with the interface until they are implemented in the site.

Custom Triggers should not be implemented for short term campaigns, but should be favoured for business critical functionalities like *Add to basket* or *Successful Registration*.

A common way to setup click Trigger is done by setting up `data-attributes` on all elements where clicks should be tracked. These attributes could then be filled by the website CMS with values, so e.g. the marketing team can setup a "Click Trigger" for a new Teaser on their own. In HTML this might look like this:

```markup
<a href="..." class="btn btn--cta" data-tracking-action="click" data-tracking-label="My CTA" data-tracking-value="campaign-1234">Buy now!</a>
```

Inside of Commanders Act Platform it is then possible to catch clicks on these elements to execute a custom Trigger. With jQuery this might look like this:

```javascript
(function(){

    if (!$) {
        console.log("Commanders Act | Error | jQuery not available in Commanders Act Click Trigger!");
        return;
    }

    var eventActionSelector = '[data-tracking-action="click"]';
    var eventLabelAttribute = 'data-tracking-label';
    var eventValueAttribute = 'data-tracking-value';

    var eventHandler = function(event) {

        var eventData = {};
        eventData.event_action = "click";
        eventData.event_label = $(this).attr("data-tracking-label");
        eventData.event_value = $(this).attr("data-tracking-value");

      	if (tC.event && typeof tC.event[triggerName] === "function"){
            // old method
            // tC.event["my_click_trigger"](event, eventData);

            eventData.from = event; // necessary to use event attributes inside the tag
            cact('emit', 'my_click_trigger', eventData);
      	}

    }

    // Setup event handler on body via event delegation to include asynchronous elements
    $("body").on("click", eventElementSelector, eventHandler);

}());
```

{% hint style="info" %}
This approach results in a nice separation of concerns between website code and Commanders Act. The website is responsible to provide tracking data and mark which elements should be trackable. Commanders Act is responsible in bootstrapping the click tracking code and executing the related Tags.
{% endhint %}


# Performance Optimization

Strategies to improve the onsite performance of TagCommander.

Onsite performance of a website is one of the most important KPIs for SEO. Therefore more and more businesses are interested in optimizing onsite performance via TagCommander. This post collects topics to make TagCommander itself more performant.

## Reduce File Size of Web Containers Commanders Act

### **Remove unused Data Layer Properties**

Each Data Layer property that is configured in the options in the interface creates a bit of JavaScript code in the Container to initialise the variable in case it was not present in the onsite Data Layer `tc_vars`. Removing unused/old variables will therefore make the Container file a bit smaller (and as a side effect also improve transparency of the Container setup).

### **Remove Unused Internal Variables**

Each internal variable that is configured in the options in the interface is a JavaScript snippet, so removing internal variables allows to make a Container file smaller. This can be done by removing unused internal variables and also by specifying which variables are used in which Container. This is especially important for clients with a `<head>` and `<body>` Container and clients that have multiple Containers for different websites.

### **Do Not Repeat Yourself**

Sometimes the same functionality of a Tag is duplicated in multiple Tags. In these cases it is possible to save a good amount of JavaScript code and Container file size by refactoring the common functionality into an internal variable or into a common Tag. For example many Tags exist of two parts. One part loads an external JavaScript library of the vendor and one part sends the actual event to the vendor. Per default the code that loads the JavaScript library is often duplicated in every event. So extracting the first part into a *base Tag* allows to remove the duplicated JavaScript.

### **Split Large Container Files**

Many Tags are deployed on every page of a website even so they are not triggered. For example many vendors have separate Tags for collecting information and only one Tag that is played out on the confirmation page. Therefore it might make sense to split the Container in two parts—one for catalogue pages and one for funnel pages. Therefore both Containers have a smaller size as they only include Tags that are relevant for their part of the website.

Also make sure to only implement Tags in `<head>` Container if necessary as those Tags usually have a greater impact on onpage performance than Tags in \`\<body>\` Container.

### **Implement Hybrid Web Container Setup**

A hybrid setup allows to move onsite performance impact into the Server-Side Commanders Act infrastructure.

{% hint style="danger" %}
To avoid any negative impact on your web performance, a web container should never exceed 500MB.
{% endhint %}

## Make Commanders Act asynchronous

### **Load Container Asynchronous**

Many onsite page speed crawlers measure the time until the browser event *onload*. So in case the IT team loads the Web Container asynchronous on the *onload* event it is possible to make the Web Container file *invisible* for some page speed metrics. This is usually only possible for `<body>` Containers as `<head>` Containers need to be executed synchronously for A/B testing and personalization Tags that have an impact on the visual content of the website.

{% hint style="danger" %}
Tags in asynchronous `<body>` Container that use synchronous `document.write` (e.g. some advertising solutions) will break the website in case the Container is loaded asynchronously. These Tags need to be avoided in case a Container is installed asynchronously.
{% endhint %}

### **Load Tags Asynchronous**

JavaScript is for the most part a single thread language, this means that long running JavaScript (like a long process in a loop) can block other parts of the JavaScript that should be executed right away. It is possible to put long running JavaScript on an *execute later with a lower priority stack* by wrapping it inside of a setTimeout with a delay of 0 ms.

```javascript
setTimeout(function() {
    // My Tag Code
}, 0);
```

This needs to be tested with each individual Tag as some might not be compatible with this approach.


# tC.\* attributes and methods

*“tC.” methods are **namespaced\*** . They come in handy when needing to perform technically advanced actions such as printing the array of launched tags within a container into the browser’s console. Please note that these functions’ availability and behavior depend on several elements like your container configuration, among others. Simply type “tC.” into your browser’s console and the list of available functions on a given site and for a given container will appear.*

*\* “**namespacing** is a technique employed to avoid collisions with other objects or variables in the global **namespace**. They’re also extremely useful for helping organize blocks of functionality in your application into easily manageable groups that can be uniquely identified.”*

| *tC.\_R*                                                                     | *Internal object used for statistics*                                                                                                                                                                                                                                                                                                             |
| ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| *tC.ams*                                                                     | *Internal object used for the Measure product*                                                                                                                                                                                                                                                                                                    |
| *tC.array\_launched\_tags*                                                   | *Displays a list of tags within the container version that is published. If you use one of our testing tools (Bookmarklet or TagAssistant Chrome extension) and simulate the presence of a different container version, the function will display the tags within the container version that is being tested*                                     |
| *tC.array\_launched\_tags\_keys*                                             | *Displays a list of tag identifiers corresponding to the tags within the container version that is published or being tested*                                                                                                                                                                                                                     |
| *tC.call*                                                                    | *Internal function used for callbacks*                                                                                                                                                                                                                                                                                                            |
| *tC.containerVersion*                                                        | *Displays the version number of the container that is published or being tested*                                                                                                                                                                                                                                                                  |
|                                                                              |                                                                                                                                                                                                                                                                                                                                                   |
| *tC.containersLaunched*                                                      | *Displays a JavaScript object containing other objects. The latter correspond to the containers launched on a given page and provide information about them and the tags within (id, name)*                                                                                                                                                       |
| *tC.dedup*                                                                   | <p><em>DEDUPLICATION HAS TO BE ENABLED FOR THIS FUNCTION TO WORK</em></p><p><em>Displays a JavaScript object containing all defined channels and sources and showing whether they are active or not</em></p>                                                                                                                                      |
| *tC.dedup\_done*                                                             | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays whether the deduplication module is on or off on a given site</em></p>                                                                                                                                                                                   |
| *tC.dedup.cj*                                                                | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays the last 10 touchpoints in a user’s customer journey. They are collected with customer journey (CJ) cookies. You can adjust the number of touchpoints in the interface. To do so, please go to the Options > Channel and sources definition tab</em></p> |
| *tC.dedup.LeA*                                                               | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays the last recognized channel in the customer journey</em></p>                                                                                                                                                                                             |
| *tC.dedup.LeAD*                                                              | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays the source associated to the last recognized channel in the customer journey cookie</em></p>                                                                                                                                                             |
| *tC.dedup.LeC*                                                               | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays the last recognized channel – related to clicks – in the customer journey cookie</em></p>                                                                                                                                                                |
| *tC.dedup.LeCD*                                                              | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays the source associated to the last recognized channel – associated to clicks – in the customer journey cookie</em></p>                                                                                                                                    |
| *tC.dedup.LeV*                                                               | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays the last recognized channel – related to views – in the customer journey cookie</em></p>                                                                                                                                                                 |
| *tC.dedup.LeVD*                                                              | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays the source associated to the last recognized channel – related to views – in the customer journey cookie</em></p>                                                                                                                                        |
| *tC.dedup.FeC*                                                               | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays the first recognized channel – related to clicks – in the customer journey</em></p>                                                                                                                                                                      |
| *tC.dedup.FeCD*                                                              | <p><em>DEDUPLICATION HAS TO BE ACTIVE FOR THIS FUNCTION TO WORK</em></p><p><em>Displays the source associated to the first recognized channel – related to clicks – in the customer journey cookie</em></p>                                                                                                                                       |
| *tC.dedup.FeV*                                                               | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays the source associated to the first recognized channel – related to views – in the customer journey cookie</em></p>                                                                                                                                       |
| *tC.dedup.FeVD*                                                              | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays the source associated to the first recognized channel –related to views – in the customer journey cookie</em></p>                                                                                                                                        |
| *tC.dedup.AeA*                                                               | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays channels recognized halfway through the customer journey</em></p>                                                                                                                                                                                        |
| *tC.dedup.AeC*                                                               | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays channels recognized halfway through the customer journey (for clicks)</em></p>                                                                                                                                                                           |
| *tC.dedup.AeV*                                                               | <p><em>DEDUPLICATION HAS TO BE ENABLED</em> FOR THIS FUNCTION TO WORK</p><p><em>Displays channels recognized halfway through the customer journey (for views)</em></p>                                                                                                                                                                            |
| *tC.domReady*                                                                | *Displays whether all the content from the Document Object Model (DOM) has finished loading or not (i.e. the containers)*                                                                                                                                                                                                                         |
| *tC.domain*                                                                  | *Returns the page’s domain (.tagcommander.com for instance)*                                                                                                                                                                                                                                                                                      |
| *tC.each*                                                                    | *Internal iterator*                                                                                                                                                                                                                                                                                                                               |
| *tC.generatorVersion*                                                        | *Displays the container generation engine’s version*                                                                                                                                                                                                                                                                                              |
| *tC.getCookie*                                                               | *Displays the value of a given cookie. You need to write the function and the cookie’s name next to it between parentheses and quotes: tC.getCookie(“cookie’s name”).*                                                                                                                                                                            |
| *tC.getParamURL*                                                             | *Displays a given parameter from the page’s URL*                                                                                                                                                                                                                                                                                                  |
| *tC.hitCounter*                                                              | *Internal function used to obtain statistics related to invoicing hits*                                                                                                                                                                                                                                                                           |
| *tC.id\_container*                                                           | *Displays the container ID*                                                                                                                                                                                                                                                                                                                       |
| *tC.id\_site*                                                                | *Displays the TagCommander site ID*                                                                                                                                                                                                                                                                                                               |
| *tC.inArray*                                                                 | *Internal function to check if an element is placed inside an array*                                                                                                                                                                                                                                                                              |
| *tC.inclusion\_oct\_1*                                                       | *Specific to each container (JS inclusion)*                                                                                                                                                                                                                                                                                                       |
| *tC.internalFunctions*                                                       | *Namespace for TagCommander’s internal functions*                                                                                                                                                                                                                                                                                                 |
| *tC.internalvars*                                                            | *Namespace for TagCommander’s internal variables*                                                                                                                                                                                                                                                                                                 |
| *tC.isArray*                                                                 | *Method to verify whether a variable is placed inside an array*                                                                                                                                                                                                                                                                                   |
| *tC.isCurrentVersion*                                                        | *Confirms whether the currently deployed version in the interface is the current version on the site*                                                                                                                                                                                                                                             |
| *tC.isDOMReady*                                                              | *Confirms if the Document Object Model (DOM) is ready*                                                                                                                                                                                                                                                                                            |
| *tC.isFunction*                                                              | *Method to verify whether the type of a variable is a function*                                                                                                                                                                                                                                                                                   |
| *tC.isNumeric*                                                               | *Method to verify whether a variable’s value is a number*                                                                                                                                                                                                                                                                                         |
| *tC.isPrototypeOf*                                                           | *Method to verify whether a variable is prototype*                                                                                                                                                                                                                                                                                                |
| *tC.isWindow*                                                                | *Method to verify whether a variable is window*                                                                                                                                                                                                                                                                                                   |
| *tC.launchTag*                                                               | *Internal method used for TagCommander’s Google Chrome extension*                                                                                                                                                                                                                                                                                 |
| *tC.length*                                                                  | *Internal variable*                                                                                                                                                                                                                                                                                                                               |
| *tC.log*                                                                     | *Method replacing the console.log() command*                                                                                                                                                                                                                                                                                                      |
| *tC.maindomain*                                                              | *Displays the main domain containers are deployed on*                                                                                                                                                                                                                                                                                             |
| *tC.name*                                                                    | *Displays a “c” for container*                                                                                                                                                                                                                                                                                                                    |
| *tC.nodeNames*                                                               | *Displays the list of the Document Object Model’s (DOM) elements*                                                                                                                                                                                                                                                                                 |
| *tC.onDomReady*                                                              | *Method to execute code on the Dom Ready event*                                                                                                                                                                                                                                                                                                   |
| *tC.pixelTrack*                                                              | *Internal Method injecting pixels*                                                                                                                                                                                                                                                                                                                |
| *tC.privacy*                                                                 | *Namespace for variables related to the Privacy module*                                                                                                                                                                                                                                                                                           |
| *tC.privacyVersion*                                                          | *Displays the version number of the Privacy banner and settings that are published*                                                                                                                                                                                                                                                               |
| *tC.rchecked*                                                                | *Internal Variable storing a regexp*                                                                                                                                                                                                                                                                                                              |
| *tC.removeCookie*                                                            | *This function lets you remove a cookie. You need to write the function and the cookie’s name next to it between parentheses and quotes: tC.removeCookie(“cookie’s name”)*                                                                                                                                                                        |
| *tC.script*                                                                  | *Returns a JavaScript object that you can “unfold” to find the location of the container (link to the script)*                                                                                                                                                                                                                                    |
| *tC.setCookie*                                                               | <p><em>This function lets you create a cookie.</em><br><em>Here is the function interface:  tC.setCookie(name, value, lifetime, path, domain, secure, sameSite).</em><br><em>Ex: tC.setCookie(“My\_cookie”, “1”, 365,”/”,”.mysite.com”, true, "Lax")</em></p>                                                                                     |
| *tC.ssl*                                                                     | *Displays the SSL certificate: indicates whether the page’s protocol is https or http*                                                                                                                                                                                                                                                            |
| *tC.tagPatterns*                                                             | *Internal variable containing the regex (patterns) to detect tags’ hits for the TagPerformance module*                                                                                                                                                                                                                                            |
| *tC.tagPerf*                                                                 | *Internal variable for the TagPerformance module*                                                                                                                                                                                                                                                                                                 |
| *tC.tagPerfAnalyzer*                                                         | *Internal function that analyzes a page to calculate tags’ response time (for the TagPerformance module)*                                                                                                                                                                                                                                         |
| *tC.tagPerfE*                                                                | *Yet unused variable that controls sampling rates of TagPerformance’s calls*                                                                                                                                                                                                                                                                      |
| *tC.script.add(location.protocol + “//manager.tagcommander.com/utils/IP/”);* | *This function allows you to recover the IP address*                                                                                                                                                                                                                                                                                              |


# APIs

## GET Tags List

Returns the tags list

#### Call URL <a href="#resource-url" id="resource-url"></a>

GET api.commander1.com/api/1.0/manage/container/tags/list?**id\_site**=X&**access\_token**=Y&**id\_container**=Z

#### Call parameters <a href="#resource-information" id="resource-information"></a>

<table data-header-hidden><thead><tr><th>URL PARAMETER</th><th width="151">TYPE</th><th width="163">MANDATORY</th><th>DESCRIPTION</th></tr></thead><tbody><tr><td>URL PARAMETER</td><td>TYPE</td><td>MANDATORY</td><td>DESCRIPTION</td></tr><tr><td>id_site</td><td>Integer</td><td>Yes</td><td>Client site identifier</td></tr><tr><td>access_token</td><td>Alphanum</td><td>Yes</td><td>Caller’s security identifier</td></tr><tr><td>id_container</td><td>Integer</td><td>No</td><td>Container identifier</td></tr></tbody></table>

#### Return code: <a href="#example-request" id="example-request"></a>

| HTTP CODE | MESSAGE               | DESCRIPTION                                                         |
| --------- | --------------------- | ------------------------------------------------------------------- |
| 200       | OK                    | The request went through, the result is in the answer’s body        |
| 400       | Bad Request           | The parameters are not ok or mandatory parameters are missing       |
| 401       | Unauthorized          | The security token does not match the site\_id or the container\_id |
| 404       | Not Found             | A container identifier for the site\_id parameter was not found     |
| 500       | Internal Server Error | Internal server error                                               |

#### Response format : <a href="#example-request" id="example-request"></a>

The response is in JSON format.

<table data-header-hidden><thead><tr><th width="213">FIELD</th><th width="150">TYPE</th><th width="187">ALWAYS PRESENT ?</th><th>DESCRIPTION</th></tr></thead><tbody><tr><td>FIELD</td><td>TYPE</td><td>ALWAYS PRESENT ?</td><td>DESCRIPTION</td></tr><tr><td>idSite</td><td>Integer</td><td>Yes</td><td>Site identifier</td></tr><tr><td>containers</td><td>Array</td><td>Yes</td><td>Array containing the container list and their label</td></tr><tr><td>containers/id</td><td>Integer</td><td>Yes</td><td>Container identifier</td></tr><tr><td>containers/label</td><td>String</td><td>Yes</td><td>Container label</td></tr><tr><td>containers/is_active</td><td>Boolean</td><td>Yes</td><td>Container status (active=true, deleted=false)</td></tr><tr><td>tags</td><td>Array</td><td>Yes</td><td>Array containing the tag list and container label</td></tr><tr><td>tags/id</td><td>Integer</td><td>No</td><td>Tag identifier</td></tr><tr><td>tags/label</td><td>String</td><td>No</td><td>Tag label</td></tr></tbody></table>

`GET`

#### Response example <a href="#example-result" id="example-result"></a>

```
{  
    "idSite":26,
    "containers":[  
        {  
            "id":1,
            "label":"Container1",
            "is_active": true,
            "tags":[  
                {  
                    "id":1,
                    "label":"Click&Site Tracking"
                },
                {  
                    "id":3,
                    "label":"commanders act"
                }
            ]
        }
    ]
```

## Get Users

Get platform users.

## Users

<mark style="color:blue;">`GET`</mark> `https://api.commander1.com/v2/{siteId}/users`

Two usages :\
GET **/users/** : Returns a list of user properties (depending on the parameters requested) linked to the users of a site.\
GET **/users/123** : Return properties of one user (id **123**) on one site.\
\
Click below to download complete API documentation

#### Query Parameters

| Name    | Type    | Description                                           |
| ------- | ------- | ----------------------------------------------------- |
| id      | integer | The user id                                           |
| include | string  | `permissions` or `roles` or both separated by a comma |

{% tabs %}
{% tab title="200 " %}

```
```

{% endtab %}
{% endtabs %}


# Onsite API

## Getting Started

The onsite API is used to interact with Commanders Act features with JavaScript.

## How to use

The onsite API consists of a single function, `cact()`, with the following strict signature:

```javascript
cact(command, [options,] [callback])
```

| Argument   | Descriptions                                                                                      | Required |
| ---------- | ------------------------------------------------------------------------------------------------- | -------- |
| `command`  | A string identifier used to select the desired method.                                            | Required |
| `options`  | A JavaScript object that includes data passed to the method.                                      | Optional |
| `callback` | A JavaScript callback function that is used to receive information or events from the onsite API. | Optional |

Onsite API is included in each containers and privacy banners.

## Send event

To send event data to the serverside Commanders Act platform, use this command:

```javascript
cact('<event_name>', {<event_params>});
```

Example : to send a purchase event :

```javascript
cact('purchase', { 
  id:'1234',
  currency: 'EUR',
  //...
});
```

## Get information

To get various values from Commanders Act, use this command:

```javascript
cact(get command, [callback])
```

Example : to get consent from TrustCommander, you can call the `consent.get` API like this:

```javascript
cact('consent.get', function(result) {
    if (result.consent.status === "all-on") {
        
        // Consent available for all categories.
        
    }
});
```

{% hint style="warning" %}
The onsite API methods are called asynchronously. In case e.g. you need information synchronous in the `<head>` of the document it is recommended to cache and retrieve the result of the API in `localStorage`.
{% endhint %}

## Error handling

You can handle errors through error property in the callback object.\
Example:

```javascript
cact('consent.get', function(result) {

    if (result.error) {
    
        // Manage the error
    
    }
    else if (result.consent.status === "all-on") {
        
        // Consent available for all categories.
        
    }
});
```

## API Stub (optional)

For advance usage, we provide also an API stub that can be added when you need to interact with the API before containers or banners have loaded.\
This stub is already included in containers and privacy banners, so you do not have to add in most use cases.\
The stub is used to buffer all methods in a JavaScript array until Commanders Act JavaScript is loaded and ready to process the methods. This allows for example to use the onsite API before TrustCommander JavaScript was loaded.

```javascript
window.caReady = window.caReady || []; 
window.cact = function() { window.caReady.push(arguments); };
```

`window.caReady` is a JavaScript array that buffers the interactions with the API. `window.cact` is a JavaScript function used to interact with the onsite API.

{% hint style="success" %}
In case you work in a big team and are unsure the stub was already installed it is ok to install the JavaScript stub multiple times.
{% endhint %}


# TMS & Consent banners IDs

This is how you can retrieve IDs of sites, containers, privacy.

## Site & Containers IDs / Versions

To be able to retrieve your site ID & containers IDs you need to open your DevTool on your navigator and enter

```
tC.containersLaunched
```

<figure><img src="/files/bUG9an2rk8ACKEeS8mx0" alt=""><figcaption></figcaption></figure>

**Here above :**

* **Site ID** : 4505
* **Containers IDs** :
  * 20 *(version 155.04)*
  * 21 *(version 32.01)*

## Privacy ID & Privacy Version

To be able to retrieve your Privacy ID & Privacy Version you need to open your DevTool on your navigator and enter

```
tC.PrivacyID
```

```
tC.PrivacyVersion
```

<figure><img src="/files/SQDvbqWrmb7Od6AOWVzS" alt=""><figcaption></figcaption></figure>

**Here above :**

* **Privacy** **ID** : 12
* **Privacy Version** : 005


# Geoloc API

### Overview

The **Geoloc API** allows you to enrich your website’s traffic data with geographic information about your visitors — **without needing support from your technical team**.\
This service provides precise location attributes such as:

* Continent code
* Country code
* Region
* City
* Postal code
* Latitude & longitude

> **Note:** Geoloc is an **optional, billable feature**. Please contact your **Commanders Act Sales representative** for pricing details.

***

### How It Works

To retrieve geoloc data, our system sends a request to the following endpoint:

```
https://api.commander1.com/geoloc?token=XXX&site=XXX
```

**Parameters:**

| Parameter | Description                                                 |
| --------- | ----------------------------------------------------------- |
| `token`   | API token provided by the Commanders Act support team       |
| `site`    | ID of the site (Commenders Act workspace) requesting geoloc |

The API returns a JSON object containing the visitor’s geographic details.

#### Example Response

```json
{
  "continentCode": "EU",
  "countryCode": "FR",
  "region": "Île-de-France",
  "longitude": 2.3333,
  "latitude": 48.8667,
  "city": "Paris",
  "postalCode": "75001"
}
```

***

### Using Geoloca in your JavaScript custom block

Below is a simple example showing how to call the API and store the result in `tC.internalvars` for use within TMS. You can use this code inside your custom javascript block.

#### Example Script

```javascript
function httpGet(url) {
  var xmlHttp = new XMLHttpRequest();
  xmlHttp.open("GET", url, false); // synchronous request
  xmlHttp.send(null);
  return JSON.parse(xmlHttp.responseText);
}

tC.internalvars.geoloc = httpGet("https://api.commander1.com/geoloc/?site={YOUR SITE ID}&token={YOUR TOKEN}");
```

Once assigned, you can use any field directly via internalvars

```javascript
tC.internalvars.geoloc.continentCode  // "EU"
tC.internalvars.geoloc.countryCode    // "FR"
tC.internalvars.geoloc.region         // "Île-de-France"
tC.internalvars.geoloc.longitude      // 2.3399
tC.internalvars.geoloc.latitude       // 48.8718
tC.internalvars.geoloc.city           // "Paris"
tC.internalvars.geoloc.postalCode     // "75009"
```

These variables can now be used to create your own custom rules, such as display a privacy banner for different countries.


# Javascript SDK

## Getting Started

The onsite API is used to interact with Commanders Act features with JavaScript.

There are different commands available within `cact()`: `config` is used to set general options, `trigger` event is used to send data, and other specific `get/update/revoke` commands are used to interract with platform features (ex : get user consent)

{% hint style="info" %}
To use the API, you must have either a web container on the page **or** the JS SDK library script: <https://cdn.tagcommander.com/events/sdk.js>
{% endhint %}

## How to use <a href="#how-to-use" id="how-to-use"></a>

The onsite API consists of a single function, `cact()`, with the following strict signature:

```
cact(command, [options,], [config,], [callback])
```

| Argument   | Descriptions                                                                                                                     | Required |
| ---------- | -------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `command`  | A string identifier used to select the desired method.                                                                           | Required |
| `options`  | A JavaScript object that includes data passed to the method.                                                                     | Optional |
| `config`   | A javascript object that is used to override the default settings like `siteId` , `collectionDomain` , `eventId`, or `sourceKey` | Optional |
| `callback` | A JavaScript callback function that is used to receive information or events from the onsite API.                                | Optional |

Onsite API is included in each containers and privacy banners.

## Initialize global settings with config <a href="#config" id="config"></a>

Use the `config` command to initialize and configure settings for a particular workspace.

{% hint style="info" %}
This command is optional, you can also set custom settings directly inside a[ `trigger` command](#send-event), through the config object parameter.
{% endhint %}

The config command takes the following format:

```javascript
cact('config', {<config_object>});
```

Config object accept **4 parameters**, they are optional if you use a web container on your page :

* `siteId` : if not set, the default value is the site id of the last web container loaded (`tC.id_site`)
* `sourceKey`: if not set, the default value is derivative from you web container id. If you don't have a web container, the sourceKey is mandatory and correspond to your JS SDK source.
* `collectionDomain`: if not set, the default value is `collect.commander1.com` (or your first party domain, if you setup one and use a [web container](/features/sources/sources-catalog/web/containers))
* `eventId`: if not set, an random id is set for this event and will be put in `context.event_id`

Example :

```javascript
cact('config', { siteId: 1234, sourceKey: 'abcd' });
```

## Send event <a href="#send-event" id="send-event"></a>

{% hint style="info" %}
To use the API, you must have either a web container on the page **or** the JS SDK library script : <https://cdn.tagcommander.com/events/sdk.js>
{% endhint %}

To send event data to the serverside Commanders Act platform, use this command:

```javascript
cact('trigger', '<event_name>', {<event_params>});
```

Example : to send a purchase event :

```javascript
cact('trigger', 'purchase', {   id:'1234',  currency: 'EUR',  //...});
```

Example : to send a purchase event, overriding the default tracking domain / workspace / sourcekey :

```javascript
cact('trigger', 'purchase', {   id:'1234',  currency: 'EUR',  //...},{
    collectionDomain: "my.firstdomain.com",
    siteId: "1234", 
    sourceKey: "abcd"
});
```

### Send events in exempt mode (without identifier cookies)

In some setups, you may need to send events without user consent, for example when using a consent-exempt analytics configuration.

In this case, you can enable the `exemptMode` option.

When enabled, Commanders Act will collect the event without setting identifier cookies such as `CAID`, `WID`, (or `TCID` depending on your setup).

#### Global configuration

You can enable `exemptMode` globally using the `config` command.

```javascript
cact('config', {
  exemptMode: true
});
```

All subsequent events sent with `cact('trigger', ...)` will use this behavior by default unless overridden at the event level.

#### Per-event configuration

You can enable `exemptMode` only for specific events by using the configuration parameter of the `trigger` command.

```javascript
cact('trigger', 'page_view', {
  page_type: 'home'
}, {
  exemptMode: true
});
```

This allows you to selectively send certain events in exempt mode while keeping others in standard mode.

#### Override global configuration

If `exemptMode` is enabled globally, it can still be disabled for specific events.

```javascript
cact('config', {
  exemptMode: true
});

cact('trigger', 'purchase', {
  id: '1234'
}, {
  exemptMode: false
});
```

This allows full control over how each event is collected.

#### When to use this option

Use `exemptMode` when:

* your event is sent before the user has provided consent
* or you are using a consent-exempt analytics setup

Typical use case:

An event is triggered as soon as the page loads, before the user interacts with the consent banner, and must still be sent for analytics purposes without setting identifier cookies.

***

## Get information <a href="#get-information" id="get-information"></a>

To get various values from Commanders Act, use this command:

```
cact(get command, [callback])
```

Example : to get consent from TrustCommander, you can call the `consent.get` API like this:

```
cact('consent.get', function(result) {    if (result.consent.status === "all-on") {                // Consent available for all categories.            }});
```

The onsite API methods are called asynchronously. In case e.g. you need information synchronous in the `<head>` of the document it is recommended to cache and retrieve the result of the API in `localStorage`.

## Error handling <a href="#error-handling" id="error-handling"></a>

You can handle errors through error property in the callback object. Example:

```
cact('consent.get', function(result) {​    if (result.error) {            // Manage the error        }    else if (result.consent.status === "all-on") {                // Consent available for all categories.            }});
```

## Meta Properties

The `meta` property includes metadata and context for the consent that was provided on a browser. You can see the list of Meta properties [here](/features/consent-management/knowledge-base/consent-object#meta-properties)

## API Stub (optional) <a href="#api-stub-optional" id="api-stub-optional"></a>

For advance usage, we provide also an API stub that can be added when you need to interact with the API before containers or banners have loaded. This stub is already included in containers and privacy banners, so you do not have to add in most use cases. The stub is used to buffer all methods in a JavaScript array until Commanders Act JavaScript is loaded and ready to process the methods. This allows for example to use the onsite API before TrustCommander JavaScript was loaded.

```
window.caReady = window.caReady || []; window.cact = function() { window.caReady.push(arguments); };
```

`window.caReady` is a JavaScript array that buffers the interactions with the API. `window.cact` is a JavaScript function used to interact with the onsite API.

In case you work in a big team and are unsure the stub was already installed it is ok to install the JavaScript stub multiple times.

## Use Javascript SDK in TMS

***

Our system now includes several new and improved features to help you efficiently manage and implement tags on your website. This guide provides comprehensive information on using our TMS webcontainers and JavaScript SDK, including browser-side events, command references, and tag context variables.

***

### Browser-Side Events

**Introduction**

Our new `cact('emit')` API is a new approach of `tC.event.XXX` functions, ensuring safer and more reliable event handling.

Here’s how you can use these events:

```html
<!-- Old method (may cause issues if event does not exist) -->
<a href="mysite.com" onclick="tC.event.my_custom_event(this, { my_event_variable: 'some_value' });">

<!-- New method (safe) -->
<a href="mysite.com" onclick="cact('emit', 'my_custom_event', { from: this, my_event_variable: 'some_value' });">
```

{% hint style="info" %}
Note that hyphens (`-`) in event names will be converted to underscores (`_`). For example, `cact('emit', 'my-custom-event')` will actually call `tC.event.my_custom_event`.
{% endhint %}

### **Available Events**

* **container\_ready**: Fires for every loaded container.
* **container\_**`<siteId>_<containerId>`**\_ready:** Fires a specific event for each container`container_ready` event (ex: `container_1234_1_ready`)
* **consent-ready**: Fires when the consent cookie is set or the banner is accepted/refused.
* **consent-updated**: Fires when consent is updated.
* **consent-revoke**: Fires when consent is revoked.
* **consent-signal-ready**: Used for Google Consent Mode setups.
* **banner-show**: Fires when the privacy banner is shown.
* **banner-hide**: Fires when the privacy banner is hidden.
* **privacy-center-show**: Fires when the privacy center is shown.
* **privacy-center-hide**: Fires when the privacy center is closed.
* **tag\_trigger\_form\_submission**: Standard form trigger.
* **tag\_trigger\_clicks**: Standard clicks trigger.
* **tag\_trigger\_scroll**: Standard scroll trigger.
* **track\_all\_events**: Server-side event sent with `cact('trigger')` API.
* **track\_\*:** Similar to `track_all_events` but with specific event names (e.g., `track_page_view`, `track_add_to_cart`).
* **privacy-module-loaded**: Internal event fired when `tC.privacy` is initialized.
* **Custom events**: Sent using `cact('emit')`.

#### Trigger example to fire a tag on `consent-updated` event

<figure><img src="/files/7SE2OXYH4baxn1UR7NT1" alt=""><figcaption></figcaption></figure>

### **Listening to all Events**

You can listen to all events using the `cact('on', '*')` API.

```javascript
function listen_all_events(event) {
  console.log(event.type); // '*'
  console.log(event.originalEvent.type); // 'page_view'
}

cact('on', '*', listen_all_events);
cact('emit', 'page_view');
```

### **Custom Tag Triggers**

To fire a custom trigger, use the `cact('emit', 'my_custom_event')` command. Note that hyphens will be converted to underscores when launching the trigger.

```javascript
cact('emit', 'my_custom_event');
```

You will be able to use this event as a TMS custom trigger:

<figure><img src="/files/NUipeG4VGuesrrUHLU1G" alt=""><figcaption></figcaption></figure>

***

### Commands Reference

The container provides a set of commands, some of which trigger browser-side events. To see all commands, type `tC.cact` in your console.

**`config`**

Set various website configurations.

```javascript
cact('config', { siteId: 4242, collectionDomain: 'example.com', sourceKey: 'ABCD-1234-EFGH' });
```

**`setProperty`**

Set properties to be merged with server-side events sent via the trigger API.

```javascript
cact('setProperty', 'page_type', 'homepage');
cact('setProperty', 'user.email', 'user@example.com');
```

**`emit` (Alias: `dispatchEvent`)**

Dispatch a browser-side event for use as a custom tag trigger.

```javascript
cact('emit', 'page_view', { page_type: 'homepage' });
```

**`on` (Alias: `addEventListener`)**

Subscribe to a browser-side event.

```javascript
cact('on', 'page_view', function(event) {
  console.log('event received of type', event.type); // 'page_view'
  console.log('event data is:', event.eventData); // { page_type: 'homepage' }
});

cact('emit', 'page_view', { page_type: 'homepage' });
```

**`once`**

Similar to `on`, but the callback fires only once.

```javascript
cact('once', 'page_view', listener_callback);
```

**`off` (Alias: `removeEventListener`)**

Remove an event listener.

```javascript
cact('off', 'page_view', listener_callback);
```

**`trigger`**

Send a server-side event. Any call to `cact('trigger', ...)` will also dispatch a generic `track_all_events` event.

```javascript
cact('trigger', 'add_to_cart', { value: 42, currency: 'EUR' });
```

***

### Tag Context Variables

The Tag Context provides variables used within a tag. If you need a Tag Context similar to "Container Loaded," consider using the `container_ready` custom trigger.

**`cact_container`**

Contains information about the container.

```javascript
{
  id_container: <containerId>,
  id_site: <siteId>,
  sourceKey: <sourceKey>
}
```

**`cact_event`**

The event that triggered the tag, with a property `cact_event.type`.

```javascript
cact('emit', 'page_view', {});
// cact_event.type will be 'page_view'
```

**`cact_event_vars`**

Contains all event variables from the trigger.

```javascript
cact('emit', 'page_view', { hello: 'world' });
// cact_event_vars will be { hello: 'world' }
```

**`cact_event_attrs`**

Contains event attributes, set using the `from` property in `emit` or `trigger` API.

```html
<a href="/home" onclick="cact('emit', 'page_view', { from: this, hello: 'world' })">Home</a>
```

For more examples and a live demo, refer to the documentation links provided.

***

### Best Practices and Tips

**Resolving Site-ID/Source-Key Conflicts**

In multi-container websites, events were sometimes sent with incorrect site-id or source-key. This issue is fixed for tags using triggers other than native "Container Loaded." Use the new `container_ready` custom trigger for accurate site-id/source-key resolution.

**Privacy-Related Events**

You can use various privacy-related events as custom triggers:

* `consent_ready`
* `consent_updated`
* `consent_revoke`
* `banner_show`
* `banner_hide`
* `privacy_center_show`
* `privacy_center_hide`

**Server-Side Tracking as Custom Triggers**

Need to track an event sent in Server Side ?

Our `cact('trigger', ...)` will dispatch a corresponding `track_*` event, that you can use as a custom trigger.

```javascript
cact('trigger', 'page_view', { value: 42, currency: 'EUR' });
```

To use this feature as a TMS custom tag trigger, you'll need to prefix the event name with "track\_\*"\
Example:\\

<figure><img src="/files/Jm88MVkanCtM7JgBUl9F" alt=""><figcaption></figcaption></figure>

**Using `cact('on')` for Event Subscription**

You can subscribe to any event sent using `cact('emit')`.

```javascript
cact('on', 'my_custom_event', function(event) {
  console.log('received an event', event.type); // "my_custom_event"
  console.log('event data:', event.eventData); // { var: "value" }
});
```


# Next.js serverside rendering

Trigger an browser event when you use serverside rendering with Next.js framework

## Example of event triggered from a browser-side user interraction

Example use case : trigger a *view\_content* event when the user scroll to 80% of the page.

```javascript
import React, { useEffect } from 'react';

const MyPage = () => {
  useEffect(() => {
    let eventTriggered = false; // Flag to track if the event has been triggered

    function handleScroll() {
      if (eventTriggered) return; // If the event has already been triggered, do nothing

      const { scrollTop, scrollHeight, clientHeight } = document.documentElement;
      if (scrollTop + clientHeight >= scrollHeight * 0.8) {
        if (window.cact) {
          window.cact('trigger', 'my_event_name', {
            myprop1: '1234',
            myprop2: 'abcd',
          }, {
            collectionDomain: "my.firstdomain.com",
            siteId: "1234", 
            sourceKey: "abcd1234",
          });
          eventTriggered = true; // Update the flag to avoid triggering the event again
        }
      }
    }

    window.addEventListener('scroll', handleScroll);

    return () => {
      window.removeEventListener('scroll', handleScroll);
    };
  }, []);

  return (
    <div>
      {/* Your server-side rendered content here */}
      <script
        dangerouslySetInnerHTML={{
          __html: `
            (function() {
              var tc = document.createElement('script');
              tc.type = 'text/javascript';
              tc.async = true;
              tc.src = 'https://cdn.tagcommander.com/events/sdk.js';
              var s = document.getElementsByTagName('script')[0];
              s.parentNode.insertBefore(tc, s);
            })();
          `
        }}
      />
    </div>
  );
};

export default MyPage;
```


# Pixel Tracking API

Pixel Tracking, also known as 1x1 gifs, or clear gifs, lets you record data from any website (or application) **where JavaScript or POST requests are not allowed**, but where you can insert an image (aka GET hit)

{% hint style="info" %}
When a POST request is possible, please prefer the [http tracking API](/features/sources/sources-catalog/server/http-tracking-api), more convenient to use.
{% endhint %}

## Basic Event Call

To send a basic event call using pixel tracking, construct a GET request to the tracking endpoint URL with the necessary query parameters. The following example demonstrates a basic event call for tracking a page view:

{% code fullWidth="false" %}

```c
GET  https://collect.commander1.com/events?tc_s={siteId}&token={yourSourceKey}&event_name=page_view&prop1=value1
```

{% endcode %}

In the above example, replace `{siteId}` with the ID of your site (aka workspace), `{yourSourceKey}` with your specific source key, and `value1` with the desired value for `prop1`. Remember to URL encode the string values, especially if they contain special characters or spaces.

## Event Call with Objects and Arrays

Pixel tracking allows for more complex data structures like objects and arrays. To include them in your event calls, you can nest parameters by indicating objects and their properties with square brackets for both objects and arrays. The property names are enclosed within the brackets and nested properties are further enclosed in their own set of brackets. The following example demonstrates an event call with objects and arrays:

```json
{
  "event_name": "page_view",
  "tc_s": "1234",
  "token": "abcdef",
  "page_type": "product_list",
  "page_name": "Best sellers",
  "user": {
    "id": "12356",
    "email": "toto@domain.fr",
    "consent_categories": [
      "1",
      "3"
    ]
  }
}
```

To transform the above JSON event call to URL parameter form, follow these steps:

1. Start with an empty string for the URL parameter form.
2. Copy the key-value pairs at the top level of the JSON object (`event_name`, `tc_s`, `token`, `page_type`, `page_name`) as they are, separating them with ampersands (`&`).
3. For nested objects like `user`, represent them in the URL parameter form by appending the nested key using square brackets (`[]`).
4. For array values like `user[consent_categories]`, append `[]` to the key to indicate an array parameter.
5. Include each element of the array as a separate key-value pair, appending the square brackets notation to the key as well.
6. URL encode the string values, such as replacing the space in `Best sellers` with `%20` and the `@` symbol in the email address with `%40`.

The transformed URL parameter form for the JSON event call would be:

{% code overflow="wrap" %}

```plaintext
GET  https://collect.commander1.com/events?tc_s=1234&token=abcdef&event_name=page_view&page_type=product_list&page_name=Best%20sellers&user[id]=12356&user[email]=toto%40domain.fr&user[consent_categories][]=1&user[consent_categories][]=3
```

{% endcode %}

## Manage array of objects (ex: items)

Arrays of objects can also be handled in pixel tracking event calls. This allows you to include multiple items within a single event, such as a purchase event. Let's consider an example of managing an array of objects for items in a purchase event:

```json
{
  "id": "O_12345",
  "revenue": 16.00,
  "value": 22.53,
  "shipping_amount": 3.33,
  "tax_amount": 3.20,
  "currency": "EUR",
  "user": {
    "id": "12356",
    "email": "toto@domain.fr"
  },
  "items": [
    {
      "id": "SKU_12345",
      "quantity": 1,
      "product": {
        "id": "12345",
        "name": "Trex tshirt",
        "category_1": "clothes",
        "colors": ["red"],
        "price": 9.99
      }
    },
    {
      "id": "SKU_12346",
      "quantity": 1,
      "price": 9.99,
      "product": {
        "id": "12346",
        "name": "Heart tshirt",
        "colors": ["blue", "white"],
        "price": 9.99
      }
    }
  ]
}
```

To include the array of objects within the event call, follow these steps:

1. Include the key-value pairs at the top level of the JSON object as usual (`id`, `revenue`, `value`, `shipping_amount`, `tax_amount`, `currency`, `user`).
2. For the array of objects, specify the key (e.g., `items`) and use square brackets (`[]`) to indicate an array parameter.
3. Include each object within the array as a separate set of key-value pairs, preserving the structure of the objects.
4. If necessary, nest additional objects or arrays within the objects of the array.

Example of transforming the JSON event call to URL parameter form:

{% code overflow="wrap" %}

```plaintext
id=O_12345&revenue=16.00&value=22.53&shipping_amount=3.33&tax_amount=3.20&currency=EUR&user[id]=12356&user[email]=toto%40domain.fr&items[0][id]=SKU_12345&items[0][quantity]=1&items[0][product][id]=12345&items[0][product][name]=Trex%20tshirt&items[0][product][category_1]=clothes&items[0][product][colors][]=red&items[0][product][price]=9.99&items[1][id]=SKU_12346&items[1][quantity]=1&items[1][price]=9.99&items[1][product][id]=12346&items[1][product][name]=Heart%20tshirt&items[1][product][colors][]=blue&items[1][product][colors][]=white&items[1][product][price]=9.99
```

{% endcode %}

In the transformed URL parameter form, each item within the array is represented by its index, followed by the keys and values of the nested object.


# Google Tag Manager (GTM)

Bridge your events in a seamless way.

Commanders Act provides a GTM template to connect your existing GTM implementation to our serverside endpoint, in a secured environment.

{% hint style="info" %}
If you use GA4, you may be interested by the [GTM ultra quick setup](/getting-started/integrating-your-data/gtm-tutorial) allowing to forward events from GA4. It offers less flexibility but can be installed in 2 minutes.
{% endhint %}

## Setup

Summarizing all recommended steps:

1. Create a GTM source in Commanders Act
2. Add our template to your GTM implementation
3. Configure your tag

## Create a source in Commanders Act

In your Commanders Act dashboard:

* In the left pane menu, click on **Sources** > **Overview**.
* Click on the **Add source** button.
* In the catalog, search for the **Google Tag Manager** source and click on it.
* Click on **Configure** and set its name, environment and bound destinations.
* Once you're done, click on the **Create** button at the bottom.
* The source key will then be displayed:

![](/files/7cW90CDio9iDgTOCbPCE)

* Copy its value and keep it for later!

{% hint style="info" %}
**Hint**: If you have already created a GTM source, you can retrieve its key by browsing to its **Settings** tab.
{% endhint %}

## Add our template to GTM

First, access [GTM](https://tagmanager.google.com/) and then add our template "**Commanders Act | Serverside events bridge**" from the Google "[Community Template Gallery](https://tagmanager.google.com/gallery/#/owners/TagCommander/templates/Serverside-events-bridge)" in your workspace, then select `(1)` "**Tags**".

![](/files/0cKwWdsTqYlJkcHv2gkM)

Click on `(2)` the "**New**" button.

![](/files/RhPFb0xegFVWXbXwkjrA)

Click on `(3)` the "**Tag Configuration**" area.

![](/files/HvCorQMi5SN2Dg6E57sx)

Click `(4)` the **magnifying glass** in the upper right corner.

![](/files/4kTqTFkoyxXSH9RWGw9u)

Search for `(5)` the "**Commanders Act | Serverside events bridge**" custom template and click on it to start the configuration.

![](/files/m3WTn4OOg0A0gU2A0FyF)

## Configure your tag

Start by filling `(6)` **a name for your tag** in the upper left corner.

![](/files/gK7pFkVp3RPLxGTUqoGg)

{% hint style="success" %}
**Hint**: you may want to name your tag adding the event name you're going to implement in the end. (E.g. "*Commanders Act |* Serverside events bridge *- **Purchase***")
{% endhint %}

Input your `(7)` "**Commanders Act Site ID**" and `(8)` "**Commanders Act Source Key**" (refer to the first section on how to create a source and retrieve its key).

Select `(9)` the "**Commanders Act Event**" from the drop-down menu, which is the event you want to forward.

<figure><img src="/files/WEOcKvdxhsXvoQgamBCC" alt="" width="536"><figcaption></figcaption></figure>

Depending on which event you select more (or less) fields will be presented. In case you don't input a mandatory field the template will highlight the missing entry so you can provide a proper mapping.

The "**Event Fields**" section contains fields that define the event itself and are mostly mandatory or highly recommended.

Events including the "**Product Fields**" section require [an array structure for your product information](https://community.commandersact.com/tagcommander/tips-and-tricks/best-practices/common-datalayer-variables#product-arrays). The first field will always be the `(10)` **base array** where the information is stored and all subsequent fields are the related properties - E.g. you can map the information about `(11)` the "**Product Id**" by filling the property name.

<figure><img src="/files/gslYzk6QHeR9bh4uAhNS" alt=""><figcaption></figcaption></figure>

In the "**User Fields**" section you can set `(12)` the "**User Id**" and `(13)` "**User Email**" - Either one of them is required if you select the "Purchase" event. The `(14)` "**User Consent Categories**" is a mandatory field holding an array with the user's consent category identifiers.

<figure><img src="/files/t4AzOvQjcnQ7Qc2wTrxx" alt=""><figcaption></figcaption></figure>

It's important to define and map all category identifiers with their respective names. For example, you may have the following array: *\[1,2,4]* and you defined the following relationship:

* 1 **➜** Advertising category
* 2 **➜** Analytics category
* 4 **➜** Functionality category

You also share with Commanders Act that the "Advertising category" must be enabled to activate the "Facebook CAPI." In this example, since the category identifier \[1] is included in the array we can activate the bridge and forward the event to Facebook.

{% hint style="info" %}
Ensure your category relationships are shared with Commanders Act.
{% endhint %}

{% hint style="warning" %}
Only with the agreed consent settings, we're allowed to bridge both the "Purchase" and "Refund" events to the "Facebook CAPI".
{% endhint %}

Complete your configuration by selecting the proper activation in the "Triggering" area / "Firing Triggers".

If you plan to setup [Facebook Conversion API](/features/destinations/destinations-catalog/facebook/facebook-conversions-api) through your GTM source, follow this extra step to update your Facebook Pixel tag:

{% content-ref url="/pages/2QXIPE4NknnWI8Dbjqg8" %}
[Facebook CAPI through GTM](/features/destinations/destinations-catalog/facebook/facebook-conversions-api/facebook-capi-through-gtm)
{% endcontent-ref %}


# Shopify

The Commanders Act application, which is available in the [Shopify App Store](https://apps.shopify.com/commanders-act), helps merchants streamline their workflows by connecting Shopify events with partners. Whether you’re tracking customer interactions, or optimizing ad performance, our app simplifies the process. By intercepting Shopify Standard and Custom events, the Commanders Act application seamlessly integrates with your existing stack while leveraging Shopify Customer Privacy API. This means less manual setup and more secure data collection.

{% hint style="success" %}
Our [Shopify APP](https://apps.shopify.com/commanders-act) works with [any plan](https://www.shopify.com/pricing).
{% endhint %}

## Key features

* Connect [Shopify standard](https://shopify.dev/docs/api/web-pixels-api/standard-events) and custom events with your partners.
* Enable reliable server-side tracking capabilities via [destinations](https://doc.commandersact.com/getting-started/concepts#destination).
* Ensure user privacy by supporting [Shopify Customer Privacy API](https://shopify.dev/docs/api/customer-privacy).
* Preserve original Shopify event data.
* User-friendly configuration.
* Include debugging functionality for troubleshooting.

## Source setup

1. Log in into your [Commanders Act account](https://app.commandersact.com/).
2. From the left menu, click on `(1)` `Sources` to expand the section:\
   \
   ![](/files/PlqtKJiF9F5AoZd5UIFH)\\
3. Click `(2)` `Source catalog` :\
   \
   ![](/files/hZPfr4klO0oV2qBUWYim)\\
4. In the search box, type `(3)` "Shopify" and click the `(4)` `Shopify web` on the right:\
   \
   ![](/files/NkQhf9hO9tzPQeY9mqAt)\\
5. Click on `(5)` `Configure` :\
   \
   ![](/files/mnDn2pKOyDXXDheKxQUV)\\
6. Input `(6)` a name for your source, select `(7)` an environment and click `(8)` `Next` :\
   \
   ![](/files/sLvdLVz6Eji3Y2UawDe1)\\
7. If you already have destinations up and running, you can connect them with your Shopify source by clicking the `(9)` top checkbox or by `(10)` selecting which one of them you want to link:\
   \
   ![](/files/l7Gr5WqVTmVCttV9yTMD)\\
8. Scroll down to the bottom and click `Save`.
9. Take note of your `(11)` `Site/Account Id` and `(12)` `Source Key` :\
   \
   ![](/files/rgiq7y0Q4S2CLbGgeoFl)\
   \
   You're going to use both values in the next section: [App setup](#app-setup).

## App setup

1. Open our [application URL in Shopify App Store](https://apps.shopify.com/commanders-act).
2. Install the app by clicking the `(1)` `Install` button:\
   \
   ![](/files/1VoA5XldkEfTGDqW5Ahf)\\
3. Configure the app by providing both the `(2)` `Site/Account Id` and `(3)` `Source Key` from the source you created in the section [Source setup](#source-setup) (See the above step 9.) and then turn `(4)` the toggle green to activate your app configuration:\
   \
   ![](/files/Qn3Uw18IYSrSzMWlyPsF)\\
4. Click `Save` to complete the setup and activate the app. See the next section [Validate your setup](#validate-your-setup) to ensure tracking is activated.

{% hint style="info" %}
At any point in time, you can deactivate the app by turning the `(4)` toggle off/red and click `Save` .
{% endhint %}

## Validate your setup

1. Log in into your [Commanders Act account](https://app.commandersact.com/).
2. From the left menu, click on (1) `Sources` to expand the section:\
   \
   ![](/files/PlqtKJiF9F5AoZd5UIFH)\\
3. Click (2) `Overview` :\
   \
   ![](/files/F9drhFctAVLgrGDPtklb)\\
4. In the search box, type (3) the name of your source and (4) click it:\
   \
   ![](/files/YzSlv95uSjhTspOGZa1Y)\
   \
   You may already have the (5) `Trend` showing a peak meaning that events are coming in.
5. Click (6) `Event Inspector` :\
   \
   ![](/files/A0Sb0GDyaTR6ydlhHW2v)\\
6. Check for reported log/entries.\\

## Quick reference

{% hint style="info" %}
The following table shows the mapping between Commanders Act and Shopify events.\
Custom Shopify events are also forwarded to Commanders Act with the same original Shopify event name.
{% endhint %}

| Shopify Events                     | Commanders Act Events         |
| ---------------------------------- | ----------------------------- |
| `cart_viewed`                      | `view_cart`                   |
| `checkout_completed`               | `purchase`                    |
| `checkout_shipping_info_submitted` | `add_shipping_info`           |
| `checkout_started`                 | `begin_checkout`              |
| `collection_viewed`                | `view_item_list`              |
| `page_viewed`                      | `page_view`                   |
| `payment_info_submitted`           | `add_payment_info`            |
| `product_added_to_cart`            | `add_to_cart`                 |
| `product_removed_from_cart`        | `remove_from_cart`            |
| `product_viewed`                   | `view_item`                   |
| `search_submitted`                 | `search`                      |
| `[Custom Shopify event name]`      | `[Custom Shopify event name]` |

## Field mappings

{% hint style="info" %}
All Shopify properties are retrieved from the `event` property.\
The original Shopify event data, with all its properties, is stored in the Commanders Act property `partners.shopify.event` .
{% endhint %}

<table data-full-width="true"><thead><tr><th width="682.66650390625">Shopify Properties</th><th>Commanders Act Properties</th></tr></thead><tbody><tr><td><code>analytics.subscribe(...)</code></td><td><code>event_name</code> <strong>[1]</strong></td></tr><tr><td><p><code>data.checkout.order.id</code></p><p><code>data.element.id</code></p></td><td><code>id</code></td></tr><tr><td><p><code>data.checkout.subtotalPrice.amount</code></p><p><code>data.cartLine.cost.totalAmount.amount</code></p><p><code>data.cart.cost.totalAmount.amount</code></p></td><td><code>value</code></td></tr><tr><td><code>data.checkout.totalPrice.amount</code></td><td><code>revenue</code></td></tr><tr><td><code>data.checkout.shippingLine.price.amount</code></td><td><code>shipping_amount</code></td></tr><tr><td><code>data.checkout.totalTax.amount</code></td><td><code>tax_amount</code></td></tr><tr><td><p><code>data.checkout.currencyCode</code></p><p><code>data.cartLine.cost.totalAmount.currencyCode</code></p><p><code>data.cart.cost.totalAmount.currencyCode</code></p></td><td><code>currency</code></td></tr><tr><td><code>context.document.location.href</code></td><td><code>url</code></td></tr><tr><td><code>context.document.title</code></td><td><code>page_title</code></td></tr><tr><td><code>context.document.location.href</code></td><td><code>context.page.url</code></td></tr><tr><td><code>context.navigator.language</code></td><td><code>context.page.lang</code></td></tr><tr><td><code>context.navigator.userAgent</code></td><td><code>context.device.user_agent</code></td></tr><tr><td><code>data.searchResult.query</code></td><td><code>search_term</code></td></tr><tr><td><code>data.checkout.transactions.0.paymentMethod.type</code></td><td><code>payment_method</code> <strong>[2]</strong></td></tr><tr><td><code>data.checkout.discountApplications.X.title</code></td><td><code>coupon</code></td></tr><tr><td><code>data.checkout.order.customer.id</code></td><td><code>user.id</code></td></tr><tr><td><code>data.checkout.order.customer.isFirstOrder</code></td><td><code>user.status</code> <strong>[3]</strong></td></tr><tr><td><p><code>data.checkout.shippingAddress.firstName</code></p><p><code>data.checkout.billingAddress.firstName</code></p></td><td><code>user.firstname</code></td></tr><tr><td><p><code>data.checkout.shippingAddress.lastName</code></p><p><code>data.checkout.billingAddress.lastName</code></p></td><td><code>user.lastname</code></td></tr><tr><td><code>data.checkout.email</code></td><td><code>user.email</code></td></tr><tr><td><p><code>data.checkout.phone</code></p><p><code>data.checkout.shippingAddress.phone</code></p></td><td><code>user.phone</code></td></tr><tr><td><p><code>data.checkout.shippingAddress.address1 + data.checkout.shippingAddress.address2</code></p><p><code>data.checkout.billingAddress.address1 + data.checkout.billingAddress.address2</code></p></td><td><code>user.street</code></td></tr><tr><td><p><code>data.checkout.shippingAddress.city</code></p><p><code>data.checkout.billingAddress.city</code></p></td><td><code>user.city</code></td></tr><tr><td><p><code>data.checkout.shippingAddress.countryCode</code></p><p><code>data.checkout.billingAddress.countryCode</code></p></td><td><code>user.country</code></td></tr><tr><td><p><code>data.checkout.shippingAddress.province</code></p><p><code>data.checkout.billingAddress.province</code></p></td><td><code>user.state</code></td></tr><tr><td><p><code>data.checkout.shippingAddress.zip</code></p><p><code>data.checkout.billingAddress.zip</code></p></td><td><code>user.zipcode</code></td></tr><tr><td><code>data.collection.title</code></td><td><code>item_list_name</code></td></tr><tr><td><p><code>data.checkout.lineItems.X.variant.id</code></p><p><code>data.checkout.lineItems.X.merchandise.id</code></p><p><code>data.checkout.lineItems.X.id</code></p><p><code>data.cart.lines.X.variant.id</code></p><p><code>data.cart.lines.X.merchandise.id</code></p><p><code>data.cart.lines.X.id</code></p><p><code>data.collection.productVariants.X.variant.id</code></p><p><code>data.collection.productVariants.X.merchandise.id</code></p><p><code>data.collection.productVariants.X.id</code></p><p><code>data.searchResult.productVariants.X.variant.id</code></p><p><code>data.searchResult.productVariants.X.merchandise.id</code></p><p><code>data.searchResult.productVariants.X.id</code></p><p><code>data.productVariant.product.id</code></p><p><code>data.cartLine.merchandise.product.id</code></p></td><td><code>items.X.id</code> <strong>[4]</strong></td></tr><tr><td><p><code>data.checkout.lineItems.X.variant.product.title</code></p><p><code>data.checkout.lineItems.X.merchandise.product.title</code></p><p><code>data.checkout.lineItems.X.product.title</code></p><p><code>data.cart.lines.X.variant.product.title</code></p><p><code>data.cart.lines.X.merchandise.product.title</code></p><p><code>data.cart.lines.X.product.title</code></p><p><code>data.collection.productVariants.X.variant.product.title</code></p><p><code>data.collection.productVariants.X.merchandise.product.title</code></p><p><code>data.collection.productVariants.X.product.title</code></p><p><code>data.searchResult.productVariants.X.variant.product.title</code></p><p><code>data.searchResult.productVariants.X.merchandise.product.title</code></p><p><code>data.searchResult.productVariants.X.product.title</code><br><code>data.productVariant.product.title</code></p><p><code>data.cartLine.merchandise.product.title</code></p></td><td><code>items.X.product.name</code> <strong>[4]</strong></td></tr><tr><td><p><code>data.checkout.lineItems.X.variant.price.amount</code></p><p><code>data.checkout.lineItems.X.merchandise.price.amount</code></p><p><code>data.checkout.lineItems.X.price.amount</code></p><p><code>data.cart.lines.X.variant.price.amount</code></p><p><code>data.cart.lines.X.merchandise.price.amount</code></p><p><code>data.cart.lines.X.price.amount</code></p><p><code>data.collection.productVariants.X.variant.price.amount</code></p><p><code>data.collection.productVariants.X.merchandise.price.amount</code></p><p><code>data.collection.productVariants.X.price.amount</code></p><p><code>data.searchResult.productVariants.X.variant.price.amount</code></p><p><code>data.searchResult.productVariants.X.merchandise.price.amount</code></p><p><code>data.searchResult.productVariants.X.price.amount</code><br><code>data.productVariant.price.amount</code></p><p><code>data.cartLine.merchandise.price.amount</code></p></td><td><code>items.X.product.price</code> <strong>[4]</strong></td></tr><tr><td><p><code>data.checkout.lineItems.X.quantity</code></p><p><code>data.cart.lines.X.quantity</code></p><p><code>data.collection.productVariants.X.quantity</code></p><p><code>data.searchResult.productVariants.X.quantity</code><br><code>data.cartLine.quantity</code></p></td><td><code>items.X.quantity</code> <strong>[4]</strong></td></tr><tr><td><p><code>data.checkout.lineItems.X.variant.product.vendor</code></p><p><code>data.checkout.lineItems.X.merchandise.product.vendor</code></p><p><code>data.checkout.lineItems.X.product.vendor</code></p><p><code>data.cart.lines.X.variant.product.vendor</code></p><p><code>data.cart.lines.X.merchandise.product.vendor</code></p><p><code>data.cart.lines.X.product.vendor</code></p><p><code>data.collection.productVariants.X.variant.product.vendor</code></p><p><code>data.collection.productVariants.X.merchandise.product.vendor</code></p><p><code>data.collection.productVariants.X.product.vendor</code></p><p><code>data.searchResult.productVariants.X.variant.product.vendor</code></p><p><code>data.searchResult.productVariants.X.merchandise.product.vendor</code></p><p><code>data.searchResult.productVariants.X.product.vendor</code></p><p><code>data.productVariant.product.vendor</code></p><p><code>data.cartLine.merchandise.product.vendor</code></p></td><td><code>items.X.product.brand</code> <strong>[4]</strong></td></tr><tr><td><p><code>data.checkout.lineItems.X.discountAllocations.Y.amount.amount</code></p><p><code>data.cart.lines.X.discountAllocations.Y.amount.amount</code></p><p><code>data.collection.productVariants.X.discountAllocations.Y.amount.amount</code></p><p><code>data.searchResult.productVariants.X.discountAllocations.Y.amount.amount</code></p></td><td><code>items.X.discount</code> <strong>[4]</strong></td></tr><tr><td><p><code>data.checkout.lineItems.X.discountAllocations.Y.discountApplication.title</code></p><p><code>data.cart.lines.X.discountAllocations.Y.discountApplication.title</code></p><p><code>data.collection.productVariants.X.discountAllocations.Y.discountApplication.title</code></p><p><code>data.searchResult.productVariants.X.discountAllocations.Y.discountApplication.title</code></p></td><td><code>items.X.coupon</code> <strong>[4]</strong></td></tr><tr><td><code>analyticsProcessingAllowed</code></td><td><code>analyticsProcessingAllowed</code> <strong>[5]</strong></td></tr><tr><td><code>marketingAllowed</code></td><td><code>marketingAllowed</code> <strong>[5]</strong></td></tr><tr><td><code>preferencesProcessingAllowed</code></td><td><code>preferencesProcessingAllowed</code> <strong>[5]</strong></td></tr><tr><td><code>saleOfDataAllowed</code></td><td><code>saleOfDataAllowed</code> <strong>[5]</strong></td></tr><tr><td><code>[Original Shopify event data]</code></td><td><code>partners.shopify.event</code></td></tr></tbody></table>

{% hint style="info" %}

> **\[1]** See Quick reference for more details.\
> \&#xNAN;**\[2]** See supported values [here](https://doc.commandersact.com/developers/tracking-and-integrations/tracking/events-reference#payment-methods).\
> \&#xNAN;**\[3]** Set with "New".\
> \&#xNAN;**\[4]** Value based on the priority list on the left column.\
> \&#xNAN;**\[5]** Property set from the base path `partners.shopify.userConsent`.
> {% endhint %}


# Mobile APP

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td></td><td>ANDROID SDK</td><td></td><td><a href="/files/qhKZeHR21YkiACmj0IFW">/files/qhKZeHR21YkiACmj0IFW</a></td><td><a href="/pages/MBLvPV5xFqkjFRgCyZ4S">/pages/MBLvPV5xFqkjFRgCyZ4S</a></td></tr><tr><td></td><td>IOS SDK</td><td></td><td><a href="/files/woN4CO4kAb4STvKIhLZs">/files/woN4CO4kAb4STvKIhLZs</a></td><td><a href="/pages/BK76uJkMqZYIIG0wArX5">/pages/BK76uJkMqZYIIG0wArX5</a></td></tr><tr><td></td><td>FLUTTER SDK</td><td></td><td><a href="/files/RC1e659wcSQ6s9GNXxEv">/files/RC1e659wcSQ6s9GNXxEv</a></td><td><a href="/pages/yaHl15t9mng9DnCjKn4B">/pages/yaHl15t9mng9DnCjKn4B</a></td></tr><tr><td></td><td>REACT NATIVE SDK</td><td></td><td><a href="/files/bYfOFL6mNuQq5V1ypqrP">/files/bYfOFL6mNuQq5V1ypqrP</a></td><td><a href="/pages/ywBz1Loo7FzIWhlaU8n4">/pages/ywBz1Loo7FzIWhlaU8n4</a></td></tr><tr><td>HTTP TRACKING API</td><td></td><td></td><td><a href="/files/Ahvgjwcg4ZUDsGfE4WWR">/files/Ahvgjwcg4ZUDsGfE4WWR</a></td><td><a href="https://doc.commandersact.com/features/sources/sources-catalog/server/http-tracking-api">https://doc.commandersact.com/features/sources/sources-catalog/server/http-tracking-api</a></td></tr></tbody></table>

## Introduction to mobile app tagging

CommandersAct’s **SDK** allows you to trigger destinations from a mobile application.

Commanders Act offers a so-called “super light” SDK you can include in your mobile app’s code; its purpose is to reduce calls to partner solutions as much as possible in order to improve your app’s performance and user experience. A unique call is issued to CommandersAct’s servers per action recorded in the app. Information related to the page browsed or the element that is clicked is then sent separately to partner solutions by CommandersAct’s servers; this allows to prevent applications’ loading speed from slowing down.

**Note**: Not all solutions are compatible with this method. Since the light SDK sends app information to partner solutions’ servers, they cannot “go back” to the app. Adserving solutions (those displaying ads) and push notification providers are thus not compatible with this method.

The basic operational principle of Commanders light SDK is:

– **Step 1**: the mobile data layer and CommandersAct’s SDK are called in the app’s source code every time the screen loads or that an element is clicked. (your IT staff should have implemented this at the start of the project).

– **Step 2**: CommandersAct’s SDK issues calls to CommandersAct’s servers and automatically sends the mobile data layer’s contents. This is the server-side hits’ structure: <https://collect.commander1.com/events?tc\\_s=`${siteID}`\\&token=`${YOUR_SOURCE_KEY}`>

`${siteID}` and `${YOUR_SOURCE_KEY}` are to be provided to the SDK and will be replaced automatically.

The rest of the parameters are send in the body in POST like presented here:

{% content-ref url="/pages/jIy9aJOvYox9wPTn3nc7" %}
[Mobile App event specificity](/developers/tracking-and-integrations/tracking/about-events/mobile-sdk-event-specificity)
{% endcontent-ref %}

– **Step 3**: CommandersAct’s servers send the received information to the different destinations. There are as many outgoing hits as there are partner solutions you wish to send information to.

<figure><img src="/files/z23hsfoMwivkPQZiS4Ud" alt="" width="563"><figcaption></figcaption></figure>

Ex: if you wish to issue a call to both Criteo and Google, a hit will be sent to either solution’s servers.

Implementing our SDKs on a mobile application is a project that consists of the steps listed hereunder:

* Definition of the mobile application’s tagging plan: selection and definition of the events.
* Creation of a mobile source and destinations
* CommandersAct SDK implementation in the app’s source code.
* Acceptance testing of the implementation in a test environment.
* Publishing

## Step #1: defining the application's tagging plan

The tagging plan corresponds to the list of events that will be sent.

## Step #2: creating a mobile source and configuring destinations in the CommandersAct interface

* **Creating a source for iOS, Android or both.**
* **Implement or select destinations.**

Implementing mobile destination is the same as implementing cloud-base destinations

## Step #3: implementing the SDK in the applications' source code

The SDK implementation is performed by technical staff or IT departments.

These elements must be provided:

* The app’s CommandersAct tagging plan, which lets IT staff know which events to declare and on which screens or elements.
* Technical documentation referring to each and every app. It must contain elements that are key to setting up the SDK and screenshots of setup examples.

Click here to read the corresponding technical documentation. iOS: <https://github.com/CommandersAct/iOSV5/> android: <https://github.com/CommandersAct/androidv5/>

The site’s ID (Commanders Act account number) and that of the source key are necessary to set-up the SDK. These two elements can be retrieved in the interface.

## Step #4: Testing the setup in a test environment

Commanders Act SDK can be tested with many different tools:

### **Tests for iOS with XCode**

Commanders Act SDK for iOS can be tested with Apple’s developing software “XCode”:

<https://itunes.apple.com/fr/app/xcode/id497799835>

You will need to connect your iPhone to your Mac.

Open XCode, go to “Window” ), > “Devices” (2), then select your device in thecolumn to the left (3):

![](/files/NdqdFKCHpR5gOSoYeOo3)

These elements will be displayed when you analyze mobile logs:

* Commanders Act SDK’s version number\
  example for consent module: “Commanders Act Privacy module init with version: 5.2.0”
* Commanders Act site ID
* Sended Server-Side events containing all the properties you have sent to Commanders Act servers (POST method). For more information about events construction, you can refer to our [events codes examples](/developers/tracking-and-integrations/tracking/events-reference)

![](/files/EUYwKo3oY4ED99PBd8fN)

\*\*\*

### **Running tests for Android or iOS with Charles Debugger**

Commanders Act SDK for both iOS and Android operating systems can be tested with the “Charles Debugger” proxy, downloadable for free here: [https://www.charlesproxy.com/](https://www.charlesproxy.com)

The first thing to do is to configure your phone so it can communicate with Charles.

In your phone’s settings, go to the Wi-fi configuration tab.

Select your network and proceed to the advanced options to edit Wi-fi settings.

Add a proxy manually:

* Proxy’s name (server)(1): Computer’s IP (you can find it in the “Local IP address” tab from Charles’ options)
* Port (2): 8888

Save.

![](/files/InJObYWRQ1CtpDaLZQzJ)

Go to the Charles app and authorize it to connect to the phone.

![](/files/1XtivE8Cl0ay7r7zvTs0)

Browse the web with your phone and in Charles (on your computer) apply a “Commander” filter to see server-side hits displayed in the “Overview” section. They look like this:\
<https://collect.commander1.com/events?tc_s=XXXX&token=XYZZ>

When you go to the “Request” area, you will be able to see all variables and the corresponding values that are sent through the Commanders Act SDK.

![](/files/v5UTpNjF4zh913nVp8Vt)

HTTPS Protocol:

Most of the time, server-side calls are issued through an https protocol.

Seeing https hits with Charles requires a more complex configuration. You will need to open your phone’s browser while Charles runs on your computer and go to this URL on your phone <http://www.charlesproxy.com/getssl/>

Download the certificate and install it; you will need to enter its name for two applications “VPN and applications” and “Wi-fi”.

Go back to Charles > “SSL proxy settings” > “SSL Proxying” > check “Enable SSL Proxying” > Click “Add” and type “\*” in the “Host” field (to authorize any given host).

Then proceed to running tests the same way you do for http hits.

## Step #5: publishing

When the implementation is ok on your testing environment, you need to submit your app to app stores (Apple Store or Android Market) and wait for them to approve changes and include the new version in their catalogues.


# Android

The Android SDK allows you to send data to analytics or marketing tools without having to learn, test, or implement a new API with each update or addition.

Please refer to our [developper documentation](https://github.com/TagCommander/AndroidV5) on github to use the Android SDK, and to the "how to":

{% content-ref url="/pages/PCMnpKASXPQW8eQD4BH6" %}
[Mobile APP](/features/sources/sources-catalog/mobile-app)
{% endcontent-ref %}


# iOS

The iOS SDK allows you to send data to analytics or marketing tools without having to learn, test, or implement a new API with each update or addition.

Please refer to our [developper documentation](https://github.com/TagCommander/iOSV5) on github to use the iOS SDK and to APP "how to" :

{% content-ref url="/pages/PCMnpKASXPQW8eQD4BH6" %}
[Mobile APP](/features/sources/sources-catalog/mobile-app)
{% endcontent-ref %}


# Flutter

The Flutter SDK allows you to send data to analytics or marketing tools without having to learn, test, or implement a new API with each update or addition.

Please refer to our [developper documentation](https://github.com/CommandersAct/tcserverside-flutter-plugin) on github to use the Flutter SDK and to APP "how to" :

{% content-ref url="/pages/PCMnpKASXPQW8eQD4BH6" %}
[Mobile APP](/features/sources/sources-catalog/mobile-app)
{% endcontent-ref %}


# React native

Installation Instructions for Commanders Act with React Native.

## React native

We currently offer a bridge for ReactNative! It's compatible with iOS & Android.

Mobile developpers can follow our dedicated documentation

<https://github.com/CommandersAct/TCDemoReactNative>

## Send Server -Side events:

To send events to Commanders Act you need a Source Key. To get it, you can use the dedicated Source on our platform.

Once your Source is called in your mobile app, you will obtain information about what is collected and the health of the implementation.

This should be quite easy and straightforward now!

<figure><img src="/files/ugWBkdjO2c1XwKnHLMMs" alt=""><figcaption></figcaption></figure>


# Advertising


# Bing Ads (cost import)

Documentation in progress


# Facebook Ads (cost import)

Documentation in progress


# Criteo (cost import)

Documentation in progress


# Realytics

Realytics helps you measuring the impact of TV/radio campaigns on digital conversions.\
Using this source, you can add TV touch points to customer journeys being able to to measure the contribution of TV to their conversions from within MixCommander.

## Setup

1. Access your [Commanders Act account](https://platform.commandersact.com/).
2. Add Realytics "Default tag".
3. Configure your tag.
4. Test and deploy your container.

## Add Realytics "Default tag"

From the "**INTEGRATIONS**" side menu, expand`(1)`"**Sources**" and select `(2)`"**Web containers**".

![Select "Sources" and "Web containers".](/files/z02Tf1yjlsmOg2NJm09K)

Select a "Web" container and, from the step `(3)`"**SELECT**" (or "EDIT"), click on `(4)`"**Add Tag(s)**".

![Click on "Add Tag(s)".](/files/nQLJELw0esZpqu4qlqwC)

Search for the tag "**Realytics V2 - Default Tag**" and add it to your container. You can now proceed with its configuration.

![Tag template "Realytics V2 - Default Tag".](/files/sLVZtfYvB7Y9QouSG9J9)

## Configure your tag

Start by adding `(5)` "**Customer Key**" which is your unique identifier as provided by Realytics.\
Set the `(6)` "**Sync User**" with your desired value: this can be either "true" or "false" (without quotes) and input the `(7)` "**Metric Name**" (also know as "Conversion Action") that you want to track. Lastly, fill two specific fields related to your entered metric: `(8)` "**Transaction Amount**" and `(9)` "**Transaction Order Id**".

![Tag template "Realytics V2 - Default Tag": configuration.](/files/rRJJay11eYsvlvL50S2W)

Under "**RULES**", select `(10)` a "**Privacy Category**". This will link your tag with the explicit user consent for the selected category.

![Select a "Privacy Category" to link your tag.](/files/RObqVIV3PdIZruo000Qt)

{% hint style="info" %}
If your website adopts virtual pages, you need to add a trigger for when these pages are loaded. This can be done under the top section "TRIGGER(S)".
{% endhint %}

This completes your configuration. You can now start the testing phase, leading to the final deployment in production.

{% hint style="info" %}
**Documentation in progress**
{% endhint %}


# Import CRM users

You can send us your users' data in 2 ways :

* [API users](/features/sources/sources-catalog/import-crm-users/api-users)
* [Files importer ](/features/sources/sources-catalog/import-crm-users/users-file-importer)(Get in touch with your Account Manager)


# API users

## Visitor

<mark style="color:blue;">`GET`</mark> `https://api.commander1.com/v1.0/engage/visitors/`

This endpoint allows you to **get properties for one specific visitor**. When you create the token, you can define which properties to return.

This API is more designed to be called from a tag in each user's browser.

#### Query Parameters

| Name     | Type    | Description                                                                   |
| -------- | ------- | ----------------------------------------------------------------------------- |
| callback | string  | (optional) Callback for jsonp request                                         |
| token    | string  | Security token                                                                |
| site     | integer | ID of the site                                                                |
| tcid     | string  | Cookie id. If empty (recommanded) it will read the tcid in the user's cookie. |

{% tabs %}
{% tab title="200 " %}

```
{
    "user_age": 39,
    "user_privacy_categories": [
      "11",
      "12",
      "13"
    ]
}
```

{% endtab %}
{% endtabs %}

### First-party usage

If your site uses a first-party domain (either through a dedicated subdomain or through the Commanders Act Gateway path), API calls must be made on your own domain.

Important: the URL must include /api/ in the path.\
Without this path, the request will not work.

#### 1. Using a dedicated subdomain (example: tracking.mydomain.com)

The first-party API structure must follow this pattern:\
<https://tracking.mydomain.com/**api**/1.0/engage/visitors/>

Example:\
<https://tracking.mydomain.com/api/v1.0/engage/visitors/?site=5326\\&tcid=\\&token=XXXX>

#### 2. Using Commanders Act Gateway (path-based setup)

If your gateway endpoint is served under a path (for example: <https://www.mydomain.com/cact-proxy/),\\>
the first-party API structure must follow this pattern:\
<https://www.mydomain.com/cact-proxy/**api**/1.0/engage/visitors/>

Example:\
<https://www.mydomain.com/cact-proxy/**api**/v1.0/engage/visitors/?site=5326\\&tcid=\\&token=XXXX>

Note: always keep the **/api/**/… structure after the subdomain or the gateway path.

## User

<mark style="color:blue;">`GET`</mark> `https://api.commander1.com/engage/user/`

This endpoint allows you to **get properties for one specific user** based on a `user_id`. When you create the token, you can define which properties to return.

#### Query Parameters

| Name     | Type    | Description    |
| -------- | ------- | -------------- |
| token    | string  | Security token |
| user\_id | string  | ID of the user |
| site     | integer | ID of the site |

{% tabs %}
{% tab title="200 Consent successfully retrieved." %}

```javascript
{
    "user_age": 39,
    "user_privacy_categories": [
      "11",
      "12",
      "13"
    ]
}
```

{% endtab %}

{% tab title="404 Could not find a user matching this query." %}

```javascript
{
    "message": "Person not found"
}
```

{% endtab %}
{% endtabs %}

### Do not use this endpoint client-side

The GET User endpoint must **not** be called from the browser.\
Exposing the token would allow anyone to capture it and loop through user IDs to extract all user data.

Use this API **server-side only** in a secure backend environment.

## User

<mark style="color:orange;">`PUT`</mark> `https://api.commander1.com/engage/user/`

Insert or update a user

#### Query Parameters

| Name     | Type   | Description              |
| -------- | ------ | ------------------------ |
| site     | string | Id of the site (account) |
| user\_id | string | Id of the user.          |
| token    | string | Security token           |

{% tabs %}
{% tab title="200 " %}

```
{"success":true}
```

{% endtab %}
{% endtabs %}

#### Example Request <a href="#example-request" id="example-request"></a>

`PUT`

<https://api.commander1.com/engage/user/?site=1234\\&user\\_id=1234\\&token=WvNIX8955cnZ7WF0f632s0Wb99Ql3rtA>

```
//Format example
{
    "person": {
        "id": "10000000",
        "card": "12345678910",
        "email": "mycustomer@test.com",
        "gender": "female",
        "firstname": "Joan",
        "lastname": "Craig",
        "custom": {
            "area_number": 123
        },
    ...
    }
}
```

## DELETE user

Delete a user

#### Resource URL <a href="#resource-url" id="resource-url"></a>

<https://api.commander1.com/engage/user/>

#### Resource Information <a href="#resource-information" id="resource-information"></a>

| Response formats         | JSON        |
| ------------------------ | ----------- |
| Requires authentication? | Yes (token) |

#### Parameters

| NAME              | REQUIREMENT    | EXAMPLE VALUES                   | DESCRIPTION       |
| ----------------- | -------------- | -------------------------------- | ----------------- |
| site              | d+             | 1234                             | Id of the site    |
| user\_id          | d+             | 1234                             | Id of the user    |
| tc\_id (optional) | d+             | 1234                             | Id of the visitor |
| token             | \[a-zA-Z0-9]\* | WvNIX8955cnZ7WF0f632s0Wb99Ql3rtA | Security token    |

#### Example Request <a href="#example-request" id="example-request"></a>

`DELETE`

<https://api.commander1.com/engage/user/?site=1234\\&user\\_id=1234\\&tc\\_id=1234\\&token=WvNIX8955cnZ7WF0f632s0Wb99Ql3rtA>

#### Response <a href="#example-request" id="example-request"></a>

```
{"success":true}
```


# Users file importer

### File structure <a href="#data-importcrm-filestructure" id="data-importcrm-filestructure"></a>

* One line per user
* Header on the file is needed for the matching
* Encoding: utf8
* The variable can not be calculated. It must be one line, one variable
* PGP or GPG key encryption are not supported. Files must be unencrypted before import.

Variables :

* it must be the same name of data variable (Variables are in uppercase, they will transcribe automatically in lowercase)
* You can add new variables. Don't forget to define them in DataCommander variable interface
* The CRM variables should be prefixed with "person." and custom variables by "person.custom."

### File example

{% file src="/files/7xBQTvh9yjcvHp68NjG9" %}


# Import conversions

Offline or online conversions

You can send us your conversion's data in 4 ways :

* [Conversion API](/features/sources/sources-catalog/import-conversions/api-conversions-and-product-catalog) (online/offline conversions)
* [Files importer](/features/sources/sources-catalog/import-conversions/conversions-files-importer) (FTP) online/offline conversions
* [HTTP tracking API source](/features/sources/sources-catalog/server/http-tracking-api) (online/offline`purchase` event)
* Web Container (online `purchase` event)


# API Conversions and Product catalog

## Commanders Act Data API v2.0.0 <a href="#commanders-act-data-api" id="commanders-act-data-api"></a>

> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

It is highly recommended that you send multiple objects in one HTTP request. This API allows streaming using newline separated JSON format or ndjson (<http://ndjson.org/>)

### Rate-limits <a href="#rate-limits" id="rate-limits"></a>

* You may send up to 30 requests per second
* You may have up to 30 concurrent connections
* If you send many conversions/products/etc. in bulk, the upload speed will be limited to 30 conversions/products/etc. per second

#### Rate limiting examples <a href="#rate-limiting-examples" id="rate-limiting-examples"></a>

* If you send 1 conversion per request you will be limited to 30 requests per second
* If you send 90 conversions in one request your upload will be completed in about 3 seconds
* If you send 40 requests, each with one conversion in the same second, 30 of them will be processed and 10 of them will be rejected
* If you send 3 requests, each with 100 conversions they will be completed in 10 seconds

### Limitations

* You can send up to 150 conversion items

### Date formats <a href="#date-formats" id="date-formats"></a>

Use the long format with timezone for passing ISO-8601 dates. The following formats are accepted:

* "2019-04-29T13:47:47.315Z"
* "2019-04-29T13:47:47Z"
* "2019-04-29T13:47:47.315+02:00"
* "2019-04-29T13:47:47+02:00"

### Errors <a href="#errors" id="errors"></a>

Errors are always returned as an array of objects in the top-level "errors" property.

#### Errors in bulk operations <a href="#errors-in-bulk-operations" id="errors-in-bulk-operations"></a>

For bulk operations you may have "errors" and "data" properties at the same time since some objects may have errors while others may not. Bulk errors are aggregated which means there won't be an error for each instance of an error but one error for each type of error with the number of occurrences and some examples of line numbers or ids.

```
{
  "errors": [
    {
      "code": "YOU_CAN_CHECK_THIS_IN_CODE",
      "detail": "This explains the error",
      "meta": {
        "context_property_example": "value_example",
        "error_count": 3,
        "line_numbers": [34, 45],
        "ids": [
          "c9017b85-8016-4f13-88b4-18d57c67b866",
          "12e0c3cb-7e8d-462f-9232-f7c61a900738"
        ]
      }
    }
  ]
  "data": {
    "accepted_object_count": 4,
    "rejected_object_count": 3
  }
}
```

#### Error object <a href="#error-object" id="error-object"></a>

Error objects have the following properties

| Property | Type   | Required | Description                                                                                                                              |
| -------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| code     | string | true     | Always present and contains error code that can be checked programmatically                                                              |
| detail   | string | true     | Human readable message that explains the problem. You should not check the value of this property programmatically because it may change |
| meta     | object | false    | Error specific object that contains details about what generated the error                                                               |

Base URLs:

* [https://api.commander1.com/v2/{siteId}](https://api.commander1.com/v2/%7BsiteId%7D)

## Authentication <a href="#authentication" id="authentication"></a>

* HTTP Authentication, scheme: bearer Token will be provided by our support/consulting team

## Default <a href="#commanders-act-data-api-default" id="commanders-act-data-api-default"></a>

### Upsert conversions <a href="#upsert-conversions" id="upsert-conversions"></a>

> Code samples

```
POST https://api.commander1.com/v2/{siteId}/conversions/bulk HTTP/1.1
Host: api.commander1.com
Content-Type: application/x-ndjson
Accept: application/json
Authorization: Bearer NJtcKaoCYu...mGZDxRgMBMUw==
```

`POST /conversions/bulk`

This endpoint creates and updates conversions. Your request will be processed asynchronously. It can take up to 1 hour until the request is processed and updates are made in the database.

> Body parameter

```
{"id":"db050bb1-810d-4420-a6fb-c1ce472a4ca9","user":{"user_email":"user@example.com"},"type":"offline","status":"in_progress","created":"2018-01-01T20:00:00.000+01:00","updated":"2018-01-01T20:00:00.000+01:00","acknowledged":true,"currency":"EUR","comment":"Package needs to be smaller than 30cm by 30cm","billing_address":{"country":"France","iso_country_code":"FR","country_code":"FRA","region":"Ile-de-France","locality":"Paris","postal_code":"75009","recipient":"Commanders Act","street_address":"3-5 Rue Saint-Georges","full_address":null,"label":"home","coordinates":{"latitude":48.857764,"longitude":2.33935}},"contact_address":{"country":"France","iso_country_code":"FR","country_code":"FRA","region":"Ile-de-France","locality":"Paris","postal_code":"75009","recipient":"Commanders Act","street_address":"3-5 Rue Saint-Georges","full_address":null,"label":"home","coordinates":{"latitude":48.857764,"longitude":2.33935}},"shipping_address":{"country":"France","iso_country_code":"FR","country_code":"FRA","region":"Ile-de-France","locality":"Paris","postal_code":"75009","recipient":"Commanders Act","street_address":"3-5 Rue Saint-Georges","full_address":null,"label":"home","coordinates":{"latitude":48.857764,"longitude":2.33935}},"shipping_provider":"UPS","shipping_tracking_code":"702c7a16-2c3d-4946-bb35-69ba540773f6","payment_method":"card","original_quantity":3,"cancelled_quantity":1,"returned_quantity":1,"exchanged_quantity":0,"final_quantity":1,"original_amount":30,"cancelled_amount":10,"returned_amount":10,"exchanged_amount":0,"shipping_amount":0,"discount_amount":0,"tax_amount":5,"final_amount":10,"custom":{"internal_reference":"fa34dc2","referer":"user@example.com","website_version":"2.4"},"conversion_items":[{"id":"68cd1310-4b7a-454c-99fb-2510f0e156ec","original_quantity":3,"cancelled_quantity":1,"returned_quantity":1,"exchanged_quantity":0,"final_quantity":1,"original_amount":30,"cancelled_amount":10,"returned_amount":10,"exchanged_amount":0,"final_amount":10,"price":10,"original_item":true,"custom":{"remarketing_campaign":"christmas_2018","time_to_checkout":"25 minutes","ab_testing_group":"3245fcda"},"product":{"id":"db050bb1-810d-4420-a6fb-c1ce472a4ca9","name":"Mug Commanders Act","description":"White stoneware mug with C-Handle is the perfect cup for any beverage","category_1":"Home","category_2":"Kitchen","category_3":"Accessories","category_4":"Containers","category_5":"Mugs","tags":["mugs","handle","white","brand"],"condition":"new","availability":"in_stock","availability_date":"2019-02-06T17:41:31.427+01:00","expiration_date":"2019-02-06T17:41:31.427+01:00","price":10,"sale_price":8,"currency":"EUR","image_link":"https://commandersact.com/images/shopping/mug_hi_res.jpg","link":"https://commandersact.com/shopping/mug","brand":"Commanders Act","width":6.4,"length":7.3,"height":9.5,"weight":80.7,"size":"medium","colors":["white","red"],"gtin":"134588842456789000","mpn":"134588842","custom":{"internal_category_id":721,"warehouse":"building B","box_barcode":1830135586179}}},{"id":"68cd1310-4b7a-454c-99fb-2510f0e156ec","original_quantity":3,"cancelled_quantity":1,"returned_quantity":1,"exchanged_quantity":0,"final_quantity":1,"original_amount":30,"cancelled_amount":10,"returned_amount":10,"exchanged_amount":0,"final_amount":10,"price":10,"original_item":true,"custom":{"remarketing_campaign":"christmas_2018","time_to_checkout":"25 minutes","ab_testing_group":"3245fcda"},"product":{"id":"db050bb1-810d-4420-a6fb-c1ce472a4ca9","name":"Mug Commanders Act","description":"White stoneware mug with C-Handle is the perfect cup for any beverage","category_1":"Home","category_2":"Kitchen","category_3":"Accessories","category_4":"Containers","category_5":"Mugs","tags":["mugs","handle","white","brand"],"condition":"new","availability":"in_stock","availability_date":"2019-02-06T17:41:31.427+01:00","expiration_date":"2019-02-06T17:41:31.427+01:00","price":10,"sale_price":8,"currency":"EUR","image_link":"https://commandersact.com/images/shopping/mug_hi_res.jpg","link":"https://commandersact.com/shopping/mug","brand":"Commanders Act","width":6.4,"length":7.3,"height":9.5,"weight":80.7,"size":"medium","colors":["white","red"],"gtin":"134588842456789000","mpn":"134588842","custom":{"internal_category_id":721,"warehouse":"building B","box_barcode":1830135586179}}}]}
{"id":"db050bb1-810d-4420-a6fb-c1ce472a4ca9","user":{"user_email":"user@example.com"},"type":"offline","status":"in_progress","created":"2018-01-01T20:00:00.000+01:00","updated":"2018-01-01T20:00:00.000+01:00","acknowledged":true,"currency":"EUR","comment":"Package needs to be smaller than 30cm by 30cm","billing_address":{"country":"France","iso_country_code":"FR","country_code":"FRA","region":"Ile-de-France","locality":"Paris","postal_code":"75009","recipient":"Commanders Act","street_address":"3-5 Rue Saint-Georges","full_address":null,"label":"home","coordinates":{"latitude":48.857764,"longitude":2.33935}},"contact_address":{"country":"France","iso_country_code":"FR","country_code":"FRA","region":"Ile-de-France","locality":"Paris","postal_code":"75009","recipient":"Commanders Act","street_address":"3-5 Rue Saint-Georges","full_address":null,"label":"home","coordinates":{"latitude":48.857764,"longitude":2.33935}},"shipping_address":{"country":"France","iso_country_code":"FR","country_code":"FRA","region":"Ile-de-France","locality":"Paris","postal_code":"75009","recipient":"Commanders Act","street_address":"3-5 Rue Saint-Georges","full_address":null,"label":"home","coordinates":{"latitude":48.857764,"longitude":2.33935}},"shipping_provider":"UPS","shipping_tracking_code":"702c7a16-2c3d-4946-bb35-69ba540773f6","payment_method":"card","original_quantity":3,"cancelled_quantity":1,"returned_quantity":1,"exchanged_quantity":0,"final_quantity":1,"original_amount":30,"cancelled_amount":10,"returned_amount":10,"exchanged_amount":0,"shipping_amount":0,"discount_amount":0,"tax_amount":5,"final_amount":10,"custom":{"internal_reference":"fa34dc2","referer":"user@example.com","website_version":"2.4"},"conversion_items":[{"id":"68cd1310-4b7a-454c-99fb-2510f0e156ec","original_quantity":3,"cancelled_quantity":1,"returned_quantity":1,"exchanged_quantity":0,"final_quantity":1,"original_amount":30,"cancelled_amount":10,"returned_amount":10,"exchanged_amount":0,"final_amount":10,"price":10,"original_item":true,"custom":{"remarketing_campaign":"christmas_2018","time_to_checkout":"25 minutes","ab_testing_group":"3245fcda"},"product":{"id":"db050bb1-810d-4420-a6fb-c1ce472a4ca9","name":"Mug Commanders Act","description":"White stoneware mug with C-Handle is the perfect cup for any beverage","category_1":"Home","category_2":"Kitchen","category_3":"Accessories","category_4":"Containers","category_5":"Mugs","tags":["mugs","handle","white","brand"],"condition":"new","availability":"in_stock","availability_date":"2019-02-06T17:41:31.427+01:00","expiration_date":"2019-02-06T17:41:31.427+01:00","price":10,"sale_price":8,"currency":"EUR","image_link":"https://commandersact.com/images/shopping/mug_hi_res.jpg","link":"https://commandersact.com/shopping/mug","brand":"Commanders Act","width":6.4,"length":7.3,"height":9.5,"weight":80.7,"size":"medium","colors":["white","red"],"gtin":"134588842456789000","mpn":"134588842","custom":{"internal_category_id":721,"warehouse":"building B","box_barcode":1830135586179}}},{"id":"68cd1310-4b7a-454c-99fb-2510f0e156ec","original_quantity":3,"cancelled_quantity":1,"returned_quantity":1,"exchanged_quantity":0,"final_quantity":1,"original_amount":30,"cancelled_amount":10,"returned_amount":10,"exchanged_amount":0,"final_amount":10,"price":10,"original_item":true,"custom":{"remarketing_campaign":"christmas_2018","time_to_checkout":"25 minutes","ab_testing_group":"3245fcda"},"product":{"id":"db050bb1-810d-4420-a6fb-c1ce472a4ca9","name":"Mug Commanders Act","description":"White stoneware mug with C-Handle is the perfect cup for any beverage","category_1":"Home","category_2":"Kitchen","category_3":"Accessories","category_4":"Containers","category_5":"Mugs","tags":["mugs","handle","white","brand"],"condition":"new","availability":"in_stock","availability_date":"2019-02-06T17:41:31.427+01:00","expiration_date":"2019-02-06T17:41:31.427+01:00","price":10,"sale_price":8,"currency":"EUR","image_link":"https://commandersact.com/images/shopping/mug_hi_res.jpg","link":"https://commandersact.com/shopping/mug","brand":"Commanders Act","width":6.4,"length":7.3,"height":9.5,"weight":80.7,"size":"medium","colors":["white","red"],"gtin":"134588842456789000","mpn":"134588842","custom":{"internal_category_id":721,"warehouse":"building B","box_barcode":1830135586179}}}]}
{"id":"db050bb1-810d-4420-a6fb-c1ce472a4ca9","user":{"user_email":"user@example.com"},"type":"offline","status":"in_progress","created":"2018-01-01T20:00:00.000+01:00","updated":"2018-01-01T20:00:00.000+01:00","acknowledged":true,"currency":"EUR","comment":"Package needs to be smaller than 30cm by 30cm","billing_address":{"country":"France","iso_country_code":"FR","country_code":"FRA","region":"Ile-de-France","locality":"Paris","postal_code":"75009","recipient":"Commanders Act","street_address":"3-5 Rue Saint-Georges","full_address":null,"label":"home","coordinates":{"latitude":48.857764,"longitude":2.33935}},"contact_address":{"country":"France","iso_country_code":"FR","country_code":"FRA","region":"Ile-de-France","locality":"Paris","postal_code":"75009","recipient":"Commanders Act","street_address":"3-5 Rue Saint-Georges","full_address":null,"label":"home","coordinates":{"latitude":48.857764,"longitude":2.33935}},"shipping_address":{"country":"France","iso_country_code":"FR","country_code":"FRA","region":"Ile-de-France","locality":"Paris","postal_code":"75009","recipient":"Commanders Act","street_address":"3-5 Rue Saint-Georges","full_address":null,"label":"home","coordinates":{"latitude":48.857764,"longitude":2.33935}},"shipping_provider":"UPS","shipping_tracking_code":"702c7a16-2c3d-4946-bb35-69ba540773f6","payment_method":"card","original_quantity":3,"cancelled_quantity":1,"returned_quantity":1,"exchanged_quantity":0,"final_quantity":1,"original_amount":30,"cancelled_amount":10,"returned_amount":10,"exchanged_amount":0,"shipping_amount":0,"discount_amount":0,"tax_amount":5,"final_amount":10,"custom":{"internal_reference":"fa34dc2","referer":"user@example.com","website_version":"2.4"},"conversion_items":[{"id":"68cd1310-4b7a-454c-99fb-2510f0e156ec","original_quantity":3,"cancelled_quantity":1,"returned_quantity":1,"exchanged_quantity":0,"final_quantity":1,"original_amount":30,"cancelled_amount":10,"returned_amount":10,"exchanged_amount":0,"final_amount":10,"price":10,"original_item":true,"custom":{"remarketing_campaign":"christmas_2018","time_to_checkout":"25 minutes","ab_testing_group":"3245fcda"},"product":{"id":"db050bb1-810d-4420-a6fb-c1ce472a4ca9","name":"Mug Commanders Act","description":"White stoneware mug with C-Handle is the perfect cup for any beverage","category_1":"Home","category_2":"Kitchen","category_3":"Accessories","category_4":"Containers","category_5":"Mugs","tags":["mugs","handle","white","brand"],"condition":"new","availability":"in_stock","availability_date":"2019-02-06T17:41:31.427+01:00","expiration_date":"2019-02-06T17:41:31.427+01:00","price":10,"sale_price":8,"currency":"EUR","image_link":"https://commandersact.com/images/shopping/mug_hi_res.jpg","link":"https://commandersact.com/shopping/mug","brand":"Commanders Act","width":6.4,"length":7.3,"height":9.5,"weight":80.7,"size":"medium","colors":["white","red"],"gtin":"134588842456789000","mpn":"134588842","custom":{"internal_category_id":721,"warehouse":"building B","box_barcode":1830135586179}}},{"id":"68cd1310-4b7a-454c-99fb-2510f0e156ec","original_quantity":3,"cancelled_quantity":1,"returned_quantity":1,"exchanged_quantity":0,"final_quantity":1,"original_amount":30,"cancelled_amount":10,"returned_amount":10,"exchanged_amount":0,"final_amount":10,"price":10,"original_item":true,"custom":{"remarketing_campaign":"christmas_2018","time_to_checkout":"25 minutes","ab_testing_group":"3245fcda"},"product":{"id":"db050bb1-810d-4420-a6fb-c1ce472a4ca9","name":"Mug Commanders Act","description":"White stoneware mug with C-Handle is the perfect cup for any beverage","category_1":"Home","category_2":"Kitchen","category_3":"Accessories","category_4":"Containers","category_5":"Mugs","tags":["mugs","handle","white","brand"],"condition":"new","availability":"in_stock","availability_date":"2019-02-06T17:41:31.427+01:00","expiration_date":"2019-02-06T17:41:31.427+01:00","price":10,"sale_price":8,"currency":"EUR","image_link":"https://commandersact.com/images/shopping/mug_hi_res.jpg","link":"https://commandersact.com/shopping/mug","brand":"Commanders Act","width":6.4,"length":7.3,"height":9.5,"weight":80.7,"size":"medium","colors":["white","red"],"gtin":"134588842456789000","mpn":"134588842","custom":{"internal_category_id":721,"warehouse":"building B","box_barcode":1830135586179}}}]}
```

#### Parameters <a href="#upsert-conversions-parameters" id="upsert-conversions-parameters"></a>

| Name          | In     | Type                           | Required | Description                                                                                           |
| ------------- | ------ | ------------------------------ | -------- | ----------------------------------------------------------------------------------------------------- |
| Authorization | header | string                         | true     | Authorization token                                                                                   |
| overwrite     | query  | boolean                        | false    | Determines if conversions should be fully replaced (`true`) or partially updated (`false` - default). |
| body          | body   | [Conversion](#tocs_conversion) | true     | Conversions as newline delimited JSON strings                                                         |

### Overwrite Parameter Behavior

The `overwrite` url parameter determines how conversions are processed when an existing `id` is found:

* **`false`** *(default)*:
  * Only the specified fields will be updated.
  * Unspecified fields will retain their existing values.
* **`true`**:
  * The existing conversion will be **fully replaced** with the new data provided.

If you need to replace a conversion entirely, set `overwrite=true`.

> Example responses

> 202 Response

```
{
  "data": {
    "accepted_object_count": 4,
    "rejected_object_count": 0
  }
}
```

> 400 Cannot parse nd-json line

```
{
  "errors": [
    {
      "code": "PARSE_ERROR",
      "detail": "Cannot parse nd-json"
    }
  ],
  "data": {}
}
```

> 400 Missing required property

```
{
  "errors": [
    {
      "code": "MISSING_REQUIRED_PROPERTY",
      "detail": "should have required property 'id'\n",
      "meta": {
        "line_numbers": [
          34,
          45
        ],
        "error_count": 2,
        "ids": [
          "c9017b85-8016-4f13-88b4-18d57c67b866",
          "12e0c3cb-7e8d-462f-9232-f7c61a900738"
        ]
      }
    }
  ],
  "data": {
    "accepted_object_count": 4,
    "rejected_object_count": 2
  }
}
```

> 400 Invalid property type

```
{
  "errors": [
    {
      "code": "INVALID_PROPERTY_TYPE",
      "detail": "\"original_amount\" property is not a number",
      "meta": {
        "property": "original_amount",
        "line_numbers": [
          34,
          45
        ],
        "error_count": 2,
        "ids": [
          "c9017b85-8016-4f13-88b4-18d57c67b866",
          "12e0c3cb-7e8d-462f-9232-f7c61a900738"
        ]
      }
    }
  ],
  "data": {
    "accepted_object_count": 4,
    "rejected_object_count": 2
  }
}
```

> 400 Invalid property format

```
{
  "errors": [
    {
      "code": "INVALID_PROPERTY_FORMAT",
      "detail": "\"original_amount\" property is not a number",
      "meta": {
        "property": "original_amount",
        "line_numbers": [
          34,
          45
        ],
        "error_count": 2,
        "ids": [
          "c9017b85-8016-4f13-88b4-18d57c67b866",
          "12e0c3cb-7e8d-462f-9232-f7c61a900738"
        ]
      }
    }
  ],
  "data": {
    "accepted_object_count": 4,
    "rejected_object_count": 2
  }
}
```

> 401 Authorization header is missing

```
{
  "errors": [
    {
      "code": "MISSING_AUTHORIZATION_HEADER",
      "detail": "The \"Authorization\" header is required"
    }
  ]
}
```

> 401 Token type is missing

```
{
  "errors": [
    {
      "code": "UNKNOWN_TOKEN_TYPE",
      "detail": "The token type is missing"
    }
  ]
}
```

> 401 The token type is invalid

```
{
  "errors": [
    {
      "code": "INVALID_TOKEN_TYPE",
      "detail": "The token type \"Bear\" is invalid. Expecting \"Bearer\" instead"
    }
  ]
}
```

> 401 The provided token is unknown

```
{
  "errors": [
    {
      "code": "UNKNOWN_TOKEN",
      "detail": "The provided token is unknown. Please contact our support team support@commandersact.com"
    }
  ]
}
```

> 403 Response

```
{
  "errors": [
    {
      "code": "SITE_ACCESS_FORBIDDEN",
      "detail": "You cannot access this site"
    }
  ]
}
```

> Too Many Requests

```
{
  "description": "You have too many open connections",
  "errors": [
    {
      "code": "CONNECTION_LIMIT_REACHED",
      "detail": "Your account is limited to 30 simultaneous connections"
    }
  ]
}
```

```
{
  "description": "You have reached the request limit",
  "errors": [
    {
      "code": "REQUEST_LIMIT_REACHED",
      "detail": "Your account is limited to 30 requests per second"
    }
  ]
}
```

> 500 Response

```
{
  "errors": [
    {
      "code": "SERVER_ERROR",
      "detail": "An internal error occurred. Please contact our support team support@commandersact.com"
    }
  ]
}
```

#### Responses <a href="#upsert-conversions-responses" id="upsert-conversions-responses"></a>

| Status | Meaning                                                                    | Description                                                       | Schema |
| ------ | -------------------------------------------------------------------------- | ----------------------------------------------------------------- | ------ |
| 202    | [Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)              | All objects are accepted for processing                           | None   |
| 400    | [Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)           | Cannot process request or part of the request due to client error | None   |
| 401    | [Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)            | Cannot identify the API caller                                    | None   |
| 403    | [Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)             | API caller does not have access to this resource                  | None   |
| 429    | [Too Many Requests](https://tools.ietf.org/html/rfc6585#section-4)         | Too Many Requests                                                 | None   |
| 500    | [Internal Server Error](https://tools.ietf.org/html/rfc7231#section-6.6.1) | Internal server error                                             | None   |

#### Response Schema <a href="#upsert-conversions-responseschema" id="upsert-conversions-responseschema"></a>

### Upsert products <a href="#upsert-products" id="upsert-products"></a>

> Code samples

```
POST https://api.commander1.com/v2/{siteId}/products/bulk HTTP/1.1
Host: api.commander1.com
Content-Type: application/x-ndjson

Authorization: Bearer NJtcKaoCYu...mGZDxRgMBMUw==
```

`POST /products/bulk`

This endpoint creates and updates products. Your request will be processed asynchronously. It can take up to 24 hours until the request is processed and updates are made in the database.

> Body parameter

```
{"id":"db050bb1-810d-4420-a6fb-c1ce472a4ca9","name":"Mug Commanders Act","description":"White stoneware mug with C-Handle is the perfect cup for any beverage","category_1":"Home","category_2":"Kitchen","category_3":"Accessories","category_4":"Containers","category_5":"Mugs","tags":["mugs","handle","white","brand"],"condition":"new","availability":"in_stock","availability_date":"2019-02-06T17:41:31.427+01:00","expiration_date":"2019-02-06T17:41:31.427+01:00","price":10,"sale_price":8,"currency":"EUR","image_link":"https://commandersact.com/images/shopping/mug_hi_res.jpg","link":"https://commandersact.com/shopping/mug","brand":"Commanders Act","width":6.4,"length":7.3,"height":9.5,"weight":80.7,"size":"medium","colors":["white","red"],"gtin":"134588842456789000","mpn":"134588842","custom":{"internal_category_id":721,"warehouse":"building B","box_barcode":1830135586179}}
{"id":"db050bb1-810d-4420-a6fb-c1ce472a4ca9","name":"Mug Commanders Act","description":"White stoneware mug with C-Handle is the perfect cup for any beverage","category_1":"Home","category_2":"Kitchen","category_3":"Accessories","category_4":"Containers","category_5":"Mugs","tags":["mugs","handle","white","brand"],"condition":"new","availability":"in_stock","availability_date":"2019-02-06T17:41:31.427+01:00","expiration_date":"2019-02-06T17:41:31.427+01:00","price":10,"sale_price":8,"currency":"EUR","image_link":"https://commandersact.com/images/shopping/mug_hi_res.jpg","link":"https://commandersact.com/shopping/mug","brand":"Commanders Act","width":6.4,"length":7.3,"height":9.5,"weight":80.7,"size":"medium","colors":["white","red"],"gtin":"134588842456789000","mpn":"134588842","custom":{"internal_category_id":721,"warehouse":"building B","box_barcode":1830135586179}}
{"id":"db050bb1-810d-4420-a6fb-c1ce472a4ca9","name":"Mug Commanders Act","description":"White stoneware mug with C-Handle is the perfect cup for any beverage","category_1":"Home","category_2":"Kitchen","category_3":"Accessories","category_4":"Containers","category_5":"Mugs","tags":["mugs","handle","white","brand"],"condition":"new","availability":"in_stock","availability_date":"2019-02-06T17:41:31.427+01:00","expiration_date":"2019-02-06T17:41:31.427+01:00","price":10,"sale_price":8,"currency":"EUR","image_link":"https://commandersact.com/images/shopping/mug_hi_res.jpg","link":"https://commandersact.com/shopping/mug","brand":"Commanders Act","width":6.4,"length":7.3,"height":9.5,"weight":80.7,"size":"medium","colors":["white","red"],"gtin":"134588842456789000","mpn":"134588842","custom":{"internal_category_id":721,"warehouse":"building B","box_barcode":1830135586179}}
```

#### Parameters <a href="#upsert-products-parameters" id="upsert-products-parameters"></a>

| Name          | In     | Type                     | Required | Description                                |
| ------------- | ------ | ------------------------ | -------- | ------------------------------------------ |
| Authorization | header | string                   | true     | Authorization token                        |
| body          | body   | [Product](#tocs_product) | true     | Products as newline delimited JSON strings |

#### Responses <a href="#upsert-products-responses" id="upsert-products-responses"></a>

| Status | Meaning                                                                 | Description   | Schema |
| ------ | ----------------------------------------------------------------------- | ------------- | ------ |
| 202    | [Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)           | Accepted      | None   |
| 207    | [Multi-Status](https://tools.ietf.org/html/rfc2518#section-10.2)        | Multi-Status  | None   |
| 401    | [Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)         | Unauthorized  | None   |
| 405    | [Method Not Allowed](https://tools.ietf.org/html/rfc7231#section-6.5.5) | Invalid input | None   |

## Schemas <a href="#schemas" id="schemas"></a>

### Conversion <a href="#tocs_conversion" id="tocs_conversion"></a>

```
{
  "id": "db050bb1-810d-4420-a6fb-c1ce472a4ca9",
  "user": {
    "email": "user@example.com", 
    "consent_categories": [1,3]
  },
  "type": "offline",
  "status": "in_progress",
  "created": "2018-01-01T20:00:00.000+01:00",
  "updated": "2018-01-01T20:00:00.000+01:00",
  "acknowledged": true,
  "currency": "EUR",
  "comment": "Package needs to be smaller than 30cm by 30cm",
  "billing_address": {
    "country": "France",
    "iso_country_code": "FR",
    "country_code": "FRA",
    "region": "Ile-de-France",
    "locality": "Paris",
    "postal_code": "75009",
    "recipient": "Commanders Act",
    "street_address": "3-5 Rue Saint-Georges",
    "full_address": null,
    "label": "home",
    "coordinates": {
      "latitude": 48.857764,
      "longitude": 2.33935
    }
  },
  "contact_address": {
    "country": "France",
    "iso_country_code": "FR",
    "country_code": "FRA",
    "region": "Ile-de-France",
    "locality": "Paris",
    "postal_code": "75009",
    "recipient": "Commanders Act",
    "street_address": "3-5 Rue Saint-Georges",
    "full_address": null,
    "label": "home",
    "coordinates": {
      "latitude": 48.857764,
      "longitude": 2.33935
    }
  },
  "shipping_address": {
    "country": "France",
    "iso_country_code": "FR",
    "country_code": "FRA",
    "region": "Ile-de-France",
    "locality": "Paris",
    "postal_code": "75009",
    "recipient": "Commanders Act",
    "street_address": "3-5 Rue Saint-Georges",
    "full_address": null,
    "label": "home",
    "coordinates": {
      "latitude": 48.857764,
      "longitude": 2.33935
    }
  },
  "shipping_provider": "UPS",
  "shipping_tracking_code": "702c7a16-2c3d-4946-bb35-69ba540773f6",
  "payment_method": "card",
  "original_quantity": 3,
  "cancelled_quantity": 1,
  "returned_quantity": 1,
  "exchanged_quantity": 0,
  "final_quantity": 1,
  "original_amount": 30,
  "cancelled_amount": 10,
  "returned_amount": 10,
  "exchanged_amount": 0,
  "shipping_amount": 0,
  "discount_amount": 0,
  "tax_amount": 5,
  "final_amount": 10,
  "custom": {
    "internal_reference": "fa34dc2",
    "referer": "user@example.com",
    "website_version": "2.4"
  },
  "conversion_items": [
    {
      "id": "68cd1310-4b7a-454c-99fb-2510f0e156ec",
      "original_quantity": 3,
      "cancelled_quantity": 1,
      "returned_quantity": 1,
      "exchanged_quantity": 0,
      "final_quantity": 1,
      "original_amount": 30,
      "cancelled_amount": 10,
      "returned_amount": 10,
      "exchanged_amount": 0,
      "final_amount": 10,
      "price": 10,
      "original_item": true,
      "custom": {
        "remarketing_campaign": "christmas_2018",
        "time_to_checkout": "25 minutes",
        "ab_testing_group": "3245fcda"
      },
      "product": {
        "id": "db050bb1-810d-4420-a6fb-c1ce472a4ca9",
        "name": "Mug Commanders Act",
        "description": "White stoneware mug with C-Handle is the perfect cup for any beverage",
        "category_1": "Home",
        "category_2": "Kitchen",
        "category_3": "Accessories",
        "category_4": "Containers",
        "category_5": "Mugs",
        "tags": [
          "mugs",
          "handle",
          "white",
          "brand"
        ],
        "condition": "new",
        "availability": "in_stock",
        "availability_date": "2019-02-06T17:41:31.427+01:00",
        "expiration_date": "2019-02-06T17:41:31.427+01:00",
        "price": 10,
        "sale_price": 8,
        "currency": "EUR",
        "image_link": "https://commandersact.com/images/shopping/mug_hi_res.jpg",
        "link": "https://commandersact.com/shopping/mug",
        "brand": "Commanders Act",
        "width": 6.4,
        "length": 7.3,
        "height": 9.5,
        "weight": 80.7,
        "size": "medium",
        "colors": [
          "white",
          "red"
        ],
        "gtin": "134588842456789000",
        "mpn": "134588842",
        "custom": {
          "internal_category_id": 721,
          "warehouse": "building B",
          "box_barcode": 1830135586179
        }
      }
    },
    {
      "id": "68cd1310-4b7a-454c-99fb-2510f0e156ec",
      "original_quantity": 3,
      "cancelled_quantity": 1,
      "returned_quantity": 1,
      "exchanged_quantity": 0,
      "final_quantity": 1,
      "original_amount": 30,
      "cancelled_amount": 10,
      "returned_amount": 10,
      "exchanged_amount": 0,
      "final_amount": 10,
      "price": 10,
      "original_item": true,
      "custom": {
        "remarketing_campaign": "christmas_2018",
        "time_to_checkout": "25 minutes",
        "ab_testing_group": "3245fcda"
      },
      "product": {
        "id": "db050bb1-810d-4420-a6fb-c1ce472a4ca9",
        "name": "Mug Commanders Act",
        "description": "White stoneware mug with C-Handle is the perfect cup for any beverage",
        "category_1": "Home",
        "category_2": "Kitchen",
        "category_3": "Accessories",
        "category_4": "Containers",
        "category_5": "Mugs",
        "tags": [
          "mugs",
          "handle",
          "white",
          "brand"
        ],
        "condition": "new",
        "availability": "in_stock",
        "availability_date": "2019-02-06T17:41:31.427+01:00",
        "expiration_date": "2019-02-06T17:41:31.427+01:00",
        "price": 10,
        "sale_price": 8,
        "currency": "EUR",
        "image_link": "https://commandersact.com/images/shopping/mug_hi_res.jpg",
        "link": "https://commandersact.com/shopping/mug",
        "brand": "Commanders Act",
        "width": 6.4,
        "length": 7.3,
        "height": 9.5,
        "weight": 80.7,
        "size": "medium",
        "colors": [
          "white",
          "red"
        ],
        "gtin": "134588842456789000",
        "mpn": "134588842",
        "custom": {
          "internal_category_id": 721,
          "warehouse": "building B",
          "box_barcode": 1830135586179
        }
      }
    }
  ]
}
```

It is recommended to use as many fields as you can in order to be able to build good segments with advanced conditions

#### Properties <a href="#properties" id="properties"></a>

| Name                      | Type                                      | Required | Restrictions | Description                                                                                                                                                                                                                                        |
| ------------------------- | ----------------------------------------- | -------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| id                        | string(1-50)                              | true     | none         | Conversion id. Used as key for updates                                                                                                                                                                                                             |
| user                      | object                                    | true     | none         | All properties that you add here will be used as conditions for matching users in our database. You must ensure that values used inside these properties are unique. Use same property names as those defined in variables interface for the user. |
| » user.email              | string(1-250)                             | false    | none         | Email of the user                                                                                                                                                                                                                                  |
| »user.consent\_categories | string                                    | false    | none         | Consent categories of the user, to be allowed to share conversions with partners                                                                                                                                                                   |
| type                      | string(1-250)                             | true     | none         | Type of conversion (online, offline, call etc.)                                                                                                                                                                                                    |
| status                    | string                                    | true     | none         | Status of your conversion (see list of possible values below). Conversions with status "pending" are not included in default sum and counts aggregated on a user.                                                                                  |
| created                   | string(ISO-8601)                          | true     | none         | Time when conversion occurred. See "Date formats" section above for a list of allowed formats.                                                                                                                                                     |
| updated                   | string(ISO-8601)                          | false    | none         | Time when conversion was updated. See "Date formats" section above for a list of allowed formats.                                                                                                                                                  |
| acknowledged              | boolean                                   | false    | none         | Set to true if conversion was acknowledged                                                                                                                                                                                                         |
| currency                  | string(ISO-4217)                          | true     | none         | Currency                                                                                                                                                                                                                                           |
| comment                   | string(1-250)                             | false    | none         | Comment of the buyer                                                                                                                                                                                                                               |
| billing\_address          | [Address](#tocs_address)                  | false    | none         | It is recommended to use as many fields as you can in order to be able to build good segments with advanced conditions                                                                                                                             |
| contact\_address          | [Address](#tocs_address)                  | false    | none         | It is recommended to use as many fields as you can in order to be able to build good segments with advanced conditions                                                                                                                             |
| shipping\_address         | [Address](#tocs_address)                  | false    | none         | It is recommended to use as many fields as you can in order to be able to build good segments with advanced conditions                                                                                                                             |
| shipping\_provider        | string(1-250)                             | false    | none         | Shipping provider                                                                                                                                                                                                                                  |
| shipping\_tracking\_code  | string(1-250)                             | false    | none         | Shipping tracking code                                                                                                                                                                                                                             |
| payment\_method           | string                                    | false    | none         | Payment method type (see list of possible values below)                                                                                                                                                                                            |
| payment\_provider         | string                                    | false    | none         | Payment provider used for this transaction                                                                                                                                                                                                         |
| original\_quantity        | float                                     | false    | read-only    | Sum of all articles in the original conversion (CALCULATED)                                                                                                                                                                                        |
| cancelled\_quantity       | float                                     | false    | read-only    | Quantity of cancelled articles in the conversion (CALCULATED)                                                                                                                                                                                      |
| returned\_quantity        | float                                     | false    | read-only    | Quantity of returned articles in the conversion (CALCULATED)                                                                                                                                                                                       |
| exchanged\_quantity       | float                                     | false    | read-only    | Quantity of exchanged articles in the conversion (CALCULATED)                                                                                                                                                                                      |
| final\_quantity           | float                                     | false    | read-only    | Quantity of articles in final transaction for this conversion (original\_quantity - cancelled\_quantity - returned\_quantity - exchanged\_quantity) (CALCULATED)                                                                                   |
| original\_amount          | float                                     | false    | write-once   | Original amount for this conversion (shipping price and taxes included)                                                                                                                                                                            |
| cancelled\_amount         | float                                     | false    | none         | Cancelled amount for this conversion                                                                                                                                                                                                               |
| returned\_amount          | float                                     | false    | none         | Returned amount for this conversion                                                                                                                                                                                                                |
| exchanged\_amount         | float                                     | false    | none         | Exchanged amount for this conversion                                                                                                                                                                                                               |
| shipping\_amount          | float                                     | false    | none         | Shipping amount for this conversion                                                                                                                                                                                                                |
| discount\_amount          | float                                     | false    | none         | Discount amount for this conversion                                                                                                                                                                                                                |
| tax\_amount               | float                                     | false    | none         | Tax amount for this conversion                                                                                                                                                                                                                     |
| final\_amount             | float                                     | false    | none         | Final amount for this conversion after returns, exchanges, cancellations etc. (shipping price and taxes included). This represents the overall transaction amount between the buyer and the seller                                                 |
| custom                    | object                                    | false    | none         | Object containing custom properties                                                                                                                                                                                                                |
| conversion\_items         | \[[ConversionItem](#tocs_conversionitem)] | true     | none         | List of products in the conversion + their own attributes. You cannot have the same product twice inside a conversion unless you provide a conversion item id                                                                                      |

**Enumerated Values**

| Property        | Value                           |
| --------------- | ------------------------------- |
| status          | canceled                        |
| status          | delivered                       |
| status          | in\_progress                    |
| status          | partially\_delivered            |
| status          | partially\_returned             |
| status          | partially\_shipped              |
| status          | pending\_shipment               |
| status          | returned                        |
| status          | shipped                         |
| status          | pending                         |
| payment\_method | by\_bank\_transfer\_in\_advance |
| payment\_method | by\_invoice                     |
| payment\_method | card                            |
| payment\_method | check\_in\_advance              |
| payment\_method | cod                             |
| payment\_method | coupon                          |
| payment\_method | direct\_debit                   |
| payment\_method | online\_payment\_system         |
| payment\_method | other                           |

### ConversionItem <a href="#tocs_conversionitem" id="tocs_conversionitem"></a>

```
{
  "id": "68cd1310-4b7a-454c-99fb-2510f0e156ec",
  "original_quantity": 3,
  "cancelled_quantity": 1,
  "returned_quantity": 1,
  "exchanged_quantity": 0,
  "final_quantity": 1,
  "original_amount": 30,
  "cancelled_amount": 10,
  "returned_amount": 10,
  "exchanged_amount": 0,
  "final_amount": 10,
  "price": 10,
  "original_item": true,
  "custom": {
    "remarketing_campaign": "christmas_2018",
    "time_to_checkout": "25 minutes",
    "ab_testing_group": "3245fcda"
  },
  "product": {
    "id": "db050bb1-810d-4420-a6fb-c1ce472a4ca9",
    "name": "Mug Commanders Act",
    "description": "White stoneware mug with C-Handle is the perfect cup for any beverage",
    "category_1": "Home",
    "category_2": "Kitchen",
    "category_3": "Accessories",
    "category_4": "Containers",
    "category_5": "Mugs",
    "tags": [
      "mugs",
      "handle",
      "white",
      "brand"
    ],
    "condition": "new",
    "availability": "in_stock",
    "availability_date": "2019-02-06T17:41:31.427+01:00",
    "expiration_date": "2019-02-06T17:41:31.427+01:00",
    "price": 10,
    "sale_price": 8,
    "currency": "EUR",
    "image_link": "https://commandersact.com/images/shopping/mug_hi_res.jpg",
    "link": "https://commandersact.com/shopping/mug",
    "brand": "Commanders Act",
    "width": 6.4,
    "length": 7.3,
    "height": 9.5,
    "weight": 80.7,
    "size": "medium",
    "colors": [
      "white",
      "red"
    ],
    "gtin": "134588842456789000",
    "mpn": "134588842",
    "custom": {
      "internal_category_id": 721,
      "warehouse": "building B",
      "box_barcode": 1830135586179
    }
  }
}
```

It is recommended to use as many fields as you can in order to be able to build good segments with advanced conditions

#### Properties <a href="#properties" id="properties"></a>

| Name                | Type                     | Required | Restrictions | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| ------------------- | ------------------------ | -------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| id                  | string                   | true     | none         | Id of this item in the conversion. This id is required. If you don't have an item id in your database and the same product id cannot repeat within a conversion you can use the product id as value. This field is used for identifying the item in updates.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| original\_quantity  | float                    | true     | none         | Quantity of items in the original conversion                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| cancelled\_quantity | float                    | false    | none         | Quantity of cancelled items                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| returned\_quantity  | float                    | false    | none         | Quantity of returned items                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| exchanged\_quantity | float                    | false    | none         | Quantity of exchanged items                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| final\_quantity     | float                    | false    | none         | Quantity of items in final transaction (original\_quantity - cancelled\_quantity - returned\_quantity - exchanged\_quantity)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| original\_amount    | float                    | false    | none         | Original amount for this item                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| cancelled\_amount   | float                    | false    | none         | Cancelled amount for this item                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| returned\_amount    | float                    | false    | none         | Returned amount for this item                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| exchanged\_amount   | float                    | false    | none         | Exchanged amount for this item                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| final\_amount       | float                    | false    | none         | Final amount for this item (original\_amount - cancelled\_amount - returned\_amount - exchanged\_amount)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| price               | float                    | false    | none         | Price of item (using same currency as for conversion)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| original\_item      | boolean                  | false    | none         | Wether this item was present in the original conversion. This is automatically set to false to all items added in conversion updates                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| custom              | object                   | false    | none         | Object containing custom properties                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| product             | [Product](#tocs_product) | true     | none         | <p>There are three ways to have product information in your conversion items. First method is to put product properties inline for each conversion item. Second method is to synchronize your product catalog with our database using "POST /products/bulk" endpoint and only send product ids in conversion items (our server will copy product properties from catalog). Third method is a combination of previous ones and implies having a product catalog and send the product information inline. In case a property is present in both catalog product and inline product, properties from inline product will overwrite properties from catalog. This method is useful when product information is incomplete or complementary in inline products.<br>It is recommended to send products inline, except when you do not have all product information. In most cases you don't need to use the catalog. It is recommended to use as many fields as you can in order to be able to build good segments with advanced conditions.<br>When you only send the id of the product in a conversion item, you need to make sure that your catalog already contains the product, otherwise product properties will not be added to your conversion item.</p> |

### Address <a href="#tocs_address" id="tocs_address"></a>

```
{
  "country": "France",
  "iso_country_code": "FR",
  "country_code": "FRA",
  "region": "Ile-de-France",
  "locality": "Paris",
  "postal_code": "75009",
  "recipient": "Commanders Act",
  "street_address": "3-5 Rue Saint-Georges",
  "full_address": null,
  "label": "home",
  "coordinates": {
    "latitude": 48.857764,
    "longitude": 2.33935
  }
}
```

It is recommended to use as many fields as you can in order to be able to build good segments with advanced conditions

#### Properties <a href="#properties" id="properties"></a>

| Name               | Type             | Required | Restrictions | Description                                                                                              |
| ------------------ | ---------------- | -------- | ------------ | -------------------------------------------------------------------------------------------------------- |
| country            | string(1-250)    | false    | none         | Readable country name                                                                                    |
| iso\_country\_code | string(ISO-3166) | false    | none         | ISO-3166 country code                                                                                    |
| country\_code      | string           | false    | none         | Use this field in case you use country codes other than ISO-3166                                         |
| region             | string(1-250)    | false    | none         | Administrative region                                                                                    |
| locality           | string(1-250)    | false    | none         | Name of city/town/village etc.                                                                           |
| postal\_code       | string(1-250)    | false    | none         | Postal code                                                                                              |
| recipient          | string(1-250)    | false    | none         | Recipient name                                                                                           |
| street\_address    | string(1-250)    | false    | none         | Street name, street number, building number etc.                                                         |
| full\_address      | string(1-250)    | false    | none         | Full address as a string that can contain newlines. Not usable in segmentation but available for exports |
| label              | string(1-250)    | false    | none         | Label for this address (home, work etc.)                                                                 |
| coordinates        | object           | false    | none         | Coordinates for this address                                                                             |
| » latitude         | float            | false    | none         | Latitude                                                                                                 |
| » longitude        | float            | false    | none         | Longitude                                                                                                |

### Product <a href="#tocs_product" id="tocs_product"></a>

```
{
  "id": "db050bb1-810d-4420-a6fb-c1ce472a4ca9",
  "name": "Mug Commanders Act",
  "description": "White stoneware mug with C-Handle is the perfect cup for any beverage",
  "category_1": "Home",
  "category_2": "Kitchen",
  "category_3": "Accessories",
  "category_4": "Containers",
  "category_5": "Mugs",
  "tags": [
    "mugs",
    "handle",
    "white",
    "brand"
  ],
  "condition": "new",
  "availability": "in_stock",
  "availability_date": "2019-02-06T17:41:31.427+01:00",
  "expiration_date": "2019-02-06T17:41:31.427+01:00",
  "price": 10,
  "sale_price": 8,
  "currency": "EUR",
  "image_link": "https://commandersact.com/images/shopping/mug_hi_res.jpg",
  "link": "https://commandersact.com/shopping/mug",
  "brand": "Commanders Act",
  "width": 6.4,
  "length": 7.3,
  "height": 9.5,
  "weight": 80.7,
  "size": "medium",
  "colors": [
    "white",
    "red"
  ],
  "gtin": "134588842456789000",
  "mpn": "134588842",
  "custom": {
    "internal_category_id": 721,
    "warehouse": "building B",
    "box_barcode": 1830135586179
  }
}
```

There are three ways to have product information in your conversion items. First method is to put product properties inline for each conversion item. Second method is to synchronize your product catalog with our database using "POST /products/bulk" endpoint and only send product ids in conversion items (our server will copy product properties from catalog). Third method is a combination of previous ones and implies having a product catalog and send the product information inline. In case a property is present in both catalog product and inline product, properties from inline product will overwrite properties from catalog. This method is useful when product information is incomplete or complementary in inline products. It is recommended to send products inline, except when you do not have all product information. In most cases you don't need to use the catalog. It is recommended to use as many fields as you can in order to be able to build good segments with advanced conditions. When you only send the id of the product in a conversion item, you need to make sure that your catalog already contains the product, otherwise product properties will not be added to your conversion item.

#### Properties <a href="#properties" id="properties"></a>

| Name               | Type                   | Required | Restrictions | Description                                                                                                                                                                                                                                               |
| ------------------ | ---------------------- | -------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| id                 | string(1-50)           | true     | none         | Unique identifier for the article (try using the most specific identifier or SKU), such as a reference. If there are several occurrences for the same identifier, only the last one will be recorded                                                      |
| name               | string(1-500)          | false    | none         | Name of the article                                                                                                                                                                                                                                       |
| description        | string(max 5000 chars) | false    | none         | Description of the article                                                                                                                                                                                                                                |
| category\_1        | string(1-250)          | false    | none         | Main category of the article                                                                                                                                                                                                                              |
| category\_2        | string(1-250)          | false    | none         | Second sub-category of the article                                                                                                                                                                                                                        |
| category\_3        | string(1-250)          | false    | none         | Third sub-category of the article                                                                                                                                                                                                                         |
| category\_4        | string(1-250)          | false    | none         | Fourth sub-category of the article                                                                                                                                                                                                                        |
| category\_5        | string(1-250)          | false    | none         | Fifth sub-category of the article. If you have more than five levels of category you may choose to concatenate the remaining ones like 'Bikes/Parts/Wheels/Front' or simply ignore the remaining ones like 'Bikes', depending on your segmentation needs. |
| tags               | \[string]              | false    | none         | Array of tags for the product. Tags can be anything that labels the product: hand-made, eco-friendly, heat-resistant etc.                                                                                                                                 |
| condition          | string                 | false    | none         | Current status of the material in your store (see list of possible values below)                                                                                                                                                                          |
| availability       | string                 | false    | none         | Current availability of the item in your store. Make sure to indicate the availability of the item on your store page and keep it up to date (see list of possible values below)                                                                          |
| availability\_date | string(ISO-8601)       | false    | none         | Date when product became or will become available. See "Date formats" section above for a list of allowed formats.                                                                                                                                        |
| expiration\_date   | string(ISO-8601)       | false    | none         | Date when product became or will become unavailable. See "Date formats" section above for a list of allowed formats.                                                                                                                                      |
| price              | float                  | false    | none         | Default price for the article. In a conversion you can specify the real price at which the item was sold in case of sales, discounts etc.                                                                                                                 |
| sale\_price        | float                  | false    | none         | Default price for the article during sales periods. In a conversion you can specify the real price at which the item was sold in case of discounts                                                                                                        |
| currency           | string(ISO-4217)       | false    | none         | Currency used for given prices. Note that you have to use the same currency for products and conversions                                                                                                                                                  |
| image\_link        | string(url)            | false    | none         | URL of product image                                                                                                                                                                                                                                      |
| link               | string(url)            | false    | none         | URL to the website where you can buy the item                                                                                                                                                                                                             |
| brand              | string(1-250)          | false    | none         | Brand of the article                                                                                                                                                                                                                                      |
| width              | float                  | false    | none         | Width of the article in centimeters (cm)                                                                                                                                                                                                                  |
| length             | float                  | false    | none         | Length of the article in centimeters (cm)                                                                                                                                                                                                                 |
| height             | float                  | false    | none         | Height of the article in centimeters (cm)                                                                                                                                                                                                                 |
| weight             | float                  | false    | none         | Height of the article in centimeters (grams)                                                                                                                                                                                                              |
| size               | string(1-250)          | false    | none         | Size of the article when width, height and lengts are not applicable. You can use any value that describes the size. Examples: S, XL, large                                                                                                               |
| colors             | \[string]              | false    | none         | Colors of product                                                                                                                                                                                                                                         |
| gender             | string(1-250)          | false    | none         | Gender for gender specific products (male, female, unisex)                                                                                                                                                                                                |
| gtin               | string(1-250)          | false    | none         | International trade identification number of the article Supported numbers: UPC (North America, 12 digits), EAN (Europe, 13 digits), JAN (Japan, 8 to 13 digits), ISBN (books, 13 digits)                                                                 |
| mpn                | string(1-250)          | false    | none         | Manufacturer part number of the material                                                                                                                                                                                                                  |
| custom             | object                 | false    | none         | Object containing custom properties                                                                                                                                                                                                                       |

**Enumerated Values**

| Property     | Value          |
| ------------ | -------------- |
| condition    | new            |
| condition    | refurbished    |
| condition    | used           |
| availability | in\_stock      |
| availability | available      |
| availability | pre\_order     |
| availability | out\_of\_stock |
| gender       | male           |
| gender       | female         |
| gender       | unisex         |


# Conversions files importer

If you wish to share your data via flat file feed integration, please use a CSV feed format, following the structure below.

{% hint style="info" %}
The CSV format is based on the comma-separated value. The header must be declared in the first row of the file, it is recommended that headers are provided in the lower case and don't contain spaces.
{% endhint %}

Files can be uploaded to the Commandersact FTP or downloaded from your own FTP by CommandersAct. Get in touch with your Account Manager to agree the integration method that is best for you.

Use our CSV conversion importer connector to configure the FTP import.

### Structure of the file:

#### 1 file with 1 line per product (conversion item)

Each line in the file should be a distinct product (conversion item) with their unit price and quantity. Transactions that include several products should be split into multiple lines, sharing the same conversion\_id.

Example:\
conversion\_ID\_1, conversion\_item\_1,\
conversion\_ID\_1, conversion\_item\_2,\
conversion\_ID\_1, conversion\_item\_3,

{% hint style="danger" %}
Be sure you are using exactly the same headers as in this example CSV file:
{% endhint %}

{% file src="/files/JMXtuX8WTy3m525v70Dh" %}
Template CSV conversions import
{% endfile %}

{% hint style="danger" %}
Some columns are **required**, please check this [link](/features/sources/sources-catalog/import-conversions/api-conversions-and-product-catalog) to see which fields are required or not.
{% endhint %}

{% hint style="warning" %}
Please sort your file and group it by conversion ID (all conversion items related to conversion\_ID\_1 then all conversion items related to conversion\_ID\_2 etc...)
{% endhint %}




---

[Next Page](/llms-full.txt/1)

