SKILL DETAIL
affiliate-performance-dashboard
mbfinotti/partnerships-skills/affiliate-performance-dashboard
Define the metric set and layout for an affiliate performance dashboard, delivered as a dashboard specification document - metric definitions with explicit formulas, views per audience, refresh and review cadence, and alert thresholds for top affiliates, conversion by source, and program ROI. Covers B2B SaaS recurring revenue-share and B2C ecommerce order-level CPA programs. Use whenever the user mentions affiliate program reporting, affiliate KPIs, affiliate ROI, revenue concentration, or what to put on an affiliate dashboard, even if they never say dashboard. Specifies metrics, never builds them in a BI tool. Do NOT use for one creator campaign's measurement plan - use mbfinotti/partnerships-skills@influencer-measurement-framework instead.
Installation
npx skills add https://github.com/mbfinotti/partnerships-skills --skill affiliate-performance-dashboard
スキルファイル
SKILL.md
最終同期 · 2026/10/23
evals/evals.json›
{
"skill_name": "affiliate-performance-dashboard",
"evals": [
{
"id": 1,
"prompt": "I run the affiliate program at Thrivelane, a B2B project-ops SaaS. 410 active partners, 20% recurring commission capped at 12 months, about $95K/month going out in commissions. Our network's built-in dashboard already gives us clicks, signups, EPC and total commissions earned, and I just paste that into a slide every month. Our CFO keeps asking whether the program actually makes money and I've got nothing solid. Put together what our affiliate dashboard should actually measure.",
"expected_output": "A dashboard specification document for a B2B recurring revenue-share program: billing spine as source of truth with the network export demoted to clicks only, validated-not-gross reporting, the four floor metrics, cost of sale with all fees inside the numerator, and EPC deleted from the B2B set.",
"files": [],
"expectations": [
"Delivers a dashboard specification document rather than instructions for building the dashboard inside a BI tool.",
"Rejects the affiliate platform's own export as the source of truth on the grounds that those are the claimant's numbers.",
"Keeps the affiliate platform as the source for clicks and traffic only, reconciled to the money spine.",
"Names the billing/orders spine as the default data foundation and gives its cost as roughly a week of reconciliation followed by near-zero standing cost.",
"Includes all four floor metrics: net program contribution, cost of sale, top-N partner concentration, and partner-sourced MRR/ARR.",
"Defines cost of sale with network fees, agency fees, and placement/tenancy fees inside the numerator, not commission alone.",
"Headlines validated or approved commission and shows pending separately, rather than headlining gross commission.",
"Excludes EPC from the metric set and gives recurring commission accruing over a conversion lag as the reason.",
"Defines net program contribution as attributed net revenue minus validated commission plus network, agency and placement fees.",
"Normalizes partner-sourced MRR/ARR by billing interval, dividing annual by 12 and quarterly by 3.",
"Gives every metric a one-sentence definition naming numerator, denominator, window, timezone, and counting method.",
"Records in the spec header which data foundation was chosen and what moved it there."
]
},
{
"id": 2,
"prompt": "Petalgrove is a DTC houseplant store, about 900 affiliates, 10% CPA on order value, 30-day cookie, last click. Coupon and cashback sites are the top six lines on our leaderboard every single month and our content partners look useless next to them. Leadership wants to cut the content budget and pay the coupon sites more. Tell me what to measure so I can settle this.",
"expected_output": "A metric and instrument plan that refuses the budget shift on last-click evidence, starts at the new-to-file screen, ranks the incrementality instruments by efficiency, and routes the resulting decisions to the right owners.",
"files": [],
"expectations": [
"Names new-to-file share sliced by partner type as the first instrument to run, because it is the cheapest rung of the incrementality instruments.",
"States explicitly that new-to-file proves the customer was not already a customer, never that the partner caused the purchase.",
"Ranks the incrementality instruments as new-to-file screen, then commission-reduction test, then geo-lift test, then holdout test, and states the ranking out loud.",
"Notes value and effort run in the same order across those four instruments, so the right pick is the weakest instrument that still settles the live question.",
"Flags the commission-reduction test as carrying the highest compliance cost because it unilaterally changes a partner's economics.",
"Directs the user to the notice and rate-change clauses in the program terms before running a commission-reduction test.",
"Names the holdout test as the option the efficiency order starves and states the condition that promotes it anyway.",
"Adds a checkout-adjacent revenue share metric covering coupon, cashback and browser-extension revenue as a share of program revenue.",
"Declines to endorse shifting budget from content partners to coupon and cashback partners on last-click numbers alone.",
"States that last-click-only program ROI systematically inflates checkout-adjacent partners and starves content partners.",
"Routes low incrementality to a repricing decision and attribution manipulation to the fraud rule set, stating the dashboard surfaces the signal but decides neither.",
"Labels the ROI tile with its attribution basis, naming last-click and the 30-day cookie window."
]
},
{
"id": 3,
"prompt": "Quick one. I'm setting the target column on our affiliate dashboard for next year. Numbers I've got: our attributed ROAS is 14:1 and the network average I keep seeing quoted is 12:1. Our active-affiliate rate is 22%, and the typical published range is 10-30%. Top 10% of our affiliates drive 64% of revenue against the 71% figure that gets quoted everywhere. Reversal rate 6%. Write the target for these four metrics and tell me how we're doing.",
"expected_output": "Targets derived from the program's own history, with every published figure tagged as calibration only, the active definition challenged, and no health verdict issued from benchmark comparison.",
"files": [],
"expectations": [
"Refuses to adopt the 12:1 network-average ROAS as the program's target and labels it calibration only.",
"Notes that trade-body and network ROAS figures come from parties with an incentive to inflate the channel.",
"Derives every target from the program's own history rather than from any published figure.",
"Tags each published figure with its provenance: vendor, trade body, synthesis, or the program's own derived baseline.",
"Declines to read the 22% active-affiliate rate as healthy purely because it sits inside the published 10-30% range.",
"Flags the active-affiliate rate as uninterpretable until the program declares what counts as active and over what window.",
"Requires the active definition to be a meaningful action such as a validated conversion or live placement inside a fixed window, not a signup or a lone click.",
"Notes the top-10%-drives-71% figure has no published raw data behind it and declines to set it as a target.",
"Bands the 6% reversal rate against the program's own derived history rather than only against the published quality-problem line near 10%.",
"States the 14:1 figure is unreproducible without its attribution basis and its denominator stated.",
"Distinguishes attributed ROAS from attributed ROI and asks whether COGS sits in the denominator before treating 14:1 as either.",
"Does not declare the program healthy or unhealthy on the strength of the benchmark comparisons alone."
]
},
{
"id": 4,
"prompt": "Board deck is Thursday. Our CRM says partner-sourced ARR is $2.1M and partner-influenced ARR is $3.4M for the year. I want one big partner-attributed ARR tile showing $5.5M, plus whatever else you think belongs next to it on the exec view. B2B SaaS, around 250 partners, mostly agencies and consultancies.",
"expected_output": "A refusal to produce the combined tile, two separate capped numbers with a stated precedence rule, and an executive view carrying contribution and concentration.",
"files": [],
"expectations": [
"Refuses to produce the combined $5.5M partner-attributed ARR tile.",
"Reports partner-sourced and partner-influenced ARR as two separate, capped numbers.",
"States that a deal qualifying as both sourced and influenced counts as sourced only.",
"Describes influenced revenue as a directional advocacy metric rather than bookable channel revenue.",
"Keeps influenced revenue in its own tile and outside any revenue total.",
"Names double-counted partner revenue as the consequence of summing the two numbers.",
"Places net program contribution on the executive view.",
"Places top-partner concentration on the same executive view.",
"Notes the influenced number costs roughly a quarter because a CRM influence model must exist and the precedence rule has to survive a political argument.",
"Ranks the influenced-revenue split low on efficiency because it changes how partner contribution is argued to an executive and nothing operational.",
"Gives every executive tile a value plus a delta against a stated prior period rather than a bare absolute number.",
"States the decision each executive tile informs."
]
},
{
"id": 5,
"prompt": "Our affiliate dashboard has exactly one alert: an email to the whole team if daily program revenue drops below $10,000. It fires constantly in January and never in Q4, so everyone filters it into a folder nobody opens. We're B2C, around 1,200 affiliates, and we do pay a handful of PPC partners. Redesign the alerting for us: what should fire, and at what number.",
"expected_output": "An alert register built on rolling-baseline thresholds, each with owner, channel and expected response time, shipped in the stated efficiency order with the brand-bidding flag promoted for the PPC partners.",
"files": [],
"expectations": [
"Replaces the static $10,000 floor with a rolling-baseline dynamic threshold.",
"Gives a concrete rolling-baseline rule, such as deviation beyond 2 standard deviations from a 30-day rolling mean.",
"Attaches four fields to every alert: threshold, owner, delivery channel, and expected response time.",
"States that a threshold with no owner is decoration.",
"Ships the alerts in the order reversal-rate spike, single-partner share spike, click-to-conversion anomaly, EPC drop, brand-bidding flag, and states that ordering out loud.",
"Explains reversal-rate spike leads because it fires on money already at risk and reads off a state the platform already maintains.",
"Names the brand-bidding or trademark flag as the alert the efficiency order starves.",
"Promotes the brand-bidding flag anyway because this program pays PPC partners.",
"Advises stopping when the team's attention runs out rather than filling the alert strip.",
"Notes that the click-to-conversion anomaly and the EPC drop are one rolling-baseline rule over two numerators, so building either makes the second a copy.",
"States that fraud rule definitions and enforcement belong to the fraud rule set while the dashboard only surfaces the signals.",
"Recommends keeping an alert log recording fired, acknowledged by, and resolved in."
]
},
{
"id": 6,
"prompt": "We're building one affiliate dashboard for the whole company: our CMO, me (I run the program day to day), and two affiliate managers. Plan is a single live-refreshing screen everyone opens, same tiles for everyone, plus a separate fraud tool the managers check weekly. B2C ecommerce, 30-day cookie, 45-day validation window. Does that work? Lay out what it should look like.",
"expected_output": "Two audience views differing in metrics, a four-band cadence with named review rituals, fraud signals folded onto the operator view, and tiles carrying deltas against a stated prior period.",
"files": [],
"expectations": [
"Rejects one refresh rate for the whole dashboard and calls it a defect.",
"Specifies four cadence bands: continuous or daily operational, weekly acquisition, monthly performance, and quarterly portfolio.",
"Assigns each band its own metrics and its own named review ritual stating who looks, in which meeting, deciding what.",
"States the four cadence bands carry no efficiency ranking and that all four get built.",
"Splits the dashboard into an executive view and an operator view.",
"States the two views differ in which metrics they carry, not only in level of detail.",
"Places fraud and compliance signals on the operator view rather than in a separate tool.",
"Gives the reason that daily decision-makers need performance and compliance signals at once.",
"Uses the layout convention KPI tiles, then trend or composition charts, then leaderboard or detail table, then alert strip.",
"Requires every tile to carry a value plus a delta against a stated prior period.",
"Puts net program contribution, cost of sale, new-to-file and top-partner share on the executive view.",
"Puts reversal rate, pending versus approved, single-partner share and conversion rate on the operator view."
]
},
{
"id": 7,
"prompt": "Ravencourt Outdoors, ecommerce affiliate program. One affiliate is 38% of our validated revenue and the top five together are 61%. I want to cap that partner's commission so the rest of the base catches up, and I need to know which concentration tiles to build. Also: three of our partners are actually sub-networks with hundreds of publishers underneath and they show as one row each. Should I split them into individual affiliates so the numbers look less scary?",
"expected_output": "A refusal to throttle the top partner, a concentration view at top-1/5/10% plus absolute top-5 share on the executive view, sub-networks counted as single credited entities, and the average-per-partner metric rejected.",
"files": [],
"expectations": [
"Advises against capping or throttling the top partner's commission.",
"Prescribes partner development in the next tier down plus top-partner retention work as the response to a concentration breach.",
"Confirms that top five partners above 50% of revenue is a concentration problem.",
"Specifies top-1%, top-5% and top-10% shares plus the absolute top-5-partner share.",
"Computes the shares over active partners, using the spec's own active definition for the denominator population.",
"Places top-partner share on the executive view and reviews it quarterly.",
"States the concentration figures must be recomputed on the same definitions each quarter for the trend to be real.",
"Rejects splitting the sub-networks into their member publishers.",
"Counts each sub-network as one credited entity per conversion, with its own mix breakdown.",
"States that counting a sub-network's members as many partners distorts both partner counts and concentration.",
"Rejects average commission per active partner as a metric because the mean hides the skew that matters.",
"Offers top-decile share plus the median in place of the average."
]
},
{
"id": 8,
"prompt": "Need a sanity check before I send this. We lengthened our validation window from 30 days to 60 days at the start of March. Q2 cost of sale came in at 11.4% against 15.1% in Q1, and August alone is at 9.2%, which would be our best month ever. I want to headline that improvement on the dashboard and set 10% as the standing target. B2C, around 700 affiliates, return window is 30 days.",
"expected_output": "A refusal to compare the two periods or to headline the improvement, an immature-period flag on August, chart annotation requirements, and the comparability contract named as the fix.",
"files": [],
"expectations": [
"Refuses to compare Q1 with Q2 because the two periods ran different validation windows.",
"Explains that reversal lag makes the more recent period look artificially good.",
"Flags August as an immature period whose validation window has not fully elapsed.",
"States a period is comparable only after its validation window fully elapses.",
"Declines to set 10% as a standing cost-of-sale target on the strength of these figures.",
"Requires validation-window changes to be annotated on every chart.",
"Requires program-term changes to be annotated on charts as well.",
"Keeps pending and approved conversions as separate states rather than mixing them into one total.",
"Names the comparability contract, covering event definition, date basis, timezone, currency and counting method, as what fixes the state per metric.",
"States the comparability contract must be fixed before any metric is specified, because changing it later invalidates all history.",
"Confirms the cost-of-sale numerator includes network, agency and placement fees before any figure is trusted.",
"Does not present the cost-of-sale drop as a genuine improvement or trend."
]
},
{
"id": 9,
"prompt": "Situation: Halden Freight Software, B2B SaaS, affiliate program is 14 months old with 180 partners. I have no analyst, it's me and a spreadsheet. Board meeting is in three weeks and I need something in front of them by then. Our affiliate platform exports conversions and commissions; the partner ID never makes it into our billing system or our CRM, and we have no warehouse. What goes on the dashboard?",
"expected_output": "A spine-pinned minimal spec, with every metric the constraints rule out deleted outright into Open items alongside what would make it computable, and the interview answers named as what moved each option.",
"files": [],
"expectations": [
"Asks the three re-ranking questions, covering the date the first version must land, one-off win versus compounding asset, and the effort ceiling, before proposing metrics.",
"Asks clarifying questions one per message rather than delivering the whole questionnaire in a single block.",
"Pins the spec to the billing or orders spine because of the near date.",
"Deletes the modeled warehouse outright rather than listing it lower in the spec.",
"Deletes the brand-bidding alert and the creative slice outright given the thin effort ceiling.",
"Deletes new-to-file share from the spec because the partner ID does not reach billing or CRM.",
"Deletes churn-adjusted partner LTV, noting the program is not old enough for a 24-month horizon.",
"Lists every deleted metric, dimension and alert under Open items.",
"States for each deleted item what would make it computable.",
"Names stamping the partner ID at order or account creation as the prerequisite for new-to-file and for sourced-versus-influenced.",
"States the customer-file join costs roughly a quarter of work.",
"Names partner-sourced MRR/ARR as blocked by the missing partner ID in billing and records it under Open items rather than silently dropping it."
]
},
{
"id": 10,
"prompt": "My VP wants me to present the framework we're using for affiliate reporting. She likes named methodologies and she'll ask for one by name. Our current headline KPIs are total clicks (we target 1M/month), affiliate signups (200/month), and gross commissions earned. Give me the framework name and the KPI set to present.",
"expected_output": "A plain statement that no canonical affiliate-dashboard framework exists, the four borrowed pieces named and attributed, and the vanity KPIs demoted into a tiered metric set where every metric carries a named decision.",
"files": [],
"expectations": [
"States plainly that no canonical affiliate-dashboard framework exists.",
"States that affiliate metric definitions are not standardized and that no standards body enforces them.",
"Declines to invent, name, or present a branded framework.",
"Names the borrowed pieces instead: incrementality measurement, the attributed ROAS versus attributed ROI split, the sourced-versus-influenced separation rule, and a tiered metric hierarchy with good-metric criteria.",
"Attributes the tiered hierarchy and the good-metric criteria to Croll and Yoskovitz's Lean Analytics.",
"Lists the four good-metric criteria: comparative, a ratio or rate, understandable, and behavior-changing.",
"Demotes clicks and signups from headline KPIs to diagnostics.",
"Names clicks, impressions and signups as vanity metrics that inform no decision.",
"Replaces gross commissions earned with validated commission in the headline.",
"Requires every metric on the dashboard to carry a named decision it informs, and to be dropped otherwise.",
"Organizes the metric set into a business or headline tier, an input or driver tier, and a health or guardrail tier.",
"Labels any partner lifecycle chain such as recruit, activate, produce, grow as informal shorthand rather than a branded framework."
]
},
{
"id": 11,
"prompt": "Here is the metric list someone before me left on our affiliate dashboard, with no definitions at all: ROAS, ROI, AOV, conversion rate, EPC, active affiliate rate, new-to-file. B2C apparel, 30-day cookie, last click. Our orders database records returns, but tax and shipping are both sitting inside the revenue column. Write the definition for each one so that two people compute the same number.",
"expected_output": "One-sentence definitions per metric with numerator, denominator, window, timezone and counting method, ROAS and ROI kept distinct, and the click, returns and active conventions declared explicitly.",
"files": [],
"expectations": [
"Gives ROAS as attributed revenue divided by media cost.",
"Gives ROI with COGS added to the denominator, distinct from ROAS.",
"States explicitly whether COGS sits in the denominator and warns against using ROAS and ROI interchangeably.",
"Specifies AOV net of returns and excluding tax and shipping, and states that convention in the definition.",
"States AOV decides nothing unless it is sliced by partner type.",
"Defines the conversion rate with unique clicks in the denominator and declares the click convention.",
"Notes that what counts as a click, whether raw, unique, deduplicated or bot-filtered, varies by source, which is why the convention must be stated.",
"Declares which EPC convention applies: per click, per 100 clicks, or per visitor.",
"Warns that a blended network EPC predicts no individual affiliate's EPC and must not be used to set a partner target.",
"Defines the active-affiliate rate with a required meaningful action and a fixed window, naming both.",
"Defines new-to-file as conversions from customers not previously in the customer file divided by total partner conversions.",
"Keeps every definition to one sentence naming numerator, denominator, window, timezone, and counting method."
]
}
],
"trigger_queries": [
{ "query": "Spec an affiliate dashboard for our B2B SaaS partner program", "should_trigger": true },
{ "query": "What KPIs should go on an affiliate program dashboard?", "should_trigger": true },
{ "query": "Our CFO keeps asking if the affiliate program makes money and I can't answer", "should_trigger": true },
{ "query": "How do I report affiliate program ROI to leadership?", "should_trigger": true },
{ "query": "Define the metrics for our affiliate reporting", "should_trigger": true },
{ "query": "affiliate dashboard metrics", "should_trigger": true },
{ "query": "I need to show which affiliates actually drive our revenue", "should_trigger": true },
{ "query": "One publisher is 40% of our program revenue, how do I track that risk", "should_trigger": true },
{ "query": "What should our affiliate manager look at every day versus what the exec sees monthly?", "should_trigger": true },
{ "query": "Write an affiliate program KPI spec with alert thresholds and owners", "should_trigger": true },
{ "query": "Our coupon partners look like heroes on last-click and I need better reporting", "should_trigger": true },
{ "query": "How should I measure revenue concentration across our affiliates?", "should_trigger": true },
{ "query": "Set up reporting for our 20% recurring revenue share program", "should_trigger": true },
{ "query": "affiliate program reporting requirements doc", "should_trigger": true },
{ "query": "What's the right refresh rate for our partner revenue reporting?", "should_trigger": true },
{ "query": "Help me pick which affiliate numbers matter and which are noise", "should_trigger": true },
{ "query": "Our network dashboard shows clicks and signups, what should we actually track", "should_trigger": true },
{ "query": "I want to stop reporting gross commissions, what replaces it", "should_trigger": true },
{ "query": "Design the reporting views for our affiliate program, exec and ops", "should_trigger": true },
{ "query": "How do I calculate cost of sale for an affiliate program?", "should_trigger": true },
{ "query": "affiliate KPIs", "should_trigger": true },
{ "query": "Build me a metric definition sheet for our publisher program", "should_trigger": true },
{ "query": "Which affiliate metrics belong on the board deck?", "should_trigger": true },
{ "query": "Our program spends $80K a month in commissions and nobody knows if it's working", "should_trigger": true },
{ "query": "Need alert thresholds for our affiliate program so we catch reversal spikes", "should_trigger": true },
{ "query": "What does good affiliate program reporting look like", "should_trigger": true },
{ "query": "partner-sourced versus partner-influenced revenue, how do I report both?", "should_trigger": true },
{ "query": "We track everything and decide nothing. Fix our affiliate reporting.", "should_trigger": true },
{ "query": "How often should we review affiliate program numbers, and with whom", "should_trigger": true },
{ "query": "Define new-to-file rate for our affiliate program", "should_trigger": true },
{ "query": "Spec the reporting layer for a 900-affiliate ecommerce program", "should_trigger": true },
{ "query": "What belongs on the top view of our publisher performance report", "should_trigger": true },
{ "query": "I'm rebuilding our affiliate reporting from scratch, where do I start", "should_trigger": true },
{ "query": "How do I prove our affiliate channel is incremental to the board", "should_trigger": true },
{ "query": "Which source of truth should our affiliate numbers come from, the network or our orders database?", "should_trigger": true },
{ "query": "Tell me how to measure whether our affiliate program is profitable", "should_trigger": true },
{ "query": "affiliate performance reporting spec", "should_trigger": true },
{ "query": "Our reversal rate reporting is a mess, what should the metric be", "should_trigger": true },
{ "query": "Set targets for our affiliate program metrics", "should_trigger": true },
{ "query": "I need a scorecard for the whole affiliate program, not per partner", "should_trigger": true },
{ "query": "How do I show attributed ROAS and ROI separately for the affiliate channel", "should_trigger": true },
{ "query": "What slices should our affiliate reporting support?", "should_trigger": true },
{ "query": "We're launching affiliate reporting next quarter, what goes in v1", "should_trigger": true },
{ "query": "Help me design the daily view my affiliate manager opens every morning", "should_trigger": true },
{ "query": "Track active versus inactive affiliates, what's the right definition", "should_trigger": true },
{ "query": "Reporting for our cashback and coupon publisher mix", "should_trigger": true },
{ "query": "Show me how to structure affiliate program metrics by tier", "should_trigger": true },
{ "query": "What alert should fire when a single partner's share of revenue jumps", "should_trigger": true },
{ "query": "I want one number that says whether the affiliate channel is worth keeping", "should_trigger": true },
{ "query": "How should I present affiliate program results at the quarterly business review", "should_trigger": true },
{ "query": "affiliate analytics setup", "should_trigger": true },
{ "query": "Our affiliate reporting compares periods that aren't comparable, help", "should_trigger": true },
{ "query": "Which affiliate benchmarks can I actually use as targets?", "should_trigger": true },
{ "query": "What's the metric that catches a partner shipping junk traffic", "should_trigger": true },
{ "query": "Build the reporting requirements for our new publisher program in ecommerce", "should_trigger": true },
{ "query": "I need to justify the affiliate program budget with numbers", "should_trigger": true },
{ "query": "What should we measure to decide whether to reprice our coupon partners", "should_trigger": true },
{ "query": "Give me the tiles for an affiliate exec dashboard", "should_trigger": true },
{ "query": "Spec out reporting for a program paying 10% CPA on orders", "should_trigger": true },
{ "query": "How do I track time to first conversion for new affiliates", "should_trigger": true },
{ "query": "Our partner revenue numbers never match finance's, what do I do about reporting", "should_trigger": true },
{ "query": "affiliate program measurement plan", "should_trigger": true },
{ "query": "What's the cadence for reviewing affiliate concentration", "should_trigger": true },
{ "query": "I want to know who drives our program and whether it's profitable, in one place", "should_trigger": true },
{ "query": "Design the metric set for a recurring commission SaaS partner program", "should_trigger": true },
{ "query": "How do I report on our affiliate channel without the network grading its own homework", "should_trigger": true },
{ "query": "What commission rate should we pay our affiliates?", "should_trigger": false },
{ "query": "Design a tiered payout ladder for our affiliate program", "should_trigger": false },
{ "query": "How long should our affiliate cookie window be?", "should_trigger": false },
{ "query": "Should we pay recurring commission or a flat CPA?", "should_trigger": false },
{ "query": "Set the clawback policy for our affiliate program", "should_trigger": false },
{ "query": "Check this Instagram caption for FTC disclosure compliance", "should_trigger": false },
{ "query": "Does thanks to X for the gift count as adequate affiliate disclosure in the UK?", "should_trigger": false },
{ "query": "Write the disclosure wording for our affiliates' YouTube descriptions", "should_trigger": false },
{ "query": "Build the rule set for detecting cookie stuffing", "should_trigger": false },
{ "query": "How do I tell real fraud from a low-incrementality cashback partner?", "should_trigger": false },
{ "query": "Someone is submitting fake leads through our affiliate links, what's the investigation path", "should_trigger": false },
{ "query": "Write the welcome email series for newly approved affiliates", "should_trigger": false },
{ "query": "What should we send an affiliate in the first 30 days after approval?", "should_trigger": false },
{ "query": "Design the activation nudge for affiliates who haven't converted yet", "should_trigger": false },
{ "query": "Audit this month's affiliate payout run before we send the money", "should_trigger": false },
{ "query": "Check our commission payout file for double-counted conversions", "should_trigger": false },
{ "query": "Our payout run has rounding and currency issues, review it line by line", "should_trigger": false },
{ "query": "Draft the terms and conditions affiliates accept when they join", "should_trigger": false },
{ "query": "What prohibited-tactics clauses belong in our affiliate agreement?", "should_trigger": false },
{ "query": "Write the outreach email to recruit new affiliates in the fitness niche", "should_trigger": false },
{ "query": "How do I pitch a big content publisher to join our program?", "should_trigger": false },
{ "query": "Rank these five candidate strategic alliances for us", "should_trigger": false },
{ "query": "Write our deal registration policy for partner-sourced deals", "should_trigger": false },
{ "query": "How do we stop direct reps fighting partners over the same account?", "should_trigger": false },
{ "query": "Draft the creative brief for our next creator campaign", "should_trigger": false },
{ "query": "Shortlist creators for a skincare launch and score them", "should_trigger": false },
{ "query": "Build the measurement plan for one influencer campaign before it launches", "should_trigger": false },
{ "query": "What KPIs should I set for a single TikTok creator collab?", "should_trigger": false },
{ "query": "Prepare me to negotiate usage rights and exclusivity with a creator", "should_trigger": false },
{ "query": "Write the first DM to a podcaster we want to sponsor", "should_trigger": false },
{ "query": "Plan a joint go-to-market campaign with our new integration partner", "should_trigger": false },
{ "query": "Design our B2B partner program from scratch: tiers, benefits, motions", "should_trigger": false },
{ "query": "Model the unit economics of this one reseller relationship", "should_trigger": false },
{ "query": "Is this partner's margin worth the cost to serve?", "should_trigger": false },
{ "query": "Which partner category should we add next, MSPs or SIs?", "should_trigger": false },
{ "query": "Map our whole partner ecosystem and find the coverage gaps", "should_trigger": false },
{ "query": "Sequence the training and certification our partners need", "should_trigger": false },
{ "query": "Should we list on AWS Marketplace or Azure first?", "should_trigger": false },
{ "query": "Build a per-partner scorecard and QBR structure for our channel partners", "should_trigger": false },
{ "query": "How do I run a quarterly business review with one underperforming reseller?", "should_trigger": false },
{ "query": "What's the underperformance ladder before we de-tier a partner?", "should_trigger": false },
{ "query": "Redesign our silver, gold and platinum partner tiers and migrate the base", "should_trigger": false },
{ "query": "How do I get into partnerships as a career?", "should_trigger": false },
{ "query": "Write the job description and interview loop for a channel manager", "should_trigger": false },
{ "query": "I'm starting partnerships work at a new company, where do I begin?", "should_trigger": false },
{ "query": "Set reward caps and cooldowns so customers can't game our refer-a-friend program", "should_trigger": false },
{ "query": "How much should we pay for a customer referral, cash or account credit?", "should_trigger": false },
{ "query": "Should we reward the referrer, the friend, or both?", "should_trigger": false },
{ "query": "Build a Grafana dashboard for our API latency", "should_trigger": false },
{ "query": "Create Kibana visualizations for our application logs", "should_trigger": false },
{ "query": "Design a KPI dashboard for our engineering team's delivery metrics", "should_trigger": false },
{ "query": "What SaaS metrics should a seed-stage startup track: ARR, NRR, burn multiple?", "should_trigger": false },
{ "query": "Set up GA4 event tracking on our marketing site", "should_trigger": false },
{ "query": "Build a React admin dashboard with charts", "should_trigger": false },
{ "query": "Configure multi-touch attribution in our ad platform", "should_trigger": false },
{ "query": "Query the Google Analytics Data API for last month's sessions", "should_trigger": false },
{ "query": "Which chart type should I use for this cohort data?", "should_trigger": false },
{ "query": "Write the SQL for our revenue reporting tables", "should_trigger": false },
{ "query": "Our warehouse costs too much, help me optimize these reporting queries", "should_trigger": false },
{ "query": "Set up alerting in Datadog for our checkout service", "should_trigger": false },
{ "query": "Design the customer health score for our CS team", "should_trigger": false },
{ "query": "Build a sales pipeline dashboard for our AEs", "should_trigger": false },
{ "query": "What's a good NPS survey cadence?", "should_trigger": false },
{ "query": "Track our paid search ROAS by campaign in Google Ads", "should_trigger": false },
{ "query": "How do I forecast next quarter's marketing-sourced pipeline?", "should_trigger": false },
{ "query": "Write a weekly investor update with our key metrics", "should_trigger": false }
]
}
references/concentration-and-cohorts.md›
# Concentration and Cohorts
Portfolio-health analysis: who actually drives the program, and whether the partner base is renewing itself. Provenance tags as in the metric catalogue.
## Computing top-N concentration
- Rank partners by validated attributed revenue for the period; top-N% share = revenue from the top N% of _active_ partners / total program revenue. Use the spec's active definition for the denominator population.
- Compute top-1%, top-5%, top-10% shares plus the absolute top-5-partner share; recompute quarterly on the same definitions so the trend is real.
- Put the top-partner share on the executive view - concentration is a board-level risk, not an operator detail.
## Published concentration figures - calibration only
| Claim | Source type |
| ------------------------------------------------------------------ | ----------------------------------------- |
| Top 10% of active affiliates drive ~71% of revenue | [SYNTH] 2026 aggregator, no raw data |
| Top 5-10% generate 80-90% of revenue | [SYNTH] multiple managed-program datasets |
| Top 1% generate 25-50x the median affiliate's revenue | [VENDOR] operator data |
| 95% of sales from 5% of affiliates | [VENDOR] Pareto framing |
| Top-1% share by vertical: ecommerce 28%, B2B SaaS 31%, iGaming 62% | [VENDOR] aggregate of trade/analyst data |
- Working threshold: **top 5 partners over 50% of revenue is a concentration problem**; losing one super-affiliate can cut program revenue 15-25% [VENDOR]. Adopt the threshold as a review trigger, then re-band it from the program's own quarters [DERIVE].
- Response to a breach is partner development in the next tier down and top-partner retention work - not throttling the top partners.
## Lifecycle stages
- Track partners through recruit -> activate -> produce -> grow. Industry practice follows these stages, but the four-word chain is informal shorthand, not a branded framework - never present it as one.
- Stage conversion metrics:
- Recruits per month.
- Conversion-to-active within 90 days.
- Producers (repeat converters).
- Growers (rising validated revenue quarter over quarter).
- Conversion-to-active-within-90-days bands [VENDOR]:
- Healthy programs: 40-60%.
- Struggling programs: below 20%.
- Typical activation: around 10%, with top programs above 50%.
Wide spread = derive the program's own band [DERIVE].
## Cohorting by recruitment month
- Rows = recruitment month; columns = months since recruitment; cells = share active, share with a first conversion, and cumulative validated commission.
- Cohorts answer what a snapshot cannot: whether recent recruiting classes activate faster or slower than older ones, and whether an activation push actually worked.
- Cohort at month granularity - day-level cohorts are too small to show any trend.
## Tail activation and partner-type mix
- Tail activation: share of below-median partners recording a first conversion in the period. A dead tail means recruiting is filling a leaky bucket.
- Time-boxed reality check: a partner with no conversion after 60 days has ~3.7% lifetime probability of ever converting [SYNTH, directional] - concentrate activation effort inside the first 60 days.
- Partner-type mix: share of validated revenue by promotional method (content, coupon, cashback/loyalty, sub-network, influencer, email, PPC). A rising checkout-adjacent share is an incrementality-review trigger, not a fraud verdict.
- Count sub-networks as one credited entity with their own mix breakdown - counting a sub-network's members as many partners distorts both concentration and active-partner counts.
references/layout-cadence-and-alerts.md›
# Layout, Cadence, and Alerts
View design per audience, slicing dimensions, refresh/review rhythm, and alert mechanics.
## Two audiences, two views
Executive and operator views differ in metrics, not just zoom level [VENDOR consensus]. Both follow the same layout convention: headline KPI tiles (value + delta vs a stated prior period, color-coded) -> trend/composition charts -> leaderboard/detail table -> alert strip. Keep fraud/compliance signals on the operator view itself, never in a separate tool.
Executive view - profitability and risk at a glance:
```
+--------------------------------------------------------------------+
| NET CONTRIBUTION | COST OF SALE | NEW-TO-FILE | TOP-5 |
| $412K (+6% vs P-1) | 14.2% (-0.4pt) | 38% (+2pt) | SHARE 44% |
+-----------------------+----------------+--------------+------------+
| Validated net revenue trend (13 mo) | Revenue by partner type |
+----------------------------------------+---------------------------+
| Sourced $X | Influenced $Y (separate, capped - never summed) |
+--------------------------------------------------------------------+
| ALERTS: concentration breach? reversal trend? window changes? |
+--------------------------------------------------------------------+
```
Operator view - daily movement and anomalies:
```
+--------------------------------------------------------------------+
| EPC | CONV RATE | REVERSAL % | PENDING vs | 1-PARTNER |
| (vs 30d) | (vs 30d) | (vs band) | APPROVED $ | SHARE |
+------------+-------------+-------------+--------------+------------+
| Daily validated conversions (6 wk) | Reversals by reason |
+----------------------------------------+---------------------------+
| Partner leaderboard: validated comm | conv | EPC | reversal% | |
| new-to-file% | delta vs prior period (sortable, full tail) |
+--------------------------------------------------------------------+
| ALERT STRIP: EPC drop | reversal spike | share spike | compliance |
+--------------------------------------------------------------------+
```
Tile rule: every tile shows value plus delta against a _stated_ prior period - never a bare absolute number. The operator tiles above are the B2C set; in B2B swap EPC for the stage conversion rate, since EPC is deleted from the B2B metric menu.
## Slicing dimensions, ranked by efficiency
Choose only dimensions the data actually carries; the Interview answers decide, and a dimension the data cannot carry is deleted from the spec with a line in Open items, never listed as an aspiration. Effort below is tagging discipline and standing classification maintenance, not query time.
- efficiency: `partner > partner type > product/plan > geography > device > landing page > creative`
- value: `partner type > partner > product/plan > landing page > geography > device > creative`
- effort (most first): `creative > landing page > partner type > product/plan > geography == device == partner`
Partner type - content, coupon, cashback/loyalty, sub-network, influencer, email, PPC - is the highest-value slice, because it is what separates demand creation from demand capture and therefore what drives every repricing decision. It is not the highest-efficiency one: the classification has to be maintained as partners change methods and sub-networks blend several, which is a standing job the partner slice does not carry.
Build the partner slice because it is free, and build partner type because it is the one that pays. Geography, device and partner tie on effort because all three arrive as attributes of the click or order record already being stored - no tagging convention, no maintenance.
**What the efficiency order starves: landing page and creative.** Both need tagging discipline at link-creation time, so they lose every ratio round - and they are the only slices that tell a content partner _why_ their traffic converts. Promote them when the program funds placements or creative feeds, or when partner optimization support is itself part of the offer.
## Cadence
Match refresh and review to each tier's own volatility; one refresh rate for the whole dashboard is a defect. Four-band structure [VENDOR, converging with generic dashboard practice]:
| Cadence | Reviewed | Drives |
| ---------------- | ---------------------------------------------------------------------------------------------------- | -------------------------------------------- |
| Continuous/daily | Operational: EPC, reversal %, pending vs approved, single-partner share, compliance flags | Spike response, holds |
| Weekly | Acquisition: new partners onboarded, conversion-to-active rate, tail activation | Recruiting and activation pushes |
| Monthly | Performance: attributed net revenue, cost of sale, active-partner count, new-to-file, tier movements | Tier and budget decisions |
| Quarterly | Portfolio: top-1/5/10% concentration, cohort curves, incrementality findings, partner mix | Commission architecture, partner development |
Review means a named ritual - who looks, in which meeting, deciding what - not just a data refresh. Route deep quarterly per-partner reviews to the partner-performance scorecard skill; this dashboard feeds them.
The four bands carry no efficiency ordering, deliberately. They are not competing options for one job - each band exists because a different tier of metric moves at a different speed, and dropping one loses that tier's decision rather than saving effort. Build all four; rank the metrics inside them instead.
## Alert design
- Every alert carries four fields:
- Threshold
- Owner
- Delivery channel
- Expected response time
A threshold with no owner is decoration.
- Prefer rolling-baseline dynamic thresholds over static ones - static thresholds cause alert fatigue and get ignored. Example anomaly rule: flag when a value deviates more than 2 standard deviations from its 30-day rolling mean.
Alerts compete for one scarce resource - the team's willingness to keep reading the strip - so ship them in this order and stop when attention runs out. Effort is build time plus the standing job of keeping the rule from crying wolf.
- efficiency: `reversal-rate spike > single-partner share spike > click-to-conversion anomaly > EPC drop > brand-bidding flag`
- value: `reversal-rate spike > brand-bidding flag > single-partner share spike > click-to-conversion anomaly > EPC drop`
- effort (most first): `brand-bidding flag > click-to-conversion anomaly == EPC drop > single-partner share spike > reversal-rate spike`
The anomaly and EPC-drop alerts tie on effort because they are one rolling-baseline rule over two numerators - build either and the second is a copy. Reversal-rate spike leads outright: it fires on money already at risk and reads off a state the platform maintains anyway.
**What the efficiency order starves: the brand-bidding/trademark flag.** It needs standing SERP monitoring or a licensed tool, so it loses every round despite guarding real margin and a trademark position. Promote it the moment the program pays PPC partners at all, or after the first trademark complaint - by then the alert is retroactive.
The last two are fraud-adjacent: the dashboard surfaces them; rule definitions and enforcement belong to the fraud-detection skill. Alert catalogue [SYNTH].
- Annotate every chart with validation-window changes and program-term changes - an unexplained step in a trend line wastes an investigation.
- Keep an alert log (fired, acknowledged by, resolved in) - alert response time is itself a health metric for the operating rhythm.
references/metric-definitions.md›
# Metric Definitions
The catalogue to pick spec rows from, ranked. A dashboard that shows everything shows nothing, so the question is never which metrics exist but which three to add after the floor.
The incrementality vocabulary (Incrementality, Baseline Conversions, Model Validation) and the ROAS/ROI split (ROAS = Attributed Revenue / Media Cost; ROI = Attributed Revenue / (Media Cost + COGS)) come from platform glossaries [VENDOR]. They are foundational because they are explicit and internally consistent, not because a program runs on that platform - apply them whatever the tooling.
Provenance tags:
- [VENDOR]: platform/network/agency figure.
- [TRADE]: trade-body study.
- [SYNTH]: multi-source synthesis without published raw data.
- [DERIVE]: compute from the program's own history.
For every metric, resolve the competing definitions explicitly in the spec row: the disagreements below are exactly where cross-source comparison breaks.
## Table of Contents
- [The floor - not part of the menu](#the-floor---not-part-of-the-menu)
- [The menu, ranked by efficiency](#the-menu-ranked-by-efficiency)
- [New-to-file / new-customer rate](#new-to-file-new-customer-rate)
- [Reversal / return / chargeback rate](#reversal-return-chargeback-rate)
- [AOV (average order value)](#aov-average-order-value)
- [Click-to-conversion rate](#click-to-conversion-rate)
- [Active-affiliate rate](#active-affiliate-rate)
- [Time-to-first-conversion](#time-to-first-conversion)
- [EPC (earnings per click) - B2C only](#epc-earnings-per-click---b2c-only)
- [B2B only: trial-to-paid rate](#b2b-only-trial-to-paid-rate)
- [Partner-sourced vs partner-influenced revenue - B2B](#partner-sourced-vs-partner-influenced-revenue---b2b)
- [B2B only: churn-adjusted partner LTV](#b2b-only-churn-adjusted-partner-ltv)
## The floor - not part of the menu
These are not options. The Pass Threshold cannot be met without them, so they go on the spec before any ranking is consulted.
**Cost of sale / commission-to-revenue.**
- Formula: `(validated commission + network fees + agency fees + placement/tenancy fees + bonuses) / attributed net revenue`.
- Dispute: what sits inside the numerator. Most casual reporting excludes network fees (2-30% of commission value [VENDOR]) and agency fees (20-25% of budget [VENDOR]), understating true cost.
- Rule: include them all. An excluded fee is the single most common way a program reports itself cheaper than it is.
**Attributed ROAS vs attributed ROI.**
- Formula: ROAS = `attributed revenue / media cost`; ROI = `attributed revenue / (media cost + COGS)` [VENDOR - impact.com glossary].
- Rule: the same platform distinguishes them. Never use the terms interchangeably, and state whether COGS is in the denominator.
- Calibration only: 12:1 network-average ROAS [TRADE, 2018]; travel $19:1, retail $11:1 [TRADE, 2025]. Trade-body figures still come from member networks.
**Net program contribution.**
- Formula: `attributed net revenue - (validated commission + network fees + agency fees + placement fees)`.
- This is the headline profitability number; keep it on the top view.
**Top-N partner concentration.**
- Method: rank partners by validated attributed revenue for the period; top-N% share = revenue from the top N% of _active_ partners / total program revenue.
- Use the spec's active definition for the denominator population, and put the top-partner share on the executive view: concentration is a board-level risk, not an operator detail.
**B2B only: partner-sourced MRR/ARR.**
- Formula: MRR/ARR from partner-sourced accounts, normalized by billing interval (annual / 12, quarterly / 3), tracked separately from overall revenue.
- Reversals recur: churn and downgrades adjust it every cycle, so the number is only stable on validated billing events.
- Contribution is derived from it, which is why it sits on the floor rather than in the menu.
## The menu, ranked by efficiency
Effort here is analyst hours, data availability, reconciliation burden and standing maintenance - never a tooling price. Value is the decision the metric actually changes; a metric that changes no decision scores zero however cheap it is.
B2C ecommerce:
- efficiency: `new-to-file share > reversal rate > AOV by partner type > click-to-conversion > active-affiliate rate > time-to-first-conversion > EPC`
- value: `new-to-file share > reversal rate > AOV by partner type > active-affiliate rate > time-to-first-conversion > click-to-conversion == EPC`
- effort (most first): `time-to-first-conversion > new-to-file share > active-affiliate rate > AOV by partner type > reversal rate == click-to-conversion == EPC`
B2B SaaS:
- efficiency: `reversal rate > trial-to-paid by partner > new-to-file share > active-partner rate > click-to-conversion by stage > time-to-first-conversion > influenced-revenue split > churn-adjusted partner LTV`
- value: `churn-adjusted partner LTV > trial-to-paid by partner > new-to-file share > reversal rate > influenced-revenue split > time-to-first-conversion > active-partner rate > click-to-conversion by stage`
- effort (most first): `churn-adjusted partner LTV > influenced-revenue split > new-to-file share > trial-to-paid by partner > time-to-first-conversion > active-partner rate > reversal rate == click-to-conversion by stage`
Ties are real, not hedges. EPC and click-to-conversion answer the same question - is this partner's traffic worth its clicks - from the two sides of one fraction, so neither adds a decision the other missed. Reversal rate, click-to-conversion and EPC all read straight off an export the platform already produces: what they cost is agreeing the counting convention, not running the query, and that cost is identical for all three.
Why new-to-file leads in B2C and falls to third in B2B: in B2C it is computable from the orders database alone once the partner ID is stamped on the order, because "first-ever customer" is already in the customer's own order history. In B2B the same number needs a CRM join and survives cross-device identity loss, which is a quarter of work rather than a week.
**What the efficiency order starves: churn-adjusted partner LTV.** It is the only metric here that can settle a commission-architecture argument, and it loses every ratio round - a 24-month horizon means the program has to be old enough to have one, and the churn-adjusted revenue join is a standing job. Promote it anyway when a rate change or a recurring-commission cap is a live decision, or when finance disputes the program's payback. The same pattern in miniature applies to time-to-first-conversion: cheap-looking until you find the platform never retained link-activation timestamps.
Deleted, not demoted:
- **Average commission per active partner.** The mean hides exactly the skew that matters, and concentration is already on the floor - top-decile share and median answer the same question honestly. Reporting both invites the reader to quote the flattering one.
- **EPC in B2B.** Recurring commission accrues over a 21-60 day conversion lag, so the number moves for reasons unrelated to partner quality and no two people compute it the same way. It stays in the B2C menu.
- Any metric whose data the Interview says does not exist. Name it under Open items with what would make it computable; never park it in the spec as a wish.
Re-rank before proposing:
- A network that exports partner-type classification cleanly moves AOV-by-partner-type and the type mix up a rung.
- A warehouse already carrying billing and CRM collapses new-to-file's effort to near-zero.
- No analyst at all deletes everything below the third rung.
Entries below run in the B2C efficiency order, then the B2B-only metrics in theirs; on a B2B program read the shared entries against the B2B line above.
## New-to-file / new-customer rate
- Formula: `conversions from customers not previously in the customer file / total partner conversions`.
- Decides: whether checkout-adjacent partner types get repriced or reviewed - the largest money decision most programs have open.
- Costs: a week in B2C (stamp the partner ID at order creation, read first-ever-customer from order history); a quarter in B2B (CRM join, plus identity resolution).
- Limits: identity resolution and cross-device loss make the join imperfect - store the originating partner ID in billing/CRM metadata at order creation, not only in the tracking platform.
- High new-to-file with a weak repeat rate signals discount-driven one-off buyers, not durable acquisition [VENDOR].
- Doubles as the cheap incrementality proxy, with one hard limit worth stating on the tile: new-to-file proves the customer was not already yours, never that the partner caused the purchase. A coupon, cashback, or brand-search partner intercepting a buyer already heading to checkout scores as new-to-file. Treat it as the cheapest rung of the incrementality instruments, and climb to a holdout or geo-lift test only as far as the live decision needs.
## Reversal / return / chargeback rate
- Formula: `reversed conversions / total conversions` per period, on the validation-date basis.
- Decides: whether to hold a partner's payout, and whether a period is comparable at all - every trend on the dashboard inherits this.
- Costs: near-zero. The platform's own pending -> approved -> declined state machine already carries it; the work is declaring which state each metric counts.
- A period is comparable only after its validation window fully elapses.
- Above ~10% signals a quality problem [VENDOR]; band to the program's own history [DERIVE].
## AOV (average order value)
- Formula: `total order revenue / orders`. Disagreements: gross vs net of returns; tax and shipping in or out - rarely specified [SYNTH]. Spec net of returns, excluding tax/shipping, and say so.
- Decides: which partner types to recruit into and which to cap - sliced by partner type it separates discount-driven buyers from premium buyers [VENDOR]. Unsliced it decides nothing.
- Costs: an hour, plus the returns join.
- B2C-native. B2B analogue: initial contract value or first-year ACV per referred account.
## Click-to-conversion rate
- Formula: `conversions / clicks x 100`. Prefer unique clicks in the denominator and say so.
- Decides: whether one partner is shipping junk traffic. Diagnostic only - never a headline.
- Costs: near-zero from the existing export, once the click definition is declared.
- Published ranges run 0.5-3% [SYNTH] largely because "a click" (raw, unique, deduplicated, bot-filtered) varies per source.
- B2B variant: name which conversion - trial/demo signup and trial-to-paid are two separate rates, never one blended number.
## Active-affiliate rate
- Formula: `active affiliates / total enrolled x 100`.
- Decides: whether the next hours go to recruiting or to activating the partners already signed.
- Costs: an hour to compute, then a standing argument over the definition - that argument is the real cost.
- Disagreements on both terms [VENDOR]: what counts as active (a click, a sale, a live placement, a lead) and the window (30/60/90 days). Require a meaningful action - a conversion or live placement - within a fixed window, not a signup or lone click.
- Calibration only: 10-30% typical, over a third of programs below 20% [VENDOR survey]. Baseline from own history [DERIVE].
## Time-to-first-conversion
- Formula: median days from partner link activation to first validated conversion.
- Decides: where activation effort lands, and when to stop spending it on a partner.
- Costs: a week if link-activation timestamps are retained, a quarter if they must be reconstructed - check before promising the metric.
- Calibration only [SYNTH, directional]: ~14-day cross-program median; 1-4 days ecommerce vs 21-60 days B2B SaaS; a partner with no conversion in 60 days has ~3.7% lifetime probability of ever converting.
## EPC (earnings per click) - B2C only
- Formula: `validated commission / clicks`, in currency per click.
- Decides: little on its own. It ranks partners the leaderboard already ranks; keep it because partners themselves negotiate on it.
- Costs: near-zero, once the click convention is declared.
- Disagreements [VENDOR]: per-click vs per-100-clicks (some networks display per-100 because per-click is fractions of a cent; others per-single-click) vs per-visitor (commission / unique visitors, absorbing multi-click visitors). Declare which.
- Blended network EPC averages across all of a program's affiliates and predicts no individual affiliate's EPC - never set a partner target from it.
- Whether the click denominator is deduplicated or bot-filtered is rarely disclosed anywhere [SYNTH]; state the program's own click definition in the spec row.
## B2B only: trial-to-paid rate
- Formula: `referred trials converting to paid / referred trials started`, per cohort.
- Decides: which partners to keep paying - a partner with high trial volume and low trial-to-paid is shipping unqualified traffic, and no other metric on this list catches that.
- Costs: a week to a quarter, depending on whether product analytics already carries the partner ID at trial start.
- Published product benchmarks diverge materially by methodology and are not partner-channel-specific [VENDOR, conflicting] - derive per-partner-type baselines from own cohorts [DERIVE].
## Partner-sourced vs partner-influenced revenue - B2B
The sourced number is floor. The menu option is whether to add the influenced number at all.
- Sourced: the partner originated the deal/order. Influenced: the partner touched a deal originated elsewhere.
- Decides: how partner contribution is argued to an executive - and nothing operational, which is why it ranks low against its cost.
- Costs: a quarter. A CRM influence model has to exist, and the precedence rule has to survive a political argument before the tile is trustworthy.
- Report as two separate, capped numbers, never summed; sourced takes precedence when a deal qualifies for both [VENDOR consensus].
- Survey context: 67% of partner teams measure sourced revenue (the most-measured KPI); influenced ranks third at 54% [survey of 500+ partnership professionals, 2023].
## B2B only: churn-adjusted partner LTV
- Formula: `revenue from a partner's referred accounts over a fixed horizon (e.g. 24 months), net of churn / total payout to that partner over the matching period`.
- Decides: the commission architecture itself - what a partner is worth paying, and for how long.
- Costs: a standing job, and the program must be old enough for the horizon to exist. This is the starved rung; promote it on the conditions above, not by default.
- Calibration only: B2B SaaS LTV-to-payout ratios of 4.2x-9.5x are published [SYNTH]; derive the program's own horizon and ratio [DERIVE].
- Never substitute signup counts - churn-adjustment is the whole point.
references/roi-and-incrementality.md›
# ROI and Incrementality
How to tell caused revenue from claimed revenue. Last-click reporting credits every touched sale; incrementality measures what the program _caused_.
Every conversion is one of three:
- **Incremental**: created by partner exposure.
- **Non-incremental**: would have happened anyway.
- **Cannibalized**: shifted from another channel.
## Instruments, ranked by efficiency
Four instruments answer the same question at wildly different strengths and costs. Effort is analyst hours and the coordination a test needs, never a media budget; compliance cost is the review each one triggers and how hard it is to walk back.
- efficiency: `new-to-file screen > commission-reduction test > geo-lift test > holdout test`
- value: `holdout test > geo-lift test > commission-reduction test > new-to-file screen`
- effort (most first): `holdout test > geo-lift test > commission-reduction test > new-to-file screen`
- compliance cost (most first): `commission-reduction test > holdout test > geo-lift test > new-to-file screen`
Value and effort run in exactly the same order, which is the whole decision: the ratio picks the weakest instrument that still settles the live question, not the most defensible one. Start at the top and stop as soon as the answer changes what you would do.
- **New-to-file screen.** Standing, near-zero once the metric is on the dashboard: net-new customers are less likely to be captured demand. Limits: identity resolution and cross-device loss corrupt the join, and a customer on a second device reads as new. A proxy calibrates suspicion; only a test answers the question.
- **Commission-reduction test.** Step a checkout-adjacent partner's rate down; performance staying flat through reductions implies the conversions were non-incremental [VENDOR]. A week to run, near-zero to analyze - and the highest compliance cost here, because it unilaterally changes a partner's economics: check the notice and rate-change clauses in the program terms first, and expect the relationship damage to outlast the test. Run it before repricing coupon/cashback partners.
- **Geo-lift / matched-market test.** Pause or vary the program in matched geographies when user-level randomization is unavailable. A quarter, mostly waiting for enough periods to read. Defensible externally as a market decision, so it carries the least contractual exposure of the three tests.
- **Holdout / lift test.** Withhold partner exposure from a randomized 5-10% of traffic and compare conversion against the exposed group [VENDOR]. The gold standard; needs user-level scale and engineering to suppress exposure cleanly. Partners can end up uncredited for traffic they drove, which is a program-terms and network-policy question before it is a statistics question - disclose the design rather than running it quietly.
**What the efficiency order starves: the holdout test.** It is the only design that yields an incremental number finance will accept, and it loses every ratio round. Promote it when a repricing or budget decision worth more than the build is blocked on the answer, when user-level scale exists, and when the program's incrementality is already contested - a proxy will not end that argument.
Deleted, not demoted: running any test at all on a program too small for its arm to reach significance. Below that scale the answer is noise dressed as evidence; stay on the new-to-file screen and the partner-type mix, and say so in Open items.
Re-rank against what is already there: an experimentation platform already running product holdouts collapses the holdout test's effort to a week, and a program already split across matched markets makes geo-lift the cheapest real test rather than the second-costliest.
Lift-test data suggests that when cannibalization occurs, revenue usually redistributes to top-of-funnel content partners rather than to other channels [VENDOR] - cutting a low-incrementality partner rarely destroys the demand.
## Last-click failure modes
- Checkout-adjacent partners - coupon, cashback, browser extensions - sit at the last click and collect credit on demand other channels created. Last-click-only program ROI systematically inflates them and starves content partners.
- Reference case: the Honey browser extension.
- The Honey browser extension (acquired by PayPal) injected its own affiliate cookie at checkout, overriding creators' earlier attribution.
- A widely-viewed exposé published December 21, 2024 made it the canonical example; PayPal defended the practice as "industry-standard last-click attribution".
- Google's Chrome Web Store policy update of March 11, 2025 now bars extensions from inserting affiliate links "when no discount, cashback, or donation is provided".
- Litigation and network removals followed into 2025-2026.
- The lesson for the spec: a dashboard whose ROI is last-click-only cannot distinguish that pattern from genuine performance. Pair ROI with new-to-file share by partner and schedule incrementality tests for checkout-adjacent partner types.
- Route the response correctly: low incrementality is a repricing decision (commission-structure territory), and attribution manipulation is a fraud-rule decision (fraud-detection territory). The dashboard surfaces the signal; it decides neither.
## Sourced vs influenced
- Report partner-sourced and partner-influenced revenue as two separate, capped numbers. Never sum them; a deal qualifying for both counts as sourced only.
- Influenced revenue is a directional advocacy metric, not bookable channel revenue - cap it visually (its own tile, never inside a revenue total).
## The one big published study - cite only with its caveat
- CJ Affiliate (2019) [VENDOR]:
- 46% higher shopper-to-customer conversion for affiliate-exposed shoppers.
- 29% higher spend per customer.
- 88% higher revenue per shopper.
- Sample: 20.2M shoppers (1.1M affiliate-exposed vs 19.1M not), September 2018 data.
- Caveat travels with the numbers: it is vendor-published marketing using an observational test/control split, not a randomized holdout. Use it to justify running a real test, never as the program's own incrementality figure.
## Specifying ROI on the dashboard
- Net program contribution = `attributed net revenue - (validated commission + network fees + agency fees + placement fees)`. This is the headline profitability number; keep it on the top view.
- State the attribution basis on the ROI tile itself (e.g. "last-click, 60-day cookie") - an ROI number without its attribution basis is unreproducible.
- Show attributed ROAS and attributed ROI as distinct rows with distinct denominators: ROAS = `attributed revenue / spend`; ROI = `(attributed revenue - cost) / cost x 100`. Same numerator, different denominators - presenting one and labelling it the other is the most common tile error.
references/worked-examples.md›
# Worked Examples
Two full specs and one negative example. Every target and threshold below tagged [DERIVE] is illustrative - recompute from the program's own history before adopting.
## Table of Contents
- [B2B SaaS spec - project-management tool, 350 partners, 20% recurring for 12 months, 90-day cookie, 60-day validation](#b2b-saas-spec---project-management-tool-350-partners-20-recurring-for-12-months-90-day-cookie-60-day-validation)
- [B2C ecommerce spec - apparel store, 900 affiliates, 10% CPA on order value, 30-day cookie, 45-day validation](#b2c-ecommerce-spec---apparel-store-900-affiliates-10-cpa-on-order-value-30-day-cookie-45-day-validation)
- [Negative example - do not deliver this spec](#negative-example---do-not-deliver-this-spec)
## B2B SaaS spec - project-management tool, 350 partners, 20% recurring for 12 months, 90-day cookie, 60-day validation
```
DASHBOARD SPEC - Acme PM affiliate program
Header : audiences: exec (monthly) + program ops (daily); source of truth: billing
system (platform numbers reconciled to it); UTC, validation-date basis,
USD, 60-day validation window
Metrics :
Net program contribution | attributed net MRR-derived revenue - (validated commission
+ platform fee + agency fee), calendar month, validated only | Business | Billing
| tile + 13-mo line | > $0 and growing | 2 consecutive down months | [DERIVE]
Cost of sale | (validated commission + all fees) / attributed net revenue, monthly
| Business | Billing | tile | <= 25% [DERIVE] | > 30% | [DERIVE]
Partner-sourced MRR | MRR from partner-sourced accounts, billing-interval normalized,
monthly | Business | Billing+CRM | line | growth trend | -10% MoM | [DERIVE]
Partner-sourced vs influenced ARR | two capped numbers, sourced precedence, quarterly
| Business | CRM | paired tiles | n/a | never summed | rule, [VENDOR consensus]
Trial-to-paid rate | referred paid conversions / referred trials, per monthly cohort,
unique accounts | Input | Product analytics | cohort bars | own baseline | -2 SD
vs 6-mo mean | [DERIVE]
New-to-file share | net-new accounts / partner-sourced accounts, monthly | Input
| CRM join | line | >= 60% [DERIVE] | < 45% | [DERIVE]
Active-partner rate | partners with >= 1 validated conversion in 90 days / enrolled,
monthly | Health | Platform | tile | own band | < 15% | [DERIVE]
Churn-adjusted partner LTV ratio | 24-mo referred revenue net of churn / first-year
payout, quarterly | Health | Billing | table by partner type | >= 4x | < 3x |
[SYNTH calibration 4.2-9.5x; band is ours]
Reversal rate | reversed / total conversions, validation basis, monthly | Health
| Platform | line vs band | < 3% | > 5% | [DERIVE]
Top-5-partner share | top-5 validated revenue / program revenue, quarterly | Health
| Billing | tile on exec view | < 50% | >= 50% | threshold [VENDOR], band [DERIVE]
Views : exec: contribution, cost of sale, sourced MRR, top-5 share -> revenue trend
+ partner-type mix -> sourced/influenced pair -> alert strip
ops: trial-to-paid, signup conv rate, reversal, pending vs approved,
1-partner share
-> daily conversions -> partner leaderboard -> alert strip
Dimensions: partner, partner type, plan, geography
Cadence : daily ops / weekly acquisition / monthly business review (program owner
+ finance) / quarterly portfolio review (adds VP)
Alerts : reversal spike > 2 SD vs 30-day mean -> program owner, chat channel, 24h;
single-partner share +10pt in 7 days -> program owner, chat, 24h;
trial-to-paid cohort -2 SD -> partner manager, weekly review, 1 wk
Open items: influenced-ARR definition awaiting CRM field; agency fee allocation
awaiting finance confirmation
```
Why it passes:
- Contribution, cost of sale, and top-5 share sit on one exec view.
- Every row states formula, window, counting method.
- Every alert has owner/channel/response time.
- Vendor numbers appear only as calibration tags.
Two ranking calls are visible in it. EPC is absent because recurring commission makes it uninterpretable in B2B. Churn-adjusted LTV is present despite being the starved rung, because the 12-month recurring cap is up for renegotiation: the promoting condition, stated rather than assumed.
## B2C ecommerce spec - apparel store, 900 affiliates, 10% CPA on order value, 30-day cookie, 45-day validation
```
DASHBOARD SPEC - Riverline Apparel affiliate program
Header : audiences: marketing director (monthly) + affiliate manager (daily);
source of truth: order database (network export reconciled to it);
America/New_York, transaction-date basis for orders and validation-date
for payables, USD, 45-day validation window
Metrics :
Net program contribution | attributed net revenue (net of returns, excl. tax/shipping)
- (validated commission + network fee + placement fees), monthly | Business |
Orders DB | tile + line | positive, seasonal-adjusted | 2 down months | [DERIVE]
Attributed ROAS vs ROI | ROAS = attributed rev / program spend; ROI adds COGS;
both monthly, labeled "last-click, 30-day cookie" | Business | Orders DB + finance
| paired tiles | own baseline | -20% vs 3-mo mean | formulas [VENDOR glossary]
New-to-file rate | first-ever customers / affiliate orders, order-level, monthly
| Input | Orders DB | line by partner type | >= 35% [DERIVE] | < 25% | [DERIVE]
AOV net of returns | net order revenue / orders, excl. tax+shipping, monthly, by
partner type | Input | Orders DB | bars | own baseline | n/a | [DERIVE]
Click-to-conversion | orders / unique clicks x 100, 30-day window | Input | Network
+ orders | line | own baseline | -2 SD vs 30-day mean | [DERIVE]
EPC | validated commission / unique clicks (per-click, bot-filtered), weekly | Input
| Network | line | own baseline | -2 SD | convention declared, [DERIVE]
Active-affiliate rate | affiliates with >= 1 validated order in 60 days / enrolled,
monthly | Health | Network | tile | own band | < 12% | [DERIVE]
Reversal rate | reversed / total orders, validation basis, monthly | Health | Orders
DB | line vs band | < 8% | > 10% | red line [VENDOR], band [DERIVE]
Top-10% share | top-decile validated revenue / program revenue, quarterly | Health
| Orders DB | exec tile | own band | top 5 partners >= 50% | [VENDOR threshold]
Checkout-adjacent share | coupon+cashback+extension validated revenue / program
revenue, monthly | Health | Network | stacked area | own band | +10pt in a quarter
-> incrementality review | [DERIVE]
Views : exec: contribution, ROAS/ROI, new-to-file, top-10% share -> revenue trend
+ partner-type mix -> alert strip
ops: EPC, conv rate, reversal, pending vs approved, 1-partner share ->
daily orders -> affiliate leaderboard w/ new-to-file column -> alert strip
Dimensions: partner, partner type, product category, device, landing page, creative
Cadence : daily ops / weekly acquisition + creative review / monthly performance
(director) / quarterly concentration + commission-reduction test readout
Alerts : reversal spike > 2 SD vs 30-day mean -> affiliate manager, chat, same day;
single-partner share spike -> manager, chat, 24h; brand-bidding flag ->
manager, email, 48h (rule owned by fraud rule set)
Open items: cross-device loss unquantified; return-reason codes not yet in export
```
Why it passes:
- The return-window reversal driver, order-level counting, and checkout-adjacent share are all explicit.
- The ROI tile carries its attribution basis.
- The incrementality review is scheduled, not implied.
- Landing page and creative appear among the dimensions, the starved pair, because this program funds creative feeds and offers partners optimization help.
- Geography is absent rather than parked, since the store ships one market.
## Negative example - do not deliver this spec
> "Headline KPIs: total clicks (target 1M/month), affiliate signups (target 200/month), and gross commissions earned. Program ROI = revenue tracked by the network / commissions, currently 14:1 - well above the industry's 12:1, so the program is healthy. All partners in one leaderboard, refreshed live. Alert: email the team if daily revenue falls below $10,000."
Line by line:
- Clicks and signups as headline KPIs are vanity metrics informing no decision; 90 of 200 signups never activating would be invisible. Demote to diagnostics; headline contribution and cost of sale.
- Gross commissions overstate cost and revenue at once; reversals and the validation window vanish. Validated only, pending shown separately.
- Network-tracked revenue over commissions is last-click-only, fee-free, COGS-blind, and computed on the claimant's own numbers - it inflates checkout-adjacent partners and ignores the source of truth. Reconcile to orders/billing; include all fees; label attribution basis.
- Beating "the industry's 12:1" adopts a trade-body average - drawn from member networks - as the program's own target. Calibration only; derive baselines from history.
- No concentration view: one super-affiliate could be 40% of revenue and its loss invisible until it happens. Top-N share on the exec view, quarterly.
- One live leaderboard for everyone is a single view with a single refresh rate: executives get noise, operators get no alert design. Two views, tiered cadence.
- A static $10K floor fires all winter and never in summer - alert fatigue, then a real drop gets ignored. Rolling-baseline threshold with owner, channel, response time.
SKILL.md›
---
name: affiliate-performance-dashboard
description: Define the metric set and layout for an affiliate performance dashboard, delivered as a dashboard specification document - metric definitions with explicit formulas, views per audience, refresh and review cadence, and alert thresholds for top affiliates, conversion by source, and program ROI. Covers B2B SaaS recurring revenue-share and B2C ecommerce order-level CPA programs. Use whenever the user mentions affiliate program reporting, affiliate KPIs, affiliate ROI, revenue concentration, or what to put on an affiliate dashboard, even if they never say dashboard. Specifies metrics, never builds them in a BI tool. Do NOT use for one creator campaign's measurement plan - use mbfinotti/partnerships-skills@influencer-measurement-framework instead.
license: MIT
metadata:
author: Maya-Beth Finotti
version: "1.4.5"
---
# Affiliate Performance Dashboard
Define what an affiliate program dashboard measures and how it is laid out, then deliver a dashboard specification document. The spec - not a built dashboard - is the artifact: whoever owns the BI tooling implements it from the spec.
No canonical affiliate-dashboard framework exists, and metric definitions are not standardized: no standards body enforces them, IAB and the PMA publish guidance only. Say this plainly to the user; never present a branded framework that does not exist.
The method borrows four established things and nothing else:
- **Incrementality measurement**, via holdout and geo-lift testing, resting on explicit definitions of incrementality, baseline conversions, and model validation.
- **Attributed ROAS vs attributed ROI split**, where ROAS divides attributed revenue by media cost and ROI divides it by media cost plus COGS.
- **Sourced vs influenced separation rule**.
- **Tiered metric hierarchy plus good-metric criteria**, from Croll & Yoskovitz's _Lean Analytics_: a metric must be comparative, a ratio or rate, understandable, and behavior-changing.
The platform glossary behind the first two definitions is named in [references/metric-definitions.md](references/metric-definitions.md), not here; the definitions are the skill's operative ones regardless of which platform the program runs on.
## Ground Rules
- Report validated/approved commission and net revenue, never gross - gross is the bigger number and the most-named practitioner error.
- Give every metric a one-sentence definition naming numerator, denominator, window, timezone, and counting method. A definition that cannot fit one sentence is theater.
- Provenance-tag every benchmark: vendor, trade body, synthesis, or the program's own derived baseline. Nearly all published affiliate benchmarks come from parties with an incentive to inflate the channel.
- Never sum partner-sourced and partner-influenced revenue; report them as two separate, capped numbers.
- Never compare two periods with different validation windows - reversal lag makes the recent one look artificially good.
- Keep fraud and compliance signals on the same view as performance, never in a separate tool - daily decision-makers need both at once.
## Interview
Ask before specifying anything, following these rules:
- One question per message.
- Multiple-choice where possible.
- Skip anything already answered.
- B2B SaaS, B2C ecommerce, or both?
- Program size and maturity: active partner count, monthly commission spend, program age?
- Who reads the dashboard - executive, operator, or both - and what decision should it drive?
- Commission model, and is any of it recurring?
- Validation/locking window length and clawback policy?
- Attribution model and cookie window?
- Which data sources exist - affiliate platform, billing/orders, CRM, warehouse - and does the partner ID reach billing or orders at all?
- Is partner type / promotional method captured per partner?
- Is new-vs-returning customer captured per conversion?
- Refresh capability and tooling constraints - live queries, daily batch, manual export?
- Current pain: what question can the program not answer today?
- Reporting cadence today, and which review meetings already exist?
- By what date must the first version be in front of its readers?
- One-off win - settle one contested question now - or a compounding asset the program is run from every week?
- Effort ceiling: analyst hours available, who owns the data join, and whether standing maintenance is fundable at all?
Those last three answers re-rank every option menu in this skill and its references. Say out loud which answer moved which option:
- A near date pins the spec to the orders spine and deletes every metric needing a join that does not exist yet.
- A compounding mandate promotes the customer-file join, cohort views, and churn-adjusted partner LTV.
- A thin effort ceiling deletes the modeled warehouse, the brand-bidding alert, and the creative slice outright rather than parking them at the bottom of the spec.
Every ranking here is a default, not a law - it shifts with context and with who executes it. Re-rank against what you already know about this user: a network that exports partner classification cleanly, a warehouse already loaded with billing and CRM, or no analyst at all each move different rungs.
## Workflow
1. Run the Interview; collect every answer the spec depends on.
2. Fix the source of truth and write the comparability contract - event definition, date basis, timezone, currency, counting method - before specifying any metric. Every later number inherits these choices; changing them afterwards invalidates all history. Three data foundations compete here, ranked by value per unit of effort, where effort is reconciliation work and standing maintenance:
- efficiency: `billing/orders spine > customer-file join > modeled warehouse`
- value: `modeled warehouse > customer-file join > billing/orders spine`
- effort (most first): `modeled warehouse > customer-file join > billing/orders spine`
Three costs distinguish these foundations:
- The spine: a week of reconciling the platform export against orders or billing, then near-zero standing cost.
- The customer-file join: a quarter, because the partner ID has to be stamped at order or account creation before new-to-file and sourced-vs-influenced are computable at all.
- The modeled warehouse: a standing job.
Default to the spine and climb only when a named decision needs it.
Deleted, not demoted: the affiliate platform's own export as source of truth. Those are the claimant's numbers, so no effort saving redeems them; the platform stays the source for clicks and traffic, reconciled to the money spine.
What this order starves is the modeled warehouse: highest value, loses every round. Promote it when the program's live question is incrementality rather than reporting, or when one repricing decision moves more money than the build costs.
3. Select the metric tier set: business/headline tier, input/driver tier, health/guardrail tier.
Four metrics are floor rather than choice, because the Pass Threshold cannot be met without them:
- Net program contribution
- Cost of sale
- Top-N partner concentration
- Partner-sourced MRR/ARR in B2B
Everything beyond that floor is a menu: take the top rungs of your segment's efficiency order in [references/metric-definitions.md](references/metric-definitions.md), which ranks B2B and B2C separately and names what each order starves. Reject any metric failing the four good-metric criteria, and stop adding rungs before the dashboard shows everything and therefore nothing. Delete every metric whose data the Interview says does not exist, naming it under Open items instead of leaving it in the spec as a wish.
4. Write each metric's spec row (see Output Shape), resolving every competing definition explicitly - the chosen numerator, denominator, window, and counting method go in the row, not in anyone's head.
5. Choose the slicing dimensions the program's data can actually support, in the efficiency order of [references/layout-cadence-and-alerts.md](references/layout-cadence-and-alerts.md): `partner > partner type > product/plan > geography > device > landing page > creative`. Partner type is not the cheapest slice and is the one that pays - build it anyway.
6. Lay out one view per audience: executive and operator views differ in metrics, not just detail level.
7. Set refresh and review cadence per tier - each tier has its own natural rhythm; one refresh rate for the whole dashboard is a defect.
8. Set alert thresholds, each with an owner, a channel, and an expected response time; prefer rolling-baseline dynamic thresholds over static ones. Ship them in the efficiency order of [references/layout-cadence-and-alerts.md](references/layout-cadence-and-alerts.md) - `reversal-rate spike > single-partner share spike > click-to-conversion anomaly > EPC drop > brand-bidding flag` - and stop when the team's attention runs out rather than filling the strip.
9. Derive the program's own baselines from its history; adopt no vendor benchmark as a baseline. Published figures calibrate expectations only ([references/concentration-and-cohorts.md](references/concentration-and-cohorts.md), [references/roi-and-incrementality.md](references/roi-and-incrementality.md)).
10. Validate the spec with the user section by section - definitions, then views, then cadence, then alerts - before assembling the final document. Ground it in a matching worked example from [references/worked-examples.md](references/worked-examples.md).
11. Check the Pass Threshold below; iterate until every criterion holds.
12. If your harness has persistent memory, memorize the comparability contract, agreed metric definitions, and derived baselines so later runs start from them instead of re-negotiating.
## Output Shape
Deliver every spec as this artifact:
```
DASHBOARD SPEC - <program>
Header : program, audiences, source of truth, period conventions
(timezone, date basis, currency, validation window)
Metrics : one row per metric -
Metric | Definition (formula, window, counting method) | Tier | Source |
Visualization | Target | Alert threshold | Provenance
Views : layout per audience - KPI tiles (value + delta vs stated prior period)
-> trend/composition charts -> leaderboard/detail table -> alert strip
Dimensions: slicing dimensions (partner, partner type/promotional method, product,
geography, device, landing page, creative)
Cadence : tier -> refresh rate + review ritual (who reviews, when, deciding what)
Alerts : register - metric | trigger | owner | channel | expected response time
Open items: data gaps, unconfirmed definitions, metrics and dimensions deleted
because the data or the effort ceiling rules them out, and what would
make each computable; questions for the next revision
```
Record in the header which data foundation was chosen and what moved it there - a later reader cannot re-derive that choice from the metric rows alone.
Full worked examples live in [references/worked-examples.md](references/worked-examples.md), never inline.
## Pass Threshold
The spec passes only when a program owner can answer at a glance: _is this program profitable, and who drives it_. Concretely, all six must hold; iterate until they do:
- Every headline number is reproducible from its written formula by someone who did not build the dashboard.
- Net program contribution - validated commission plus network/agency fees against attributed net revenue - is visible without leaving the top view.
- Top-partner concentration is visible on that same top view.
- Every metric on the dashboard has a named decision it informs; drop it otherwise.
- Zero metrics whose definition cannot be stated in one sentence.
- Every metric, dimension and alert that did not make the spec appears under Open items with what would make it computable - nothing was silently parked at the bottom.
## B2B SaaS vs B2C Ecommerce
These apply identically to both:
- The comparability contract
- Metric tiering
- Concentration analysis
- Cadence discipline
- Alert design
- Validated-not-gross reporting
What genuinely diverges:
- **Revenue object.** B2B tracks partner-sourced MRR/ARR and churn-adjusted partner LTV; B2C tracks order-level CPA, AOV, and basket composition.
- **Funnel.** B2B adds trial-to-paid as a second conversion stage plus deal-registration and MQL/SQL pipeline stages; B2C is click to order, with new-to-file as the extra dimension.
- **Windows.** B2B cookie windows run 60-180 days for long cycles; B2C defaults to ~30 days, and coupon/cashback traffic runs shorter still. `mbfinotti/partnerships-skills@affiliate-commission-structure` owns these ranges - read a window against its numbers, never against a second set stated here.
- **Reversal driver.** B2B: trial failure, refund, downgrade, churn - recurring commission makes reversal a per-cycle event. B2C: returns and chargebacks inside the return window.
## Failure Modes
| Defect | Consequence | Fix |
| ------------------------------------------------------ | ------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| Vanity metrics headline (clicks, impressions, signups) | Dashboard looks busy; informs no decision | Every metric needs a named decision; demote counts to diagnostics |
| Gross commission reported instead of validated | Program looks more expensive and more productive than it is | Headline validated/approved only; show pending separately |
| Last-click-only program ROI | Coupon/cashback/extension partners inflate; content partners starve | Add new-to-file share and incrementality tests; report sourced vs influenced separately |
| No concentration view | One partner's exit erases a large revenue share unseen | Top-1/5/10% share on the executive view, reviewed quarterly |
| Pending and approved states mixed | Totals unreproducible; trends meaningless | Comparability contract fixes the state per metric |
| Reversal lag ignored | Recent periods look artificially good | Compare only fully-validated periods; flag immature ones |
| Periods with different validation windows compared | False trend in either direction | Never compare them; annotate window changes on every chart |
| Sub-network counted as many partners | Partner counts and concentration both distorted | Count one credited entity per conversion; break out sub-networks separately |
| Sourced + influenced summed | Double-counted partner revenue | Two capped numbers; sourced takes precedence when a deal qualifies for both |
| Network/agency fees excluded from cost of sale | True program cost understated | Cost of sale includes commission, network, agency, and placement fees |
| Vendor benchmark adopted as the program's baseline | Targets and alerts miscalibrated in both directions | Derive baselines from the program's own history; tag vendor numbers as calibration only |
| Static alert thresholds | Alert fatigue; team ignores the strip | Rolling-baseline dynamic thresholds with owner, channel, response time |
| Metric with no decision attached | Review meetings recite numbers and decide nothing | Name the decision in the spec row or delete the metric |
These rows carry no efficiency ordering, deliberately. Each is a defect with one fix, not a menu of competing fixes for one problem - ranking them would rank the reader's symptoms rather than their options. Apply every row that matches.
## Invocation Examples
- "Our SaaS affiliate program pays 20% recurring across 400 partners. Leadership asks every month whether it's profitable and I can't answer. Spec a dashboard for us."
- "I run an ecommerce affiliate program on last-click and the coupon sites look like heroes. Define the metrics and views for a program dashboard my team reviews weekly."
- "Write an affiliate program KPI spec for a program spending $80K/month in commissions - what we track daily vs monthly, with alert thresholds and owners."
## Reference
- Read [references/metric-definitions.md](references/metric-definitions.md) when writing metric spec rows - formulas, where credible sources disagree, B2B/B2C variants, provenance.
- Read [references/roi-and-incrementality.md](references/roi-and-incrementality.md) when specifying ROI metrics or judging checkout-adjacent partners - test designs, proxies, last-click failure cases.
- Read [references/concentration-and-cohorts.md](references/concentration-and-cohorts.md) when adding concentration views, lifecycle stages, and recruitment-cohort analysis.
- Read [references/layout-cadence-and-alerts.md](references/layout-cadence-and-alerts.md) when laying out views, choosing dimensions, and designing cadence and alerts.
- Read [references/worked-examples.md](references/worked-examples.md) when shaping the deliverable - one B2B SaaS spec, one B2C ecommerce spec, one negative example.
- See `mbfinotti/partnerships-skills@affiliate-payout-audit` for pre-disbursement accuracy of one payout run - this skill tracks the ongoing program, not a run.
- See `mbfinotti/partnerships-skills@affiliate-fraud-detection` for the fraud rule set - this dashboard surfaces its signals but never defines the rules.
- See `mbfinotti/partnerships-skills@partner-performance` for B2B channel-partner scorecards and QBR structure - out of scope here.
- See `mbfinotti/partnerships-skills@affiliate-program-terms` for the contract clauses behind validation windows and clawbacks.