Cross-Channel Matches

Cross-channel matches enrich your users' profiles, enabling you to reach them across several channels.

Match Providers#

Match Providers are first or third-party data sources that have their own user IDs (such as cookies, email hashes or login IDs), which can be matched to your first-party IDs.

Match Providers can be added to the system using the Dashboard under Collect > ID Matches, by clicking the Match Providers tab, followed by the New Match Provider button.

Dashboard Match Providers

The following fields are available:

  • Name: Name for the Match Provider.

  • Key: Identifier for the Match Provider. It is used later to create matches for this specific match provider.

  • Active: Enables/Disables matches from this Match Provider.

  • Allow extra iFrame Activations: Enables activations on match requests to this provider, replying to the match request with the appropriate HTML or Image tag as set in the Activation.

  • Encryption Key: When enabled, the new user ID parameter must be base64-encoded and encrypted using AES/ECB with the SHA256 hash of this key kept secret. Using encryption, particularly when done server-side, ensures the user ID is unusable in the event of a data leak during transport.

    Examples of how to encrypt your ID with the configured encryption Key:

    <script src="//"></script>
    <script src="//"></script>
    <script src="//"></script>
    <script src="//"></script>
    <script src="//"></script>
    <script type="text/javascript">
    var EmailHash = {
    generate: function(email, secret) {
    var hash = CryptoJS.SHA256(email.trim().toLowerCase());
    var aesKey = CryptoJS.SHA256(secret);
    var encrypted = CryptoJS.AES.encrypt(hash, aesKey, {
    mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7
    var b64 = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
    return b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
    class Security {
    private static function encryptAES($input, $key) {
    $data = openssl_encrypt($input, "AES-256-ECB", $key, $options=OPENSSL_RAW_DATA);
    return $data;
    private static function base64url_encode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
    public static function encrypt($input, $key) {
    $hashValue = hash("sha256", strtolower(trim($input)), $raw_output = true);
    $aes256Key = hash("sha256", $key, $raw_output = true);
    $encryptedHashValue = Security::encryptAES($hashValue, $aes256Key);
    return Security::base64url_encode($encryptedHashValue);
    import java.util.Locale;
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.SecretKeySpec;
    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.codec.digest.DigestUtils;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    public class EmailHash {
    public static String generate(String email, String secret) throws
    UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException,
    nvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    byte[] hash = DigestUtils.sha256(email.trim().toLowerCase(Locale.US).getBytes("UTF-8"));
    byte[] key = DigestUtils.sha256(secret.getBytes("UTF-8"));
    BouncyCastleProvider provider = new BouncyCastleProvider();
    Cipher encryptor = Cipher.getInstance("AES/ECB/PKCS5Padding", provider);
    SecretKeySpec skey = new SecretKeySpec(key, "AES/ECB/PKCS5Padding");
    encryptor.init(Cipher.ENCRYPT_MODE, skey);
    byte[] encrypted = encryptor.doFinal(hash);
    return Base64.encodeBase64URLSafeString(encrypted);

Matching User IDs#

To link together 2 or more User IDs under the same user profile we provide 2 approaches:

Last updated on