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 groups02What 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 group Clicks Clickthroughs Conversions Revenue Cost Profit EPC Avg CPC ROI % ------------------------------ ------ ------------- ----------- ------- ------- -------- ------- ------- --------- Owned Media 458 458 21 4604 173 4431 10.0524 0.3777 2561.2717 › Bakery Pre-orders / Local 88 88 6 528 0 528 6 0 0 › Coffee Subscription / US 140 140 4 128 77 51 0.9143 0.55 66.2338 › Project Tool Pro Annual / US 140 140 7 3396 96 3300 24.2571 0.6857 3437.50 › Spring Collection / US 90 90 4 552 0 552 6.1333 0 0 Search 1186 1186 56 7703 1214.15 6488.85 6.4949 1.0237 534.4356 › Coffee Subscription / US 227 227 16 564 86.26 477.74 2.4846 0.38 553.8372 › Free Trial to Paid / CA 128 128 11 319 230.40 88.60 2.4922 1.80 38.4549 › Holiday Gift Cards / AU 178 178 10 1300 85.44 1214.56 7.3034 0.48 1421.5356 › Project Tool Pro Annual / US 168 168 3 1044 403.20 640.80 6.2143 2.40 158.9286 › Spring Collection / US 277 277 10 1472 180.05 1291.95 5.3141 0.65 717.5507 › Standing Desk Launch / UK 208 208 6 3004 228.80 2775.20 14.4423 1.10 1212.9371 Social 1257 1257 44 3530 645.83 2884.17 2.8083 0.5138 446.5835 › Bakery Pre-orders / Local 150 150 12 852 27 825 5.68 0.18 3055.5556 › Coffee Subscription / US 177 177 10 424 51.33 372.67 2.3955 0.29 726.0277 › Free Trial to Paid / CA 170 170 7 203 161.50 41.50 1.1941 0.95 25.6966 › Holiday Gift Cards / AU 110 110 3 150 34.10 115.90 1.3636 0.31 339.8827 › Spring Collection / US 420 420 10 1354 176.40 1177.60 3.2238 0.42 667.5737 › Standing Desk Launch / UK 230 230 2 547 195.50 351.50 2.3783 0.85 179.7954 Total 2901 2901 121 15837 2032.98 13804.02 5.4592 0.7008 679.0042
$ p202 report groups --by ppc_network,campaign --period last30 --json { "available_breakdowns": [ "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" ], "by": [ "ppc_network", "campaign" ], "data": [ { "avg_cpc": 0.3777292576419214, "breakdown": "ppc_network", "children": [ { "avg_cpc": 0, "breakdown": "campaign", "conv_rate": 6.8181818181818175, "cpa": 0, "epc": 6, "id": 6, "name": "Bakery Pre-orders / Local", "roi": 0, "total_click_throughs": 88, "total_clicks": 88, "total_cost": 0, "total_income": 528, "total_leads": 6, "total_net": 528 }, { "avg_cpc": 0.55, "breakdown": "campaign", "conv_rate": 2.857142857142857, "cpa": 19.25, "epc": 0.9142857142857143, "id": 2, "name": "Coffee Subscription / US", "roi": 66.23376623376623, "total_click_throughs": 140, "total_clicks": 140, "total_cost": 77, "total_income": 128, "total_leads": 4, "total_net": 51 }, { "avg_cpc": 0.6857142857142857, "breakdown": "campaign", "conv_rate": 5, "cpa": 13.714285714285714, "epc": 24.257142857142856, "id": 4, "name": "Project Tool Pro Annual / US", "roi": 3437.5, "total_click_throughs": 140, "total_clicks": 140, "total_cost": 96, "total_income": 3396, "total_leads": 7, "total_net": 3300 }, { "avg_cpc": 0, "breakdown": "campaign", "conv_rate": 4.444444444444445, "cpa": 0, "epc": 6.133333333333334, "id": 1, "name": "Spring Collection / US", "roi": 0, "total_click_throughs": 90, "total_clicks": 90, "total_cost": 0, "total_income": 552, "total_leads": 4, "total_net": 552 } ], "conv_rate": 4.585152838427948, "cpa": 8.238095238095237, "epc": 10.052401746724891, "id": 3, "name": "Owned Media", "roi": 2561.2716763005783, "total_click_throughs": 458, "total_clicks": 458, "total_cost": 173, "total_income": 4604, "total_leads": 21, "total_net": 4431 }, { "avg_cpc": 1.023735244519393, "breakdown": "ppc_network", "children": [ { "avg_cpc": 0.38, "breakdown": "campaign", "conv_rate": 7.048458149779736, "cpa": 5.39125, "epc": 2.484581497797357, "id": 2, "name": "Coffee Subscription / US", "roi": 553.8372362624623, "total_click_throughs": 227, "total_clicks": 227, "total_cost": 86.26, "total_income": 564, "total_leads": 16, "total_net": 477.74 }, { "avg_cpc": 1.8, "breakdown": "campaign", "conv_rate": 8.59375, "cpa": 20.945454545454545, "epc": 2.4921875, "id": 5, "name": "Free Trial to Paid / CA", "roi": 38.45486111111111, "total_click_throughs": 128, "total_clicks": 128, "total_cost": 230.4, "total_income": 319, "total_leads": 11, "total_net": 88.6 }, { "avg_cpc": 0.48, "breakdown": "campaign", "conv_rate": 5.617977528089887, "cpa": 8.544, "epc": 7.303370786516854, "id": 7, "name": "Holiday Gift Cards / AU", "roi": 1421.5355805243446, "total_click_throughs": 178, "total_clicks": 178, "total_cost": 85.44, "total_income": 1300, "total_leads": 10, "total_net": 1214.56 }, { "avg_cpc": 2.4, "breakdown": "campaign", "conv_rate": 1.7857142857142856, "cpa": 134.4, "epc": 6.214285714285714, "id": 4, "name": "Project Tool Pro Annual / US", "roi": 158.92857142857142, "total_click_throughs": 168, "total_clicks": 168, "total_cost": 403.2, "total_income": 1044, "total_leads": 3, "total_net": 640.8 }, { "avg_cpc": 0.65, "breakdown": "campaign", "conv_rate": 3.6101083032490973, "cpa": 18.005000000000003, "epc": 5.3140794223826715, "id": 1, "name": "Spring Collection / US", "roi": 717.5506803665648, "total_click_throughs": 277, "total_clicks": 277, "total_cost": 180.05, "total_income": 1472, "total_leads": 10, "total_net": 1291.95 }, { "avg_cpc": 1.1, "breakdown": "campaign", "conv_rate": 2.8846153846153846, "cpa": 38.13333333333333, "epc": 14.442307692307692, "id": 3, "name": "Standing Desk Launch / UK", "roi": 1212.9370629370628, "total_click_throughs": 208, "total_clicks": 208, "total_cost": 228.8, "total_income": 3004, "total_leads": 6, "total_net": 2775.2 } ], "conv_rate": 4.721753794266442, "cpa": 21.681250000000002, "epc": 6.4949409780775715, "id": 1, "name": "Search", "roi": 534.435613392085, "total_click_throughs": 1186, "total_clicks": 1186, "total_cost": 1214.15, "total_income": 7703, "total_leads": 56, "total_net": 6488.85 }, { "avg_cpc": 0.5137867939538584, "breakdown": "ppc_network", "children": [ { "avg_cpc": 0.18, "breakdown": "campaign", "conv_rate": 8, "cpa": 2.25, "epc": 5.68, "id": 6, "name": "Bakery Pre-orders / Local", "roi": 3055.5555555555557, "total_click_throughs": 150, "total_clicks": 150, "total_cost": 27, "total_income": 852, "total_leads": 12, "total_net": 825 }, { "avg_cpc": 0.29, "breakdown": "campaign", "conv_rate": 5.649717514124294, "cpa": 5.133, "epc": 2.3954802259887007, "id": 2, "name": "Coffee Subscription / US", "roi": 726.0276641340347, "total_click_throughs": 177, "total_clicks": 177, "total_cost": 51.33, "total_income": 424, "total_leads": 10, "total_net": 372.67 }, { "avg_cpc": 0.95, "breakdown": "campaign", "conv_rate": 4.117647058823529, "cpa": 23.071428571428573, "epc": 1.1941176470588235, "id": 5, "name": "Free Trial to Paid / CA", "roi": 25.696594427244584, "total_click_throughs": 170, "total_clicks": 170, "total_cost": 161.5, "total_income": 203, "total_leads": 7, "total_net": 41.5 }, { "avg_cpc": 0.31, "breakdown": "campaign", "conv_rate": 2.727272727272727, "cpa": 11.366666666666667, "epc": 1.3636363636363635, "id": 7, "name": "Holiday Gift Cards / AU", "roi": 339.88269794721407, "total_click_throughs": 110, "total_clicks": 110, "total_cost": 34.1, "total_income": 150, "total_leads": 3, "total_net": 115.9 }, { "avg_cpc": 0.42000000000000004, "breakdown": "campaign", "conv_rate": 2.380952380952381, "cpa": 17.64, "epc": 3.223809523809524, "id": 1, "name": "Spring Collection / US", "roi": 667.5736961451246, "total_click_throughs": 420, "total_clicks": 420, "total_cost": 176.4, "total_income": 1354, "total_leads": 10, "total_net": 1177.6 }, { "avg_cpc": 0.85, "breakdown": "campaign", "conv_rate": 0.8695652173913043, "cpa": 97.75, "epc": 2.378260869565217, "id": 3, "name": "Standing Desk Launch / UK", "roi": 179.79539641943734, "total_click_throughs": 230, "total_clicks": 230, "total_cost": 195.5, "total_income": 547, "total_leads": 2, "total_net": 351.5 } ], "conv_rate": 3.5003977724741446, "cpa": 14.677954545454547, "epc": 2.8082736674622115, "id": 2, "name": "Social", "roi": 446.58346623724515, "total_click_throughs": 1257, "total_clicks": 1257, "total_cost": 645.83, "total_income": 3530, "total_leads": 44, "total_net": 2884.17 } ], "totals": { "avg_cpc": 0.7007859358841779, "conv_rate": 4.1709755256808, "cpa": 16.801487603305784, "epc": 5.459152016546018, "roi": 679.004220405513, "total_click_throughs": 2901, "total_clicks": 2901, "total_cost": 2032.98, "total_income": 15837, "total_leads": 121, "total_net": 13804.02 } }
Profit by ppc network,campaign
Drawn from the JSON output above.
03Build your command
Pick values and the command line writes itself, quoted and ready to paste.
p202 report groupsSet flags below; the command updates as you type.
04Flags
23 flags, plus the global flags every command takes.
| Flag | What it does |
|---|---|
| --aff-campaign-idstring | Filter by INTERNAL campaign id (from campaign list), not the public id in tracking URLs |
| --aff-network-idstring | Filter by affiliate network ID |
| --browser-idstring | Filter by browser ID (the id of a --breakdown browser row) |
| --bystring | 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 severalcampaignaff_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-idstring | Filter by country ID |
| --device-typestring | Filter by device type ID: 1 Desktop, 2 Mobile, 3 Tablet, 4 Bot (the ids of --breakdown device_type rows) |
| --ipstring | Only clicks from this one IP address, IPv4 or IPv6 |
| --isp-idstring | Filter by ISP/carrier ID (the id of a --breakdown isp row) |
| --keywordstring | Only clicks whose keyword contains this text (case-insensitive) |
| --landing-page-idstring | Filter by landing page ID |
| --method-of-promotionstring | Only direct-link clicks or only landing-page clicks: directlink, landingpagedirectlinklandingpage |
| --period, -pstring | Period: today, yesterday, last7, last14, last30, last90, thismonth, lastmonth, thisyear, lastyear, alltimetodayyesterdaylast7last14last30last90thismonthlastmonththisyearlastyearalltime |
| --platform-idstring | Filter by platform (OS) ID (the id of a --breakdown platform row) |
| --ppc-account-idstring | Filter by PPC account ID |
| --ppc-network-idstring | Filter by PPC network ID, or none for the clicks with no traffic source |
| --refererstring | Only clicks whose referring URL contains this text (case-insensitive) |
| --region-idstring | Filter by region ID (the id of a --breakdown region row) |
| --showstring | Which clicks count (default all): all, real, filtered, filtered_bot, leads; real = not filtered, filtered_bot = filtered as bots, leads = convertedallrealfilteredfiltered_botleads |
| --sortstring | 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)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-dirstring | ASC or DESC (default ASC by name, DESC by a metric): ASC, DESCASCDESC |
| --text-ad-idstring | Filter by text ad ID |
| --time-fromstring | 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) |
| --time-tostring | End, 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,CLAUDECODEor another agent variable set, output is compact JSON and errors arrive on stderr as a JSON envelope with ahint. - Exit codes: 0 ok, 1 bad input, 2 auth, 3 network, 4 server error, 5 partial failure.
{
"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
}
]
}