{"id":"ec41e51d-fd2a-41c0-8253-baaa43c415a5","shortId":"hpzzQC","kind":"skill","title":"ds-channel-report","tagline":"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 w","description":"# Cross-channel weekly report (ds-channel-report)\n\nYou are a marketing analyst who runs weekly performance reviews for B2B SaaS\nteams. Your job is to give a clear, honest picture of what happened, why it\nhappened, and what to do next. You never pad reports with data that does not\ndrive a decision. One sharp insight is worth more than ten metrics.\n\n---\n\n## Step 1 — Read context\n\nBusiness context (auto-loaded):\n!`cat .agents/product-marketing-context.md 2>/dev/null || echo \"No context file found.\"`\n\nIf no context was loaded above, ask the user one question only:\n> \"What is the date range you want me to cover, and do you have\n> weekly targets I should compare against?\"\n\nIf the user passed a date range as argument, use it: $ARGUMENTS\nDefault date range if none specified: last 7 days vs previous 7 days.\n\n---\n\n## Step 2 — Get the data\n\nFirst, check if a Dataslayer MCP is available by looking for any tool\nmatching `*__natural_to_data` in the available tools (the server name\nvaries per installation — it may be a UUID or a custom name).\n\n### Path A — Dataslayer MCP is connected (automatic)\n\nFetch all channels in parallel. Do not wait for one before starting the next.\n\n**Important: always fetch current period and previous period as two separate\nqueries.** Do not request both in a single query — the MCP returns cleaner\ndata when periods are split.\n\n```\nFetch in parallel (each as TWO queries — current period + previous period):\n\n  GA4:\n    - sessions, users, traffic by source/medium\n    - Conversions by eventName\n\n  Search Console:\n    - total impressions, clicks, CTR, position (current vs previous)\n    - top queries by clicks (current period only)\n\n  Google Ads:\n    - spend, impressions, clicks, CTR, conversions, CPA, ROAS\n\n  Meta Ads:\n    - spend, impressions, clicks, CTR, conversions, CPA\n\n  LinkedIn Ads:\n    - spend, impressions, clicks, CTR, conversions, CPL\n\n  TikTok Ads (if connected):\n    - spend, impressions, clicks, CTR, conversions\n\n  Reddit Ads (if connected):\n    - spend, impressions, clicks, CTR, conversions\n```\n\nIf a channel is not connected, skip it silently and note it once\nat the bottom of the report.\n\n### Path B — No MCP detected (manual data)\n\nShow this message to the user:\n\n> ⚡ **Want this to run automatically?** Connect the Dataslayer MCP and\n> skip the manual data step entirely.\n> 👉 [Set up Dataslayer MCP](https://dataslayer.ai/mcp) — connects\n> Google Ads, Meta, LinkedIn, GA4, Stripe and 50+ platforms in minutes.\n>\n> For now, I can run the same analysis with data you provide manually.\n\nAsk the user to provide data for each channel they want in the report.\n\n**Per channel, required columns:**\n- Impressions\n- Clicks\n- CTR (or calculated from impressions/clicks)\n- Conversions\n\n**For paid channels, also required:**\n- Spend / Cost\n- CPA (or calculated from spend/conversions)\n\n**Optional:**\n- Previous period data (enables trend comparison and anomaly detection)\n- ROAS / Conversion value\n- Top queries (Search Console)\n\nAccepted formats: CSV, TSV, JSON, or tables pasted in the chat.\nThe user can provide one file per channel or a combined file with a\n\"Channel\" or \"Platform\" column.\n\nOnce you have the data, continue to \"Process data with ds_utils\" below.\n\n### Process data with ds_utils\n\nAfter the MCP returns data, process through ds_utils. **Do not write inline\nscripts for period comparison, conversion detection, or data validation.**\n\n```bash\n# 1. Detect the right conversion event (sign_up → generate_lead → begin_trial → form_submit)\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" detect-conversion <ga4_conversions_file>\n# Output: JSON with selected_event, fallback_used, warning\n\n# 2. Compare current vs previous period for each channel\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" compare-periods '{\"sessions\":X,\"clicks\":Y}' '{\"sessions\":X2,\"clicks\":Y2}'\n# Output: JSON with direction (up/down/flat) and pct_change for each metric\n\n# 3. Validate MCP results before analysing\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" validate <file> <source_name>\n```\n\nUse `detect-conversion` once and apply the selected event consistently\nacross all channels. The biggest risk in cross-channel reports is different\nsections using different conversion events.\n\n---\n\n## Step 3 — Detect anomalies\n\nBefore writing the report, scan the data for anomalies.\nAn anomaly is any metric that moved more than ±25% week over week\nwith no obvious seasonal explanation.\n\nFlag these as:\n- **Spike** — significant unexpected increase\n- **Drop** — significant unexpected decrease\n\nFor each anomaly, form a hypothesis about the cause before writing\nthe report. Use the data to support or discard each hypothesis.\n\nCommon causes to check:\n- Tracking issue (sudden 0 or near-0 in a metric that was stable)\n- Budget change (spend increased/decreased significantly)\n- Algorithm update (organic rankings shifted across many queries at once)\n- Creative fatigue (CTR dropping while impressions hold steady)\n- Seasonal pattern (check if same week last month showed similar movement)\n\n---\n\n## Step 4 — Write the report\n\nStructure the output exactly as follows.\n\n---\n\n### Weekly marketing report — [date range]\n\n**One-line summary:** [The single most important thing that happened this week, in plain language.]\n\n---\n\n#### Organic performance\n\n| Metric | This week | Last week | Change |\n|--------|-----------|-----------|--------|\n| Organic sessions (GA4) | | | |\n| Impressions (Search Console) | | | |\n| Clicks (Search Console) | | | |\n| Average CTR | | | |\n| Average position | | | |\n\n**Top 3 queries by impressions this week:**\nList query, impressions, CTR, position.\n\n**Notable movement:**\nOne or two sentences only. Name the specific page or query that moved\nand by how much. Skip this section if nothing meaningful changed.\n\n---\n\n#### Paid media performance\n\n| Channel | Spend | Conversions | CPA | vs Last week |\n|---------|-------|-------------|-----|--------------|\n| Google Ads | | | | |\n| Meta Ads | | | | |\n| LinkedIn Ads | | | | |\n| **Total paid** | | | | |\n\n**Notable movement:**\nOne or two sentences. Name the specific campaign if relevant.\n\n---\n\n#### AI referral traffic\n\nIf any of these sources appear in the GA4 source/medium data, group them\ninto a single \"AI referrals\" row and report the combined sessions:\n\n- chatgpt.com / referral (and chatgpt.com / (not set))\n- claude.ai / referral\n- gemini.google.com / referral\n- perplexity.ai / referral (and perplexity / (not set))\n- copilot.com / (not set)\n\nThis is an emerging channel. Report it only if total AI referral sessions\nexceed 50 in the period. Show the breakdown by platform and week-over-week\nchange if both periods have data. Skip this section silently if under 50.\n\n---\n\n#### Conversion summary\n\nIf GA4 returned 0 conversions and you could not find a valid conversion\nevent (see Step 2), replace this section with a **Conversion tracking gap**\ncallout explaining which events were tested and that none returned data.\nRecommend the user verify their GA4 conversion configuration.\n\n| Source | Conversions | % of total | vs Last week |\n|--------|-------------|------------|--------------|\n| Organic | | | |\n| Google Ads | | | |\n| Meta Ads | | | |\n| LinkedIn Ads | | | |\n| Direct / Other | | | |\n| **Total** | | | |\n\n---\n\n#### This week's signal\n\nOne paragraph. Three to five sentences. Answer these questions in order:\n\n1. What was the single most significant thing that happened this week?\n2. Is it a trend or a one-off?\n3. Does it require action before next week?\n\nThis is the most important section of the report. Write it last,\nafter reviewing all the data. Be direct. Avoid hedging language\nlike \"it seems\" or \"possibly.\" If the data is ambiguous, say so\nand explain what additional data would clarify it.\n\n---\n\n#### Actions before next week\n\nList only actions that are time-sensitive or high-impact.\nMaximum 3. Each one:\n- Specific task (not a vague recommendation)\n- Owner if known from context\n- Expected outcome\n\nSkip this section entirely if there are no clear actions.\nDo not manufacture actions to fill the section.\n\n---\n\n## Tone and output rules\n\n- Every number in the report must come from the MCP data.\n  Never estimate or approximate.\n- Use the same currency and units as the data source.\n- If a metric moved in the wrong direction, say so plainly.\n  Do not soften bad news with context until after stating the fact.\n- Write in the same language the user is using.\n- Keep the report scannable. A busy marketing manager should be able\n  to read the full report in under 3 minutes.\n- If two weeks of data are not available (new account, recent setup),\n  note it and report on the available period only.\n\n---\n\n## Related skills\n\n- `ds-paid-audit` — for a deep-dive into paid campaigns specifically\n- `ds-seo-weekly` — for a detailed organic and Search Console analysis\n- `ds-content-perf` — to understand which content is driving conversions\n- `ds-churn-signals` — if conversion quality needs to be cross-checked\n  against retention data","tags":["channel","report","marketing","skills","dataslayer-ai","agent-skills","analytics","claude-code","mcp","paid-media","seo"],"capabilities":["skill","source-dataslayer-ai","skill-ds-channel-report","topic-agent-skills","topic-analytics","topic-claude-code","topic-marketing","topic-mcp","topic-paid-media","topic-seo"],"categories":["Marketing-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Dataslayer-AI/Marketing-skills/ds-channel-report","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Dataslayer-AI/Marketing-skills","source_repo":"https://github.com/Dataslayer-AI/Marketing-skills","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 9 github stars · SKILL.md body (8,983 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T01:03:50.009Z","embedding":null,"createdAt":"2026-04-23T13:04:25.083Z","updatedAt":"2026-04-24T01:03:50.009Z","lastSeenAt":"2026-04-24T01:03:50.009Z","tsv":"'-0':747 '/../../scripts/ds_utils.py':584,609,642 '/dev/null':127 '/mcp)':415 '0':744,1001 '1':116,566,1074 '2':126,191,596,1014,1086 '25':695 '3':632,674,842,1096,1163,1276 '4':789 '50':424,969,995 '7':184,188 'abl':1268 'accept':496 'account':1287 'across':22,655,764 'action':1100,1146,1152,1188,1192 'activ':38 'ad':319,328,336,344,353,418,890,892,894,1051,1053,1055 'addit':1141 'agents/product-marketing-context.md':125 'ai':909,928,965 'algorithm':759 'also':470 'alway':253 'ambigu':1135 'analys':637 'analysi':435,1325 'analyst':64 'anomali':32,487,676,685,687,717 'answer':1069 'appear':917 'appli':650 'approxim':1215 'argument':173,176 'ask':139,441 'audit':1304 'auto':122 'auto-load':121 'automat':237,397 'avail':202,214,1285,1296 'averag':837,839 'avoid':1123 'b':381 'b2b':71 'bad':1240 'bash':565 'begin':576 'biggest':659 'bottom':376 'breakdown':975 'budget':754 'busi':119,1263 'calcul':463,476 'callout':1023 'campaign':906,1312 'cat':124 'caus':723,738 'chang':628,755,827,878,983 'channel':3,23,53,58,240,363,449,456,469,514,521,604,657,664,882,959 'chat':506 'chatgpt.com':936,939 'check':196,740,779,1349 'churn':1339 'clarifi':1144 'claud':581,606,639 'claude.ai':942 'cleaner':275 'clear':80,1187 'click':305,314,322,331,339,349,358,460,615,619,834 'column':458,524 'combin':517,934 'come':1207 'common':737 'compar':163,597,611 'compare-period':610 'comparison':485,559 'configur':1041 'connect':236,346,355,366,398,416 'consist':654 'consol':302,495,833,836,1324 'content':1328,1333 'context':118,120,130,135,1176,1243 'continu':530 'convers':298,324,333,341,351,360,466,490,560,570,587,647,671,884,996,1002,1010,1020,1040,1043,1336,1342 'copilot.com':952 'cost':473 'could':1005 'cover':154 'cpa':325,334,474,885 'cpl':342 'creativ':769 'cross':52,663,1348 'cross-channel':51,662 'cross-check':1347 'csv':498 'ctr':306,323,332,340,350,359,461,771,838,851 'currenc':1219 'current':255,288,308,315,598 'custom':229 'data':99,194,211,276,386,406,437,446,482,529,533,539,547,563,683,730,922,988,1033,1120,1133,1142,1211,1224,1282,1352 'dataslay':199,233,400,411 'dataslayer.ai':414 'dataslayer.ai/mcp)':413 'date':148,170,178,802 'day':185,189 'decis':105 'decreas':714 'deep':1308 'deep-div':1307 'default':177 'detail':1320 'detect':384,488,561,567,586,646,675 'detect-convers':585,645 'differ':667,670 'dir':583,608,641 'direct':624,1056,1122,1233 'discard':734 'dive':1309 'drive':103,1335 'drop':711,772 'ds':2,57,535,541,550,1302,1315,1327,1338 'ds-channel-report':1,56 'ds-churn-sign':1337 'ds-content-perf':1326 'ds-paid-audit':1301 'ds-seo-week':1314 'echo':128 'emerg':958 'enabl':483 'entir':408,1182 'estim':1213 'event':571,592,653,672,1011,1026 'eventnam':300 'everi':1201 'exact':796 'exceed':968 'expect':1177 'explain':1024,1139 'explan':703 'fact':1248 'factual':14 'fallback':593 'fatigu':770 'fetch':238,254,281 'file':131,512,518 'fill':1194 'find':1007 'first':195 'five':1067 'flag':704 'follow':798 'form':578,718 'format':497 'found':132 'full':1272 'ga4':292,421,830,920,999,1039 'gap':1022 'gemini.google.com':944 'generat':574 'get':192 'give':78 'googl':318,417,889,1050 'group':923 'happen':85,88,814,1083 'hedg':1124 'high':1160 'high-impact':1159 'hold':775 'honest':81 'hypothesi':720,736 'impact':1161 'import':252,811,1108 'impress':304,321,330,338,348,357,459,774,831,845,850 'impressions/clicks':465 'increas':710 'increased/decreased':757 'inlin':555 'insight':108 'instal':221 'issu':742 'job':75 'json':500,589,622 'keep':1258 'known':1174 'languag':819,1125,1253 'last':183,783,825,887,1047,1115 'lead':575 'lightweight':27 'like':1126 'line':806 'linkedin':335,420,893,1054 'list':848,1150 'load':123,137 'look':204 'manag':1265 'mani':765 'manual':385,405,440 'manufactur':1191 'market':20,63,800,1264 'match':208 'maximum':1162 'may':223 'mcp':200,234,273,383,401,412,545,634,1210 'meaning':877 'media':880 'messag':389 'meta':327,419,891,1052 'metric':21,114,631,690,750,822,1228 'minut':427,1277 'month':784 'move':692,867,1229 'movement':787,854,898 'much':871 'must':1206 'name':218,230,860,903 'natur':209 'near':746 'need':1344 'never':95,1212 'new':1286 'news':1241 'next':93,251,1102,1148 'none':181,1031 'notabl':853,897 'note':371,1290 'noth':876 'number':30,1202 'obvious':701 'one':106,142,247,511,805,855,899,1063,1094,1165 'one-lin':804 'one-off':1093 'option':479 'order':1073 'organ':761,820,828,1049,1321 'outcom':1178 'output':588,621,795,1199 'overview':18 'owner':1172 'pad':96 'page':863 'paid':468,879,896,1303,1311 'paragraph':1064 'parallel':242,283 'pass':168 'past':503 'path':231,380 'pattern':778 'pct':627 'per':220,455,513 'perf':1329 'perform':68,821,881 'period':17,256,259,278,289,291,316,481,558,601,612,972,986,1297 'perplex':949 'perplexity.ai':946 'pictur':82 'plain':818,1236 'platform':425,523,977 'posit':307,840,852 'possibl':1130 'previous':187,258,290,310,480,600 'process':532,538,548 'provid':439,445,510 'python':580,605,638 'qualiti':1343 'queri':263,271,287,312,493,766,843,849,865 'question':143,1071 'quick':13 'rang':149,171,179,803 'rank':762 'read':117,1270 'recent':1288 'recommend':1034,1171 'reddit':352 'referr':910,929,937,943,945,947,966 'relat':1299 'relev':908 'replac':1015 'report':4,28,44,55,59,97,379,454,665,680,727,792,801,932,960,1112,1205,1260,1273,1293 'request':266 'requir':457,471,1099 'result':635 'retent':1351 'return':274,546,1000,1032 'review':69,1117 'right':569 'risk':660 'roa':326,489 'row':930 'rule':1200 'run':66,396,432 'saa':72 'say':42,1136,1234 'scan':681 'scannabl':1261 'script':556 'search':301,494,832,835,1323 'season':702,777 'section':668,874,991,1017,1109,1181,1196 'see':1012 'seem':1128 'select':591,652 'sensit':1157 'sentenc':858,902,1068 'seo':1316 'separ':262 'server':217 'session':293,613,617,829,935,967 'set':409,941,951,954 'setup':1289 'sharp':107 'shift':763 'show':387,785,973 'sign':572 'signal':1062,1340 'signific':708,712,758,1080 'silent':369,992 'similar':786 'singl':270,809,927,1078 'skill':7,582,607,640,1300 'skill-ds-channel-report' 'skip':367,403,872,989,1179 'soften':1239 'sourc':916,1042,1225 'source-dataslayer-ai' 'source/medium':297,921 'specif':862,905,1166,1313 'specifi':182 'spend':320,329,337,347,356,472,756,883 'spend/conversions':478 'spike':707 'split':280 'stabl':753 'start':249 'state':1246 'steadi':776 'step':115,190,407,673,788,1013 'strateg':36 'stripe':422 'structur':793 'subag':34 'submit':579 'sudden':743 'summari':807,997 'support':732 'synthesi':37 'tabl':502 'target':160 'task':1167 'team':73 'ten':113 'test':1028 'thing':812,1081 'three':1065 'tiktok':343 'time':1156 'time-sensit':1155 'tone':1197 'tool':207,215 'top':311,492,841 'topic-agent-skills' 'topic-analytics' 'topic-claude-code' 'topic-marketing' 'topic-mcp' 'topic-paid-media' 'topic-seo' 'total':303,895,964,1045,1058 'track':741,1021 'traffic':295,911 'trend':484,1090 'trial':577 'tsv':499 'two':261,286,857,901,1279 'understand':1331 'unexpect':709,713 'unit':1221 'up/down/flat':625 'updat':760 'use':5,174,594,644,669,728,1216,1257 'user':10,41,141,167,294,392,443,508,1036,1255 'util':536,542,551 'uuid':226 'vagu':1170 'valid':564,633,643,1009 'valu':491 'vari':219 'verifi':1037 'vs':186,309,599,886,1046 'w':50 'wait':245 'want':11,151,393,451 'warn':595 'week':15,43,54,67,159,696,698,782,799,816,824,826,847,888,980,982,1048,1060,1085,1103,1149,1280,1317 'week-over-week':979 'worth':110 'would':1143 'write':554,678,725,790,1113,1249 'wrong':1232 'x':614 'x2':618 'y':616 'y2':620","prices":[{"id":"5ed325c7-b463-44a2-a681-de92700f1bed","listingId":"ec41e51d-fd2a-41c0-8253-baaa43c415a5","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Dataslayer-AI","category":"Marketing-skills","install_from":"skills.sh"},"createdAt":"2026-04-23T13:04:25.083Z"}],"sources":[{"listingId":"ec41e51d-fd2a-41c0-8253-baaa43c415a5","source":"github","sourceId":"Dataslayer-AI/Marketing-skills/ds-channel-report","sourceUrl":"https://github.com/Dataslayer-AI/Marketing-skills/tree/main/skills/ds-channel-report","isPrimary":false,"firstSeenAt":"2026-04-23T13:04:25.083Z","lastSeenAt":"2026-04-24T01:03:50.009Z"}],"details":{"listingId":"ec41e51d-fd2a-41c0-8253-baaa43c415a5","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Dataslayer-AI","slug":"ds-channel-report","github":{"repo":"Dataslayer-AI/Marketing-skills","stars":9,"topics":["agent-skills","analytics","claude-code","marketing","mcp","paid-media","seo"],"license":"mit","html_url":"https://github.com/Dataslayer-AI/Marketing-skills","pushed_at":"2026-03-23T15:50:29Z","description":"Marketing agent skills powered by real data. Connect Claude Code to your actual Google Ads, GA4, Search Console, Meta Ads, LinkedIn Ads and 50+ platforms via Dataslayer MCP — no copy-pasting required.","skill_md_sha":"65a4ac1d10fd3faf8718652fdb7ae7a67a9e644e","skill_md_path":"skills/ds-channel-report/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Dataslayer-AI/Marketing-skills/tree/main/skills/ds-channel-report"},"layout":"multi","source":"github","category":"Marketing-skills","frontmatter":{"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."},"skills_sh_url":"https://skills.sh/Dataslayer-AI/Marketing-skills/ds-channel-report"},"updatedAt":"2026-04-24T01:03:50.009Z"}}