pixellint

Mobile · engineers · marketers

The install happened after the click

Ordinary deep links need the app installed. Paid UA usually cannot assume that. Deferred is an MMP feature, not an OS feature, which is why each MMP's setup is a separate project.

Click, store, first open

On click, Branch, AppsFlyer, or Adjust records a click id and the desired path. The device then leaves for the App Store or Play Store. After install, first open calls the MMP. The MMP returns the path. Your app navigates. If first open never asks, you measured the install and threw away the content.

This is not the same as a universal link or app link for a user who already has the app. Those hit the OS and open the app directly. Deferred is for the install gap. Wiring only universal links will work for reopens and fail for new installs. Test with a real store install, not a debug scheme on a device that already had the app.

Not the Events API

Branch's event endpoint is api2.branch.io/v2/event/standard or /custom. That is in-app events: branch_key, name, user_data. Deferred routing is a different Branch product surface. Do not POST a PURCHASE to the event API and expect the next new install to open the product page.

pixellint validate json on the event body checks the event contract. It does not check that your app called the deferred deep link SDK method on first open. Those are two bugs that get pasted into the same ticket. Split them.

POST https://api2.branch.io/v2/event/custom
{
  "branch_key": "key_live_example",
  "name": "complete_tutorial",
  "user_data": {
    "os": "iOS",
    "idfv": "A1B2C3D4-E5F6-7890-ABCD-EF1234567890",
    "ip": "192.0.2.1",
    "developer_identity": "user-10492"
  }
}

Identity after ATT

The join used to lean on IDFA. After ATT, MMPs still use their click id, and probabilistic clues where they still do. Device pasting, clipboard, and probabilistic fallbacks fail more often. Prefer deterministic paths the MMP still documents. Do not expect a deferred link if you wiped clipboard, denied ATT, and blocked the MMP domain.

Pass through click ids you already have from the web (gclid, fbclid) into the MMP click if this is web-to-app. A deferred deep link that only knows the MMP token cannot fill Meta CAPI on the app event unless you stored the web click id somewhere the app can send.

Windows

Attribution windows expire. A click on Monday and an install on Friday may still deep link, or may not, depending on the MMP config. A click that attributed to organic will not carry paid creative metadata. Debug with the MMP's last-click tools, not with a pixel HAR from the web thank-you page.

Do not implement deferred routing by guessing the last product the web pixel saw. That product is a different device session until you join it. Ask the MMP. If the MMP returns nothing, show home, and do not invent a purchase funnel event for a path you never opened. Campaign, creative, and destination path have to survive the store hop.

QA

Walk a click from ad to store to first open on a device that did not have the app. Anything less is a unit test of the SDK, not of the campaign. A debug scheme that opens product/sku-99 on a device that already had the app proves universal links, not deferred.

If first open lands on home, check whether the app asked the MMP, whether the click is still inside the window, and whether ATT deny plus a blocked MMP domain left no join. Then check whether you S2S'd an install event that has nothing to do with the route. Measurement can succeed without the route. The user still landed on home.

Check the artifact

Paste the pixel URL or JSON body into the playground. Same engine as pixellint validate. Nothing leaves the tab.