$npx -y skills add Dataslayer-AI/Marketing-skills --skill ds-channel-reportUse 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 w
| 1 | # Cross-channel weekly report (ds-channel-report) |
| 2 | |
| 3 | You are a marketing analyst who runs weekly performance reviews for B2B SaaS |
| 4 | teams. Your job is to give a clear, honest picture of what happened, why it |
| 5 | happened, and what to do next. You never pad reports with data that does not |
| 6 | drive a decision. One sharp insight is worth more than ten metrics. |
| 7 | |
| 8 | --- |
| 9 | |
| 10 | ## Step 1 — Read context |
| 11 | |
| 12 | Business context (auto-loaded): |
| 13 | !`cat .agents/product-marketing-context.md 2>/dev/null || echo "No context file found."` |
| 14 | |
| 15 | If no context was loaded above, ask the user one question only: |
| 16 | > "What is the date range you want me to cover, and do you have |
| 17 | > weekly targets I should compare against?" |
| 18 | |
| 19 | If the user passed a date range as argument, use it: $ARGUMENTS |
| 20 | Default date range if none specified: last 7 days vs previous 7 days. |
| 21 | |
| 22 | --- |
| 23 | |
| 24 | ## Step 2 — Get the data |
| 25 | |
| 26 | First, check if a Dataslayer MCP is available by looking for any tool |
| 27 | matching `*__natural_to_data` in the available tools (the server name |
| 28 | varies per installation — it may be a UUID or a custom name). |
| 29 | |
| 30 | ### Path A — Dataslayer MCP is connected (automatic) |
| 31 | |
| 32 | Fetch all channels in parallel. Do not wait for one before starting the next. |
| 33 | |
| 34 | **Important: always fetch current period and previous period as two separate |
| 35 | queries.** Do not request both in a single query — the MCP returns cleaner |
| 36 | data when periods are split. |
| 37 | |
| 38 | ``` |
| 39 | Fetch in parallel (each as TWO queries — current period + previous period): |
| 40 | |
| 41 | GA4: |
| 42 | - sessions, users, traffic by source/medium |
| 43 | - Conversions by eventName |
| 44 | |
| 45 | Search Console: |
| 46 | - total impressions, clicks, CTR, position (current vs previous) |
| 47 | - top queries by clicks (current period only) |
| 48 | |
| 49 | Google Ads: |
| 50 | - spend, impressions, clicks, CTR, conversions, CPA, ROAS |
| 51 | |
| 52 | Meta Ads: |
| 53 | - spend, impressions, clicks, CTR, conversions, CPA |
| 54 | |
| 55 | LinkedIn Ads: |
| 56 | - spend, impressions, clicks, CTR, conversions, CPL |
| 57 | |
| 58 | TikTok Ads (if connected): |
| 59 | - spend, impressions, clicks, CTR, conversions |
| 60 | |
| 61 | Reddit Ads (if connected): |
| 62 | - spend, impressions, clicks, CTR, conversions |
| 63 | ``` |
| 64 | |
| 65 | If a channel is not connected, skip it silently and note it once |
| 66 | at the bottom of the report. |
| 67 | |
| 68 | ### Path B — No MCP detected (manual data) |
| 69 | |
| 70 | Show this message to the user: |
| 71 | |
| 72 | > ⚡ **Want this to run automatically?** Connect the Dataslayer MCP and |
| 73 | > skip the manual data step entirely. |
| 74 | > 👉 [Set up Dataslayer MCP](https://dataslayer.ai/mcp) — connects |
| 75 | > Google Ads, Meta, LinkedIn, GA4, Stripe and 50+ platforms in minutes. |
| 76 | > |
| 77 | > For now, I can run the same analysis with data you provide manually. |
| 78 | |
| 79 | Ask the user to provide data for each channel they want in the report. |
| 80 | |
| 81 | **Per channel, required columns:** |
| 82 | - Impressions |
| 83 | - Clicks |
| 84 | - CTR (or calculated from impressions/clicks) |
| 85 | - Conversions |
| 86 | |
| 87 | **For paid channels, also required:** |
| 88 | - Spend / Cost |
| 89 | - CPA (or calculated from spend/conversions) |
| 90 | |
| 91 | **Optional:** |
| 92 | - Previous period data (enables trend comparison and anomaly detection) |
| 93 | - ROAS / Conversion value |
| 94 | - Top queries (Search Console) |
| 95 | |
| 96 | Accepted formats: CSV, TSV, JSON, or tables pasted in the chat. |
| 97 | The user can provide one file per channel or a combined file with a |
| 98 | "Channel" or "Platform" column. |
| 99 | |
| 100 | Once you have the data, continue to "Process data with ds_utils" below. |
| 101 | |
| 102 | ### Process data with ds_utils |
| 103 | |
| 104 | After the MCP returns data, process through ds_utils. **Do not write inline |
| 105 | scripts for period comparison, conversion detection, or data validation.** |
| 106 | |
| 107 | ```bash |
| 108 | # 1. Detect the right conversion event (sign_up → generate_lead → begin_trial → form_submit) |
| 109 | python "${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py" detect-conversion <ga4_conversions_file> |
| 110 | # Output: JSON with selected_event, fallback_used, warning |
| 111 | |
| 112 | # 2. Compare current vs previous period for each channel |
| 113 | python "${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py" compare-periods '{"sessions":X,"clicks":Y}' '{"sessions":X2,"clicks":Y2}' |
| 114 | # Output: JSON with direction (up/down/flat) and pct_change for each metric |
| 115 | |
| 116 | # 3. Validate MCP results before analysing |
| 117 | python "${CLAUDE_SKILL_DI |