p202 app report

Cross-platform app report: iOS postbacks and Android installs, with the goals they reached

Web UIAnalyze › Mobile Apps
All commands

01Jobs it does

Each one is a real command line. Copy it, or open it in the builder below to change it.

app installs report

Also: skadnetwork postbacks

p202 app report
Web UIAnalyze › Mobile Apps

02What you get

Pick the shape you need. People get a table. Add --json, --csv or --ndjson for scripts, or -q for ids only. An AI agent gets compact JSON without asking. All output formats

03Build your command

Pick values and the command line writes itself, quoted and ready to paste.

p202 app report

Set flags below; the command updates as you type.

04Flags

30 flags, plus the global flags every command takes.

FlagWhat it does
--ad-interaction-typestringFilter: view (view-through) or click: view, click
viewclick
--ad-network-idstringFilter by ad network id
--aff-campaign-idstringAndroid: only installs on this campaign's clicks (p202 campaign list)
--app-idstringFilter by the App Store id the postback itself named (forensic; prefer --registration-id)
--campaign-idstringFilter by SKAN 2/3 campaign id
--coarse-conversion-valuestringFilter by coarse value: low, medium, high
lowmediumhigh
--conversion-typestringFilter by conversion type: download, redownload, re-engagement
downloadredownloadre-engagement
--country-codestringFilter by install country code
--ctit-flagstringAndroid: only installs whose click-to-install time is: short, ok, long, unmeasured
shortoklongunmeasured
--did-winstringFilter: 1=winning postbacks, 0=losing: 0, 1 (aliases: false=0, true=1)
01false → 0true → 1
--fast-goalsstringAndroid: only installs with a goal reached implausibly fast (1), or only those without one (0): 0, 1
01
--fidelity-typestringFilter: 1=click-through, 0=view-through (both protocols; prefer --ad-interaction-type): 0, 1
01
--group-bystring · default dayGroup by (ad-network, source, country, version, protocol, conversion-type need --platform ios; campaign, match-state, integrity-state, ctit-flag, goal need --platform android): day, registration, platform, ad-network, source, country, version, protocol, conversion-type, campaign, match-state, integrity-state, ctit-flag, goal
dayregistrationplatformad-networksourcecountryversionprotocolconversion-typecampaignmatch-stateintegrity-statectit-flaggoal
--integrity-statestringAndroid: only installs whose Play Integrity verdict is in this state: not_requested, received, missing, pending, valid, invalid, error, skipped
not_requestedreceivedmissingpendingvalidinvaliderrorskipped
--limit, -lstringMax groups per platform (default 100)
--match-statestringAndroid: only installs in this match state: attributed, organic, third_party, unavailable, pending_click, bad_token, foreign_click, implausible, outside_window, duplicate_click, pending_integrity, integrity_failed, integrity_unverified
attributedorganicthird_partyunavailablepending_clickbad_tokenforeign_clickimplausibleoutside_windowduplicate_clickpending_integrityintegrity_failedintegrity_unverified
--platformstringPlatform (default ios; all reports both): ios, android, all
iosandroidall
--postback-sequence-indexstringFilter by conversion window: 0, 1, 2
012
--protocolstringFilter by protocol: skadnetwork, adattributionkit (aliases: aak=adattributionkit, skan=skadnetwork)
skadnetworkadattributionkitaak → adattributionkitskan → skadnetwork
--redownloadstringFilter: 1=redownloads, 0=first installs (both protocols; prefer --conversion-type): 0, 1 (aliases: false=0, true=1)
01false → 0true → 1
--registration-idstringFilter by registration (from p202 app list)
--registration-idsstringFilter by several registrations, comma-separated
--signaturestringFilter by verification state: valid, invalid, unverifiable, development
validinvalidunverifiabledevelopment
--source-identifierstringFilter by SKAN 4 source identifier
--teststringAndroid: only test installs (1) or only real ones (0): 0, 1
01
--time-fromstringReceived-at range start (unix timestamp)
--time-tostringReceived-at range end (unix timestamp)
--transaction-idstringFilter by Apple transaction id
--trustedstringAndroid: only this trust class (trusted, refuted, unvouched); goals are then counted over it
trustedrefutedunvouched
--versionstringFilter by SKAN postback version (e.g. 4.0)

05How it works

Reports Apple's postbacks by default (--platform ios, what this report meant before Android), Android installs with --platform android, and both with --platform all. Any platform groups by day (UTC), registration or platform; iOS also by ad-network, source, country, version, protocol or conversion-type (Apple's postbacks, decoded through p202 app encoding), Android also by campaign, match-state, integrity-state, ctit-flag (click-to-install time: short, ok, long, unmeasured) or goal (the funnel: installs that reached each goal).

Every row carries platform, installs, the trust-class counts, goals_reached, revenue and events. Headline figures count trusted signals only: signature-verified postbacks, attributed installs. --signature (iOS) or --trusted (Android) recompute them over one class. Totals are in meta.totals: per platform, and with both platforms {ios, android, combined}. Android figures are by install: a goal counts in its install's group.

06For agents

Running this from an agent

  • Read the same facts as JSON: p202 commands app report --json.
  • With AI_AGENT, CLAUDECODE or another agent variable set, output is compact JSON and errors arrive on stderr as a JSON envelope with a hint.
  • Exit codes: 0 ok, 1 bad input, 2 auth, 3 network, 4 server error, 5 partial failure.
p202 commands app report --json
{
  "path": "p202 app report",
  "use": "report",
  "short": "Cross-platform app report: iOS postbacks and Android installs, with the goals they reached",
  "long": "Reports Apple's postbacks by default (--platform ios, what this report meant before Android),\nAndroid installs with --platform android, and both with --platform all. Any platform groups by\nday (UTC), registration or platform; iOS also by ad-network, source, country, version, protocol\nor conversion-type (Apple's postbacks, decoded through `p202 app encoding`), Android also by\ncampaign, match-state, integrity-state, ctit-flag (click-to-install time: short, ok, long,\nunmeasured) or goal (the funnel: installs that reached each goal).\n\nEvery row carries platform, installs, the trust-class counts, goals_reached, revenue and\nevents. Headline figures count trusted signals only: signature-verified postbacks, attributed\ninstalls. --signature (iOS) or --trusted (Android) recompute them over one class.\nTotals are in meta.totals: per platform, and with both platforms {ios, android, combined}.\nAndroid figures are by install: a goal counts in its install's group.",
  "runnable": true,
  "example": "p202 app report --platform all --group-by registration\n  p202 app report --platform android --group-by goal --registration-id 7\n  p202 app report --platform ios --group-by ad-network --signature valid",
  "tasks": [
    {
      "run": "p202 app report",
      "ui_pages": [
        "Analyze › Mobile Apps"
      ],
      "phrases": [
        "app installs report",
        "skadnetwork postbacks"
      ]
    }
  ],
  "flags": [
    {
      "name": "ad-interaction-type",
      "type": "string",
      "default": "",
      "usage": "Filter: view (view-through) or click: view, click",
      "allowed_values": [
        "view",
        "click"
      ],
      "required": false
    },
    {
      "name": "ad-network-id",
      "type": "string",
      "default": "",
      "usage": "Filter by ad network id",
      "required": false
    },
    {
      "name": "aff-campaign-id",
      "type": "string",
      "default": "",
      "usage": "Android: only installs on this campaign's clicks (`p202 campaign list`)",
      "required": false
    },
    {
      "name": "app-id",
      "type": "string",
      "default": "",
      "usage": "Filter by the App Store id the postback itself named (forensic; prefer --registration-id)",
      "required": false
    },
    {
      "name": "campaign-id",
      "type": "string",
      "default": "",
      "usage": "Filter by SKAN 2/3 campaign id",
      "required": false
    },
    {
      "name": "coarse-conversion-value",
      "type": "string",
      "default": "",
      "usage": "Filter by coarse value: low, medium, high",
      "allowed_values": [
        "low",
        "medium",
        "high"
      ],
      "required": false
    },
    {
      "name": "conversion-type",
      "type": "string",
      "default": "",
      "usage": "Filter by conversion type: download, redownload, re-engagement",
      "allowed_values": [
        "download",
        "redownload",
        "re-engagement"
      ],
      "required": false
    },
    {
      "name": "country-code",
      "type": "string",
      "default": "",
      "usage": "Filter by install country code",
      "required": false
    },
    {
      "name": "ctit-flag",
      "type": "string",
      "default": "",
      "usage": "Android: only installs whose click-to-install time is: short, ok, long, unmeasured",
      "allowed_values": [
        "short",
        "ok",
        "long",
        "unmeasured"
      ],
      "required": false
    },
    {
      "name": "did-win",
      "type": "string",
      "default": "",
      "usage": "Filter: 1=winning postbacks, 0=losing: 0, 1 (aliases: false=0, true=1)",
      "allowed_values": [
        "0",
        "1"
      ],
      "value_aliases": {
        "false": "0",
        "true": "1"
      },
      "required": false
    },
    {
      "name": "fast-goals",
      "type": "string",
      "default": "",
      "usage": "Android: only installs with a goal reached implausibly fast (1), or only those without one (0): 0, 1",
      "allowed_values": [
        "0",
        "1"
      ],
      "required": false
    },
    {
      "name": "fidelity-type",
      "type": "string",
      "default": "",
      "usage": "Filter: 1=click-through, 0=view-through (both protocols; prefer --ad-interaction-type): 0, 1",
      "allowed_values": [
        "0",
        "1"
      ],
      "required": false
    },
    {
      "name": "group-by",
      "type": "string",
      "default": "day",
      "usage": "Group by (ad-network, source, country, version, protocol, conversion-type need --platform ios; campaign, match-state, integrity-state, ctit-flag, goal need --platform android): day, registration, platform, ad-network, source, country, version, protocol, conversion-type, campaign, match-state, integrity-state, ctit-flag, goal",
      "allowed_values": [
        "day",
        "registration",
        "platform",
        "ad-network",
        "source",
        "country",
        "version",
        "protocol",
        "conversion-type",
        "campaign",
        "match-state",
        "integrity-state",
        "ctit-flag",
        "goal"
      ],
      "required": false
    },
    {
      "name": "integrity-state",
      "type": "string",
      "default": "",
      "usage": "Android: only installs whose Play Integrity verdict is in this state: not_requested, received, missing, pending, valid, invalid, error, skipped",
      "allowed_values": [
        "not_requested",
        "received",
        "missing",
        "pending",
        "valid",
        "invalid",
        "error",
        "skipped"
      ],
      "required": false
    },
    {
      "name": "limit",
      "shorthand": "l",
      "type": "string",
      "default": "",
      "usage": "Max groups per platform (default 100)",
      "required": false
    },
    {
      "name": "match-state",
      "type": "string",
      "default": "",
      "usage": "Android: only installs in this match state: attributed, organic, third_party, unavailable, pending_click, bad_token, foreign_click, implausible, outside_window, duplicate_click, pending_integrity, integrity_failed, integrity_unverified",
      "allowed_values": [
        "attributed",
        "organic",
        "third_party",
        "unavailable",
        "pending_click",
        "bad_token",
        "foreign_click",
        "implausible",
        "outside_window",
        "duplicate_click",
        "pending_integrity",
        "integrity_failed",
        "integrity_unverified"
      ],
      "required": false
    },
    {
      "name": "platform",
      "type": "string",
      "default": "",
      "usage": "Platform (default ios; all reports both): ios, android, all",
      "allowed_values": [
        "ios",
        "android",
        "all"
      ],
      "required": false
    },
    {
      "name": "postback-sequence-index",
      "type": "string",
      "default": "",
      "usage": "Filter by conversion window: 0, 1, 2",
      "allowed_values": [
        "0",
        "1",
        "2"
      ],
      "required": false
    },
    {
      "name": "protocol",
      "type": "string",
      "default": "",
      "usage": "Filter by protocol: skadnetwork, adattributionkit (aliases: aak=adattributionkit, skan=skadnetwork)",
      "allowed_values": [
        "skadnetwork",
        "adattributionkit"
      ],
      "value_aliases": {
        "aak": "adattributionkit",
        "skan": "skadnetwork"
      },
      "required": false
    },
    {
      "name": "redownload",
      "type": "string",
      "default": "",
      "usage": "Filter: 1=redownloads, 0=first installs (both protocols; prefer --conversion-type): 0, 1 (aliases: false=0, true=1)",
      "allowed_values": [
        "0",
        "1"
      ],
      "value_aliases": {
        "false": "0",
        "true": "1"
      },
      "required": false
    },
    {
      "name": "registration-id",
      "type": "string",
      "default": "",
      "usage": "Filter by registration (from `p202 app list`)",
      "required": false
    },
    {
      "name": "registration-ids",
      "type": "string",
      "default": "",
      "usage": "Filter by several registrations, comma-separated",
      "required": false
    },
    {
      "name": "signature",
      "type": "string",
      "default": "",
      "usage": "Filter by verification state: valid, invalid, unverifiable, development",
      "allowed_values": [
        "valid",
        "invalid",
        "unverifiable",
        "development"
      ],
      "required": false
    },
    {
      "name": "source-identifier",
      "type": "string",
      "default": "",
      "usage": "Filter by SKAN 4 source identifier",
      "required": false
    },
    {
      "name": "test",
      "type": "string",
      "default": "",
      "usage": "Android: only test installs (1) or only real ones (0): 0, 1",
      "allowed_values": [
        "0",
        "1"
      ],
      "required": false
    },
    {
      "name": "time-from",
      "type": "string",
      "default": "",
      "usage": "Received-at range start (unix timestamp)",
      "required": false
    },
    {
      "name": "time-to",
      "type": "string",
      "default": "",
      "usage": "Received-at range end (unix timestamp)",
      "required": false
    },
    {
      "name": "transaction-id",
      "type": "string",
      "default": "",
      "usage": "Filter by Apple transaction id",
      "required": false
    },
    {
      "name": "trusted",
      "type": "string",
      "default": "",
      "usage": "Android: only this trust class (trusted, refuted, unvouched); goals are then counted over it",
      "allowed_values": [
        "trusted",
        "refuted",
        "unvouched"
      ],
      "required": false
    },
    {
      "name": "version",
      "type": "string",
      "default": "",
      "usage": "Filter by SKAN postback version (e.g. 4.0)",
      "required": false
    }
  ]
}