Analytics Integration Guide

This guide covers how to configure and use all available analytics pixels on the web2wave platform, including event mappings, data transmission, and testing recommendations.

🎯 Available Analytics Pixels

The platform supports the following analytics and advertising pixels:

  • Facebook Pixel (Meta Pixel) - For Facebook/Instagram advertising
  • TikTok Pixel - For TikTok advertising campaigns
  • Snapchat Pixel - For Snapchat advertising
  • Pinterest Tag - For Pinterest advertising
  • AppLovin AXON - For mobile advertising attribution
  • Google Analytics & Google Ads - For web analytics and Google advertising

🔧 How to Add Pixels to the Platform

General Setup Process

  1. Navigate to Project Settings → Analytics Tab
  2. Enable the desired pixel by checking the checkbox
  3. Configure required fields (Pixel ID, Access Tokens, etc.)
  4. Test configuration using the "Check token" buttons where available
  5. Save settings - The pixel will automatically load on your pages

Pixels and Conversions API: fields to fill in

Every network is connected in Project settings → Analytics. You never paste a pixel snippet into your pages. In each section the ID gives you browser events, and the token next to it is what adds server-side conversions — fill in both if you want both.

  • Meta Pixel — Meta Pixel ID and Facebook Access Token. Facebook Test Event Code belongs in the field only while you are testing — clear it afterwards, or Meta keeps treating your traffic as test events.
  • TikTok Pixel & Conversion API — TikTok Pixel ID and TikTok Access Token. The token also covers click ID forwarding to the TikTok Events API.
  • Snapchat Pixel — Snapchat Pixel ID and Snapchat Access Token. Snapchat conversions are sent from web2wave servers once both fields are filled in.
  • Pinterest Tag — Pinterest Tag ID for the browser tag, plus Pinterest Ad Account ID and Pinterest Conversion Token for server-side conversions. Pinterest is the one network where server events use the ad account, not the tag, so filling in the Tag ID alone leaves you with browser events only. Send Pinterest Conversions API events as test marks the server events as test data while you check the setup — switch it off afterwards.
  • Choose which events each network receives on the server side in Events to send via Conversion API, on the same tab.

Saving is enough — the pixels then load on every quiz, paywall, and After Pay page in the project.

🚧

Don't connect a pixel by pasting the network's own snippet into HTML to HEAD or into a tag manager. Pixels added that way fire browser events only — server conversions need the token fields above — and a pixel your own code puts on the page can also pick up web2wave funnel events, which shows up in Events Manager as duplicated or unexpected conversions.

Need a different pixel for a single quiz or paywall, or none at all? See Custom and multiple pixels.

Configuration Fields by Platform

PlatformRequired FieldsOptional FieldsServer Events
Facebook• Pixel ID • Access Token• Test Event Code • Server Events Only✅ Full Support
TikTok• Pixel ID • Access Token• Server Events Only✅ Full Support
Snapchat• Pixel ID • Access TokenNone✅ Full Support
Pinterest• Tag ID (browser) • Ad Account ID + Conversion Token (server events)• Server events only • Send server events as test✅ With Ad Account ID and Conversion Token
AppLovin• Event KeyNone❌ Browser Only
Google• Analytics ID • Tag Manager ID• AdWords Tag ID✅ Full Support

Note: Pinterest is the exception to "one ID plus one token". Its browser tag uses the Pinterest Tag ID, while its server-side conversions use Pinterest Ad Account ID and Pinterest Conversion Token — fill in all three to get browser and server events.

❗️

Don't use Birch for your Meta Pixel, choose "Set up manually" and input Pixel ID and Facebook Access Token.


📈 Event Mappings by Platform

Facebook Pixel Events

Internal EventFacebook EventEvent Type
PurchasePurchaseStandard
SubscribeSubscribeStandard
InitiateCheckoutInitiateCheckoutStandard
CompleteRegistrationCompleteRegistrationStandard
AddPaymentInfoAddPaymentInfoStandard
StartTrialStartTrialStandard
PageViewPageViewStandard
Paywall Prices visibleViewContentStandard
Paywall click priceViewContentStandard
Other eventsCustom EventsCustom

Special Features:

  • ✅ Enhanced matching with hashed email and user_id (SHA-256)
  • ✅ Event deduplication using eventID
  • ✅ Facebook Click ID (fbclid) and Browser ID (fbp) tracking
  • ✅ Automatic cookie management (_fbc, _fbp)

TikTok Pixel Events

Internal EventTikTok EventNotes
PurchasePurchaseWith transaction data
SubscribeSubscribeWith subscription data
InitiateCheckoutInitiateCheckoutWith cart data
CompleteRegistrationCompleteRegistrationUser signup
AddPaymentInfoAddPaymentInfoPayment info added
StartTrialStartTrialTrial started
PageViewPageViewPage view
All eventsForwardedAll events sent

Special Features:

  • ✅ Enhanced matching with email and external_id
  • ✅ TikTok Click ID (ttclid) tracking
  • ✅ Automatic user identification
  • ✅ Full event forwarding with currency/value data

Snapchat Pixel Events

Internal EventSnapchat EventNotes
PurchasePURCHASEWith price/currency
SubscribePURCHASESubscription purchase
InitiateCheckoutSTART_CHECKOUTCheckout initiated
CompleteRegistrationSIGN_UPUser registration
AddPaymentInfoADD_BILLINGPayment info
StartTrialPURCHASETrial signup
PageViewPAGE_VIEWPage view
Paywall Prices visibleVIEW_CONTENTContent view
AddToCartADD_TO_CARTCart addition
SearchSEARCHSearch performed

Special Features:

  • ✅ Client deduplication ID (client_dedup_id) prevents duplicate events
  • ✅ Snapchat Click ID (sccid, ScCid) tracking
  • ✅ Enhanced user matching with email
  • ✅ Only sends mapped standard events (filters irrelevant events)

Pinterest Tag Events

Internal EventPinterest EventNotes
PurchasecheckoutWith transaction data
SubscribesignupUser signup
InitiateCheckoutaddtocartCheckout process
CompleteRegistrationsignupUser registration
AddPaymentInfoaddtocartPayment process
StartTrialcheckoutTrial conversion
PageViewpagevisitPage view
Paywall Prices visibleviewcategoryCategory view
AddToCartaddtocartCart addition
SearchsearchSearch performed

Special Features:

  • ✅ Enhanced match with email and external_id
  • ✅ Pinterest Click ID (pinclid) tracking
  • ✅ Automatic email hashing for privacy
  • ✅ Cross-device checkout tracking

AppLovin AXON Events

Internal EventAXON EventCategory
PurchasepurchaseRequired
SubscribesubscribeRequired
StartTrialsubscribeRequired
InitiateCheckoutbegin_checkoutRequired
CompleteRegistrationsign_upRecommended
AddPaymentInfoadd_payment_infoRecommended
PageViewpage_viewRequired
Paywall Prices visibleview_itemRequired
AddToCartadd_to_cartRequired
SearchsearchRecommended

Special Features:

  • ✅ Rich ecommerce data with items array
  • ✅ Product categorization (item_category_id: 317)
  • ✅ Automatic additional events (land on page_view, add_to_cart on checkout)
  • ✅ Mobile-optimized attribution

Google Analytics Events

Internal EventGoogle EventNotes
PurchasepurchaseEnhanced ecommerce
SubscribepurchaseEnhanced ecommerce
StartTrialpurchaseEnhanced ecommerce
InitiateCheckoutbegin_checkoutEcommerce funnel
CompleteRegistrationsign_upUser action
AddPaymentInfoadd_payment_infoCheckout step
PageViewpage_viewStandard tracking
Paywall Prices visibleview_itemProduct view

Special Features:

  • ✅ Enhanced ecommerce tracking
  • ✅ Multiple tag support (Analytics + Tag Manager + Ads)
  • ✅ Data Layer and gtag support
  • ✅ Custom send_to targeting

📊 Data Transmitted with Events

Common Data Sent to All Platforms

{
    user_id: "unique_user_identifier",
    email: "[email protected]", // when available
    value: 29.99, // transaction value
    currency: "USD",
    subscription_id: "sub_123456",
    price_id: "price_123",
    external_price_id: "stripe_price_123",
    quiz_id: "quiz_123",
    paywall_id: "paywall_123",
    app_version: "1.0.0"
}

Platform-Specific Data

Facebook Pixel

{
    eventID: "user123_Purchase", // Deduplication
    fbc: "fb.1.1703123456000.abc123", // Facebook Click ID
    fbp: "fb.1.1703123456000.xyz789", // Facebook Browser ID
    external_id: "hashed_user_id", // SHA-256 hashed
    em: "hashed_email" // SHA-256 hashed email
}

TikTok Pixel

{
    external_id: "user_123",
    email: "[email protected]",
    // Full event properties forwarded
}

Snapchat Pixel

{
    client_dedup_id: "user123_Purchase", // Deduplication
    user_id: "user_123",
    user_email: "[email protected]",
    price: 29.99,
    currency: "USD",
    transaction_id: "subscription_123"
}

Pinterest Tag

{
    external_id: "user_123",
    em: "[email protected]", // Auto-hashed
    value: 29.99,
    currency: "USD",
    order_id: "subscription_123"
}

AppLovin AXON

{
    items: [{
        item_id: "price_123",
        item_name: "Subscription",
        quantity: 1,
        price: 29.99,
        currency: "USD",
        item_category_id: 317
    }],
    value: 29.99,
    currency: "USD",
    transaction_id: "subscription_123"
}

Notes:

  • The function is executed per system. Returning false blocks sending only for that specific system.
  • If the function throws an error, the event will be sent (errors are swallowed to avoid losing analytics).
  • Keep logic simple and fast; the function runs for every event.

🔍 Testing Pixels with Browser Extensions

Facebook Pixel Helper

  • Extension: Facebook Pixel Helper
  • Features: Real-time event monitoring, error detection, parameter validation
  • Testing: Shows all fired events, parameters, and errors
  • What to Check: Event names, parameters, enhanced matching data
  • Recommendation: ⭐⭐⭐⭐⭐ Essential for Facebook debugging

TikTok Pixel Helper

  • Extension: TikTok Pixel Helper
  • Features: Event tracking, parameter validation, data quality monitoring
  • Testing: Monitors TikTok events and enhanced matching
  • What to Check: Event firing, user identification, currency data
  • Recommendation: ⭐⭐⭐⭐ Very useful for TikTok campaigns

Snapchat Pixel Helper

  • Extension: Snap Pixel Helper
  • Features: Event validation, test events, deduplication monitoring
  • Testing: Real-time Snapchat event monitoring
  • What to Check: Event mapping, deduplication IDs, user matching
  • Recommendation: ⭐⭐⭐⭐ Important for Snapchat attribution

Pinterest Tag Helper

  • Extension: Pinterest Tag Helper
  • Features: Tag verification, event tracking, enhanced match validation
  • Testing: Monitors Pinterest events and data quality
  • What to Check: Event firing, enhanced match data, conversion tracking
  • Recommendation: ⭐⭐⭐ Useful for Pinterest campaigns

Google Tag Assistant

  • Extension: Google Tag Assistant
  • Features: Google Analytics, GTM, Google Ads tracking validation
  • Testing: Comprehensive Google ecosystem debugging
  • What to Check: Enhanced ecommerce, goal tracking, conversion data
  • Recommendation: ⭐⭐⭐⭐⭐ Essential for Google properties

Generic Analytics Debuggers

  • Extension: Analytics Debugger
  • Features: Multi-platform analytics debugging
  • Testing: Supports multiple analytics platforms simultaneously
  • What to Check: Cross-platform event consistency
  • Recommendation: ⭐⭐⭐ Good for cross-platform testing

🛠️ Advanced Configuration

Server-Side Events

Currently supported platforms for server-side events:

  • Facebook: ✅ Full server events support with Conversions API
  • TikTok: ✅ Full server events support with Events API
  • Snapchat: ✅ Full server events support with Conversions API
  • Pinterest: ✅ Server events through the Pinterest API for conversions
  • Google: ✅ Enhanced conversions and server-side tracking
  • AppLovin: ❌ Browser-only (no server events available)

To enable: fill in the platform's token in Project settings → Analytics — Facebook Access Token, TikTok Access Token, Snapchat Access Token, or, for Pinterest, Pinterest Ad Account ID plus Pinterest Conversion Token — then list the events you want on the server side in Events to send via Conversion API. There is no separate switch that turns server events on: the credentials plus the event list are the whole configuration, and an event that is not in that list stays browser-only.

"Use [Platform] for server events only" does something different: it stops the browser pixel or tag from loading, so the platform receives server events only. It is available for Meta, TikTok, and Pinterest (Use Pinterest Tag for server events only). Leave it off if you want browser and server events together — that combination is what the ad networks deduplicate and optimize best on.

Click ID Parameters

The platform automatically tracks and forwards click IDs:

PlatformClick ID ParameterCookie CreatedPurpose
Facebookfbclid_fbcAttribution tracking
TikTokttclid_ttpCampaign attribution
Snapchatsccid, ScCidNoneClick tracking
PinterestpinclidPlatform-managedAttribution
Googlegclid, gbraidPlatform-managedAds attribution

Enhanced Matching Configuration

Platforms that support enhanced matching automatically use:

  • Email addresses (hashed when required)
  • User IDs as external identifiers
  • Phone numbers (when available)
  • First-party data for better attribution

Event filter function (per system)

You can define an optional JavaScript filter function for each analytics system. This function allows you to:

  • Skip events by returning false
  • Override event name by returning { event_name: "NewEventName" }
  • Override event properties by returning { event_properties: {...} }
  • Override both by returning { event_name: "...", event_properties: {...} }

How to configure

In the admin UI (Project → Analytics tab), each supported system includes a field named "Event filter function (JS)". Paste a function into that field. The function receives two parameters:

  • event_name - The name of the event being sent
  • event_properties - An object containing all event properties

Example Use Cases

1. Filtering Events by Name

Skip all events that start with "Step ":

function(event_name, event_properties) {
  if (event_name.indexOf('Step ') === 0) {
    return false; // Skip this event
  }
}

Skip events containing specific keywords:

function(event_name, event_properties) {
  if (event_name.indexOf('Step') > -1 || event_name.indexOf('Scroll') > -1) {
    return false;
  }
}
2. Modifying Event Properties

Multiply value by 3 for Meta/TikTok:

function(event_name, event_properties) {
  if (event_properties.value) {
    event_properties.value = event_properties.value * 3;
  }
  return { event_properties: event_properties };
}

Adjust value based on price_id_internal:

function(event_name, event_properties) {
  // Apply different multipliers based on internal price ID
  if (event_properties.price_id_internal === 'premium') {
    event_properties.value = event_properties.value * 1.5;
  } else if (event_properties.price_id_internal === 'basic') {
    event_properties.value = event_properties.value * 0.8;
  }
  return { event_properties: event_properties };
}
3. Conditional Event Filtering

Skip events for specific user segments:

function(event_name, event_properties) {
  // Skip events for users in test group
  if (event_properties.user_segment === 'test' || event_properties.user_segment === 'beta') {
    return false;
  }
}

Only send purchase events above a certain value:

function(event_name, event_properties) {
  if (event_name === 'Purchase' || event_name === 'Subscribe') {
    if (!event_properties.value || event_properties.value < 10) {
      return false; // Skip low-value purchases
    }
  }
}
4. Renaming Events

Rename events for better tracking:

function(event_name, event_properties) {
  if (event_name === 'Paywall click price') {
    return { event_name: 'ProductView' };
  }
  if (event_name === 'Paywall Prices visible') {
    return { event_name: 'CatalogView' };
  }
	// otherwise
	return true;
}
5. Adding Custom Properties

Add custom properties to all events:

function(event_name, event_properties) {
  // Add custom tracking properties
  event_properties.custom_source = 'web2wave';
  event_properties.timestamp = new Date().toISOString();
  event_properties.platform_version = '2.0';
  
  return { event_properties: event_properties };
}
6. Currency Conversion

Convert values to a specific currency:

function(event_name, event_properties) {
  const exchangeRates = {
    'EUR': 0.85,
    'GBP': 0.73,
    'JPY': 110
  };
  
  if (event_properties.value && event_properties.currency === 'USD') {
    const targetCurrency = 'EUR'; // Target currency
    const rate = exchangeRates[targetCurrency];
    
    if (rate) {
      event_properties.value = event_properties.value * rate;
      event_properties.currency = targetCurrency;
    }
  }
  
  return { event_properties: event_properties };
}
7. Complex Conditional Logic

Different rules for different event types:

function(event_name, event_properties) {
  // For purchase events, ensure minimum value
  if (event_name === 'Purchase' || event_name === 'Subscribe') {
    if (event_properties.value < 5) {
      return false; // Skip low-value conversions
    }
    // Add conversion source
    event_properties.conversion_source = 'web';
  }
  
  // For page views, add viewport info
  if (event_name === 'PageView') {
    event_properties.viewport_width = window.innerWidth;
    event_properties.viewport_height = window.innerHeight;
  }
  
  // Skip test events
  if (event_properties.is_test === true) {
    return false;
  }
  
  return { event_properties: event_properties };
}
8. Filtering by Subscription Status

Only send events for active subscribers:

function(event_name, event_properties) {
  // Skip events if user doesn't have active subscription
  if (event_properties.subscription_status !== 'active' && 
      event_properties.subscription_status !== 'trialing') {
    return false;
  }
}

Important Notes

  • Return false to skip sending the event to that specific system
  • Return an object with event_name and/or event_properties to override values
  • Return nothing or true to send the event as-is
  • The function is executed per system - each analytics platform can have its own filter
  • If the function throws an error, the event will be sent (errors are caught to prevent data loss)
  • Keep logic simple and fast - the function runs for every event
  • Don't modify the original event_properties object directly - create a copy or return a new object