01Run it
Replace the <placeholders> with your own values, or use the builder below.
p202 report breakeven02What 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 breakeven --breakdown keyword --aff-campaign-id 4 --period last30 id name Clicks Clickthroughs Conversions Conv % Revenue Cost Profit ROI % EPC CPA Avg CPC Breakeven CPC Margin verdict -- --------------------------- ------ ------------- ----------- ------ ------- ------ ------- -------- ------- ------ ------- ------------- ------- ---------- 13 project management software 54 54 0 0 0 129.60 -129.60 -100 0 0 2.40 0 -2.40 NO-CONVERT 11 gantt chart tool 49 49 1 2.04 348 117.60 230.40 195.9184 7.102 117.60 2.40 7.102 4.702 PROFITABLE 9 team task tracker 47 47 2 4.26 696 112.80 583.20 517.0213 14.8085 56.40 2.40 14.8085 12.4085 PROFITABLE
$ p202 report breakeven --breakdown keyword --aff-campaign-id 4 --period last30 --json { "data": [ { "avg_cpc": 2.4, "breakeven_cpc": 0, "conv_rate": 0, "cpa": 0, "epc": 0, "id": 13, "margin": -2.4, "name": "project management software", "roi": -100, "total_click_throughs": 54, "total_clicks": 54, "total_cost": 129.6, "total_income": 0, "total_leads": 0, "total_net": -129.6, "verdict": "NO-CONVERT" }, { "avg_cpc": 2.4, "breakeven_cpc": 7.102, "conv_rate": 2.04, "cpa": 117.6, "epc": 7.102040816, "id": 11, "margin": 4.702, "name": "gantt chart tool", "roi": 195.918367347, "total_click_throughs": 49, "total_clicks": 49, "total_cost": 117.6, "total_income": 348, "total_leads": 1, "total_net": 230.4, "verdict": "PROFITABLE" }, { "avg_cpc": 2.4, "breakeven_cpc": 14.8085, "conv_rate": 4.26, "cpa": 56.4, "epc": 14.808510638, "id": 9, "margin": 12.4085, "name": "team task tracker", "roi": 517.021276596, "total_click_throughs": 47, "total_clicks": 47, "total_cost": 112.8, "total_income": 696, "total_leads": 2, "total_net": 583.2, "verdict": "PROFITABLE" } ] }
Profit by keyword
Drawn from the JSON output above. Losses run left of zero in orange.
03Build your command
Pick values and the command line writes itself, quoted and ready to paste.
p202 report breakevenSet flags below; the command updates as you type.
04Flags
22 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 |
| --breakdown, -bstring · default keyword | Dimension: 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)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 |
| --browser-idstring | Filter by browser ID (the id of a --breakdown browser row) |
| --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 |
| --max-cpcfloat64 | Override the payout-derived break-even CPC target |
| --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 |
| --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
Computes the maximum profitable cost-per-click for each breakdown row.
breakeven_cpc = campaign payout × (conversions / clicks); margin = breakeven_cpc − avg_cpc.
Requires --aff-campaign-id (the INTERNAL id from campaign list) to read the payout.
06For agents
Running this from an agent
- Read the same facts as JSON:
p202 commands report breakeven --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 breakeven",
"use": "breakeven",
"short": "Break-even CPC per row: max biddable click price (payout × conversion rate)",
"long": "Computes the maximum profitable cost-per-click for each breakdown row.\nbreakeven_cpc = campaign payout × (conversions / clicks); margin = breakeven_cpc − avg_cpc.\nRequires --aff-campaign-id (the INTERNAL id from `campaign list`) to read the payout.",
"runnable": true,
"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": "breakdown",
"shorthand": "b",
"type": "string",
"default": "keyword",
"usage": "Dimension: 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)",
"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"
},
"required": false
},
{
"name": "browser-id",
"type": "string",
"default": "",
"usage": "Filter by browser ID (the id of a `--breakdown browser` row)",
"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": "max-cpc",
"type": "float64",
"default": "0",
"usage": "Override the payout-derived break-even CPC target",
"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": "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
}
]
}