Use this skill when an agency operator wants a single headline view of revenue across every brand and every network in their book — the agency's home dashboard. Trigger on: "How is the whole book doing this week?", "Show me revenue across all clients", "Portfolio summary", "Which brands are trending down this month?".
How this skill is triggered — by the user, by Claude, or both
Slash command
/affiliate-networks-mcp:agency-portfolio-rollupThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are producing a portfolio-wide rollup across every brand the agency has bound, on every network those brands are bound to.
You are producing a portfolio-wide rollup across every brand the agency has bound, on every network those brands are bound to.
Call affiliate_resolve_brand with no arguments. The response is an array of { brand, network, networkBrandId } bindings — one row per (brand, network) pair.
If the array is empty, tell the user no brands are registered and point them at affiliate-networks-mcp setup. Stop.
Call affiliate_list_client_strategies once. It returns one row per slug with hasStrategy / hasKpi / registered / orphan. For each registered brand in the book with either hasStrategy or hasKpi, call affiliate_get_client_strategy({ brand }) to load its kpi.targets and strategy framing. Skip registered brands with no plan.
Keep a count of how many registered brands in the book have no plan recorded; it drives the coverage line in Step 5. If affiliate_list_client_strategies returns orphan rows, mention them in the coverage line and do not invent network data for them. This context is advisory: it adds a verdict and a coverage prompt; it never changes the figures.
If kpi.parseErrors is non-empty for a loaded brand, report each malformed line verbatim in the coverage/failures area and exclude it from verdicts. Never guess what the target meant.
Default period: the last 7 days, ending today. Honour explicit user windows ("this month", "Q1", named dates).
Compute a comparison window of the same length immediately prior. Express all dates as ISO YYYY-MM-DD. Surface both windows in the final report so the user can confirm.
For each (brand, network) binding, call the network's performance tool twice — current window and comparison window. Tool names follow affiliate_<network>_get_programme_performance:
affiliate_impact-advertiser_get_programme_performance({ brand, from, to })Issue these in parallel — the chassis resolves brand to the correct networkBrandId per call. Do not serialise unless rate limits force it.
Each call returns ProgrammePerformanceRow[] with publisherId, publisherName, clicks, conversions, grossSale, commission, currency, status.
If a binding fails, capture the verbatim error (network, operation, message, httpStatus). Do not treat a failure as zero. Continue with the rest and report the gap under the affected brand's line.
The user thinks in brands. Sum each brand's bindings together for the headline. If a brand spans multiple currencies across its networks, keep each currency on its own sub-line — do not invent FX.
For each brand:
grossSale, commission, conversions, clicks.grossSale.Output in this order:
from YYYY-MM-DD to YYYY-MM-DD and comparison from YYYY-MM-DD to YYYY-MM-DD (each with day count).grossSale desc. Each row: brand name, gross sale, commission, conversions, delta (currency and percent). For a brand with a revenue target, add a short verdict against the plan (on track / behind / ahead). When the target has a period, show pace to target, for example "behind: GBP 268k of GBP 400k quarter, about 7% short on run-rate". When the target has no period, compare the current-window total and say no period was recorded. Where a target's metric is unsupported on a brand's bound network, say so rather than guess. If a brand had errors on one or more networks, append the per-network errors verbatim at the end of its row; never silently drop data.grossSale is down more than 20% vs. the comparison window, or that is behind a recorded KPI target. One line each: brand, current vs. comparison figure (or target gap), percent delta. A brand down in a channel its strategy deprioritised can be noted as lower concern only when the row data or publisher name makes that partner type evident.Others (N brands, <total>, <percent delta>) line per currency.Matter-of-fact tone, UK spelling. Keep the table compact.
currency. Per-brand totals stay in the currency of their underlying rows. Across-brand totals stay per-currency.client-onboarding to record a plan for a brand surfaced by the coverage line.programme-performance-report when the user drills into a single brand from the rollup.affiliate_resolve_brand({ network: "<slug>" }) if the user wants to scope the rollup to a single network.npx claudepluginhub bobberrisford/affiliatemcp --plugin affiliate-networks-mcpSearches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.