Re-engagement & uninstalls

Attributing deep-link re-opens of existing users to retargeting clicks, and detecting uninstalls / reinstalls with silent push.

Updated 2026-09-02

Re-engagement#

When an existing user opens the app through a smart link, universal link or push, the SDK calls:

POST /api/sdk/v1/open
{ "device_id": "<sha256>", "url": "https://links.yourbrand.com/product/123?wc_click_id=abc", "occurred_at": "2026-09-02T09:40:00Z" }

The open is attributed to the click (click_id or the id parsed from url) inside the app's clickLookbackDays window, returning { "reengagement_id", "attributed", "campaign_id", "deep_link_path" }. Re-engagements and their subsequent events (purchases within the re-engagement window, default 7 days) are reported on Re-engagement and are separate from installs so retargeting ROAS is measured on its own.

Uninstall tracking#

  1. The SDK registers the push token: POST /api/sdk/v1/push-token with platform = ios | android | tvos | android_tv | fire_tv.
  2. Configure push credentials per app under Apps & SDK → Uninstall tracking: APNs (team id, key id, .p8, topic) and / or FCM (service-account JSON). Stored encrypted.
  3. The uninstall check (pnpm uninstall:check, scheduled daily) sends a silent push (content-available: 1 / FCM data message with no payload) to every install with a token. Unregistered / BadDeviceToken / UNREGISTERED responses mark the install uninstalledAt.
  4. A later install call from the same device is recorded as a reinstall.

Uninstall rate by campaign, cohort and day-since-install is shown on Installs → Uninstalls and available through get_metric_timeseries (uninstalls).

Note

Silent pushes are not delivered while the app is force-quit on iOS; a device is only marked uninstalled on an explicit APNs / FCM unregistered response, never on silence.