In-app conversions and ad platforms

Apps need no new conversion model. App events are ordinary X3 events, screens are pageviews, so the existing conversion definitions (event, goal, lead, lead status, purchase, manual) cover everything. What is new: the events the app SDK sends by itself, purchases confirmed by store notifications, and how conversions of app users reach the ad platforms.

Events and typical definitions

EventWhenTypical definition
app_installfirst session of an installMeta Install on Android or with ATT; mostly a report
app_openstart of every session (cold: true for a process start)none; basis for active users and retention
screen (pageview)every screen changegoal "Paywall seen" (screen /paywall)
account_created, loginyour app calls them (identity)"Account created" → Meta CompleteRegistration
leadX3.lead(...)trigger lead, optionally per form
purchaseX3.purchase(...), confirmed by a servertrigger purchase, value from the purchase (purchases)
trial_startedstore notification of a free trialMeta StartTrial
your own eventsX3.track("profile_completed", …)trigger event with a property filter, for example plan = "year"

Goals, funnels and the relevance model work unchanged. An app funnel for Nordlicht: install → onboarding finished → account → paywall seen → trial → subscription. The platform filter splits every definition's numbers by web, iOS and Android.

Conversions from app traffic inherit every guard of web conversions: test traffic is never reported, browser-reported purchases stay held until a server confirms them, and a destination's "only with marketing consent" rule still applies.

Meta

X3 reports app conversions to Meta in one of two ways, decided per conversion:

  1. Through the web journey. When the person's journey has a Meta click (fbclid / _fbc) within 90 days and user data may be sent, X3 uses the Meta Conversions API exactly as for web conversions, with the click id and the hashed identities. This is the common case for a web-first funnel: the purchase happened in the app, the ad click on the website.
  2. As an app event. Otherwise X3 sends an app event (action_source: "app") to the dataset linked to your app: app_data with advertiser_tracking_enabled (1 only for Android with ad measurement consent or iOS with ATT authorized) and the extinfo array (platform, bundle id, app version and build, OS version, locale, screen size, time zone; no device model), user_data.anon_id (the install's X3 id, not a device id) and, where allowed, hashed e-mail and user id. The event_id is the same as for any other upload of that conversion.

Setup: in Meta Events Manager link your app to a dataset (one app per dataset), then enter the dataset id in Einstellungen › Apps › Nordlicht › Werbeplattformen (Ad platforms, field metaDatasetId). Without it X3 uses the pixel of your Meta destination.

TikTok

Like Meta: when the journey has a TikTok click (ttclid) and user data may be sent, X3 uses the TikTok Events API web path. Otherwise it sends an app event (event_source: "app") for your TikTok App ID with the app's store id or package, name and version; iOS without ATT carries no user identifiers. Register the app in TikTok Events Manager and enter the TikTok App ID under Werbeplattformen (tiktokAppId).

  • Click conversions with gclid / gbraid / wbraid from the web journey or from the Play referrer of an Android install, through the existing Google Ads upload.
  • Enhanced conversions for leads with the hashed e-mail, as on the web.

Optimizing Google app campaigns (App campaigns for installs or in-app actions) needs Google's own measurement: Firebase (or Google's server-to-server app conversion API, which X3 does not support in this version). Recommendation: keep Firebase for Google app campaign bidding, use X3 for the cross-channel view, journeys and leads, and compare.

LinkedIn

LinkedIn has no app attribution. X3 reports leads and accounts of app users through the LinkedIn Conversions API with the hashed e-mail or an li_fat_id from the web journey, as for web leads. Useful for B2B apps.

App Tracking Transparency

Apple treats it as tracking when data from your app (including hashed e-mail addresses) is linked with data of other companies for advertising measurement, no matter whether the device or a server sends it. X3 therefore applies these rules to every upload, on top of each destination's own consent rules:

SessionMetaTikTokGoogle AdsLinkedIn
adPlatforms not granted (any platform)skippedskippedskippedskipped
Android, adPlatforms grantedwith user datawith user datayesyes
iOS, ATT authorized, adPlatforms grantedwith user datawith user datayesyes
iOS, ATT not authorized, adPlatforms grantedapp event without user dataapp event without user dataskippedskipped
health project, adPlatforms not from an opt-in grantskippedskippedskippedskipped

Skipped uploads show their reason in the conversion's sync status ("keine Einwilligung für Werbeplattformen in der App", "iOS ohne ATT-Freigabe"). Journey enrichment (adding the web journey's click ids) is off for iOS sessions without ATT as well.

Ask for ATT with X3.requestTrackingAuthorization() at a moment where the reason is clear (after onboarding, not at the first launch), with a NSUserTrackingUsageDescription that says what you do (iOS). Declare tracking in App Store Connect when you use it (store privacy details).

Dedupe with platform SDKs

If your app also contains the Meta or TikTok SDK, the platform counts twice when both send the same event. Rule: one source per platform and event. When you need both, pass X3's event id to the platform SDK call (Meta dedupes on event_id plus event_name, as for pixel and Conversions API on the web), and run the Meta SDK with AutoLogAppEventsEnabled = false until the user consented. X3's event id of a conversion is order:<orderId> for purchases and is shown in the conversion's sync details; for leads pass your own eventId to X3.lead and to the platform SDK.