Why Is My SKAdNetwork Conversion Value Null?

A SKAdNetwork conversion value null result does not always mean your tracking is broken. Apple often withholds the value on purpose to protect user privacy. This guide shows how to tell expected behavior apart from a real implementation problem.

Direct Answer:

A SKAdNetwork conversion value null result usually has one of two causes. Apple withheld it because of the postback data tier, conversion window, or a non-winning attribution. Or your app never sent a valid value through the right method. To see which case applies, paste the raw postback into a free mobile app attribution debugger and read the findings before changing any code.

How SKAdNetwork Conversion Values Work

SKAdNetwork is Apple’s privacy-preserving framework for measuring ad-driven app installs. Your app reports engagement by setting a conversion value. Apple then includes that value in a postback to the ad network, but only when privacy rules allow it.

In SKAdNetwork 4, there are two kinds of conversion value:

  •     Fine value: a whole number from 0 to 63. It appears in the postback as the conversion-value field.
  •     Coarse value: one of three strings, “low”, “medium”, or “high”. It appears as the coarse-conversion-value field.

A postback can contain one of these fields, but never both. It can also contain neither, which is what most teams describe as a null value.

SKAN 4 vs SKAN 3: Which Update Method Does Your App Use?

The method your app calls decides which values Apple can report. A null value can trace back to an older method that cannot set every field.

SKAN 4 (iOS 16.1 and later)

The current method is updatePostbackConversionValue(_:coarseValue:lockWindow:completionHandler:). It sets both a fine value and a coarse value in one call. It also supports all three conversion windows.

The lockWindow parameter tells the system to finalize the value early. When it is true, the system ignores further updates until that conversion window ends.

A sister method, updatePostbackConversionValue(_:coarseValue:completionHandler:), works the same way with lockWindow set to false.

SKAN 3 and Earlier

The original method is updateConversionValue(_:). It accepts a single fine value from 0 to 63. Apple deprecated it in iOS 15.4.

Its replacement, updatePostbackConversionValue(_:completionHandler:), also takes only a fine value. For SKAN 3 ads, the value must increase with each call. After a rolling 24-hour timer expires, the value is final and later calls have no effect.

Apple recommends the SKAN 4 method for new implementations. It works with ads signed in any SKAdNetwork version, and the system adjusts its behavior to the ad’s version automatically.

SKAdNetwork Conversion Value Null: The Causes to Check

1. The Postback Data Tier Is Too Low

Apple assigns every ad-driven install a postback data tier from Tier 0 to Tier 3. The tier reflects crowd size, which depends on the source app or domain, the advertised app, the country, and the source identifier.

Higher tiers unlock more detail. Lower tiers remove it:

  •     Tier 2 and Tier 3: the first postback can include the fine value, if your app set one.
  •     Tier 1: the first postback replaces the fine value with a coarse value, if your app set one.
  •     Tier 0: the first postback carries no conversion value at all. No second or third postback is sent.

This means a fine value is not guaranteed, even in the first conversion window. Smaller crowds lead to lower tiers, so small campaigns are more exposed.

2. The Postback Came From the Second or Third Window

SKAN 4 has three conversion windows. They cover days 0 to 2, days 3 to 7, and days 8 to 35 after the first app launch.

Only the first postback can carry a fine value. The second and third postbacks only ever return a coarse value. Apple’s method even ignores the fine value you pass after the first window ends.

3. The Postback Did Not Win the Attribution

When several ad networks qualify for one install, only one wins. Up to five others receive a non-winning postback with did-win set to false.

Apple states that non-winning postbacks never include the conversion-value field. A null value here is expected, not a bug.

4. The App Only Sets a Fine Value

If your app calls a method that only accepts a fine value, it never sets a coarse value. That leaves Tier 1 postbacks and later-window postbacks with nothing to report.

The fix is to call the SKAN 4 method and pass both a fine value and a coarse value.

5. The Update Method Was Never Called

Apple requires the advertised app to call a conversion update method on first launch. This call registers the install for attribution.

If the call is missing or fails, there is nothing for Apple to report. Check that it runs on every first launch, not only on certain code paths.

Apple also confirms apps do not need App Tracking Transparency permission before calling SKAdNetwork APIs. If your code waits for the ATT prompt first, users who decline may never register.

6. The Value Was Outside the Valid Range

A fine value must be a whole number from 0 to 63. Apple ignores any call with a value outside that range and returns an invalidConversionValue error.

Earlier valid updates still count. However, if every call sends an invalid value, the postback will have no conversion value. Handle the completion error so failures are logged rather than silent.

How to Read Your Postback Field by Field

Before changing code, look at a raw postback rather than a dashboard summary. Check these fields in order:

  •     version: confirms whether the ad was signed with SKAN 3 or SKAN 4 rules.
  •     did-win: if false, a missing conversion value is expected.
  •     postback-sequence-index: 0 is the first postback. A value of 1 or 2 means a later window, where only a coarse value can appear.
  •     conversion-value: the fine value. If it is absent, check the next field.
  •     coarse-conversion-value: if this appears instead in the first postback, the install landed in a lower data tier.
  •     source-identifier: a number of two, three, or four digits. Apple shows fewer digits when crowd anonymity is lower. Tier 0 and Tier 1 first postbacks, and all later postbacks, use two digits.

Step-by-Step Fix Process

  1.     Collect several raw postbacks. Dashboards can hide or merge the fields you need.
  2.     Rule out expected cases first. Check did-win, postback-sequence-index, and source-identifier length before touching code.
  3.     Confirm which method your app calls. Move to the SKAN 4 method if you still use updateConversionValue(_:).
  4.     Set both values on every update. Pass a fine value and a coarse value so every tier and window has data.
  5.     Log update errors. Use the completion handler to catch invalid values and failed calls.
  6.     Check first-launch timing. Make sure registration does not depend on ATT consent or a delayed code path.

Frequently Asked Questions

How long does it take to receive the first postback?

In SKAN 4, the first conversion window ends two days after first launch. The system then sends the postback after a random delay of 24 to 48 hours.

Can a postback include both a fine and a coarse value?

No. Apple states that a postback contains either conversion-value or coarse-conversion-value, never both.

Can a conversion value go down?

For SKAN 4 ads, yes. Any valid value is accepted on each call. For SKAN 3 ads, each new value must be higher than the previous one.

Does locking a conversion window speed up the postback?

Yes. Setting lockWindow to true finalizes the value early, so the system prepares the postback without waiting for the window to end.

How can I test postbacks without waiting days?

Apple offers a downloadable testing profile that cuts the wait to roughly 5 to 10 minutes. The StoreKit Test framework can also validate postbacks in unit tests.

Is SKAdNetwork still Apple’s main attribution framework?

Apple now recommends AdAttributionKit for app ad campaigns. It documents how the two frameworks work together, so SKAdNetwork knowledge still applies.

Conclusion

Most of the time, a null value is Apple applying its privacy rules as designed. Low data tiers, later windows, and non-winning postbacks all remove the fine value on purpose.

The causes you control are the method you call, the values you pass, and when the call runs. Rule out the expected cases first, and a SKAdNetwork conversion value null result becomes much easier to fix.