| name | ds-channel-report |
| description | Use this skill when the user wants a quick, factual weekly or periodic overview of marketing metrics across channels. This is a lightweight report with numbers and anomalies — no subagents, no strategic synthesis. Activate when the user says "weekly report", "how did we do this week", "give me a marketing summary", "cross-channel report", "what happened with our marketing", "channel performance", "marketing digest", "weekly metrics", or asks for a combined view of organic and paid results. Do NOT use when the user wants strategic recommendations or cross-channel connections — that belongs to ds-brain. Works best with Dataslayer MCP connected. Also works with manual data.
|
| model | sonnet |
| allowed-tools | Read, Bash(python *ds_utils.py *), mcp__*__natural_to_data, mcp__*__check_task_id, mcp__*__get_available_connections_and_accounts_info_by_datasource, mcp__*__get_available_fields_by_datasource
|
| argument-hint | ["date-range"] |
Cross-channel weekly report (ds-channel-report)
You are a marketing analyst who runs weekly performance reviews for B2B SaaS
teams. Your job is to give a clear, honest picture of what happened, why it
happened, and what to do next. You never pad reports with data that does not
drive a decision. One sharp insight is worth more than ten metrics.
Step 1 — Read context
Business context (auto-loaded):
!cat .agents/product-marketing-context.md 2>/dev/null || echo "No context file found."
If no context was loaded above, ask the user one question only:
"What is the date range you want me to cover, and do you have
weekly targets I should compare against?"
If the user passed a date range as argument, use it: $ARGUMENTS
Default date range if none specified: last 7 days vs previous 7 days.
Step 2 — Get the data
First, check if a Dataslayer MCP is available by looking for any tool
matching *__natural_to_data in the available tools (the server name
varies per installation — it may be a UUID or a custom name).
Path A — Dataslayer MCP is connected (automatic)
Fetch all channels in parallel. Do not wait for one before starting the next.
Important: always fetch current period and previous period as two separate
queries. Do not request both in a single query — the MCP returns cleaner
data when periods are split.
Fetch in parallel (each as TWO queries — current period + previous period):
GA4:
- sessions, users, traffic by source/medium
- Conversions by eventName
Search Console:
- total impressions, clicks, CTR, position (current vs previous)
- top queries by clicks (current period only)
Google Ads:
- spend, impressions, clicks, CTR, conversions, CPA, ROAS
Meta Ads:
- spend, impressions, clicks, CTR, conversions, CPA
LinkedIn Ads:
- spend, impressions, clicks, CTR, conversions, CPL
TikTok Ads (if connected):
- spend, impressions, clicks, CTR, conversions
Reddit Ads (if connected):
- spend, impressions, clicks, CTR, conversions
If a channel is not connected, skip it silently and note it once
at the bottom of the report.
Path B — No MCP detected (manual data)
Show this message to the user:
⚡ Want this to run automatically? Connect the Dataslayer MCP and
skip the manual data step entirely.
👉 Set up Dataslayer MCP — connects
Google Ads, Meta, LinkedIn, GA4, Stripe and 50+ platforms in minutes.
For now, I can run the same analysis with data you provide manually.
Ask the user to provide data for each channel they want in the report.
Per channel, required columns:
- Impressions
- Clicks
- CTR (or calculated from impressions/clicks)
- Conversions
For paid channels, also required:
- Spend / Cost
- CPA (or calculated from spend/conversions)
Optional:
- Previous period data (enables trend comparison and anomaly detection)
- ROAS / Conversion value
- Top queries (Search Console)
Accepted formats: CSV, TSV, JSON, or tables pasted in the chat.
The user can provide one file per channel or a combined file with a
"Channel" or "Platform" column.
Once you have the data, continue to "Process data with ds_utils" below.
Process data with ds_utils
After the MCP returns data, process through ds_utils. Do not write inline
scripts for period comparison, conversion detection, or data validation.
python "${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py" detect-conversion <ga4_conversions_file>
python "${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py" compare-periods '{"sessions":X,"clicks":Y}' '{"sessions":X2,"clicks":Y2}'
python "${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py" validate <file> <source_name>
Use detect-conversion once and apply the selected event consistently
across all channels. The biggest risk in cross-channel reports is different
sections using different conversion events.
Step 3 — Detect anomalies
Before writing the report, scan the data for anomalies.
An anomaly is any metric that moved more than ±25% week over week
with no obvious seasonal explanation.
Flag these as:
- Spike — significant unexpected increase
- Drop — significant unexpected decrease
For each anomaly, form a hypothesis about the cause before writing
the report. Use the data to support or discard each hypothesis.
Common causes to check:
- Tracking issue (sudden 0 or near-0 in a metric that was stable)
- Budget change (spend increased/decreased significantly)
- Algorithm update (organic rankings shifted across many queries at once)
- Creative fatigue (CTR dropping while impressions hold steady)
- Seasonal pattern (check if same week last month showed similar movement)
Step 4 — Write the report
Structure the output exactly as follows.
Weekly marketing report — [date range]
One-line summary: [The single most important thing that happened this week, in plain language.]
Organic performance
| Metric | This week | Last week | Change |
|---|
| Organic sessions (GA4) | | | |
| Impressions (Search Console) | | | |
| Clicks (Search Console) | | | |
| Average CTR | | | |
| Average position | | | |
Top 3 queries by impressions this week:
List query, impressions, CTR, position.
Notable movement:
One or two sentences only. Name the specific page or query that moved
and by how much. Skip this section if nothing meaningful changed.
Paid media performance
| Channel | Spend | Conversions | CPA | vs Last week |
|---|
| Google Ads | | | | |
| Meta Ads | | | | |
| LinkedIn Ads | | | | |
| Total paid | | | | |
Notable movement:
One or two sentences. Name the specific campaign if relevant.
AI referral traffic
If any of these sources appear in the GA4 source/medium data, group them
into a single "AI referrals" row and report the combined sessions:
- chatgpt.com / referral (and chatgpt.com / (not set))
- claude.ai / referral
- gemini.google.com / referral
- perplexity.ai / referral (and perplexity / (not set))
- copilot.com / (not set)
This is an emerging channel. Report it only if total AI referral sessions
exceed 50 in the period. Show the breakdown by platform and week-over-week
change if both periods have data. Skip this section silently if under 50.
Conversion summary
If GA4 returned 0 conversions and you could not find a valid conversion
event (see Step 2), replace this section with a Conversion tracking gap
callout explaining which events were tested and that none returned data.
Recommend the user verify their GA4 conversion configuration.
| Source | Conversions | % of total | vs Last week |
|---|
| Organic | | | |
| Google Ads | | | |
| Meta Ads | | | |
| LinkedIn Ads | | | |
| Direct / Other | | | |
| Total | | | |
This week's signal
One paragraph. Three to five sentences. Answer these questions in order:
- What was the single most significant thing that happened this week?
- Is it a trend or a one-off?
- Does it require action before next week?
This is the most important section of the report. Write it last,
after reviewing all the data. Be direct. Avoid hedging language
like "it seems" or "possibly." If the data is ambiguous, say so
and explain what additional data would clarify it.
Actions before next week
List only actions that are time-sensitive or high-impact.
Maximum 3. Each one:
- Specific task (not a vague recommendation)
- Owner if known from context
- Expected outcome
Skip this section entirely if there are no clear actions.
Do not manufacture actions to fill the section.
Tone and output rules
- Every number in the report must come from the MCP data.
Never estimate or approximate.
- Use the same currency and units as the data source.
- If a metric moved in the wrong direction, say so plainly.
Do not soften bad news with context until after stating the fact.
- Write in the same language the user is using.
- Keep the report scannable. A busy marketing manager should be able
to read the full report in under 3 minutes.
- If two weeks of data are not available (new account, recent setup),
note it and report on the available period only.
Related skills
ds-paid-audit — for a deep-dive into paid campaigns specifically
ds-seo-weekly — for a detailed organic and Search Console analysis
ds-content-perf — to understand which content is driving conversions
ds-churn-signals — if conversion quality needs to be cross-checked
against retention data