AppsFlyer (iOS)
Datafly Signal sends in-app events from your iOS app to AppsFlyer’s server-to-server in-app events API, with the AppsFlyer ID, IDFA, IDFV, ATT status, event time and AppsFlyer predefined event names.
Prerequisites
Find your app ID and dev key
In AppsFlyer, the app ID is the App Store ID with the id prefix (for example id123456789). Without the prefix AppsFlyer answers 200 OK but does not record the event. The dev key is under App settings.
Pass the AppsFlyer ID from the app
Read the AppsFlyer ID from the AppsFlyer SDK and pass it to Signal with setCollectedId("appsflyer_id", ...). AppsFlyer requires it on every event.
Configure in Signal
Configuration Fields
| Field | Required | Description |
|---|---|---|
app_id | Yes | The App Store app ID with the id prefix, exactly as in the AppsFlyer dashboard, for example id123456789. Without the id prefix AppsFlyer answers 200 OK but does not record the event. |
dev_key | Yes | Your AppsFlyer dev key, found in the AppsFlyer dashboard under App Settings. Sent as the ‘authentication’ request header for server-to-server event calls. |
api_token | No | Optional AppsFlyer V2 API token. Not currently used by the S2S in-app event delivery (which authenticates via the dev key); reserved for future Pull/Reporting API support. |
apple_app_id | No | Optional numeric Apple App ID from App Store Connect. Not consumed by the in-app event delivery endpoint; informational for SKAdNetwork setup. |
bundle_id | No | The iOS bundle identifier, sent as bundleIdentifier on every event. AppsFlyer recommends always setting it: many ad networks need it for campaign optimisation. |
Management UI Setup
- Go to Integrations > Add Integration > AppsFlyer (iOS).
- Choose a preset: Default (
default), Retail (ecommerce), Travel (travel), Media (media), Insurance (insurance). - Fill in the fields above and click Save.
Request format
A purchase:
POST https://api2.appsflyer.com/inappevent/id123456789
{"appsflyer_id":"1234567890123-1234567","att":3,"bundleIdentifier":"com.example.shop","consent_data":{"manual":{"ad_personalization_enabled":true,"ad_user_data_enabled":true,"gdpr_applies":true}},"customer_user_id":"crm-user-9","email_hashed":"86e0b9e56c17cc4d12387e1949b85053fbe73bc3ce5a1188713a9d300cc6133d","eventCurrency":"GBP","eventName":"af_purchase","eventTime":"2025-09-22 00:13:20.123","eventValue":"{\"af_content_id\":[\"SKU_1\",\"SKU_2\"],\"af_currency\":\"GBP\",\"af_order_id\":\"ORD-1001\",\"af_price\":[120,19.99],\"af_quantity\":[2,1],\"af_revenue\":259.99}","idfa":"29DDE430-CE81-4F00-A50C-689595AAD142","idfv":"59E27F41-A86B-4560-B585-63161F871C4B","ip":"203.0.113.9","os":"17.5.1","phone_number_e164_hashed":"9e1919ad78a34fd67a84bfbcf2fea14074065517bea32e92924771c3f92e5462"}eventValue is a JSON-encoded string, as AppsFlyer requires; an event with no values sends "".
Event Mapping
| Signal event | Vendor event | Presets |
|---|---|---|
sign_up | af_complete_registration | Default, Retail, Travel, Media, Insurance |
login | af_login | Default, Retail, Travel, Media, Insurance |
view_item | af_content_view | Default, Retail, Travel, Insurance |
search | af_search | Default, Retail, Travel, Media |
add_to_cart | af_add_to_cart | Default, Retail |
begin_checkout | af_initiated_checkout | Default, Retail, Travel, Insurance |
purchase | af_purchase | Default, Retail, Insurance |
generate_lead | generate_lead | Default, Insurance |
trial_started | af_start_trial | Default, Media |
subscription_started | af_subscribe | Default, Media |
view_item_list | af_list_view | Retail |
add_to_wishlist | af_add_to_wishlist | Retail |
add_payment_info | af_add_payment_info | Retail |
purchase | af_travel_booking | Travel |
booking_completed | af_travel_booking | Travel |
content_viewed | af_content_view | Media |
quote_completed | quote_completed | Insurance |
Identity
appsflyer_id is required; iOS events without it (and all web and Android events) are not sent. Signal also sends idfa and idfv (upper-cased), customer_user_id (your user ID), the IP address, and the email and phone as SHA-256 hashes (email_hashed, phone_number_e164_hashed, phone in E.164 first). No plaintext personal data is sent.
Consent
AppsFlyer’s consent_data.manual object carries gdpr_applies (EEA and UK visitors, from geo), ad_user_data_enabled and ad_personalization_enabled (from marketing consent). Assign a consent category to the integration in Signal to gate delivery altogether.
Troubleshooting
| Problem | Solution |
|---|---|
| Events accepted but not in AppsFlyer | Check the app ID carries the id prefix. |
| No events arrive | Check the app passes appsflyer_id with setCollectedId. |
| AppsFlyer API 3 | Signal uses the api2 host with the dev key. API 3 (api3 host, S2S token) is planned. |
Blueprint
The AppsFlyer (iOS) blueprint version is 0.7.0. It was last reviewed against the vendor’s documentation on 2026-09-23.