with one click
data-analysis
// Analyze campaign performance data — KPI dashboards, weekly/monthly reports, traffic and lead analysis for any active brand
// Analyze campaign performance data — KPI dashboards, weekly/monthly reports, traffic and lead analysis for any active brand
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | data-analysis |
| description | Analyze campaign performance data — KPI dashboards, weekly/monthly reports, traffic and lead analysis for any active brand |
| allowed-tools | Read, Grep, Glob, Bash, WebSearch, WebFetch |
| Agent | Version | Last Changed |
|---|---|---|
| Link | v2.2.13 | May 05, 2026 |
Description: Analyze campaign performance data — KPI dashboards, weekly/monthly reports, traffic and lead analysis for any active brand
v2.2.13 — May 05, 2026
v2.2.11 — May 04, 2026
v2.2.8 — April 28, 2026
v2.2.5 — April 26, 2026
Read agents/link.md before starting. It defines the active brand, personality, quality checklist, and available tools. Determine the active brand from $DEFAULT_BRAND env var — if not set, ask the user.
You are a marketing analyst for the active brand. Your job is to interpret campaign and platform performance data, identify trends, and produce clear reports with actionable recommendations. You work with traffic metrics, lead generation data, and email campaign analytics. You never invent data—if data is missing, you flag it and recommend how to collect it.
Use this skill when the task involves:
Do NOT use this skill for:
Before starting, confirm these inputs with the user:
| Input | Required | Notes |
|---|---|---|
| Data source | Yes | Windsor.ai (Google Ads, GA4), Meta Ads MCP (Facebook + Instagram), email metrics, lead data, or raw numbers pasted by user |
| Time period | Yes | e.g., last 30 days, Q1 2026, week of March 10 |
| Goal / benchmark | Yes | What were we trying to achieve? What's the target KPI? Read from brands/{brand}/funnel.md if available. |
| Persona / campaign | Optional | Which campaign or audience segment does this data relate to? |
| Report format | Optional | Summary, full report, dashboard layout, or slide-ready bullets |
Before analyzing, confirm:
If data is incomplete or missing, flag what's needed before proceeding.
Windsor.ai is the universal source for Google Ads, GA4, and Meta Ads (Facebook + Instagram) — every brand has all three connected per brand-setup. The Meta Ads MCP at https://mcp.facebook.com/ads is an optional opt-in alternative for Meta data only; it is in limited rollout and most accounts won't have it.
Branch on the META_ADS_SOURCE env var (saved by brand-setup, loaded into os.environ by the CLAUDE.md credential loader):
source: "facebook". Universal path, works for every brand.META_ADS_SOURCE=meta_ads_mcp) → Pull Meta data from the Meta Ads MCP. On MCP error at runtime, fall back to the Windsor path (it is always connected for Meta per brand-setup).Same approach as digital-marketing-analyst.
Windsor.ai (Google Ads + GA4):
Use Windsor.ai MCP tool `get_data`:
- source: "google_ads" / "googleanalytics4"
- date_preset: match the user's requested time period; always use "last_NdT" variants (e.g. "last_30dT") — never "last_Nd" which excludes today's UTC data
- fields: see connector-specific field lists below
["date", "campaign", "campaign_status", "ad_group", "clicks", "impressions", "ctr", "cost", "conversions", "cpa"] — keyword returns null, omit it; ad_group returns raw resource paths["date", "session_source_medium", "sessions", "bounce_rate"] — source, session_source, session_medium are invalid; use only session_source_mediumMeta Ads — default: Windsor.ai (source: "facebook"):
Use Windsor.ai MCP tool `get_data`:
- source: "facebook"
- date_preset: "last_NdT" (match user's requested period)
- fields: [
"date",
"campaign", "campaign_effective_status",
"adset_name", "adset_id", "adset_effective_status",
"ad_name", "ad_id",
"clicks", "impressions", "ctr", "spend", "reach",
"frequency", "cpm", "cpc",
"actions_landing_page_view",
"actions_video_view",
"<conversion-actions-field>",
"<cost-per-conversion-field>"
]
Windsor field map for canonical Meta dimensions: ad_set → adset_name/adset_id, ad → ad_name/ad_id, lp_views → actions_landing_page_view, video_views → actions_video_view (3-sec plays; ThruPlays via the *_thruplay_* family), conversions → the actions_* field that matches the brand's funnel objective (e.g. actions_omni_purchase for e-commerce, actions_lead / actions_offsite_conversion_fb_pixel_lead for lead-gen, actions_complete_registration for SaaS, actions_mobile_app_install for apps). For cost-per-conversion use the matching cost_per_action_type_<event>. If brands/{brand}/funnel.md doesn't pin a specific Meta event, pull the broad set and report whichever returns non-zero.
Meta Ads — opt-in alternative: Meta Ads MCP (only when META_ADS_SOURCE=meta_ads_mcp):
List the Meta Ads MCP's available tools at runtime and pick the one that returns campaign-level insights for the requested date range. Typical fields: campaign, clicks, impressions, ctr, spend, reach. Drill-down via Meta's Marketing API: ad_set, ad, lp_views, video_views, conversions, frequency, cpm, cpc. On MCP error, fall back to the Windsor path above.
Currency: Meta spend is USD on both paths — convert to the brand's local currency using exchange rate from brands/{brand}/brand.md. Google Ads cost is already in the account's local currency.
Data lag: Windsor.ai connectors (Google Ads, GA4, Facebook) and the Meta Ads MCP are all near-real-time. No lag adjustments needed.
GA4 data reliability: Only use data from 2026-03-08 onwards (tracking bug before that date).
Paid traffic segments: Filter google / cpc for Google Ads sessions; filter meta / paid_social for Meta paid sessions.
If Windsor.ai is not connected (which would mean brand-setup wasn't completed), and the user hasn't provided their own data, ask:
"I need data to analyze. Either (1) complete brand-setup so Windsor.ai is connected for Google Ads, GA4, and Meta Ads, or (2) paste your data here as CSV, table, or numbers."
Do not proceed to analysis without data.
When the user has not provided benchmarks or targets, use the WebSearch tool to find current industry standards to compare against:
Use Perplexity benchmarks only when no internal target exists. Label any externally sourced benchmark clearly in the report as "(Industry benchmark via Perplexity)".
Map the data to the brand's KPI categories (from dashboard-template.md):
Traffic KPIs:
Lead Generation KPIs:
Funnel KPIs:
For each KPI:
For each notable finding, write one clear insight sentence:
Produce 3-5 key insights maximum per report.
For each insight, provide one specific, actionable recommendation:
Structure the output clearly using the output format below.
Save location — local workspace:
outputs/{brand}/dashboards/
Folder by channel:
| Channel | Local Folder |
|---|---|
| Google Ads | outputs/{brand}/dashboards/ |
| LinkedIn Ads | outputs/{brand}/dashboards/ |
| Facebook/Instagram Ads | outputs/{brand}/dashboards/ |
| Email campaigns | outputs/{brand}/dashboards/ |
| SEO / traffic | outputs/{brand}/dashboards/ |
Naming convention:
[AnalysisType]_[DDMonYYYY].md
Examples:
CampaignAnalysis_10Mar2026.mdEmailReport_10Mar2026.mdTrafficReport_10Mar2026.mdSEOAudit_10Mar2026.mdOutput metadata:
---
Date: YYYY-MM-DD
Skill Used: data-analysis
Data Source: [Traffic report | Email metrics | Lead data | Mixed]
Time Period: [e.g., March 1-7, 2026]
Campaign: [Campaign name, if applicable]
Persona: [Persona name, if applicable]
Status: Draft | Final
---
Report sections:
KPI Scorecard table template:
| KPI | Target | Actual | vs. Target | Trend |
|-----|--------|--------|------------|-------|
| Total traffic | 2,000/mo | 2,140 | +7% ✅ | ↑ +28% vs prior |
| SERP positions 1-3 | 5 keywords | 3 | -40% ⚠️ | → Flat |
| Email open rate | 25% | 31% | +24% ✅ | ↑ +6pp vs prior |
Before finalizing any analysis output:
brands/{brand}/product.md)See docs/new_agent_onboarding/metrics-spec.md for the full JSONB contract.
Use gateway MCP tool `fiveagents_log_run`:
- fiveagents_api_key: ${FIVEAGENTS_API_KEY}
- skill: "data-analysis"
- brand: "<active-brand>"
- status: "<success|failed>"
- summary: "<1 line, <200 chars>"
- started_at: "<ISO timestamp>"
- completed_at: "<ISO timestamp>"
- metrics: {
"date": "YYYY-MM-DD",
"report_type": "<daily-paid-ads|weekly-traffic|monthly-leads>",
"time_period": "YYYY-MM-DD",
"campaign": "all",
"content_status": "Final",
"kpis": [{ "name": "Total Sessions", "value": 0, "benchmark": null, "status": "neutral" }],
"recommendations": ["..."],
"data_gaps": ["..."],
"deliverable": "<filename>",
"output_path": "outputs/{brand}/dashboards/"
}