p202 report groups

Traffic grouped by up to four dimensions, nested, each group with its totals (Group Overview)

Web UIOverview › Group Overview
All commands

01Jobs it does

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

nested report

Also: group by several dimensions

p202 report groups
Web UIOverview › Group Overview

02What you get

Captured from the real binary, run against a demo store with 30 days of traffic. Switch tabs to see the same run as JSON, the shape scripts and agents parse.

p202 report groups --by ppc_network,campaign --period last30
$ p202 report groups --by ppc_network,campaign --period last30
group                           Clicks  Clickthroughs  Conversions  Revenue  Cost     Profit    EPC      Avg CPC  ROI %
------------------------------  ------  -------------  -----------  -------  -------  --------  -------  -------  ---------
Owned Media                     458     458            27           3585     173      3412      7.8275   0.3777   1972.2543
› Bakery Pre-orders / Local     88      88             16           939      0        939       10.6705  0        0
› Coffee Subscription / US      140     140            2            64       77       -13       0.4571   0.55     -16.8831
› Project Tool Pro Annual / US  140     140            5            1980     96       1884      14.1429  0.6857   1962.50
› Spring Collection / US        90      90             4            602      0        602       6.6889   0        0
Search                          1187    1187           52           8157     1214.53  6942.47   6.8719   1.0232   571.6178
› Coffee Subscription / US      228     228            14           578      86.64    491.36    2.5351   0.38     567.1283
› Free Trial to Paid / CA       128     128            9            261      230.40   30.60     2.0391   1.80     13.2812
› Holiday Gift Cards / AU       178     178            9            1025     85.44    939.56    5.7584   0.48     1099.6723
› Project Tool Pro Annual / US  168     168            8            3264     403.20   2860.80   19.4286  2.40     709.5238
› Spring Collection / US        277     277            7            1122     180.05   941.95    4.0505   0.65     523.1602
› Standing Desk Launch / UK     208     208            5            1907     228.80   1678.20   9.1683   1.10     733.479
Social                          1255    1255           41           3607     645.34   2961.66   2.8741   0.5142   458.9302
› Bakery Pre-orders / Local     149     149            7            654      26.82    627.18    4.3893   0.18     2338.4787
› Coffee Subscription / US      177     177            10           346      51.33    294.67    1.9548   0.29     574.0697
› Free Trial to Paid / CA       170     170            6            174      161.50   12.50     1.0235   0.95     7.7399
› Holiday Gift Cards / AU       109     109            4            625      33.79    591.21    5.7339   0.31     1749.6597
› Spring Collection / US        420     420            14           1808     176.40   1631.60   4.3048   0.42     924.9433
› Standing Desk Launch / UK     230     230            0            0        195.50   -195.50   0        0.85     -100
Total                           2900    2900           120          15349    2032.87  13316.13  5.2928   0.701    655.0409
Real output · p202 1.9.78 · demo dataexit 0

Profit by ppc network,campaign

  • Search$6,942.47
  • Owned Media$3,412.00
  • Social$2,961.66

Drawn from the JSON output above.

03Build your command

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

p202 report groups

Set flags below; the command updates as you type.

04Flags

23 flags, plus the global flags every command takes.

FlagWhat it does
--aff-campaign-idstringFilter by INTERNAL campaign id (from campaign list), not the public id in tracking URLs
--aff-network-idstringFilter by affiliate network ID
--browser-idstringFilter by browser ID (the id of a --breakdown browser row)
--bystringUp to 4 dimensions, outermost first (e.g. ppc_network,campaign,keyword): campaign, aff_network, ppc_account, ppc_network, landing_page, keyword, country, city, region, browser, platform, device, isp, text_ad, ip, referer, referer_url, device_type, c1, c2, c3, c4, utm_source, utm_medium, utm_campaign, utm_term, utm_content, rotator, rotator_rule (aliases: geo=country, lp=landing_page, network=aff_network, offer=campaign, referrer=referer, referrer_url=referer_url, rule=rotator_rule, source=ppc_account); comma-separated for several
campaignaff_networkppc_accountppc_networklanding_pagekeywordcountrycityregionbrowserplatformdeviceisptext_adiprefererreferer_urldevice_typec1c2c3c4utm_sourceutm_mediumutm_campaignutm_termutm_contentrotatorrotator_rulegeo → countrylp → landing_pagenetwork → aff_networkoffer → campaignreferrer → refererreferrer_url → referer_urlrule → rotator_rulesource → ppc_account
--country-idstringFilter by country ID
--device-typestringFilter by device type ID: 1 Desktop, 2 Mobile, 3 Tablet, 4 Bot (the ids of --breakdown device_type rows)
--ipstringOnly clicks from this one IP address, IPv4 or IPv6
--isp-idstringFilter by ISP/carrier ID (the id of a --breakdown isp row)
--keywordstringOnly clicks whose keyword contains this text (case-insensitive)
--landing-page-idstringFilter by landing page ID
--method-of-promotionstringOnly direct-link clicks or only landing-page clicks: directlink, landingpage
directlinklandingpage
--period, -pstringPeriod: today, yesterday, last7, last14, last30, last90, thismonth, lastmonth, thisyear, lastyear, alltime
todayyesterdaylast7last14last30last90thismonthlastmonththisyearlastyearalltime
--platform-idstringFilter by platform (OS) ID (the id of a --breakdown platform row)
--ppc-account-idstringFilter by PPC account ID
--ppc-network-idstringFilter by PPC network ID, or none for the clicks with no traffic source
--refererstringOnly clicks whose referring URL contains this text (case-insensitive)
--region-idstringFilter by region ID (the id of a --breakdown region row)
--showstringWhich clicks count (default all): all, real, filtered, filtered_bot, leads; real = not filtered, filtered_bot = filtered as bots, leads = converted
allrealfilteredfiltered_botleads
--sortstringOrder each group's rows by name (default) or a metric: name, total_clicks, total_click_throughs, total_leads, total_income, total_cost, total_net, epc, avg_cpc, conv_rate, roi, cpa (aliases: clicks=total_clicks, conversions=total_leads, cost=total_cost, income=total_income, leads=total_leads, net=total_net, profit=total_net, revenue=total_income)
nametotal_clickstotal_click_throughstotal_leadstotal_incometotal_costtotal_netepcavg_cpcconv_rateroicpaclicks → total_clicksconversions → total_leadscost → total_costincome → total_incomeleads → total_leadsnet → total_netprofit → total_netrevenue → total_income
--sort-dirstringASC or DESC (default ASC by name, DESC by a metric): ASC, DESC
ASCDESC
--text-ad-idstringFilter by text ad ID
--time-fromstringStart: unix seconds, a date (2026-10-01, from its first second in the account's timezone) or a time with its offset (2026-10-01T09:30:00Z)
--time-tostringEnd, inclusive: unix seconds, a date (2026-10-01, through its last second in the account's timezone) or a time with its offset

05How it works

The Overview's Group Overview: traffic grouped by up to four dimensions, one inside the other, every group with its clicks, leads, income, cost, net and ratios. A group is the sum of its children: the clicks a level has no value for (no keyword, no landing page) are its [no keyword] row. Takes every report filter and period.

--json answers the tree as the server serves it (each group's children); the table, CSV and --ndjson give one row per group, marked by level (› per level), then a Total row.

p202 report groups --by ppc_network,campaign,keyword --period last7
p202 report groups --by campaign,device_type --show real --sort clicks --json

06For agents

Running this from an agent

  • Read the same facts as JSON: p202 commands report groups --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, 6 no Pro licence on the install.
p202 commands report groups --json
{
  "path": "p202 report groups",
  "use": "groups",
  "short": "Traffic grouped by up to four dimensions, nested, each group with its totals (Group Overview)",
  "long": "The Overview's Group Overview: traffic grouped by up to four dimensions, one inside\nthe other, every group with its clicks, leads, income, cost, net and ratios. A group\nis the sum of its children: the clicks a level has no value for (no keyword, no\nlanding page) are its `[no keyword]` row. Takes every report filter and period.\n\n--json answers the tree as the server serves it (each group's `children`); the table,\nCSV and --ndjson give one row per group, marked by level (› per level), then a Total row.\n\n  p202 report groups --by ppc_network,campaign,keyword --period last7\n  p202 report groups --by campaign,device_type --show real --sort clicks --json",
  "runnable": true,
  "tasks": [
    {
      "run": "p202 report groups",
      "ui_pages": [
        "Overview › Group Overview"
      ],
      "phrases": [
        "nested report",
        "group by several dimensions"
      ]
    }
  ],
  "flags": [
    {
      "name": "aff-campaign-id",
      "type": "string",
      "default": "",
      "usage": "Filter by INTERNAL campaign id (from `campaign list`), not the public id in tracking URLs",
      "required": false
    },
    {
      "name": "aff-network-id",
      "type": "string",
      "default": "",
      "usage": "Filter by affiliate network ID",
      "required": false
    },
    {
      "name": "browser-id",
      "type": "string",
      "default": "",
      "usage": "Filter by browser ID (the id of a `--breakdown browser` row)",
      "required": false
    },
    {
      "name": "by",
      "type": "string",
      "default": "",
      "usage": "Up to 4 dimensions, outermost first (e.g. ppc_network,campaign,keyword): campaign, aff_network, ppc_account, ppc_network, landing_page, keyword, country, city, region, browser, platform, device, isp, text_ad, ip, referer, referer_url, device_type, c1, c2, c3, c4, utm_source, utm_medium, utm_campaign, utm_term, utm_content, rotator, rotator_rule (aliases: geo=country, lp=landing_page, network=aff_network, offer=campaign, referrer=referer, referrer_url=referer_url, rule=rotator_rule, source=ppc_account); comma-separated for several",
      "allowed_values": [
        "campaign",
        "aff_network",
        "ppc_account",
        "ppc_network",
        "landing_page",
        "keyword",
        "country",
        "city",
        "region",
        "browser",
        "platform",
        "device",
        "isp",
        "text_ad",
        "ip",
        "referer",
        "referer_url",
        "device_type",
        "c1",
        "c2",
        "c3",
        "c4",
        "utm_source",
        "utm_medium",
        "utm_campaign",
        "utm_term",
        "utm_content",
        "rotator",
        "rotator_rule"
      ],
      "value_aliases": {
        "geo": "country",
        "lp": "landing_page",
        "network": "aff_network",
        "offer": "campaign",
        "referrer": "referer",
        "referrer_url": "referer_url",
        "rule": "rotator_rule",
        "source": "ppc_account"
      },
      "value_list": true,
      "required": false
    },
    {
      "name": "country-id",
      "type": "string",
      "default": "",
      "usage": "Filter by country ID",
      "required": false
    },
    {
      "name": "device-type",
      "type": "string",
      "default": "",
      "usage": "Filter by device type ID: 1 Desktop, 2 Mobile, 3 Tablet, 4 Bot (the ids of `--breakdown device_type` rows)",
      "required": false
    },
    {
      "name": "ip",
      "type": "string",
      "default": "",
      "usage": "Only clicks from this one IP address, IPv4 or IPv6",
      "required": false
    },
    {
      "name": "isp-id",
      "type": "string",
      "default": "",
      "usage": "Filter by ISP/carrier ID (the id of a `--breakdown isp` row)",
      "required": false
    },
    {
      "name": "keyword",
      "type": "string",
      "default": "",
      "usage": "Only clicks whose keyword contains this text (case-insensitive)",
      "required": false
    },
    {
      "name": "landing-page-id",
      "type": "string",
      "default": "",
      "usage": "Filter by landing page ID",
      "required": false
    },
    {
      "name": "method-of-promotion",
      "type": "string",
      "default": "",
      "usage": "Only direct-link clicks or only landing-page clicks: directlink, landingpage",
      "allowed_values": [
        "directlink",
        "landingpage"
      ],
      "required": false
    },
    {
      "name": "period",
      "shorthand": "p",
      "type": "string",
      "default": "",
      "usage": "Period: today, yesterday, last7, last14, last30, last90, thismonth, lastmonth, thisyear, lastyear, alltime",
      "allowed_values": [
        "today",
        "yesterday",
        "last7",
        "last14",
        "last30",
        "last90",
        "thismonth",
        "lastmonth",
        "thisyear",
        "lastyear",
        "alltime"
      ],
      "required": false
    },
    {
      "name": "platform-id",
      "type": "string",
      "default": "",
      "usage": "Filter by platform (OS) ID (the id of a `--breakdown platform` row)",
      "required": false
    },
    {
      "name": "ppc-account-id",
      "type": "string",
      "default": "",
      "usage": "Filter by PPC account ID",
      "required": false
    },
    {
      "name": "ppc-network-id",
      "type": "string",
      "default": "",
      "usage": "Filter by PPC network ID, or none for the clicks with no traffic source",
      "required": false
    },
    {
      "name": "referer",
      "type": "string",
      "default": "",
      "usage": "Only clicks whose referring URL contains this text (case-insensitive)",
      "required": false
    },
    {
      "name": "region-id",
      "type": "string",
      "default": "",
      "usage": "Filter by region ID (the id of a `--breakdown region` row)",
      "required": false
    },
    {
      "name": "show",
      "type": "string",
      "default": "",
      "usage": "Which clicks count (default all): all, real, filtered, filtered_bot, leads; real = not filtered, filtered_bot = filtered as bots, leads = converted",
      "allowed_values": [
        "all",
        "real",
        "filtered",
        "filtered_bot",
        "leads"
      ],
      "required": false
    },
    {
      "name": "sort",
      "type": "string",
      "default": "",
      "usage": "Order each group's rows by name (default) or a metric: name, total_clicks, total_click_throughs, total_leads, total_income, total_cost, total_net, epc, avg_cpc, conv_rate, roi, cpa (aliases: clicks=total_clicks, conversions=total_leads, cost=total_cost, income=total_income, leads=total_leads, net=total_net, profit=total_net, revenue=total_income)",
      "allowed_values": [
        "name",
        "total_clicks",
        "total_click_throughs",
        "total_leads",
        "total_income",
        "total_cost",
        "total_net",
        "epc",
        "avg_cpc",
        "conv_rate",
        "roi",
        "cpa"
      ],
      "value_aliases": {
        "clicks": "total_clicks",
        "conversions": "total_leads",
        "cost": "total_cost",
        "income": "total_income",
        "leads": "total_leads",
        "net": "total_net",
        "profit": "total_net",
        "revenue": "total_income"
      },
      "required": false
    },
    {
      "name": "sort-dir",
      "type": "string",
      "default": "",
      "usage": "ASC or DESC (default ASC by name, DESC by a metric): ASC, DESC",
      "allowed_values": [
        "ASC",
        "DESC"
      ],
      "required": false
    },
    {
      "name": "text-ad-id",
      "type": "string",
      "default": "",
      "usage": "Filter by text ad ID",
      "required": false
    },
    {
      "name": "time-from",
      "type": "string",
      "default": "",
      "usage": "Start: unix seconds, a date (2026-10-01, from its first second in the account's timezone) or a time with its offset (2026-10-01T09:30:00Z)",
      "required": false
    },
    {
      "name": "time-to",
      "type": "string",
      "default": "",
      "usage": "End, inclusive: unix seconds, a date (2026-10-01, through its last second in the account's timezone) or a time with its offset",
      "required": false
    }
  ]
}