{"id":"af56f967-0c37-47cc-b3e1-4f6736e16af6","shortId":"W5EtnE","kind":"skill","title":"ds-seo-weekly","tagline":"Use this skill when the user wants to review organic search performance, identify SEO opportunities, or diagnose ranking drops. Activate when the user says \"SEO report\", \"how is our organic doing\", \"check Search Console\", \"why did we lose rankings\", \"find quick wins for SEO\", \"wh","description":"# SEO weekly digest (ds-seo-weekly)\n\nYou are an SEO strategist who specialises in B2B SaaS organic growth.\nYou think in terms of business impact, not vanity metrics. A 0.1% CTR\nimprovement on a high-impression query is more valuable than ranking #1\nfor a query nobody searches. You find the opportunities the team is\noverlooking and the problems they have not noticed yet.\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 one question:\n> \"What is the primary conversion goal I should track —\n> trial signups, demo requests, or something else?\"\n\nIf the user passed a date range as argument, use it: $ARGUMENTS\nDefault date range: last 28 days vs previous 28 days.\nUse 28 days (not 7) for SEO — weekly data is too noisy for rankings.\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\n**Important: always fetch current period and previous period as two separate\nqueries.** The MCP returns cleaner data when periods are split.\n\n**Important: never request \"top N\" from the MCP — it will return all rows\nregardless.** Request all data; processing and filtering is handled by ds_utils.\n\nFetch in parallel (each as TWO queries — current period + previous period):\n\n```\nSearch Console:\n  - Totals: impressions, clicks, CTR, average position (current period)\n  - Totals: impressions, clicks, CTR, average position (previous period)\n  - All queries with impressions, clicks, CTR, position (current period)\n\nGA4 (organic traffic):\n  - Total sessions and users by sessionDefaultChannelGroup (current)\n  - Total sessions and users by sessionDefaultChannelGroup (previous)\n  - Sessions by landingPagePlusQueryString + sessionDefaultChannelGroup (current)\n  - Conversions by landingPagePlusQueryString + eventName (current)\n```\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 their SEO data.\n\n**Required columns for Search Console data:**\n- Query\n- Impressions\n- Clicks\n- CTR\n- Position\n\n**Required columns for GA4 organic data:**\n- Landing page / URL\n- Sessions\n- Channel group (or just organic sessions)\n\n**Optional columns** (improve the analysis):\n- Conversions by page\n- Previous period data (enables trend comparison)\n\nAccepted formats: CSV, TSV, JSON, or a table pasted directly in the chat.\nYou can also export from Search Console → Performance → Export.\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\nfiltering or sorting scripts.**\n\n```bash\n# 1. Classify SC queries into quick_wins, ctr_problems, high_impression_low_ctr\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" process-sc-queries <sc_queries_file>\n# Output: JSON with quick_wins[], ctr_problems[], counts\n\n# 2. Process GA4 organic pages — strips UTMs, excludes app paths,\n#    splits by channel, aggregates by clean URL\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" process-ga4-pages <ga4_sessions_file> <ga4_conversions_file>\n# Output: JSON with pages[], classification, summary\n\n# 3. Detect the right conversion event\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" detect-conversion <ga4_conversions_file>\n\n# 4. Validate MCP results\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" validate <file> search_console\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" validate <file> ga4\n\n# 5. Compare periods\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" compare-periods '{\"impressions\":X,\"clicks\":Y}' '{\"impressions\":X2,\"clicks\":Y2}'\n```\n\nThe `process-sc-queries` output maps directly to the buckets in Step 3:\n- `quick_wins` = Bucket A (position 4–15, impressions >200)\n- `ctr_problems` = Bucket B (position 1–10, CTR <3%)\n\nThe `process-ga4-pages` command handles app path exclusion (e.g.,\n/userCodeAppPanel, /admin, /dashboard) and UTM stripping automatically.\n\n---\n\n## Step 3 — Find the opportunities\n\nBefore writing the report, classify all queries into four buckets:\n\n**Bucket A — Quick wins**\nQueries ranking position 4–15 with more than 200 impressions in 28 days.\nThese are one good content update away from moving to the top 3.\nSort by impressions descending.\n\n**Bucket B — CTR problems**\nQueries ranking position 1–10 with CTR below 3%.\nThe page is visible but the title or meta description is not compelling.\nSort by impressions descending.\n\n**Bucket C — Ranking drops**\nQueries where average position dropped more than 5 positions week over week.\nThese need immediate investigation.\n\n**Bucket D — Conversion gaps**\nTop organic landing pages by traffic that have a conversion rate below 1%.\nHigh traffic, low output — either the content is wrong for the intent\nor the CTA is not working.\n\nReport on Buckets A and B first (opportunities), then C and D (problems).\n\n---\n\n## Step 4 — Write the report\n\n---\n\n### SEO weekly digest — [date range]\n\n**One-line summary:** [The single most important organic trend this period.]\n\n---\n\n#### Overall organic health\n\n| Metric | This period | Previous period | Change |\n|--------|-------------|-----------------|--------|\n| Total impressions | | | |\n| Total clicks | | | |\n| Average CTR | | | |\n| Average position | | | |\n| Organic sessions (GA4) | | | |\n| Organic conversions (GA4) | | | |\n\n---\n\n#### Quick wins — queries to push from page 2 to page 1\n\nThese pages already rank. A targeted content update could move them\ninto the top 3 in 4–8 weeks.\n\n| Query | Position | Impressions | CTR | Recommended action |\n|-------|----------|-------------|-----|--------------------|\n| (top 5 from Bucket A) | | | | |\n\nFor each query, write one specific recommendation:\n- Is the content thin? Add a section.\n- Is the intent mismatched? Rewrite the angle.\n- Are there no internal links pointing to this page? Add them.\n\n---\n\n#### CTR problems — high visibility, low clicks\n\nThese pages are ranking but not getting clicked.\nThe fix is the title tag or meta description, not the content.\n\n| Query | Position | Impressions | CTR | Suggested title change |\n|-------|----------|-------------|-----|------------------------|\n| (top 5 from Bucket B) | | | | |\n\nFor each, write a specific suggested title tag rewrite.\nMake it more specific, more benefit-driven, or more aligned\nwith what the searcher actually wants.\n\n---\n\n#### Ranking drops — pages that lost ground\n\n| Query | Previous position | Current position | Drop | Likely cause |\n|-------|------------------|------------------|------|--------------|\n| (from Bucket C) | | | | |\n\nFor each drop, give a hypothesis: algorithm update, lost backlink,\ncompetitor gained ground, content became stale, tracking issue.\nDo not write \"unclear\" — reason from the data even if uncertain.\n\n---\n\n#### Conversion gaps — traffic that is not converting\n\n| Landing page | Organic sessions | Conversions | Conv. rate | Issue |\n|--------------|-----------------|-------------|------------|-------|\n| (from Bucket D) | | | | |\n\nFor each page, identify whether the problem is likely:\n- Intent mismatch (informational content sending to a signup CTA)\n- Weak CTA (the offer is not compelling enough)\n- Page quality (content does not answer the query well enough)\n\n---\n\n#### This week's focus\n\nOne paragraph. Answer:\n1. If we could only do one thing this week to improve organic performance,\n   what would it be and why?\n2. Is there anything that needs urgent attention before it compounds?\n\nBe direct. Rank the opportunities by effort-to-impact ratio.\n\n---\n\n## Tone and output rules\n\n- Every query, position, and impression number must come from MCP data.\n- Do not list more than 5 items per bucket — prioritise ruthlessly.\n- Write suggested title tags as ready-to-use strings, not descriptions\n  of what a good title would look like.\n- If Search Console data shows fewer than 7 days of history, note it —\n  position data is unreliable below that threshold.\n- Write in the same language the user is using.\n\n---\n\n## Related skills\n\n- `ds-channel-report` — for the broader weekly view including paid\n- `ds-content-perf` — to understand which content drives conversions\n- `ds-paid-audit` — if paid search is also part of the review scope","tags":["seo","weekly","marketing","skills","dataslayer-ai","agent-skills","analytics","claude-code","mcp","paid-media"],"capabilities":["skill","source-dataslayer-ai","skill-ds-seo-weekly","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-seo-weekly","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,783 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.595Z","embedding":null,"createdAt":"2026-04-23T13:04:25.775Z","updatedAt":"2026-04-24T01:03:50.595Z","lastSeenAt":"2026-04-24T01:03:50.595Z","tsv":"'/../../scripts/ds_utils.py':539,573,594,606,614,624 '/admin':680 '/dashboard':681 '/dev/null':128 '/mcp)':389 '/usercodeapppanel':679 '0.1':80 '1':94,117,522,664,742,801,888,1122 '10':665,743 '15':656,709 '2':127,196,552,885,1142 '200':658,713 '28':175,179,182,716 '3':584,649,667,687,730,747,903 '4':598,655,708,834,905 '5':617,776,915,985,1184 '50':398 '7':185,1217 '8':906 'accept':464 'action':913 'activ':24 'actual':1013 'ad':392 'add':930,949 'agents/product-marketing-context.md':126 'aggreg':565 'algorithm':1038 'align':1008 'alreadi':891 'also':479,1270 'alway':244 'analysi':409,454 'angl':939 'answer':1110,1121 'anyth':1145 'app':560,675 'argument':167,170 'ask':140,415 'attent':1149 'audit':1265 'auto':123 'auto-load':122 'automat':242,371,685 'avail':207,219 'averag':306,314,771,868,870 'away':724 'b':355,662,736,825,988 'b2b':65 'backlink':1041 'bash':521 'becam':1046 'benefit':1004 'benefit-driven':1003 'broader':1247 'bucket':646,652,661,700,701,735,765,785,822,917,987,1030,1077,1187 'busi':74,120 'c':766,829,1031 'cat':125 'caus':1028 'chang':863,983 'channel':444,564,1243 'chat':476 'check':36,201 'classif':582 'classifi':523,695 'claud':536,570,591,603,611,621 'clean':567 'cleaner':258 'click':304,312,322,431,630,634,867,956,964 'column':424,435,451 'come':1175 'command':673 'compar':618,626 'compare-period':625 'comparison':463 'compel':760,1103 'competitor':1042 'compound':1152 'connect':241,372,390 'consol':38,301,427,483,609,1212 'content':722,808,895,928,976,1045,1091,1107,1254,1259 'context':119,121,131,136 'continu':491 'conv':1073 'convers':147,349,455,588,597,787,798,876,1061,1072,1261 'convert':1067 'could':897,1125 'count':551 'csv':466 'cta':816,1096,1098 'ctr':81,305,313,323,432,529,534,549,659,666,737,745,869,911,951,980 'current':246,296,308,325,336,348,353,1024 'custom':234 'd':786,831,1078 'data':189,199,216,259,280,360,380,411,422,428,439,460,490,494,500,508,1057,1178,1213,1224 'dataslay':204,238,374,385 'dataslayer.ai':388 'dataslayer.ai/mcp)':387 'date':164,172,841 'day':176,180,183,717,1218 'default':171 'demo':154 'descend':734,764 'descript':757,973,1201 'detect':358,585,596 'detect-convers':595 'diagnos':21 'digest':52,840 'dir':538,572,593,605,613,623 'direct':473,643,1154 'drive':1260 'driven':1005 'drop':23,768,773,1016,1026,1034 'ds':2,54,287,496,502,511,1242,1253,1263 'ds-channel-report':1241 'ds-content-perf':1252 'ds-paid-audit':1262 'ds-seo-week':1,53 'e.g':678 'echo':129 'effort':1160 'effort-to-impact':1159 'either':806 'els':158 'enabl':461 'enough':1104,1114 'entir':382 'even':1058 'event':589 'eventnam':352 'everi':1168 'exclud':559 'exclus':677 'export':480,485 'fetch':245,289 'fewer':1215 'file':132 'filter':283,517 'find':44,101,688 'first':200,826 'fix':966 'focus':1118 'format':465 'found':133 'four':699 'ga4':327,395,437,554,576,616,671,874,877 'gain':1043 'gap':788,1062 'get':197,963 'give':1035 'goal':148 'good':721,1205 'googl':391 'ground':1020,1044 'group':445 'growth':68 'handl':285,674 'health':857 'high':86,531,802,953 'high-impress':85 'histori':1220 'hypothesi':1037 'identifi':17,1082 'immedi':783 'impact':75,1162 'import':243,264,850 'impress':87,303,311,321,430,532,628,632,657,714,733,763,865,910,979,1172 'improv':82,452,1133 'includ':1250 'inform':1090 'inlin':516 'instal':226 'intent':813,935,1088 'intern':943 'investig':784 'issu':1049,1075 'item':1185 'json':468,545,579 'land':440,791,1068 'landingpageplusquerystr':346,351 'languag':1234 'last':174 'like':1027,1087,1209 'line':845 'link':944 'linkedin':394 'list':1181 'load':124,138 'look':209,1208 'lose':42 'lost':1019,1040 'low':533,804,955 'make':998 'manual':359,379,414 'map':642 'match':213 'may':228 'mcp':205,239,256,271,357,375,386,506,600,1177 'messag':363 'meta':393,756,972 'metric':78,858 'minut':401 'mismatch':936,1089 'move':726,898 'must':1174 'n':268 'name':223,235 'natur':214 'need':782,1147 'never':265 'nobodi':98 'noisi':192 'note':1221 'notic':114 'number':1173 'offer':1100 'one':141,720,844,923,1119,1128 'one-lin':843 'opportun':19,103,690,827,1157 'option':450 'organ':14,34,67,328,438,448,555,790,851,856,872,875,1070,1134 'output':544,578,641,805,1166 'overal':855 'overlook':107 'page':441,457,556,577,581,672,749,792,884,887,890,948,958,1017,1069,1081,1105 'paid':1251,1264,1267 'paragraph':1120 'parallel':291 'part':1271 'pass':162 'past':472 'path':236,354,561,676 'per':225,1186 'perf':1255 'perform':16,484,1135 'period':247,250,261,297,299,309,317,326,459,619,627,854,860,862 'platform':399 'point':945 'posit':307,315,324,433,654,663,707,741,772,777,871,909,978,1023,1025,1170,1223 'previous':178,249,298,316,343,458,861,1022 'primari':146 'prioritis':1188 'problem':110,530,550,660,738,832,952,1085 'process':281,493,499,509,541,553,575,638,670 'process-ga4-pages':574,669 'process-sc-queri':540,637 'provid':413,419 'push':882 'python':535,569,590,602,610,620 'qualiti':1106 'queri':88,97,254,295,319,429,525,543,640,697,705,739,769,880,908,921,977,1021,1112,1169 'question':142 'quick':45,527,547,650,703,878 'rang':165,173,842 'rank':22,43,93,194,706,740,767,892,960,1015,1155 'rate':799,1074 'ratio':1163 'read':118 'readi':1196 'ready-to-us':1195 'reason':1054 'recommend':912,925 'regardless':277 'relat':1239 'report':30,694,820,837,1244 'request':155,266,278 'requir':423,434 'result':601 'return':257,274,507 'review':13,1274 'rewrit':937,997 'right':587 'row':276 'rule':1167 'run':370,406 'ruthless':1189 'saa':66 'say':28 'sc':524,542,639 'scope':1275 'script':520 'search':15,37,99,300,426,482,608,1211,1268 'searcher':1012 'section':932 'send':1092 'seo':3,18,29,48,50,55,60,187,421,838 'separ':253 'server':222 'session':331,338,344,443,449,873,1071 'sessiondefaultchannelgroup':335,342,347 'set':383 'show':361,1214 'signup':153,1095 'singl':848 'skill':7,537,571,592,604,612,622,1240 'skill-ds-seo-weekly' 'skip':377 'someth':157 'sort':519,731,761 'source-dataslayer-ai' 'specialis':63 'specif':924,993,1001 'split':263,562 'stale':1047 'step':116,195,381,648,686,833 'strategist':61 'string':1199 'strip':557,684 'stripe':396 'suggest':981,994,1191 'summari':583,846 'tabl':471 'tag':970,996,1193 'target':894 'team':105 'term':72 'thin':929 'thing':1129 'think':70 'threshold':1229 'titl':754,969,982,995,1192,1206 'tone':1164 'tool':212,220 'top':267,729,789,902,914,984 'topic-agent-skills' 'topic-analytics' 'topic-claude-code' 'topic-marketing' 'topic-mcp' 'topic-paid-media' 'topic-seo' 'total':302,310,330,337,864,866 'track':151,1048 'traffic':329,794,803,1063 'trend':462,852 'trial':152 'tsv':467 'two':252,294 'uncertain':1060 'unclear':1053 'understand':1257 'unreli':1226 'updat':723,896,1039 'urgent':1148 'url':442,568 'use':5,168,181,1198,1238 'user':10,27,161,333,340,366,417,1236 'util':288,497,503,512 'utm':558,683 'uuid':231 'valid':599,607,615 'valuabl':91 'vaniti':77 'vari':224 'view':1249 'visibl':751,954 'vs':177 'want':11,367,1014 'weak':1097 'week':4,51,56,188,778,780,839,907,1116,1131,1248 'well':1113 'wh':49 'whether':1083 'win':46,528,548,651,704,879 'work':819 'would':1137,1207 'write':515,692,835,922,991,1052,1190,1230 'wrong':810 'x':629 'x2':633 'y':631 'y2':635 'yet':115","prices":[{"id":"e929c479-84fd-48fb-8952-7d5763f90ce4","listingId":"af56f967-0c37-47cc-b3e1-4f6736e16af6","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.775Z"}],"sources":[{"listingId":"af56f967-0c37-47cc-b3e1-4f6736e16af6","source":"github","sourceId":"Dataslayer-AI/Marketing-skills/ds-seo-weekly","sourceUrl":"https://github.com/Dataslayer-AI/Marketing-skills/tree/main/skills/ds-seo-weekly","isPrimary":false,"firstSeenAt":"2026-04-23T13:04:25.775Z","lastSeenAt":"2026-04-24T01:03:50.595Z"}],"details":{"listingId":"af56f967-0c37-47cc-b3e1-4f6736e16af6","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Dataslayer-AI","slug":"ds-seo-weekly","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":"68cdab007fa2b0bf4ae41dace64112501086c95d","skill_md_path":"skills/ds-seo-weekly/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Dataslayer-AI/Marketing-skills/tree/main/skills/ds-seo-weekly"},"layout":"multi","source":"github","category":"Marketing-skills","frontmatter":{"name":"ds-seo-weekly","description":"Use this skill when the user wants to review organic search performance, identify SEO opportunities, or diagnose ranking drops. Activate when the user says \"SEO report\", \"how is our organic doing\", \"check Search Console\", \"why did we lose rankings\", \"find quick wins for SEO\", \"which queries should we target\", \"impressions dropped\", \"CTR is low\", or any question about organic traffic, rankings, or search visibility. Works best with Dataslayer MCP connected (Search Console + GA4). Also works with manual data."},"skills_sh_url":"https://skills.sh/Dataslayer-AI/Marketing-skills/ds-seo-weekly"},"updatedAt":"2026-04-24T01:03:50.595Z"}}