$npx -y skills add zubair-trabzada/ai-marketing-claude --skill market-report-pdf| Format | Best For | Pros | Cons | |---|---|---|---| | PDF | Client presentations, email attachments, sales collateral | Professional appearance, consistent formatting, visual charts, printable | Harder to edit, requires Python script | | Markdown | Internal use, quick r
| 1 | # PDF Marketing Report Generator |
| 2 | |
| 3 | ## Skill Purpose |
| 4 | Generate a professional, visually polished PDF marketing report using the Python script `scripts/generate_pdf_report.py`. This skill collects all available audit and analysis data, structures it into the expected JSON format, invokes the script, and produces a branded PDF with score gauges, bar charts, comparison tables, findings, and a prioritized action plan. |
| 5 | |
| 6 | ## When to Use |
| 7 | - User wants a PDF version of the marketing report (not just Markdown) |
| 8 | - User is preparing a deliverable for a client presentation |
| 9 | - User asks for a "polished report", "client-ready report", or "PDF report" |
| 10 | - User wants a visual report with charts and scores |
| 11 | - Triggered by `/market report-pdf` or `/market report-pdf <domain>` |
| 12 | |
| 13 | ## When to Use PDF vs Markdown |
| 14 | |
| 15 | | Format | Best For | Pros | Cons | |
| 16 | |---|---|---|---| |
| 17 | | **PDF** | Client presentations, email attachments, sales collateral | Professional appearance, consistent formatting, visual charts, printable | Harder to edit, requires Python script | |
| 18 | | **Markdown** | Internal use, quick reference, iterative editing, version control | Easy to edit, readable in any editor, git-friendly | Less visually polished, no charts | |
| 19 | |
| 20 | **Rule of thumb:** If the report is going to a client or prospect, use PDF. If it is for internal use or further editing, use Markdown. |
| 21 | |
| 22 | ## How to Execute |
| 23 | |
| 24 | ### Step 1: Collect All Available Data |
| 25 | Gather data from all previous skill runs. Check for these files in the project directory: |
| 26 | |
| 27 | **Primary data sources:** |
| 28 | - `MARKETING-AUDIT.md` -- Overall audit results |
| 29 | - `LANDING-CRO.md` -- Landing page conversion analysis |
| 30 | - `SEO-AUDIT.md` -- SEO findings |
| 31 | - `BRAND-VOICE.md` -- Brand voice analysis |
| 32 | - `COMPETITOR-ANALYSIS.md` -- Competitor comparison data |
| 33 | - `FUNNEL-ANALYSIS.md` -- Funnel analysis |
| 34 | - `SOCIAL-AUDIT.md` -- Social media audit |
| 35 | - `EMAIL-AUDIT.md` -- Email marketing audit |
| 36 | - `AD-AUDIT.md` -- Advertising audit |
| 37 | |
| 38 | **If no previous data exists:** |
| 39 | 1. Recommend the user run `/market audit <url>` first for the best results |
| 40 | 2. If the user insists on generating a report without prior audits, analyze the provided URL directly and build the data structure from scratch |
| 41 | 3. Use the analyze_page.py script to gather automated data: `python scripts/analyze_page.py <url>` |
| 42 | |
| 43 | ### Step 2: Build the JSON Data Structure |
| 44 | The `scripts/generate_pdf_report.py` script expects a JSON file as input with this exact structure: |
| 45 | |
| 46 | ```json |
| 47 | { |
| 48 | "url": "https://example.com", |
| 49 | "date": "March 1, 2026", |
| 50 | "brand_name": "Example Co", |
| 51 | "overall_score": 62, |
| 52 | "executive_summary": "A 2-4 sentence summary of the overall marketing health, key opportunities, and estimated revenue impact of implementing recommendations.", |
| 53 | "categories": { |
| 54 | "Content & Messaging": { |
| 55 | "score": 68, |
| 56 | "weight": "25%" |
| 57 | }, |
| 58 | "Conversion Optimization": { |
| 59 | "score": 52, |
| 60 | "weight": "20%" |
| 61 | }, |
| 62 | "SEO & Discoverability": { |
| 63 | "score": 74, |
| 64 | "weight": "20%" |
| 65 | }, |
| 66 | "Competitive Positioning": { |
| 67 | "score": 48, |
| 68 | "weight": "15%" |
| 69 | }, |
| 70 | "Brand & Trust": { |
| 71 | "score": 70, |
| 72 | "weight": "10%" |
| 73 | }, |
| 74 | "Growth & Strategy": { |
| 75 | "score": 55, |
| 76 | "weight": "10%" |
| 77 | } |
| 78 | }, |
| 79 | "findings": [ |
| 80 | { |
| 81 | "severity": "Critical", |
| 82 | "finding": "Description of the most important finding" |
| 83 | }, |
| 84 | { |
| 85 | "severity": "High", |
| 86 | "finding": "Description of a high-priority finding" |
| 87 | }, |
| 88 | { |
| 89 | "severity": "Medium", |
| 90 | "finding": "Description of a medium-priority finding" |
| 91 | }, |
| 92 | { |
| 93 | "severity": "Low", |
| 94 | "finding": "Description of a lower-priority finding" |
| 95 | } |
| 96 | ], |
| 97 | "quick_wins": [ |
| 98 | "First quick win action item", |
| 99 | "Second quick win action item", |
| 100 | "Third quick win action item" |
| 101 | ], |
| 102 | "medium_term": [ |
| 103 | "First medium-term action item", |
| 104 | "Second medium-term action item", |
| 105 | "Third medium-term action item" |
| 106 | ], |
| 107 | "strategic": [ |
| 108 | "First strategic action item", |
| 109 | "Second strategic action item", |
| 110 | "Third strategic action item" |
| 111 | ], |
| 112 | "competitors": [ |
| 113 | { |
| 114 | "name": "Competitor A", |
| 115 | "positioning": "Their market position", |
| 116 | "pricing": "Their pricing model", |
| 117 | "social_proof": "Their trust signals", |
| 118 | "content": "Their content approach" |
| 119 | }, |
| 120 | { |
| 121 | "name": "Competitor B", |
| 122 | "positioning": "Their market position", |
| 123 | "pricing": "Their pricing model", |
| 124 | "social_proof": "Their trust signals", |
| 125 | "content": "Their content approach" |
| 126 | } |
| 127 | ] |
| 128 | } |
| 129 | ``` |
| 130 | |
| 131 | ### Step 3: Field-by-Field Data Assembly Guide |
| 132 | |
| 133 | #### `url` (string, required) |
| 134 | The target website URL. Use the full URL including protocol. |
| 135 | |
| 136 | #### `date` (string, required) |
| 137 | The report generation date. Format: "Month DD, YYYY" (e.g., "March 1, 2026"). |
| 138 | |
| 139 | #### `brand_name` (string, required) |
| 140 | The company or brand name. Used in competitor comparison table headers. |
| 141 | |
| 142 | #### `overall_score` (integer, 0-100, required) |
| 143 | The weighted average of all category scores. Calculate as: |
| 144 | ``` |
| 145 | overall_score = (content * 0.25) + (conversion * 0.20) + (seo * 0.20) + |