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
| Event | When | Typical definition |
|---|---|---|
app_install | first session of an install | Meta Install on Android or with ATT; mostly a report |
app_open | start of every session (cold: true for a process start) | none; basis for active users and retention |
| screen (pageview) | every screen change | goal "Paywall seen" (screen /paywall) |
account_created, login | your app calls them (identity) | "Account created" → Meta CompleteRegistration |
lead | X3.lead(...) | trigger lead, optionally per form |
purchase | X3.purchase(...), confirmed by a server | trigger purchase, value from the purchase (purchases) |
trial_started | store notification of a free trial | Meta StartTrial |
| your own events | X3.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:
- 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. - As an app event. Otherwise X3 sends an app event (
action_source: "app") to the dataset linked to your app:app_datawithadvertiser_tracking_enabled(1 only for Android with ad measurement consent or iOS with ATT authorized) and theextinfoarray (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. Theevent_idis 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).
Google Ads
- Click conversions with
gclid/gbraid/wbraidfrom 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 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:
| Session | Meta | TikTok | Google Ads | |
|---|---|---|---|---|
adPlatforms not granted (any platform) | skipped | skipped | skipped | skipped |
Android, adPlatforms granted | with user data | with user data | yes | yes |
iOS, ATT authorized, adPlatforms granted | with user data | with user data | yes | yes |
iOS, ATT not authorized, adPlatforms granted | app event without user data | app event without user data | skipped | skipped |
health project, adPlatforms not from an opt-in grant | skipped | skipped | skipped | skipped |
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.