AppsFlyer MMP Setup
PlayOps delegates mobile measurement partner (MMP) attribution to AppsFlyer. Your game embeds the official AppsFlyer Unity SDK, initializes it with a dev key provided by your Tactile integration contact, and optionally forwards a small set of analytics events so they can be attributed in the AppsFlyer dashboard.
Install the AppsFlyer SDK
Follow AppsFlyer’s official Unity installation guide:
AppsFlyer Unity SDK — Installation
The PlayOps SDK does not bundle the AppsFlyer SDK. Use the version and installation method recommended by AppsFlyer (Unity Package Manager, .unitypackage, or OpenUPM) so you get their latest attribution and privacy fixes.
Get your dev key
Your AppsFlyer dev key is issued by Tactile, not by AppsFlyer directly. Request it from your Tactile integration contact — the same person who onboards you to PlayOps. The dev key is shared across iOS and Android builds of a single title.
Initialize AppsFlyer
Initialize the AppsFlyer SDK according to their documentation, passing the dev key from Tactile and your platform-specific app IDs. A minimal Unity setup looks like:
using AppsFlyerSDK;using UnityEngine;
public class AppsFlyerBootstrap : MonoBehaviour{ [SerializeField] private string devKey; // provided by Tactile [SerializeField] private string appleAppId; // iOS App Store ID
private void Start() { AppsFlyer.initSDK(devKey, appleAppId, this); AppsFlyer.startSDK(); }}Refer to the AppsFlyer installation docs for the full initialization flow, including ATT (App Tracking Transparency) handling on iOS and consent signals on Android.
Forwarding PlayOps events to AppsFlyer (optional)
If you want user-acquisition campaigns to optimize against in-game behaviour, forward a small set of events to AppsFlyer in addition to logging them through PlayOps analytics.
The following event names are used by the Tactile analytics team:
| Event name | When to fire | Notes |
|---|---|---|
first_purchase | The player’s first successful in-app purchase. | Sends product_id as the event parameter. |
in_app_purchase | Every in-app purchase. | Do not send manually — AppsFlyer’s PurchaseConnector tracks and validates iOS/Android IAPs automatically. |
ad_revenue | An ad impression that produced revenue. | Uses logAdRevenue with ad unit, ad type, placement, and revenue. |
in_app_purchase
AppsFlyer’s PurchaseConnector library validates and reports iOS and Android IAP revenue automatically, so the game side does not need to send this event. Enable PurchaseConnector as part of the AppsFlyer SDK setup and purchases will flow through without additional integration work. (Amazon builds are the exception — there, the unvalidated transaction is reported explicitly.)
first_purchase
Fire this event once, the first time a given player completes a purchase. It is forwarded to AppsFlyer with the purchased product identifier:
product_id: <store product identifier>Use it as a conversion signal for UA campaigns that target paying users.
ad_revenue
Fire this event for every ad impression that generated revenue. It is mapped to AppsFlyer’s logAdRevenue API with the following parameters:
| Parameter | Source |
|---|---|
af_ad_unit | Ad unit ID |
af_ad_type | Ad format (rewarded, interstitial, banner, …) |
af_placement | Placement name in your game |
| Revenue | Revenue amount in the reported currency |
| Currency | ISO currency code |
| Network | Ad network name |
| Mediation | Mediation network (from config) |
Reporting ad revenue lets AppsFlyer compute ROAS (return on ad spend) for UA campaigns that rely on ad-monetized cohorts.