You’re sending purchase events to TikTok’s pixel but seeing low Event Match Quality (EMQ) scores and underattributed conversions. TikTok’s attribution engine relies on matching user signals between your pixel events and TikTok’s user database. When signals are weak or missing, conversions don’t get attributed, your ROAS looks artificially low, and TikTok’s algorithm can’t optimize effectively. This guide covers the matching signals, quality thresholds, and implementation fixes. Learn more in our guide on Meta Conversions API Field Mapping.

TikTok Pixel Event Matching Quality: Why Your Conversions Get Low Credit

How TikTok Event Matching Works

TikTok matches your conversion events to TikTok users through a priority-based signal system. TikTok checks these signals in order: Learn more in our guide on GA4 Consent Mode v2.

  • Click ID (ttclid): Highest quality. A unique identifier appended to TikTok ad URLs when clicked
  • Email: Hashed SHA256 email address
  • Phone: Hashed SHA256 phone number in E.164 format
  • External ID: Your hashed internal user identifier
  • IP Address + User Agent: Lower quality, but used as fallback

TikTok’s EMQ score (0-10) reflects how many high-quality signals match. A score of 7+ enables reliable attribution. Below 5, many conversions won’t be attributed.

The ttclid Problem: Why It’s Often Missing

ttclid is TikTok’s equivalent of Google’s gclid or Meta’s fbclid. TikTok appends it to ad destination URLs when clicked. Common reasons ttclid is missing from your events:

  • URL redirects: If your ad URL redirects (e.g., bit.ly link → your landing page), the ttclid parameter is often stripped during the redirect
  • Missing URL parameter capture: Your landing page doesn’t read the ttclid parameter from the URL and pass it to the pixel
  • Cookie blocked: iOS 14+ privacy restrictions or ad blockers prevent ttclid from being stored
  • Parameter not whitelisted in GTM: If using GTM, the ttclid URL parameter isn’t configured to be captured

Fix: Read ttclid from URL parameters on page load, store in a first-party cookie, and pass it with every subsequent event. Avoid redirects in ad URLs that strip parameters.

Implementing ttclid Capture Correctly

// Capture ttclid from URL and store in cookie
(function() {
  const urlParams = new URLSearchParams(window.location.search);
  const ttclid = urlParams.get('ttclid');
  
  if (ttclid) {
    // Store for 7 days (TikTok's attribution window)
    const expires = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toUTCString();
    document.cookie = `ttclid=${ttclid}; expires=${expires}; path=/; Secure; SameSite=Lax`;
  }
  
  // Read stored ttclid for event sending
  function getTtclid() {
    const match = document.cookie.match(/ttclid=([^;]+)/);
    return match ? match[1] : null;
  }
  
  window._getTtclid = getTtclid;
})();

// When sending purchase event
ttq.track('Purchase', {
  value: 99.99,
  currency: 'USD',
  contents: [{ content_id: 'SKU123', content_type: 'product', quantity: 1 }]
}, {
  ttclid: window._getTtclid()  // Include stored ttclid
});

Email and Phone Hashing for TikTok Events API

TikTok Events API (server-side equivalent of the pixel) uses hashed PII for matching. Hashing requirements:

TikTok Pixel Event Matching Quality: Why Your Conversions Get Low Credit implementation guide
  • Email: lowercase, trim whitespace, SHA256 hash
  • Phone: Remove non-numeric, include country code without +, SHA256 hash
  • External ID: Convert to string, SHA256 hash
const crypto = require('crypto');

function hashForTikTok(value) {
  return crypto.createHash('sha256').update(value.toString().toLowerCase().trim()).digest('hex');
}

// TikTok Events API payload
const payload = {
  pixel_code: 'YOUR_PIXEL_CODE',
  event: 'Purchase',
  timestamp: new Date().toISOString(),
  context: {
    user: {
      email: hashForTikTok(userEmail),
      phone_number: hashForTikTok(userPhone.replace(/[^0-9]/g, '')),
      external_id: hashForTikTok(userId.toString())
    },
    ad: {
      callback: ttclid  // NOT hashed
    },
    ip: clientIP,  // NOT hashed
    user_agent: userAgent  // NOT hashed
  },
  properties: {
    value: 99.99,
    currency: 'USD',
    content_id: ['SKU123'],
    content_type: 'product'
  }
};

Advanced Matching in TikTok Pixel

TikTok’s Advanced Matching feature allows you to pass hashed PII directly from the browser pixel (not just server-side). Enable it in TikTok Events Manager and configure it to capture email/phone from your site’s logged-in state or checkout forms:

// Initialize pixel with advanced matching
ttq.identify({
  email: sha256(userEmail),  // Pre-hash client side
  phone_number: sha256(userPhone)
});

// Or pass in event
ttq.track('Purchase', {
  value: 99.99,
  currency: 'USD'
}, {
  email: sha256(userEmail),
  phone_number: sha256(userPhone)
});

Advanced Matching significantly improves EMQ for authenticated users. Even if ttclid is missing, email matching alone can bring EMQ to 7-8.

Diagnosing Low EMQ in TikTok Events Manager

Check your current EMQ in TikTok Ads Manager under Events → your pixel → Event Quality. For each event type, you’ll see:

  • Overall EMQ score
  • Which signals are being received (email, phone, ttclid, etc.)
  • Coverage rate — percentage of events that include each signal
  • Match rate — percentage of events that successfully matched a TikTok user

If email coverage is 0%, you’re missing advanced matching setup. If ttclid coverage is below 50%, your redirect flow is stripping it. If match rate is below 40%, even your provided signals aren’t matching TikTok’s database (often means email format issues or phone format issues).

Improving EMQ: Priority Actions

  • Capture ttclid: Add URL parameter capture code to your landing pages. Test by clicking a TikTok ad in preview mode and checking the URL for ttclid.
  • Enable Advanced Matching: Pass hashed email during checkout or login. This alone often raises EMQ 3-4 points.
  • Use TikTok Events API (server-side): Sends events reliably even when ad blockers or iOS privacy settings prevent client-side pixel firing.
  • Fix phone format: Ensure phone numbers include country code without + sign (e.g., 14155551234 not +1-415-555-1234).
  • Deduplicate events: If using both pixel and Events API, send the same event_id to prevent double-counting.

TikTok’s algorithm optimizes using conversion signals. High EMQ means TikTok can find more lookalike users for your campaigns. Fixing matching quality often improves campaign performance more than any bid or creative optimization.

Leave a Comment