GEO PDF Report Generator
Purpose
This skill generates a professional, visually polished PDF report from GEO audit data. The PDF includes score gauges, bar charts, platform readiness visualizations, color-coded tables, and a prioritized action plan — ready to deliver directly to clients.
Two PDF paths — pick one. For a branded, client-ready deliverable, prefer the TypeScript tools/audit-report-kit (react-pdf, THL brand tokens, provenance tags, — for null scores, compile-checked JSON-LD alongside). The ReportLab script below is the lightweight Python path when you don't want a Node toolchain. They render the same audit JSON; don't run both.
Prerequisites
- ReportLab must be installed:
pip install reportlab
- The Python PDF generation script lives at
../geo/scripts/generate_pdf_report.py (shared with the geo umbrella skill). Run it from the repo root: python3 skills/geo/scripts/generate_pdf_report.py <data.json> <out.pdf>.
- Run a full GEO audit first (using
geo-audit) to have data to include in the report
How to Generate a PDF Report
Step 1: Collect Audit Data
After running a full /geo-audit, collect all scores, findings, and recommendations into a JSON structure. The JSON data must follow this schema:
{
"url": "https://example.com",
"brand_name": "Example Company",
"date": "2026-02-18",
"geo_score": 65,
"scores": {
"ai_citability": 62,
"brand_authority": 78,
"content_eeat": 74,
"technical": 72,
"schema": 45,
"platform_optimization": 59
},
"platforms": {
"Google AI Overviews": 68,
"ChatGPT": 62,
"Perplexity": 55,
"Gemini": 60,
"Bing Copilot": 50
},
"executive_summary": "A 4-6 sentence summary of the audit findings...",
"findings": [
{
"severity": "critical",
"title": "Finding Title",
"description": "Description of the finding and its impact."
}
],
"quick_wins": [
"Action item 1",
"Action item 2"
],
"medium_term": [
"Action item 1",
"Action item 2"
],
"strategic": [
"Action item 1",
"Action item 2"
],
"crawler_access": {
"GPTBot": {"platform": "ChatGPT", "status": "Allowed", "recommendation": "Keep allowed"},
"ClaudeBot": {"platform": "Claude", "status": "Blocked", "recommendation": "Unblock for visibility"}
}
}
Step 2: Write JSON Data to a Temp File
Write the collected audit data to a temporary JSON file:
# Write audit data to temp file
cat > /tmp/geo-audit-data.json << 'EOF'
{ ... audit JSON data ... }
EOF
Step 3: Generate the PDF
Run the PDF generation script:
python3 skills/geo/scripts/generate_pdf_report.py /tmp/geo-audit-data.json GEO-REPORT-[brand].pdf
The script will produce a professional PDF report with:
- Cover Page — Brand name, URL, date, overall GEO score with visual gauge
- Executive Summary — Key findings and top recommendations
- Score Breakdown — Table and bar chart of all 6 scoring categories
- AI Platform Readiness — Visual horizontal bar chart per platform with scores
- AI Crawler Access — Color-coded table (green=allowed, red=blocked)
- Key Findings — Severity-coded findings list (critical/high/medium/low)
- Prioritized Action Plan — Quick wins, medium-term, and strategic initiatives
- Appendix — Methodology, data sources, and glossary
Step 4: Return the PDF Path
After generation, tell the user where the PDF was saved and its file size.
Complete Workflow Example
When the user runs this skill, follow this exact sequence:
Check for existing audit data — Look for recent GEO audit reports in the current directory:
GEO-CLIENT-REPORT.md
GEO-AUDIT-REPORT.md
- Or any
GEO-*.md files from a recent audit
If no audit data exists — Tell the user to run /geo-audit <url> first, then come back for the PDF.
If audit data exists — Parse the markdown report to extract:
- Overall GEO score
- Category scores (citability, brand authority, content/E-E-A-T, technical, schema, platform)
- Platform readiness scores (Google AIO, ChatGPT, Perplexity, Gemini, Bing Copilot)
- AI crawler access status
- Key findings with severity levels
- Quick wins, medium-term, and strategic action items
- Executive summary
Build the JSON — Structure all data into the JSON schema shown above.
Write JSON to temp file — Save to /tmp/geo-audit-data.json
Run the PDF generator:
python3 skills/geo/scripts/generate_pdf_report.py /tmp/geo-audit-data.json "GEO-REPORT-[brand_name].pdf"
Report success — Tell the user the PDF was generated, its location, and file size.
If the User Provides a URL
If the user runs /geo-report-pdf https://example.com with a URL:
- First run a full audit: invoke the
geo-audit skill for that URL
- Then collect all the audit data from the generated report files
- Generate the PDF as described above
Parsing Markdown Audit Data
When extracting data from existing GEO markdown reports, look for these patterns:
- GEO Score: Look for "GEO Score: XX/100" or "Overall: XX/100" or "GEO Readiness Score: XX"
- Category Scores: Look for score tables with columns like "Component | Score | Weight"
- Platform Scores: Look for tables with "Google AI Overviews", "ChatGPT", "Perplexity", etc.
- Crawler Status: Look for tables with "Allowed" or "Blocked" status for crawlers like GPTBot, ClaudeBot
- Findings: Look for sections titled "Key Findings", "Critical Issues", "Recommendations"
- Action Items: Look for sections titled "Quick Wins", "Action Plan", "Recommendations"
Notes
- If ReportLab is not installed, run:
pip install reportlab
- The PDF is designed for US Letter size (8.5" x 11")
- Color palette: Navy primary (#1a1a2e), Blue accent (#0f3460), Coral highlight (#e94560), Green success (#00b894)
- Each page has a header line, page numbers, "Confidential" watermark, and generation date
- Score gauges use traffic-light colors: green (80+), blue (60-79), yellow (40-59), red (below 40)
1---2name: geo-report-pdf3description: Generate a professional PDF report from GEO audit data using ReportLab. Creates a polished, client-ready PDF with score gauges, bar charts, platform readiness visualizations, color-coded tables, and prioritized action plans.4---56# GEO PDF Report Generator78## Purpose910This skill generates a professional, visually polished PDF report from GEO audit data. The PDF includes score gauges, bar charts, platform readiness visualizations, color-coded tables, and a prioritized action plan — ready to deliver directly to clients.1112> **Two PDF paths — pick one.** For a **branded, client-ready** deliverable, prefer the TypeScript [`tools/audit-report-kit`](../../tools/audit-report-kit) (react-pdf, THL brand tokens, provenance tags, `—` for null scores, compile-checked JSON-LD alongside). The ReportLab script below is the lightweight Python path when you don't want a Node toolchain. They render the same audit JSON; don't run both.1314## Prerequisites1516- **ReportLab** must be installed: `pip install reportlab`17- The Python PDF generation script lives at [`../geo/scripts/generate_pdf_report.py`](../geo/scripts/generate_pdf_report.py) (shared with the `geo` umbrella skill). Run it from the repo root: `python3 skills/geo/scripts/generate_pdf_report.py <data.json> <out.pdf>`.18- Run a full GEO audit first (using `geo-audit`) to have data to include in the report1920## How to Generate a PDF Report2122### Step 1: Collect Audit Data2324After running a full `/geo-audit`, collect all scores, findings, and recommendations into a JSON structure. The JSON data must follow this schema:2526```json27{28 "url": "https://example.com",29 "brand_name": "Example Company",30 "date": "2026-02-18",31 "geo_score": 65,32 "scores": {33 "ai_citability": 62,34 "brand_authority": 78,35 "content_eeat": 74,36 "technical": 72,37 "schema": 45,38 "platform_optimization": 5939 },40 "platforms": {41 "Google AI Overviews": 68,42 "ChatGPT": 62,43 "Perplexity": 55,44 "Gemini": 60,45 "Bing Copilot": 5046 },47 "executive_summary": "A 4-6 sentence summary of the audit findings...",48 "findings": [49 {50 "severity": "critical",51 "title": "Finding Title",52 "description": "Description of the finding and its impact."53 }54 ],55 "quick_wins": [56 "Action item 1",57 "Action item 2"58 ],59 "medium_term": [60 "Action item 1",61 "Action item 2"62 ],63 "strategic": [64 "Action item 1",65 "Action item 2"66 ],67 "crawler_access": {68 "GPTBot": {"platform": "ChatGPT", "status": "Allowed", "recommendation": "Keep allowed"},69 "ClaudeBot": {"platform": "Claude", "status": "Blocked", "recommendation": "Unblock for visibility"}70 }71}72```7374### Step 2: Write JSON Data to a Temp File7576Write the collected audit data to a temporary JSON file:7778```bash79# Write audit data to temp file80cat > /tmp/geo-audit-data.json << 'EOF'81{ ... audit JSON data ... }82EOF83```8485### Step 3: Generate the PDF8687Run the PDF generation script:8889```bash90python3 skills/geo/scripts/generate_pdf_report.py /tmp/geo-audit-data.json GEO-REPORT-[brand].pdf91```9293The script will produce a professional PDF report with:94- **Cover Page** — Brand name, URL, date, overall GEO score with visual gauge95- **Executive Summary** — Key findings and top recommendations96- **Score Breakdown** — Table and bar chart of all 6 scoring categories97- **AI Platform Readiness** — Visual horizontal bar chart per platform with scores98- **AI Crawler Access** — Color-coded table (green=allowed, red=blocked)99- **Key Findings** — Severity-coded findings list (critical/high/medium/low)100- **Prioritized Action Plan** — Quick wins, medium-term, and strategic initiatives101- **Appendix** — Methodology, data sources, and glossary102103### Step 4: Return the PDF Path104105After generation, tell the user where the PDF was saved and its file size.106107## Complete Workflow Example108109When the user runs this skill, follow this exact sequence:1101111. **Check for existing audit data** — Look for recent GEO audit reports in the current directory:112 - `GEO-CLIENT-REPORT.md`113 - `GEO-AUDIT-REPORT.md`114 - Or any `GEO-*.md` files from a recent audit1151162. **If no audit data exists** — Tell the user to run `/geo-audit <url>` first, then come back for the PDF.1171183. **If audit data exists** — Parse the markdown report to extract:119 - Overall GEO score120 - Category scores (citability, brand authority, content/E-E-A-T, technical, schema, platform)121 - Platform readiness scores (Google AIO, ChatGPT, Perplexity, Gemini, Bing Copilot)122 - AI crawler access status123 - Key findings with severity levels124 - Quick wins, medium-term, and strategic action items125 - Executive summary1261274. **Build the JSON** — Structure all data into the JSON schema shown above.1281295. **Write JSON to temp file** — Save to `/tmp/geo-audit-data.json`1301316. **Run the PDF generator**:132 ```bash133 python3 skills/geo/scripts/generate_pdf_report.py /tmp/geo-audit-data.json "GEO-REPORT-[brand_name].pdf"134 ```1351367. **Report success** — Tell the user the PDF was generated, its location, and file size.137138## If the User Provides a URL139140If the user runs `/geo-report-pdf https://example.com` with a URL:1411. First run a full audit: invoke the `geo-audit` skill for that URL1422. Then collect all the audit data from the generated report files1433. Generate the PDF as described above144145## Parsing Markdown Audit Data146147When extracting data from existing GEO markdown reports, look for these patterns:148149- **GEO Score**: Look for "GEO Score: XX/100" or "Overall: XX/100" or "GEO Readiness Score: XX"150- **Category Scores**: Look for score tables with columns like "Component | Score | Weight"151- **Platform Scores**: Look for tables with "Google AI Overviews", "ChatGPT", "Perplexity", etc.152- **Crawler Status**: Look for tables with "Allowed" or "Blocked" status for crawlers like GPTBot, ClaudeBot153- **Findings**: Look for sections titled "Key Findings", "Critical Issues", "Recommendations"154- **Action Items**: Look for sections titled "Quick Wins", "Action Plan", "Recommendations"155156## Notes157158- If ReportLab is not installed, run: `pip install reportlab`159- The PDF is designed for US Letter size (8.5" x 11")160- Color palette: Navy primary (#1a1a2e), Blue accent (#0f3460), Coral highlight (#e94560), Green success (#00b894)161- Each page has a header line, page numbers, "Confidential" watermark, and generation date162- Score gauges use traffic-light colors: green (80+), blue (60-79), yellow (40-59), red (below 40)