{"id":"af0af0a1-dfec-4118-a518-ea6b3b3b0b65","shortId":"v2NXgr","kind":"skill","title":"ds-report-pdf","tagline":"Use this skill when the user wants to generate a professional PDF report for a client or for internal use. Activate when the user says \"generate a PDF report\", \"create a client report\", \"export to PDF\", \"make a report for my client\", \"monthly report PDF\", \"branded report\", or any","description":"# Client PDF report generator (ds-report-pdf)\n\nYou are a marketing analyst and Python developer combined. You fetch\nreal marketing data, analyze it, write production-quality Python code\nto generate a professional branded PDF, and execute it immediately.\nThe output is a downloadable file ready to send to a client.\n\nA reference implementation is available at:\n`${CLAUDE_SKILL_DIR}/scripts/generate_report.py`\nRead it before writing your own script — use it as a starting point\nand adapt it to the actual data fetched from Dataslayer MCP.\n\n---\n\n## Step 1 — Read branding config\n\nBusiness context (auto-loaded):\n!`cat .agents/product-marketing-context.md 2>/dev/null || echo \"No context file found.\"`\n\nBranding config (auto-loaded):\n!`cat dataslayer-config.json 2>/dev/null || echo \"No config file found. Using defaults.\"`\n\nIf the user passed arguments, apply them:\n- Client name: $0\n- Period: $1\n\nExtract from config (or use defaults):\n- `client_name` — appears on cover and headers (default: \"Client\")\n- `agency_name` — appears in footer (default: \"\")\n- `logo_path` — local path to client logo image (PNG or JPG)\n- `brand_color` — hex color for headers and accents (default: \"#0F6E56\")\n- `secondary_color` — hex color for secondary elements (default: \"#1D9E75\")\n- `report_language` — \"en\" or \"es\" (default: \"en\")\n- `report_period` — e.g. \"March 2026\" (default: current month)\n- `currency` — \"EUR\", \"USD\", \"GBP\" (default: \"EUR\")\n- `channels` — list of channels to include (default: all connected)\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 configured channels in parallel for the report period.\n\n```\nFetch in parallel (only channels listed in config, or all if not specified):\n\n  Google Ads:\n    - Total spend, impressions, clicks, CTR, conversions, CPA, ROAS\n    - Campaign breakdown: name, spend, conversions, CPA\n    - Week over week trend (last 4 weeks)\n\n  Meta Ads:\n    - Total spend, impressions, clicks, CTR, conversions, CPA\n    - Campaign breakdown: name, spend, conversions, CPA\n\n  LinkedIn Ads:\n    - Total spend, impressions, clicks, CTR, conversions, CPL\n\n  GA4:\n    - Sessions, users, conversions, conversion rate\n    - Top 5 organic landing pages by conversions\n    - Traffic source breakdown\n\n  Search Console:\n    - Total impressions, clicks, CTR, average position\n    - Top 10 queries by clicks\n```\n\nStore all results in structured variables.\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 generate the same branded PDF report with data you\n> 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, Clicks, CTR, Conversions\n- Spend / Cost and CPA (paid channels)\n\n**For the best report, also provide:**\n- Campaign-level breakdown (name, spend, conversions, CPA)\n- Weekly trend data (last 4 weeks)\n- Top queries from Search Console\n- GA4 traffic source breakdown\n\nAccepted formats: CSV, TSV, JSON, or tables pasted in the chat.\n\nOnce you have the data, continue to \"Process data with ds_utils\" below.\n\n### Process data with ds_utils\n\nBefore generating the PDF, process all MCP data through ds_utils\nfor consistent calculations:\n\n```bash\n# Process GA4 pages (UTM stripping, classification)\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" process-ga4-pages <ga4_file>\n\n# Detect conversion event\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" detect-conversion <conversions_file>\n\n# Compare months\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" compare-periods '{\"spend\":X,\"conversions\":Y}' '{\"spend\":X2,...}'\n\n# CPA check\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" cpa-check <cpa> b2b_saas\n\n# Validate all data sources\npython \"${CLAUDE_SKILL_DIR}/../../scripts/ds_utils.py\" validate <file> <source>\n```\n\nUse the JSON output from ds_utils as the data source for the PDF script.\nThis ensures the numbers in the PDF match what the other skills report.\n\n---\n\n## Step 3 — Analyze and prepare findings\n\nBefore writing any code, prepare:\n\n1. **Executive summary** (2-3 sentences): the most important thing\n   that happened this period, in plain language.\n\n2. **Key metrics summary**: a clean table of top-line numbers.\n\n3. **Top 3 findings**: the three most actionable insights from the data.\n   Each finding needs: what happened, why it matters, what to do.\n\n4. **Status per channel**: Green / Amber / Red with one-line reason.\n\n---\n\n## Step 4 — Write and execute the Python PDF generator\n\nRead the reference script first:\n`${CLAUDE_SKILL_DIR}/scripts/generate_report.py`\n\nWrite a complete Python script using reportlab that generates the PDF.\nThen execute it immediately using the bash tool.\n\n### Python script requirements\n\n```python\n# Required libraries — install if not present:\n# pip install reportlab pillow requests --break-system-packages\n\nimport json\nimport os\nimport requests\nfrom io import BytesIO\nfrom datetime import datetime\nfrom reportlab.lib.pagesizes import A4\nfrom reportlab.lib import colors\nfrom reportlab.lib.units import mm\nfrom reportlab.lib.styles import ParagraphStyle\nfrom reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT\nfrom reportlab.platypus import (\n    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,\n    HRFlowable, PageBreak, KeepTogether\n)\nfrom reportlab.platypus import Flowable\n```\n\n### Cover page\n\nThe cover page must include:\n- Full-bleed colored background using `brand_color`\n- Client logo centered (load from `logo_path` or `logo_url` if provided,\n  skip gracefully if not found — never crash on missing logo)\n- Report title in white, large font\n- Report period and date generated\n- Agency name in the footer if provided\n\n### Page template\n\nEvery page after the cover must have:\n- A thin colored header bar (3mm, `brand_color`) at the top\n- Page number bottom right\n- Agency name bottom left (if provided)\n- Client name bottom center\n\n### Report sections\n\nGenerate these sections in order, each starting with a colored H2:\n\n**Section 1 — Executive summary**\n- The 2-3 sentence summary prepared in Step 3\n- A metric grid: 4 cards showing the most important top-line numbers\n  (total spend, total conversions, blended CPA, organic sessions)\n\n**Section 2 — Channel performance**\nFor each connected channel, a subsection with:\n- Status badge (Green / Amber / Red) next to the channel name\n- A clean metrics table (this period vs last period, % change)\n- Color-code the change column: green for improvement, red for decline\n- Campaign breakdown table for paid channels (top 5 campaigns)\n\n**Section 3 — Key findings**\nThree finding cards, each with:\n- Finding title in `brand_color`\n- What happened (with specific numbers)\n- What to do (specific action)\n\n**Section 4 — Recommended actions**\nA numbered list of 3-5 prioritized actions for the next period.\nEach action: title, description, expected impact, suggested owner.\n\n**Section 5 — Appendix (optional)**\nRaw data tables if the user requested full detail.\n\n### Output file\n\nSave to: `./reports/[client_name]_[period]_marketing_report.pdf`\nCreate the `reports/` directory if it does not exist.\n\n### Color rules for the Python code\n\n```python\n# Always define colors as HexColor objects\nBRAND     = colors.HexColor(config[\"brand_color\"])\nSECONDARY = colors.HexColor(config[\"secondary_color\"])\nDARK      = colors.HexColor(\"#2C2C2A\")\nLIGHT     = colors.HexColor(\"#F1EFE8\")\nWHITE     = colors.white\nSUCCESS   = colors.HexColor(\"#1D9E75\")\nWARNING   = colors.HexColor(\"#854F0B\")\nDANGER    = colors.HexColor(\"#A32D2D\")\n\n# Status colors\nSTATUS_GREEN  = colors.HexColor(\"#E1F5EE\")\nSTATUS_AMBER  = colors.HexColor(\"#FAEEDA\")\nSTATUS_RED    = colors.HexColor(\"#FCEBEB\")\n```\n\n### Table style rules for the Python code\n\n```python\n# Standard data table style\nDATA_TABLE_STYLE = TableStyle([\n    (\"BACKGROUND\",    (0, 0), (-1, 0), BRAND),\n    (\"TEXTCOLOR\",     (0, 0), (-1, 0), WHITE),\n    (\"FONTNAME\",      (0, 0), (-1, 0), \"Helvetica-Bold\"),\n    (\"FONTSIZE\",      (0, 0), (-1, -1), 9),\n    (\"TOPPADDING\",    (0, 0), (-1, -1), 6),\n    (\"BOTTOMPADDING\", (0, 0), (-1, -1), 6),\n    (\"LEFTPADDING\",   (0, 0), (-1, -1), 8),\n    (\"GRID\",          (0, 0), (-1, -1), 0.3,\n     colors.HexColor(\"#D3D1C7\")),\n    (\"ROWBACKGROUNDS\", (0, 1), (-1, -1),\n     [WHITE, colors.HexColor(\"#F1EFE8\")]),\n    (\"FONTNAME\",      (0, 1), (-1, -1), \"Helvetica\"),\n    (\"VALIGN\",        (0, 0), (-1, -1), \"MIDDLE\"),\n])\n```\n\n---\n\n## Step 5 — Execute and confirm\n\nRun the script using the bash tool:\n\n```bash\npip install reportlab pillow --break-system-packages -q\npython generate_report.py\n```\n\nIf it runs successfully, tell the user:\n- The exact file path of the PDF\n- The file size\n- How to open it\n\nIf it fails, fix the error and re-run. Do not ask the user for help\ndebugging — fix it yourself and re-run silently.\n\n---\n\n## Step 6 — Natural language customization\n\nThe user never needs to edit a JSON file or touch any code.\nEvery aspect of the report can be changed by just saying it.\n\n### Understand and apply these customization requests automatically:\n\n**Logo**\n- \"Add my logo\" → ask for a file path or URL, add to config + PDF cover\n- \"Use the logo at https://...\" → download and embed automatically\n- \"Remove the logo\" → generate without logo, no crash\n\n**Colors**\n- \"Make it blue\" → set brand_color to a sensible blue (#1B4F8A)\n- \"Use our brand color #FF6B35\" → apply exact hex\n- \"Dark theme\" → dark background cover, light body\n- \"Make it more corporate\" → navy + gray palette\n\n**Language**\n- \"In Spanish\" / \"En español\" → all labels, headings, and text in Spanish\n- \"In French\" → same for French\n- Default is English if not specified\n\n**Client name and agency**\n- \"This is for Acme Corp\" → client_name = \"Acme Corp\"\n- \"Prepared by Agency XYZ\" → agency_name = \"Agency XYZ\"\n- \"Add the contact email john@acme.com\" → add to footer\n\n**Content**\n- \"Without the appendix\" → skip raw data tables\n- \"Only paid media and organic\" → skip content and retention sections\n- \"Add an executive summary on page 1\" → always include summary card\n- \"Make it shorter\" → reduce to 2 pages, key metrics only\n- \"More detail on Google Ads\" → expand campaign breakdown table\n\n**Date range**\n- \"For last month\" → calculate and apply automatically\n- \"Q1 2026\" → January 1 to March 31 2026\n- \"Last 30 days\" → rolling window\n\n### After any customization request:\n\n1. Confirm what you understood: \"I'll generate the report with a blue\n   palette (#1B4F8A), Acme Corp branding, in Spanish, for March 2026.\"\n2. Update the config variables internally\n3. Regenerate the PDF immediately\n4. If the user says \"no, make it darker blue\" — adjust and regenerate\n\nThe user should never have to say the same thing twice.\nOnce a preference is stated, apply it to all future regenerations\nin the same session.\n\n### Save to config file on request:\n\nIf the user says \"save this setup\" or \"remember these settings\",\nwrite the current config to `dataslayer-config.json` so it\npersists for future sessions:\n\n```bash\n# Claude writes this automatically when asked to save\ncat > dataslayer-config.json << 'EOF'\n{\n  \"client_name\": \"[current value]\",\n  \"agency_name\": \"[current value]\",\n  \"brand_color\": \"[current value]\",\n  ...\n}\nEOF\necho \"Settings saved to dataslayer-config.json\"\n```\n\n---\n\n## Config file reference\n\nTell the user that running this command creates a starter config:\n\n```bash\ncat > dataslayer-config.json << 'EOF'\n{\n  \"client_name\": \"Your Client Name\",\n  \"agency_name\": \"Your Agency Name\",\n  \"logo_path\": \"./logo.png\",\n  \"brand_color\": \"#0F6E56\",\n  \"secondary_color\": \"#1D9E75\",\n  \"report_language\": \"en\",\n  \"report_period\": \"March 2026\",\n  \"currency\": \"EUR\",\n  \"channels\": [\"google_ads\", \"meta_ads\", \"linkedin_ads\", \"ga4\", \"search_console\"]\n}\nEOF\n```\n\n---\n\n## Tone and output rules\n\n- The PDF must look professional enough to send directly to a client\n  without additional editing. No amateur layouts, no clashing colors.\n- Never crash on missing data — if a channel has no data, show a\n  \"No data available for this period\" placeholder in that section.\n- Never ask the user to run the script themselves — execute it.\n- The filename must be clean and client-ready:\n  `Acme_Corp_March_2026_marketing_report.pdf` not `report_final_v2.pdf`\n- Write in the language specified in the config (`report_language`).\n\n---\n\n## Related skills\n\n- `ds-brain` — run this first to get the full analysis, then use\n  `ds-report-pdf` to generate the client deliverable\n- `ds-paid-audit` — for a deeper paid analysis before the PDF\n- `ds-channel-report` — for a quick internal digest without PDF output","tags":["report","pdf","marketing","skills","dataslayer-ai","agent-skills","analytics","claude-code","mcp","paid-media","seo"],"capabilities":["skill","source-dataslayer-ai","skill-ds-report-pdf","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-report-pdf","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 (12,999 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.518Z","embedding":null,"createdAt":"2026-04-23T13:04:25.662Z","updatedAt":"2026-04-24T01:03:50.518Z","lastSeenAt":"2026-04-24T01:03:50.518Z","tsv":"'-1':1202,1208,1214,1222,1223,1228,1229,1234,1235,1240,1241,1246,1247,1254,1255,1262,1263,1268,1269 '-3':692,970 '-5':1083 '/../../scripts/ds_utils.py':595,607,617,633,647 '/dev/null':153,167 '/logo.png':1733 '/mcp)':456 '/reports':1115 '/scripts/generate_report.py':115,769 '0':184,1200,1201,1203,1206,1207,1209,1212,1213,1215,1220,1221,1226,1227,1232,1233,1238,1239,1244,1245,1252,1260,1266,1267 '0.3':1248 '0f6e56':228,1736 '1':141,186,688,965,1253,1261,1521,1557,1571 '10':411 '1b4f8a':1422,1585 '1d9e75':237,1162,1739 '2':152,166,269,691,705,969,999,1531,1594 '2026':249,1555,1561,1593,1746 '2c2c2a':1154 '3':678,717,719,976,1051,1082,1600 '30':1563 '31':1560 '3mm':931 '4':360,530,740,753,980,1075,1605 '5':393,1048,1099,1272 '50':465 '6':1230,1236,1343 '8':1242 '854f0b':1165 '9':1224 'a32d2d':1168 'a4':825 'accent':226 'accept':541 'acm':1475,1479,1586 'acme_corp_march_2026_marketing_report.pdf':1828 'action':724,1073,1077,1085,1091 'activ':25 'actual':134 'ad':340,363,378,459,1540,1751,1753,1755 'adapt':130 'add':1380,1390,1489,1494,1515 'addit':1777 'adjust':1615 'agenc':202,910,941,1471,1483,1485,1487,1689,1726,1729 'agents/product-marketing-context.md':151 'also':516 'alway':1136,1522 'amateur':1780 'amber':745,1012,1176 'analysi':1853,1873 'analyst':66 'analyz':76,679 'appear':195,204 'appendix':1100,1500 'appli':180,1374,1428,1552,1634 'argument':179 'ask':484,1328,1383,1679,1809 'aspect':1361 'audit':1868 'auto':148,162 'auto-load':147,161 'automat':315,438,1378,1402,1553,1677 'avail':110,280,292,1800 'averag':408 'b':422 'b2b':637 'background':873,1199,1434 'badg':1010 'bar':930 'bash':584,787,1281,1283,1673,1717 'best':514 'bleed':871 'blend':994 'blue':1414,1421,1583,1614 'bodi':1437 'bold':1218 'bottom':939,943,949 'bottompad':1231 'brain':1845 'brand':50,88,143,159,219,476,875,932,1062,1142,1145,1204,1416,1425,1588,1693,1734 'break':805,1289 'break-system-packag':804,1288 'breakdown':350,372,401,521,540,1042,1543 'busi':145 'bytesio':817 'calcul':583,1550 'campaign':349,371,519,1041,1049,1542 'campaign-level':518 'card':981,1056,1525 'cat':150,164,1682,1718 'center':844,879,950 'chang':1028,1033,1367 'channel':259,262,319,330,492,499,511,743,1000,1005,1017,1046,1749,1792,1879 'chat':551 'check':274,628,636 'clash':1783 'classif':590 'claud':112,592,604,614,630,644,766,1674 'clean':710,1020,1823 'click':344,367,382,406,414,503 'client':20,36,46,54,105,182,193,201,213,877,947,1116,1468,1477,1685,1721,1724,1775,1826,1863 'client-readi':1825 'code':83,686,1031,1134,1189,1359 'color':220,222,230,232,829,872,876,928,933,962,1030,1063,1129,1138,1146,1151,1170,1411,1417,1426,1694,1735,1738,1784 'color-cod':1029 'colors.hexcolor':1143,1148,1153,1156,1161,1164,1167,1173,1177,1181,1249,1257 'colors.white':1159 'column':501,1034 'combin':70 'command':1712 'compar':611,619 'compare-period':618 'complet':772 'config':144,160,170,189,333,1144,1149,1392,1597,1646,1664,1703,1716,1838 'configur':318 'confirm':1275,1572 'connect':267,314,439,457,1004 'consist':582 'consol':403,536,1758 'contact':1491 'content':1497,1511 'context':146,156 'continu':557 'convers':346,353,369,375,384,389,390,398,505,524,601,610,623,993 'corp':1476,1480,1587 'corpor':1441 'cost':507 'cover':197,862,865,923,1394,1435 'cpa':347,354,370,376,509,525,627,635,995 'cpa-check':634 'cpl':385 'crash':895,1410,1786 'creat':34,1120,1713 'csv':543 'ctr':345,368,383,407,504 'currenc':253,1747 'current':251,1663,1687,1691,1695 'custom':307,1346,1376,1569 'd3d1c7':1250 'danger':1166 'dark':1152,1431,1433 'darker':1613 'data':75,135,272,289,427,447,480,489,528,556,560,566,577,641,658,728,1103,1192,1195,1503,1789,1795,1799 'dataslay':138,277,311,441,452 'dataslayer-config.json':165,1666,1683,1702,1719 'dataslayer.ai':455 'dataslayer.ai/mcp)':454 'date':908,1545 'datetim':819,821 'day':1564 'debug':1333 'declin':1040 'deeper':1871 'default':174,192,200,207,227,236,243,250,257,265,1462 'defin':1137 'deliver':1864 'descript':1093 'detail':1110,1537 'detect':425,600,609 'detect-convers':608 'develop':69 'digest':1885 'dir':114,594,606,616,632,646,768 'direct':1772 'directori':1123 'download':98,1399 'ds':2,59,562,568,579,654,1844,1857,1866,1878 'ds-brain':1843 'ds-channel-report':1877 'ds-paid-audit':1865 'ds-report-pdf':1,58,1856 'e.g':247 'e1f5ee':1174 'echo':154,168,1698 'edit':1352,1778 'element':235 'email':1492 'emb':1401 'en':240,244,1448,1742 'english':1464 'enough':1769 'ensur':665 'entir':449 'eof':1684,1697,1720,1759 'error':1321 'es':242 'español':1449 'eur':254,258,1748 'event':602 'everi':919,1360 'exact':1303,1429 'execut':91,689,756,782,966,1273,1517,1817 'exist':1128 'expand':1541 'expect':1094 'export':38 'extract':187 'f1efe8':1157,1258 'faeeda':1178 'fail':1318 'fcebeb':1182 'fetch':72,136,316,326 'ff6b35':1427 'file':99,157,171,1112,1304,1310,1355,1386,1647,1704 'filenam':1820 'find':682,720,730,1053,1055,1059 'first':273,765,1848 'fix':1319,1334 'flowabl':861 'font':904 'fontnam':1211,1259 'fontsiz':1219 'footer':206,914,1496 'format':542 'found':158,172,893 'french':1458,1461 'full':870,1109,1852 'full-ble':869 'futur':1638,1671 'ga4':386,462,537,586,598,1756 'gbp':256 'generat':13,30,57,85,473,571,760,778,909,953,1406,1578,1861 'generate_report.py':1294 'get':270,1850 'googl':339,458,1539,1750 'grace':890 'gray':1443 'green':744,1011,1035,1172 'grid':979,1243 'h2':963 'happen':699,733,1065 'head':1452 'header':199,224,929 'help':1332 'helvetica':1217,1264 'helvetica-bold':1216 'hex':221,231,1430 'hexcolor':1140 'hrflowabl':855 'imag':215 'immedi':93,784,1604 'impact':1095 'implement':108 'import':696,808,810,812,816,820,824,828,832,836,840,849,860,985 'impress':343,366,381,405,502 'improv':1037 'includ':264,868,1523 'insight':725 'instal':299,795,800,1285 'intern':23,1599,1884 'io':815 'januari':1556 'john@acme.com':1493 'jpg':218 'json':545,651,809,1354 'keeptogeth':857 'key':706,1052,1533 'label':1451 'land':395 'languag':239,704,1345,1445,1741,1834,1840 'larg':903 'last':359,529,1026,1548,1562 'layout':1781 'left':842,944 'leftpad':1237 'level':520 'librari':794 'light':1155,1436 'line':715,750,988 'linkedin':377,461,1754 'list':260,331,1080 'll':1577 'load':149,163,880 'local':210 'logo':208,214,878,882,885,898,1379,1382,1397,1405,1408,1731 'look':282,1767 'make':41,1412,1438,1526,1611 'manual':426,446,483 'march':248,1559,1592,1745 'market':65,74 'marketing_report.pdf':1119 'match':286,671 'matter':736 'may':301 'mcp':139,278,312,424,442,453,576 'media':1507 'messag':430 'meta':362,460,1752 'metric':707,978,1021,1534 'middl':1270 'minut':468 'miss':897,1788 'mm':833 'month':47,252,612,1549 'must':867,924,1766,1821 'name':183,194,203,296,308,351,373,522,911,942,948,1018,1117,1469,1478,1486,1686,1690,1722,1725,1727,1730 'natur':287,1344 'navi':1442 'need':731,1350 'never':894,1349,1621,1785,1808 'next':1014,1088 'number':667,716,938,989,1068,1079 'object':1141 'one':749 'one-lin':748 'open':1314 'option':1101 'order':957 'organ':394,996,1509 'os':811 'output':95,652,1111,1762,1888 'owner':1097 'packag':807,1291 'page':396,587,599,863,866,917,920,937,1520,1532 'pagebreak':856 'paid':510,1045,1506,1867,1872 'palett':1444,1584 'paragraph':851 'paragraphstyl':837 'parallel':321,328 'pass':178 'past':548 'path':209,211,309,421,883,1305,1387,1732 'pdf':4,16,32,40,49,55,61,89,477,573,662,670,759,780,1308,1393,1603,1765,1859,1876,1887 'per':298,498,742 'perform':1001 'period':185,246,325,620,701,906,1024,1027,1089,1118,1744,1803 'persist':1669 'pillow':802,1287 'pip':799,1284 'placehold':1804 'plain':703 'platform':466 'png':216 'point':128 'posit':409 'prefer':1631 'prepar':681,687,973,1481 'present':798 'priorit':1084 'process':559,565,574,585,597 'process-ga4-pages':596 'product':80 'production-qu':79 'profession':15,87,1768 'provid':482,488,517,888,916,946 'python':68,82,591,603,613,629,643,758,773,789,792,1133,1135,1188,1190,1293 'q':1292 'q1':1554 'qualiti':81 'queri':412,533 'quick':1883 'rang':1546 'rate':391 'raw':1102,1502 're':1324,1339 're-run':1323,1338 'read':116,142,761 'readi':100,1827 'real':73 'reason':751 'recommend':1076 'red':746,1013,1038,1180 'reduc':1529 'refer':107,763,1705 'regener':1601,1617,1639 'relat':1841 'rememb':1658 'remov':1403 'report':3,17,33,37,43,48,51,56,60,238,245,324,478,497,515,676,899,905,951,1122,1364,1580,1740,1743,1839,1858,1880 'report_final_v2.pdf':1830 'reportlab':776,801,1286 'reportlab.lib':827 'reportlab.lib.enums':839 'reportlab.lib.pagesizes':823 'reportlab.lib.styles':835 'reportlab.lib.units':831 'reportlab.platypus':848,859 'request':803,813,1108,1377,1570,1649 'requir':500,791,793 'result':417 'retent':1513 'right':846,940 'roa':348 'roll':1565 'rowbackground':1251 'rule':1130,1185,1763 'run':437,1276,1297,1325,1340,1710,1813,1846 'saa':638 'save':1113,1644,1654,1681,1700 'say':29,1370,1609,1624,1653 'script':122,663,764,774,790,1278,1815 'search':402,535,1757 'secondari':229,234,1147,1150,1737 'section':952,955,964,998,1050,1074,1098,1514,1807 'send':102,1771 'sensibl':1420 'sentenc':693,971 'server':295 'session':387,997,1643,1672 'set':450,1415,1660,1699 'setup':1656 'shorter':1528 'show':428,982,1796 'silent':1341 'simpledoctempl':850 'size':1311 'skill':7,113,593,605,615,631,645,675,767,1842 'skill-ds-report-pdf' 'skip':444,889,1501,1510 'sourc':400,539,642,659 'source-dataslayer-ai' 'spacer':852 'spanish':1447,1456,1590 'specif':1067,1072 'specifi':338,1467,1835 'spend':342,352,365,374,380,506,523,621,625,991 'standard':1191 'start':127,959 'starter':1715 'state':1633 'status':741,1009,1169,1171,1175,1179 'step':140,268,448,677,752,975,1271,1342 'store':415 'strip':589 'stripe':463 'structur':419 'style':1184,1194,1197 'subsect':1007 'success':1160,1298 'suggest':1096 'summari':690,708,967,972,1518,1524 'system':806,1290 'ta':841,843,845 'tabl':547,711,853,1022,1043,1104,1183,1193,1196,1504,1544 'tablestyl':854,1198 'tell':1299,1706 'templat':918 'text':1454 'textcolor':1205 'theme':1432 'thin':927 'thing':697,1627 'three':722,1054 'titl':900,1060,1092 'tone':1760 'tool':285,293,788,1282 'top':392,410,532,714,718,936,987,1047 'top-lin':713,986 'topic-agent-skills' 'topic-analytics' 'topic-claude-code' 'topic-marketing' 'topic-mcp' 'topic-paid-media' 'topic-seo' 'toppad':1225 'total':341,364,379,404,990,992 'touch':1357 'traffic':399,538 'trend':358,527 'tsv':544 'twice':1628 'understand':1372 'understood':1575 'updat':1595 'url':886,1389 'usd':255 'use':5,24,123,173,191,649,775,785,874,1279,1395,1423,1855 'user':10,28,177,388,433,486,1107,1301,1330,1348,1608,1619,1652,1708,1811 'util':563,569,580,655 'utm':588 'uuid':304 'valid':639,648 'valign':1265 'valu':1688,1692,1696 'vari':297 'variabl':420,1598 'vs':1025 'want':11,434,494 'warn':1163 'week':355,357,361,526,531 'white':902,1158,1210,1256 'window':1566 'without':1407,1498,1776,1886 'write':78,119,684,754,770,1661,1675,1831 'x':622 'x2':626 'xyz':1484,1488 'y':624","prices":[{"id":"5e784d90-de66-4208-ade2-e93fe015129e","listingId":"af0af0a1-dfec-4118-a518-ea6b3b3b0b65","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.662Z"}],"sources":[{"listingId":"af0af0a1-dfec-4118-a518-ea6b3b3b0b65","source":"github","sourceId":"Dataslayer-AI/Marketing-skills/ds-report-pdf","sourceUrl":"https://github.com/Dataslayer-AI/Marketing-skills/tree/main/skills/ds-report-pdf","isPrimary":false,"firstSeenAt":"2026-04-23T13:04:25.662Z","lastSeenAt":"2026-04-24T01:03:50.518Z"}],"details":{"listingId":"af0af0a1-dfec-4118-a518-ea6b3b3b0b65","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Dataslayer-AI","slug":"ds-report-pdf","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":"e3965c02a10a5500665da9df20db2f549c036d3d","skill_md_path":"skills/ds-report-pdf/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Dataslayer-AI/Marketing-skills/tree/main/skills/ds-report-pdf"},"layout":"multi","source":"github","category":"Marketing-skills","frontmatter":{"name":"ds-report-pdf","description":"Use this skill when the user wants to generate a professional PDF report for a client or for internal use. Activate when the user says \"generate a PDF report\", \"create a client report\", \"export to PDF\", \"make a report for my client\", \"monthly report PDF\", \"branded report\", or any request that implies a downloadable, shareable, professional document with marketing performance data. Works best with Dataslayer MCP connected. Also works with manual data. Reads branding config from dataslayer-config.json if present."},"skills_sh_url":"https://skills.sh/Dataslayer-AI/Marketing-skills/ds-report-pdf"},"updatedAt":"2026-04-24T01:03:50.518Z"}}