Short answer: a SKAN postback carries a conversion value only if the app set one and Apple's privacy tier allows it. Non-winning postbacks never carry one, tier 0 postbacks carry none and tier 1 carries only a coarse value. Check did-win and the source identifier length first.
What a null conversion value means
Conversion value: the number an app sets after install to describe what the user did, sent back to the ad network in the SKAN postback. The fine value is a 6-bit integer from 0 to 63; the coarse value is low, medium or high.
A null value means Apple sent the postback without either. That can be correct behaviour, so the job is to find out which nulls are expected.
Which null values are expected?
Nulls on non-winning postbacks and on tier 0 postbacks are expected and cannot be fixed by code. Nulls on winning postbacks with 3 or 4 digit source identifiers usually mean the app did not set a valid value.
Likely causes
- Non-winning postback. Apple says non-winning postbacks (did-win false) never contain a conversion value.
- Crowd anonymity tier 0. The first postback at tier 0 carries only a 2-digit source identifier. Tier 0 gets no second or third postback.
- Tier 1. The first postback carries a 2-digit source identifier and a coarse value only.
- No update call. Apple only includes a value "if the app provides one".
- Out-of-range fine value. Values outside 0 to 63 return an invalid conversion value error and are ignored.
- Update after the window closed or was locked. Updates in a locked window are ignored.
How to confirm it
- Filter your SKAN data to did-win true. Ignore the rest for conversion value analysis.
- Group winning postbacks by source identifier length. Two digits means tier 0 or 1.
- For tier 1, check that a coarse value is present.
- For 3 or 4 digit postbacks with nulls, check that the app calls the update method on first launch.
- Install with an Apple testing profile, which shortens the delay to about 5 to 10 minutes, and inspect a postback.
MMPs such as Linkrunner, Tenjin or Kochava manage the conversion value schema for you, so check that the schema is switched on in your MMP before changing app code.
How to fix it
- Call updatePostbackConversionValue on first launch and on each key event.
- Keep every fine value between 0 and 63.
- Map coarse values to meaningful events so tier 1 postbacks still carry signal.
- Consolidate very small campaigns so each has more installs per source (general practice).
- Lock a window only when the value is final.
| Postback shape | Meaning |
|---|---|
| did-win false, no value | Expected: non-winning |
| 2-digit source, no value | Tier 0, or no update call |
| 2-digit source, coarse only | Tier 1 |
| 3 or 4 digit source, no value | App did not set a value |
The SKAN null values troubleshooter asks these questions in order, and the SKAN 4 postbacks guide explains windows and tiers. If no postbacks arrive at all, see no SKAN postbacks.