Skip to main content
Skip table of contents

CDP Integration

This page contains integration guides with various CDP solutions, of how to pass martechpass as declared ID.

Why Integrate Utiq martechpass with CDPs?

The martechpass enables CDPs to identify and unify user profiles more accurately, even across sessions, devices, and browsers. As a declared ID, it provides a reliable anchor for user data, enhancing personalization and activation potential.

Primary Use Cases

  • Audience Building & Activation: Collect traits and behaviors tied to martechpass, and activate audiences across owned media, AdTech platforms, or via data clean rooms.

  • First-Party Data Activation: Empower brands to activate customer insights without relying on third-party cookies or shared identifiers.

Learn more: Utiq Use Cases

Vendor Integrations

For each integration, Utiq recommends retrieving the mtid using onIdsAvailable via the addEventListener API, especially when embedding via third-party scripts.

Adobe CDP

Last update: April 2025 (check vendor documentation)

JS
window.Utiq ||= {};
window.Utiq.queue ||= [];

const handleIdsAvailable = ({ mtid, category }) => {
  // Callback action for onIdsAvailable
  
  if (mtid && category === 'mobile' && typeof alloy === 'function') {
    alloy("sendEvent", {
      xdm: {
        "identityMap": {
          "utiq_mobile": [ // Ensure it's a registered identity namespace in Adobe CDP
            {
              "id": mtid,
              "authenticatedState": "ambiguous",
              "primary": false
            }
          ]
        }
      }
    });
  } else if (mtid && category === 'fixed' && typeof alloy === 'function') {
    alloy("sendEvent", {
      xdm: {
        "identityMap": {
          "utiq_fixed": [ // Ensure it's a registered identity namespace in Adobe CDP
            {
              "id": mtid,
              "authenticatedState": "ambiguous",
              "primary": false
            }
          ]
        }
      }
    });
  } else {
    console.error('Adobe CDP is not available, or MTID is missing.');
  }
};

window.Utiq.queue.push(() => {
  window.Utiq.API.addEventListener('onIdsAvailable', handleIdsAvailable);
});

Ensure that ‘utiq_mobile’ and ‘utiq_fixed’ are registered identity namespaces in Adobe CDP.

Documentation:

Testing: Filter Network for interact and check events.0.xdm.identityMap.utiq_XX

AudienceStream

Last update: July 2025 (check vendor documentation)

JS
window.Utiq ||= {};
window.Utiq.queue ||= [];

const handleIdsAvailable = ({ mtid, category }) => {
  // Callback action for onIdsAvailable
  
  if (mtid && typeof utag === 'object' && typeof utag.link === 'function') {
    utag.link({
      tealium_event: 'utiqUserIdReady',
      utiq_mtid: mtid,
      utiq_category: category
    });
  } else {
    console.error('Tealium iQ is not available, or MTID is missing.');
  }
};

window.Utiq.queue.push(() => {
  window.Utiq.API.addEventListener('onIdsAvailable', handleIdsAvailable);
});

Configurations in Tealium iQ Tag Management

Create a Data Layer Variable

  • Go to Data Layer > Add Variable

  • Name: utiq_mtid

  • Type: JavaScript Variable

  • Variable: utiq_mtid

  • Do the same for utiq_category

Enable ‘Collect Tag’

  • Go to Tags > Add Tag

  • Choose ‘Tealium Collect Tag’

  • Scope: All Pages or relevant rule

Configurations in Tealium EventStream

  • Go to Data Layer > Event Attributes

  • Look for attribute utiq_mtid (Type: String)

  • If it doesn't exist, create it

    • Source: Event data

    • Match field name from payload: utiq_mtid

  • Do the same for utiq_category

Configurations in Tealium AudienceStream

  • Go to Attributes

  • Create a new attribute:

    • Type: Visitor String

    • Name: Utiq MTID

    • Enrichment Rule:

      • When: utiq_mtid (event attribute) is assigned

      • Set Visitor String to the value of utiq_mtid

      • Optional: Add validation (e.g., matches regex or exists)

  • Do the same for attribute Utiq Category with Visitor String utiq_category

This maps the MTID and Category from a single event to the user profile

Documentation:

Testing:

  • Filter Network for collect.tealiumiq.com/event and check attribute utiq_XX

  • Use Tealium Tools to confirm identity mappings

Permutive

Last update: April 2025 (check vendor documentation)

JS
window.Utiq ||= {};
window.Utiq.queue ||= [];

const handleIdsAvailable = ({ mtid, category }) => {
  // Callback action for onIdsAvailable
  
  if (mtid && category === 'mobile' && window.permutive && typeof window.permutive.identify === 'function') {
    window.permutive.identify([
      {
        id: mtid,
        tag: 'utiq_mobile', // Ensure it's a registered identifier in Permutive CDP
        priority: 1
      }
    ])
  } else if (mtid && category === 'fixed' && window.permutive && typeof window.permutive.identify === 'function') {
    window.permutive.identify([
      {
        id: mtid,
        tag: 'utiq_fixed', // Ensure it's a registered identifier in Permutive CDP
        priority: 1
      }
    ])
  } else {
    console.error('Permutive is not available, or MTID is missing.');
  }
};

window.Utiq.queue.push(() => {
  window.Utiq.API.addEventListener('onIdsAvailable', handleIdsAvailable);
});

Ensure that ‘utiq_mobile’ and ‘utiq_fixed’ are registered identifiers in Permutive CDP.

Documentation:

Testing: Look for localStorage permutive-data-misc containing utiq in identities. Also filter network for identify and check if mtid is part of the aliases object

ADEX

Last update: April 2025 (check vendor documentation)

JS
window.Utiq ||= {};
window.Utiq.queue ||= [];

// Define your ADEX variables here
const adexCustomerId = <customerId>; // Replace <customerId> with your real Customer ID
const adexTagId = <tagId>; // Replace <tagId> with your real Tag ID

const handleIdsAvailable = ({ mtid, category }) => {
  // Callback action for onIdsAvailable
  
  if (mtid && category === 'mobile') {
    window._adexc = window._adexc || [];
    const instancePath = `/${adexCustomerId}/${adexTagId}/`;
    window._adexc.push([instancePath, "cm", "_cm", [308, mtid]]) // '308' is Utiq's partner ID
  }
};

window.Utiq.queue.push(() => {
  window.Utiq.API.addEventListener('onIdsAvailable', handleIdsAvailable);
});

Replace <customerId> and <tagId> with your real Customer ID and Tag ID.

'308' is Utiq's partner ID.

Documentation:

Testing: Filter Network for 2.gif?axd_pid=308 and check attribute axd_fuid

Emetriq

Last update: July 2025 (check vendor documentation)

The code implies that you load Emetriq SDK conditionally, based on Utiq SDK event listeners. Also, the asynchronous call of the script, could impact you if you rely on segments returned by the data call.

In any case, it’s highly recommended to consult your Emetriq contacts.

JS
window.Utiq ||= {};
window.Utiq.queue ||= [];

window.Utiq.queue.push(() => {
  let sid = '<sid>'; // Replace <sid> with your real Emetriq SID

  let consentFinished = false;
  let flowCompleted = false;
  let fallbackTriggered = false;

  // Function to run standard Emetriq fallback code
  const runFallback = () => {
    if (fallbackTriggered) return;
    fallbackTriggered = true;

    console.info('Utiq - Running fallback, standard Emetriq code');

    window._enqAdpParam ||= {};
    window._enqAdpParam.sid = sid;

    const s = document.createElement('script');
    s.type = 'text/javascript';
    s.src = `https://ups.xplosion.de/loader/${sid}/default.js`;
    s.async = true;
    document.head.appendChild(s);
  };

  // 1. onInitialised: check if Utiq is available
  window.Utiq.API.addEventListener('onInitialised', () => {
    console.info('Utiq - onInitialised event fired.');

    // 2. onConsentUpdateFinished: start 4s timer waiting for onFlowCompleted
    window.Utiq.API.addEventListener('onConsentUpdateFinished', () => {
      console.info('Utiq - onConsentUpdateFinished event fired.');
      consentFinished = true;

      const timeoutId = setTimeout(() => {
        if (!flowCompleted) {
          console.info('Utiq - Timeout expired waiting for onFlowCompleted, running fallback');
          runFallback();
        }
      }, 4000);

      // 3. onFlowCompleted within 4 seconds
      window.Utiq.API.addEventListener('onFlowCompleted', () => {
        console.info('Utiq - onFlowCompleted event fired');
        flowCompleted = true;
        clearTimeout(timeoutId);

        // 4. Proceed to listen for onIdsAvailable to get mtid
        window.Utiq.API.addEventListener('onIdsAvailable', ({ mtid, category }) => {
          if (!mtid || category !== 'mobile') {
            console.info('Utiq - MTID missing or category is not mobile, fallback to standard code');
            runFallback();
            return;
          }

          if (fallbackTriggered) return; // Already ran fallback

          console.info(`Utiq - MTID found and category is mobile, setting Emetriq params`);

          // Set params with MTID
          window._enqAdpParam ||= {};
          window._enqAdpParam.sid = sid;
          window._enqAdpParam[`id_utiq_${sid}`] = mtid;

          // Load Emetriq loader script
          const s = document.createElement('script');
          s.type = 'text/javascript';
          s.src = `https://ups.xplosion.de/loader/${sid}/default.js`;
          s.async = true;
          document.head.appendChild(s);
        });
      });
    });
  });

  // If onInitialised never fires (meaning Utiq not present), fallback after short delay
  setTimeout(() => {
    if (!consentFinished) {
      console.info('Utiq - Utiq not initialised, fallback immediately');
      runFallback();
    }
  }, 1000); // 1 second grace to detect Utiq init
});

Documentation:

Testing: Filter Network for xplosion.de/data and check attribute id_utiq_<sid>

Segment

Last update: July 2025 (check vendor documentation)

JS
window.Utiq ||= {};
window.Utiq.queue ||= [];

const handleIdsAvailable = ({ mtid, category }) => {
  // Callback action for onIdsAvailable
  
  if (mtid && typeof analytics === 'object' && typeof analytics.identify === 'function') {
    analytics.identify({
      utiq_mtid: mtid,
      utiq_category: category
    });
    
    // Optional: track event if you want to trigger workflows
    /*
    analytics.track('utiqUserIdReady', {
      utiq_mtid: mtid,
      utiq_category: category
    });
    */
  } else {
    console.error('Segment is not available, or MTID is missing.');
  }
};

window.Utiq.queue.push(() => {
  window.Utiq.API.addEventListener('onIdsAvailable', handleIdsAvailable);
});

Documentation:

Testing:

  • For trait: Filter Network for api.segment.io/v1/i and check attribute traits

  • For event: Filter Network for api.segment.io/v1/t and check attribute event and properties

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.