> ## Documentation Index
> Fetch the complete documentation index at: https://docs.datalyr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Apple ATT and install matching

> What DATALYR collects on iOS, what depends on App Tracking Transparency, and how to choose whether install matching runs without it.

When you finish, you know which iOS data depends on the user's App Tracking Transparency
(ATT) choice, and you have chosen whether install matching runs for users who haven't
allowed tracking.

## What the SDK collects on iOS

| Data | Collected | Where it goes |
| - | - | - |
| Events, the anonymous ID, the session ID | Always | DATALYR |
| `idfv` | Always | DATALYR. Ad platforms receive it only when the user allowed tracking. |
| `idfa` | Only when the user allowed tracking | DATALYR and your ad platforms |
| `att_status`, 0 to 3 | Always | DATALYR, and the tracking flag of each ad platform |
| `properties.device_context`: OS version, model, manufacturer, screen size, timezone, locale, carrier | Always | DATALYR |
| IP address | Always, from the request | DATALYR, your ad platforms' conversion payloads, and install matching when the setting below allows it |

`att_status` uses Apple's values: `0` notDetermined, `1` restricted, `2` denied,
`3` authorized.

## What ad platforms receive

DATALYR reads `att_status` on every app event before it sends a conversion. When the
status is anything other than `3`, the event is sent without IDFA and IDFV. Other fields,
such as the IP address, hashed email and phone, and click IDs, follow your consent
settings, not ATT.

| Ad platform | User allowed tracking | User has not allowed tracking |
| - | - | - |
| Meta | IDFA as `madid`, `advertiser_tracking_enabled: 1` | No IDFA, `advertiser_tracking_enabled: 0` |
| Snapchat | IDFA, IDFV, tracking flag on | No device IDs, tracking flag off |
| TikTok | IDFA, IDFV, `att_status: AUTHORIZED` | No device IDs, `att_status` set to `DENIED`, `NOT_DETERMINED`, or `RESTRICTED` |
| AppLovin | IDFA, IDFV | No device IDs |
| OpenAI | No iOS device IDs | No iOS device IDs |

Meta also receives the anonymous ID as `anon_id` in both cases.

Android has no ATT. TikTok receives `att_status: NOT_APPLICABLE` for Android events. When
Limit Ad Tracking is on (the SDK reports `att_status` `2`), no Android advertising ID is
sent.

## Choose how install matching runs

iOS has no install referrer. To credit an install to a web ad click, DATALYR can compare
the installing device's IP address and device details with recent web clicks. See
[App campaigns](/advanced/app-campaigns#bridge-by-ip-address-and-device-details) for how
the match is scored.

Apple's ATT guidelines are relevant to this kind of matching. Decide based on your own
review of them.

1. Open **Settings → Identity & Attribution**.
2. Find the **Install matching without ATT** card.
3. Turn `Match without ATT` on or off.

| `Match without ATT` | iOS user allowed tracking | iOS user has not allowed tracking | Android |
| - | - | - | - |
| On | Matched | Matched | Matched |
| Off | Matched | Not matched by IP address or device details | Matched |

| Default | Value |
| - | - |
| Workspaces created on or after 2026-10-14 00:00 UTC | Off |
| Workspaces created before 2026-10-14 00:00 UTC | On |

The label shows `default on` or `default off` until you save a choice.

The setting applies forward from the moment you save it. Installs already matched keep
their campaign. An install from the last 7 days that was refused can still match on its
next launch after you turn the setting on (iOS 2.1.18 and later, React Native 1.7.23 and
later). The setting also covers matches made later from a RevenueCat, Superwall, or Stripe
webhook.

<Note>
  iOS SDK versions before 2.1.18 and React Native SDK versions before 1.7.23 don't send
  `att_status` with the lookup. With `Match without ATT` off, iOS installs from those
  versions are not matched by IP address or device details. Older SDKs treat this answer
  as final and don't ask again. Update the SDK to match users who allowed tracking.
</Note>

## Match users who allow tracking later

With `Match without ATT` off, an install is matched only after the user allows tracking.
iOS SDK 2.1.18 and React Native SDK 1.7.23 run the lookup again, within 7 days of install,
as soon as the user allows tracking.

| SDK | What starts the second lookup |
| - | - |
| iOS | `requestTrackingAuthorization()`, `updateTrackingAuthorization()`, or the app becoming active after your own `ATTrackingManager` prompt |
| React Native | `updateTrackingAuthorization()` after the prompt, or the app returning to the foreground, once the device reports ATT authorized |
| React Native, native module unavailable (Expo Go) | No `att_status` is sent. With `Match without ATT` off, the install is not matched. |

## What still attributes without ATT

| Method | How it works |
| - | - |
| Email match | `identify()` with an email the user entered on your landing page. See [App campaigns](/advanced/app-campaigns#bridge-by-email). |
| IDFV | Recognizes the same install across sessions inside DATALYR. |
| SKAdNetwork and AdAttributionKit | Apple's aggregate postbacks. See [App campaigns](/advanced/app-campaigns#skadnetwork). |
| Apple Search Ads | The SDK reads the attribution token through `AdServices`. |

## Verify

1. Build the app with `debug: true` in the SDK configuration.
2. Open your tracking link on a physical iPhone.
3. Install the app from the store and open it.
4. Select **Ask App Not to Track** at the ATT prompt.
5. Read the Xcode console for lines that start with `[Datalyr]`.
6. Open **Events** and find the `app_install` event for that install.
7. Compare the result with the table below.

| `Match without ATT` | Debug log | `app_install` |
| - | - | - |
| Off | iOS: `Deferred lookup waiting for ATT authorization (att_status 2)`. React Native: a line that starts with `Deferred lookup needs ATT authorization`. | No campaign |
| On | No ATT line | Carries the campaign |

In React Native, debug lines print only while `__DEV__` is true.

## When it does not work

| Symptom | Cause | Fix |
| - | - | - |
| No iOS install is matched, including users who allowed tracking | The app runs an SDK version before 2.1.18 (iOS) or 1.7.23 (React Native). | Update the SDK. |
| A user allowed tracking but the install has no campaign | The user allowed tracking more than 7 days after install, or (React Native) the app did not call `updateTrackingAuthorization()`. | Read the SDK debug log for the lookup result. |
| `att_not_authorized` on each launch | The user has not allowed tracking. The SDK asks on each launch for 7 days after install. | This is expected with `Match without ATT` off. |
| The setting change did not apply to older installs | The setting applies forward only. | This is expected. Earlier matches keep their campaign. |

## Next

* [App campaigns](/advanced/app-campaigns): every bridge from an ad click to an install.
* [iOS SDK](/sdk-reference/ios#app-tracking-transparency): the ATT methods and the privacy manifest.
* [Privacy and redaction](/advanced/privacy): consent, opt-out, and erasure.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.