plugins/adobe-analytics/skills/aa-executive-briefing/SKILL.md
Generates a concise, executive-ready performance summary covering key metrics, trends, and what's driving movement. Use this skill when someone needs to produce a briefing, executive summary, performance narrative, or stakeholder readout — for example, "write an exec summary of last week's performance," "create a performance briefing for our leadership team," "produce a monthly business review summary," "what should I tell executives about our metrics," or "generate a performance narrative." Also trigger for "QBR summary," "weekly business review," or "stakeholder briefing."
npx skillsauth add adobe/skills aa-executive-briefingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate a concise, executive-ready performance summary with narrative context, metric highlights, and key drivers. Designed for leadership audiences — no raw data dumps, just clear signals and business implications.
Key parameter facts validated during implementation:
runReport→metricIds(plural), notmetricId; dates asYYYY-MM-DDTHH:mm:ssfindMetrics→expansionsis a required parameter (use"componentType")describeAa→ parameter isguideType, notguide;REPORT_SUITE_CONTEXT_GUIDEmay return empty for some report suites — skip gracefully and proceedmetrics/uniquevisitorsis often unauthorized — usemetrics/visitsinsteadsetSessionDefaultsis the correct tool name (notsetDefaultReportSuite)
findReportSuites — select report suitesetSessionDefaults — set session context (reportSuiteId + globalCompanyId)describeAa(guideType: "REPORT_SUITE_CONTEXT_GUIDE") — load org context;
note: may return no output for some report suites — proceed without itfindMetrics(expansions: "componentType") — resolve metric IDs (expansions
parameter is required)listComponentUsage(componentType: "metric") — identify most-used metrics
if not specified by the userrunReport — current and comparison period with all metrics batched in one
call (metricIds accepts comma-separated IDs); dimension breakdowns for top moverssearchDimensionItems — validate dimension values for driver calloutsfindReportSuites()
setSessionDefaults(reportSuiteId: "<rsid>", globalCompanyId: "<companyId>")
describeAa(guideType: "REPORT_SUITE_CONTEXT_GUIDE") # may return empty — proceed if so
Use the context guide to understand:
WEEK_START_DOW — day of week each week starts on. Default: Monday
(ISO 8601).FISCAL_YEAR_START_MONTH — month the fiscal year begins. Default:
January (calendar year).TIMEZONE — for example, America/Los_Angeles.CALENDAR_SOURCE — one of "context guide", "default fallback", or
"user override".Ask the user:
Two runs of this skill on the same report suite, period type, and prompt MUST
produce identical current and comparison date ranges. Determinism comes
from (a) reading calendar conventions from Phase 0 instead of improvising, and
(b) applying the alignment rule for the period type without taste calls.
Pick exactly one period type from the user's request:
| User request | PERIOD_TYPE | Current period | Comparison period |
|---|---|---|---|
| "last week" | weekly | Most recent full week ending before today, aligned to WEEK_START_DOW (exactly 7 days) | The week immediately before, same alignment |
| "this month" / "MTD" | month-to-date | 1st of current month → today | 1st of prior month → same day-of-month as today |
| "last month" | monthly | Prior full calendar month | The month before that |
| "this quarter" / "QTD" | quarter-to-date | Start of current fiscal quarter → today; fiscal quarters derived from FISCAL_YEAR_START_MONTH | Same days into the prior fiscal quarter |
| "last quarter" / "Q[N]" | quarterly | Prior full fiscal quarter | The fiscal quarter before that |
| Custom date range | custom | Use as specified | Equal-length window ending the day before current.startDate |
Before calling runReport, verify all six:
current.startDate < current.endDatecomparison.startDate < comparison.endDatecomparison.endDate < current.startDate (no overlap)comparison.endDate equals current.startDate (contiguous)current and comparison have the same length in daysPERIOD_TYPE is satisfied:
weekly: both startDates fall on WEEK_START_DOWmonthly: both startDates fall on the 1st of a monthmonth-to-date: both startDates fall on the 1st; both endDates have the same day-of-monthquarterly: both startDates fall on the first day of a fiscal quarterquarter-to-date: both startDates fall on a fiscal quarter start; both endDates are the same number of days into the quartercustom: lengths match; contiguity holdsIf ANY invariant fails, recompute the dates. Never paper over a mismatch by editing the footer.
Assumes WEEK_START_DOW = Sunday and FISCAL_YEAR_START_MONTH = January. Numbers change for other calendars — that's the point.
| User request | PERIOD_TYPE | Current | Comparison |
|---|---|---|---|
| "last week" | weekly | May 17 (Sun) – May 23 (Sat) | May 10 (Sun) – May 16 (Sat) |
| "this month" / "MTD" | month-to-date | May 1 – May 26 | Apr 1 – Apr 26 |
| "last month" | monthly | Apr 1 – Apr 30 | Mar 1 – Mar 31 |
| "this quarter" / "QTD" | quarter-to-date | Apr 1 – May 26 | Jan 1 – Feb 24 |
| "last quarter" | quarterly | Jan 1 – Mar 31 | Oct 1 – Dec 31 (2025) |
| Custom: "May 15–22" | custom | May 15 – May 22 (8 days) | May 7 – May 14 (8 days) |
If WEEK_START_DOW = Monday instead, the weekly row becomes May 18 (Mon) – May 24 (Sun) vs May 11 (Mon) – May 17 (Sun). The other rows are unchanged.
The AI may "know" from training data that weeks are Mon–Sun (ISO 8601) or that
quarters are Q1=Jan–Mar (calendar). Silently overriding the context guide with
those defaults is exactly the determinism bug this section exists to prevent.
The footer's methodology line MUST accurately describe the dates you computed
— if footer says "weeks start Sunday" but current.startDate is a Monday,
that's a bug to fix in the dates, not in the footer.
Audience — "Who is this briefing for?"
North-star metric — "What is the single most important metric for
this briefing?" (e.g., revenue, conversions, retention rate)
If not specified, use the most-used metric from listComponentUsage.
Supporting metrics — "What other metrics should be included? (up to 5)"
Specific topic focus — "Is there anything you want to highlight or investigate? (e.g., mobile performance, campaign results)"
findMetrics(expansions: "componentType") # expansions required
listComponentUsage(componentType: "metric") # if metrics not specified
Important:
findMetricsrequires theexpansionsparameter (use"componentType"as a safe default). Without it the call will fail.Avoid
metrics/uniquevisitors— this metric is frequently restricted and returns an "unauthorized_metric" error. Prefermetrics/visitsfor audience size.Reliable standard metrics for AA briefings:
metrics/pageviews,metrics/visits,metrics/orders,metrics/revenue,metrics/bouncerate,metrics/occurrences
The KPI set MUST be reproducible across runs. Two runs of this skill on the same report suite + period must produce the same metric values, which requires selecting the same metric IDs every time. Follow this algorithm exactly:
findMetrics. On ambiguity, pick the metric with the highest usageCount
from listComponentUsage and document the choice.listComponentUsage(componentType: "metric") results, sort by
usageCount descending with metric ID alphabetical as the tiebreak (stable
secondary sort), and take the top 6 metric IDs.describeMetric to resolve to display names.metrics/orders vs a calculated metric
also called "Orders" produce wildly different numbers and break trust.Include a "Metrics included" line in the briefing artifact's footer listing the resolved metric IDs. This makes the report auditable and lets the user confirm a re-run is using the same metrics.
Record metric IDs and display names. Limit to 6 metrics total.
Batch all metrics into a single runReport call per period:
runReport(
dimensionId: "variables/daterangeday",
metricIds: "<metricId1>,<metricId2>,<metricId3>,...",
startDate: "<YYYY-MM-DDTHH:mm:ss>",
endDate: "<YYYY-MM-DDTHH:mm:ss>"
)
Critical: The
runReportparameter ismetricIds(plural), notmetricId. It accepts comma-separated IDs — pass all metrics in one call. Dates must be ISO 8601 with time component:2026-03-31T00:00:00/2026-04-06T23:59:59. Usevariables/daterangedayasdimensionIdto get a day-by-day breakdown; totals for each metric are insummaryData.totals[0],totals[1], etc. in order. If a metric is unauthorized, it surfaces incolumnErrors— the overall call still succeeds.
For 6 metrics: 2 calls total (current period + comparison period).
From each pair compute:
For the north-star metric and any metric with a change > ±10%, run a marketing channel breakdown to find what drove the movement:
runReport(
metricIds: "<northStarMetricId>",
dimensionId: "variables/marketingchannel",
startDate: "<current period start>T00:00:00",
endDate: "<current period end>T23:59:59",
limit: 8
)
Run the same for the comparison period if needed to identify share shift.
Also check device type if the user mentioned mobile:
runReport(
metricIds: "<northStarMetricId>",
dimensionId: "variables/mobiledevicetype",
startDate: "<current period start>T00:00:00",
endDate: "<current period end>T23:59:59",
limit: 5
)
Compose the executive briefing as a structured narrative, not a data table. Tone: confident, clear, forward-looking. Avoid jargon. Use business language.
Opening headline — 1 sentence capturing the period's overall result. "Q2 performance was strong, with revenue growing 14% and conversion rates reaching a 12-month high."
North-star metric — 2–3 sentences on the most important KPI: value, change, context, what drove it.
Supporting highlights — 1 sentence per additional metric (positive first, then concerns).
Key driver — 2 sentences identifying what primarily caused movement. "Paid Search drove 60% of revenue growth, up from 48% in the prior period. Email performance also improved materially with a 22% lift in conversions."
Risk or watch item — 1–2 sentences on anything concerning: "Bounce rate on mobile increased 4pp, suggesting friction in the mobile experience worth investigating."
Forward look / ask — optional: what does this imply for next period?
Build the executive briefing HTML and write to
/tmp/aa_executive_briefing_<YYYY-MM-DD_HHMMSS>.html.
Two runs of this skill on the same report suite + period must render identically (modulo the generation timestamp). The rules below pin the formatting choices that the AI would otherwise drift on.
8,160, 77,584, 1,250,000). Do NOT use SI
suffixes like K or M, even for large values. Executives want exact
numbers, not abbreviations.−23.55% displays as
−23.6%, never −23.5%. Compute on full-precision values; round only at
display time.pp. Example: +0.40 pp.$ prefix with thousands separators and no decimals for
values ≥ $100 ($1,240,000); cents only when value < $100 ($45.20).A KPI tile must reflect what the report suite actually returned. The AI must not silently substitute a different metric or hide a tile to make the briefing look cleaner.
kpi-value = Data unavailable, pill class flat, pill text
⚠ N/A, and prior text = Both periods returned no data — validate instrumentation. The tile stays in the grid; do not omit it.kpi-value, pill class flat, pill text ⚠ N/A, and
prior text = Prior {period_noun}: no data..callout.note
above the KPI grid explaining the gap. Do not invent a value.Populate every {PLACEHOLDER} in the HTML template below using these rules.
The briefing belongs to the customer — never substitute Adobe, AA, or any
vendor language into customer-visible fields.
{ORG_NAME} — The customer's business or brand name, derived from the
report suite context loaded in Phase 0. Strip technical/environment suffixes
like — Prod, - Demo, Stage, Test, MCP. If the report suite
name has no clean brand label, fall back to the report suite display name
with suffixes removed. Do not invent a name and do not substitute a
vendor name.{PERIOD_TYPE} — One of Weekly, Monthly, Quarterly, or
Performance (default), chosen from the period inferred in Phase 1.{LEDE_SENTENCE} — Use exactly this pattern, with no vendor names:
Leadership readout for the {period type lowercase} of {PERIOD_LABEL} compared to {COMPARISON_LABEL}.{REPORT_SUITE} — Report suite display name. Suffixes are acceptable
here — this row is the technical identifier line, not the title.{PERIOD_LABEL} / {COMPARISON_LABEL} — Human-readable date ranges,
e.g., May 12–18, 2026.{GENERATED_DATE} — Today's date in the same human format.{METRIC_LABEL} / {FORMATTED_VALUE} / {PCT_CHANGE} / {PRIOR_VALUE} —
Per-KPI values from Phase 3. Use the metric's customer-facing display name,
not its internal ID.Read template.html and use it verbatim. Do not improvise the
HTML structure or CSS — only fill in the {PLACEHOLDER} tokens documented
in Template variables above. Preserve the .up | .down | .flat and
.green | .red | .yellow | .grey modifier classes per the trend rules in
Phase 3.
Section titles — no phase prefix: Section headings in the HTML report must not include the phase number. Use the plain section name only (e.g., "KPI Scorecards" not "Phase 2 — KPI Scorecards", "Narrative" not "Phase 3 — Narrative", "Watch Items" not "Phase 5 — Watch Items").
Write to /tmp/aa_executive_briefing_<YYYY-MM-DD_HHMMSS>.html and open:
open /tmp/aa_executive_briefing_<YYYY-MM-DD_HHMMSS>.html
| Audience | Tone | Metrics | Length | |---|---|---|---| | C-suite | High-level, business outcomes, 1-2 sentences per metric | 3–5 max | 1 page | | VP/Director | Operational detail, channel context, trend narrative | 5–7 | 1.5 pages | | Marketing leadership | Campaign and channel depth, attribution, segment | 5–8 | 2 pages |
Always:
REPORT_SUITE_CONTEXT_GUIDE identifies the company name
or industry, use it in the narrative for a more personalized output."Write an exec summary of last week's performance for our leadership team."
tools
Use the run-workflow MCP to discover, compose, execute, publish, and save Adobe Firefly workflows. TRIGGER when: user asks what actions are available, what the MCP can do, how to process images/video/3D via workflow, wants to build/run/save/publish a workflow, OR pastes any workflow/batch/execution ID. BARE ID (UUID/workflowId/batchId) = INSPECT ONLY — call inspect_run, NEVER run_workflow_submit. ALWAYS call list_actions first for capability/discovery questions. DO NOT TRIGGER for direct Firefly API calls without MCP (use firefly-api-specs).
tools
Run predefined featured workflows via run-workflow MCP. TRIGGER when user names a featured workflow (retargeting, banners at scale, localization, packaging, banner advertising, etc.) or asks to run a known marketing/production workflow. Requires run-workflow MCP. ALWAYS call get_featured_workflow before compose_workflow. DO NOT TRIGGER for custom one-off workflows with no named template — use run-workflow skill.
tools
Migrate an Adobe Commerce App Builder project from the Integration Starter Kit or Checkout Starter Kit to the new App Management approach. Run from the root of the App Builder project to be migrated. Pass --auto to skip confirmation prompts (suitable for CI or batch use) — auto mode prints a summary of all Q&A questions answered with their defaults. Pass --doc-scan-only to scan README.md and env.dist for outdated content without modifying any files. Use when the user wants to migrate an App Builder project from the Integration Starter Kit or Checkout Starter Kit to the App Management approach, or mentions upgrading their Adobe Commerce extension architecture.
development
Add or modify webhook interceptors in an Adobe Commerce app. Use when the user wants to intercept Commerce operations to validate input, append data, or modify behavior — before or after execution. Requires a base app initialized with commerce-app-init.