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)
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:
https://experienceleague.adobe.com/en/docs/experience-platform/web-sdk/identity/overview
https://experienceleague.adobe.com/en/docs/experience-platform/xdm/data-types/identity
Testing: Filter Network for interact
and check events.0.xdm.identityMap.utiq_XX
AudienceStream
Last update: July 2025 (check vendor documentation)
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 assignedSet 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 Stringutiq_category
This maps the MTID and Category from a single event to the user profile
Documentation:
https://docs.tealium.com/server-side/visitor-stitching/visitor-id-attribute/
https://docs.tealium.com/early-access/api/api-v3/tealium-collect-http-api-v3-early-access/
Testing:
Filter Network for
collect.tealiumiq.com/event
and check attributeutiq_XX
Use Tealium Tools to confirm identity mappings
Permutive
Last update: April 2025 (check vendor documentation)
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)
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.
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)
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:
https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/#identify
https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/#track
Testing:
For trait: Filter Network for
api.segment.io/v1/i
and check attributetraits
For event: Filter Network for
api.segment.io/v1/t
and check attributeevent
andproperties