# App measurement map: <app name>

Proposed location: `martech-context/tracking-plan/app-measurement-map.md`. Decisions from this map also go to `martech-context/decisions.md` as dated entries, metric definitions to `metrics.md`, and apps, SDKs and owners to `stack.md`. Owner: <name or role>. Last reviewed: <YYYY-MM-DD>.

## Apps and platforms

- iOS app: <bundle ID placeholder>, minimum supported version <x.y>, OS mix checked <date>: <share on 17.4+>, <share on 18+>, <share on 18.4+>, <share on 26.2+>, <share on 27.2+>
- Android app: <package name placeholder>, minimum supported version <x.y>, stores: <Google Play, others>
- Release cadence: <weekly, fortnightly>

## Decisions and governing reports

Repeat this block for each recurring decision.

```yaml
- decision: <one sentence naming the action someone takes>
  owner: <role>
  cadence: <daily | weekly | monthly>
  governing_report: <one report, one tool>
  metric: <name with denominator, for example cost_per_verified_payer_d7>
  date_basis: <for aggregated iOS reports: postback_received | mmp_modelled_install_date, with the MMP's offset; spend aligned to the same basis>
  maturity_rule: <for example "modelled install-date cohorts provisional for 4 days plus MMP processing lag (first postback)">
  diagnostics_only: [<other views, never summed with the governing report>]
  reconciliation_tolerance: <value, method and weeks used, for example "15%: median weekly gap plus twice its standard deviation over 10 weeks">
```

## Measurement paths

iOS:

- ATT prompt: <placement>, prompt version <id>, opt-in rate definition: authorized answers / authorized plus denied answers to first prompts (Additional Information taps and EU re-prompts excluded)
- SKAdNetwork: <yes or no>, conversion value updater: <MMP SDK | app code>, schema cut-over recorded as: <app version and adoption date | dashboard change timestamp>
- Verified purchase signal to the device: <revenue-free SDK event name | app update call>, MMP answer on S2S-driven conversion values: <answer, date>
- AdAttributionKit: <yes or no>, configured attribution windows: <defaults or values>, cooldowns: <none or values>
- Postback copy keys: SKAdNetwork key owner <MMP or self>, AdAttributionKit key owner <MMP or self>, re-engagement copies <yes or no>, received copy of each type: <release, date>
- Install counting: first-time downloads only, version-aware SKAdNetwork rule; redownloads line: <yes or no>; re-engagement metric: <name>
- Crowd anonymity: digit mapping per network recorded <yes or no>, share of first postbacks with 2 digits or no value: <per network>, consolidation threshold: <30% default or value>
- Apple Ads: AdServices token exchange by <backend | MMP>
- Web-to-app: <SKAdNetwork for Web Ads | App Store campaign links | link vendor | none>

Android:

- Install Referrer read by <MMP SDK | app code>, `install_referrer_status` stored: <yes or no>
- `AD_ID` permission declared: <yes or no>, `ad_id_status` stored on the install record: <yes or no>
- Web-to-app: Play `referrer` values allowed: <list or pattern>
- Privacy status checked: <date and URL>

## SDK start order

- Consent source: <CMP name or in-house>, TCF: <yes or no>, regions: <list>, region check: <method>
- Analytics SDK static consent defaults (Info.plist and manifest): <values>; runtime grant outside consent regions: <when>
- CMP and ATT combination rule: <rule>, approved by privacy owner on <date>
- MMP consent method: <TCF | manual object>, set before start: <yes or no>
- MMP ATT wait: <seconds>, based on production p90 time from first launch to the first ATT answer of <seconds> on <date>, share leaving before the prompt <percent>, vendor maximum or own ceiling <seconds>
- Start point per platform: <lifecycle method>

## Identity

- User ID source: <backend account ID>, set at: <signup | login>, cleared at: <logout>
- Install-to-user mapping stored in: <table>, renewal rule: <rule>
- Acquisition source in product analytics: <MMP partner integration with analytics ID passed | warehouse join on install ID>, test install on the same profile as later events: <release, date>
- S2S sending: after install ID observed <yes or no>, post-install delay <seconds or callback>, occurrence and delivery time stored <yes or no>, timestamp cut-off alert <rule, for example "previous UTC day unsent at 01:00 UTC">

## Revenue

- Verified purchase source: <backend from App Store Server Notifications V2 and Play RTDN | subscription platform | app>
- Sender per destination: MMP <sender>, analytics <sender>, ad networks <sender>
- Fields: gross price and currency on events; provisional net from a dated fee-rate table, trued up monthly from store financial reports
- Test purchases excluded on: Apple `environment` <yes or no>, Play `testPurchase` <yes or no>
- Refund handling: <event name and link to original transaction>

## Deep links

- Link domains and owners: <domain, owner, contract dependency>
- Firebase Dynamic Links remaining: <count, date checked>
- Route contract tested on: <release, date, devices and OS versions>, entry contexts covered: <in-app browser, email click tracking, pasted URL, same-domain page, QR scan>, accepted fallbacks: <list>

## MMP decision

- Decision: <buy now | wait>, rule step that decided it: <1, 2 or 3 and the trigger>, date: <YYYY-MM-DD>, approved by: <name or role>
- Reopen when: <triggers>

## Sources checked

- <URL> checked <YYYY-MM-DD>
