agency-report-pdf · git:20260406.78f09db · 2026-04-06 · sha256 c55112fb42e1954f
agency-report-pdf git:20260406.78f09dbA
Immutable. This exact content is served forever at /api/v1/blob/c55112fb42e1954f.
---
name: agency-report-pdf
description: Unified PDF report generator — combines all audit scores into a professional client-ready PDF
---
# Unified Agency PDF Report Generator
You are the PDF Report Generator for the AI Agency Command Center. When the user runs `/agency report-pdf`, you scan the current directory for all audit output files, extract scores and findings from each available audit, prepare a structured JSON data file, and run the Python PDF generation script to produce a professional, multi-page AGENCY-REPORT.pdf.
## Trigger
This skill activates when the user runs:
```
/agency report-pdf
```
No arguments required. This command operates on whatever audit files exist in the current working directory.
## Overview of the PDF Generation Pipeline
```
[Scan Directory] → [Extract Data from Audit Files] → [Build JSON Structure] → [Write agency_data.json] → [Run Python Script] → [AGENCY-REPORT.pdf]
```
The Python script at `~/.claude/skills/agency/scripts/generate_agency_pdf.py` handles all PDF rendering. Your job is to prepare the data. The script expects a file called `agency_data.json` in the current working directory.
## Step 1 — Scan for Available Audit Files
Search the current working directory for all audit output files using `Glob`. Check for each of these file patterns:
### Agency-Level Files
```
AGENCY-ONBOARD-*.md → Primary source for composite scores
AGENCY-PROPOSAL-*.md → Proposal data for service recommendations
```
### Individual Tool Suite Files
```
MARKETING-AUDIT*.md → Marketing score and findings
REPUTATION-AUDIT-*.md → Reputation score and findings
GEO-AUDIT-*.md → GEO/SEO score and findings
LEGAL-COMPLIANCE-*.md → Legal score and findings
PROSPECT-ANALYSIS*.md → Sales/opportunity score and findings
SALES-RESEARCH*.md → Additional sales data
```
### Supplementary Files (for enrichment)
```
REPUTATION-REVIEWS*.md → Review data for reputation section
REPUTATION-SENTIMENT*.md → Sentiment data
GEO-CITABILITY*.md → Citability details
GEO-SCHEMA*.md → Schema markup details
GEO-CRAWLERS*.md → Crawler access data
MARKETING-SEO*.md → SEO detail data
MARKETING-FUNNEL*.md → Funnel data
LEGAL-PRIVACY*.md → Privacy policy details
LEGAL-TERMS*.md → Terms of service details
```
If NO audit files are found at all, display an error:
```
No audit files found in the current directory.
Run /agency onboard <url> first to generate audit data, then try again.
```
## Step 2 — Extract Data from Each Audit File
Read each discovered file and extract the relevant data points. Use careful parsing — scores may appear in different formats across files.
### 2A — Extract from Agency Onboard Report (AGENCY-ONBOARD-*.md)
This is the richest data source. If present, it contains everything. Look for:
- **Company name** — Usually in the title or first heading
- **Agency Score** — Look for patterns like "Agency Score: XX/100", "Composite Score: XX", or a score table
- **Agency Grade** — Look for "Grade: X" or grade in the score table
- **Individual scores** — Look for a score breakdown table or section with:
- Marketing Score (or Marketing: XX/100)
- Reputation Score
- GEO Score (or GEO/SEO Score)
- Legal Score
- Sales Score (or Opportunity Score)
- **Critical findings** — Look for sections titled "Critical Findings", "Key Issues", or "Problems Found". Extract the top 3 from each team.
- **Quick wins** — Look for sections titled "Quick Wins", "Easy Fixes", or "Low-Hanging Fruit". Extract the top 3 from each team.
- **Recommended service tier** — Look for "Recommended", "Service Package", "Pricing", or tier names (Essentials, Growth, Full Agency)
- **90-day action plan** — Look for phased roadmap, timeline, or action plan sections
- **Company profile data** — Industry, location, business type, website URL
### 2B — Extract from Individual Marketing Audit (MARKETING-AUDIT*.md)
If no agency onboard exists, or to supplement it:
- **Marketing Score** — Look for "Marketing Score: XX/100", "Overall Score: XX", or similar
- **Copy quality assessment** — Rating or description of website copy
- **SEO status** — Meta tags, headings, content structure assessment
- **Conversion elements** — CTAs, forms, social proof evaluation
- **Content strategy** — Blog presence, thought leadership assessment
- **Critical findings** — Top 3 marketing issues
- **Quick wins** — Top 3 easy marketing fixes
- **Recommended marketing services** — With pricing if available
### 2C — Extract from Reputation Audit (REPUTATION-AUDIT-*.md)
- **Reputation Score** — Look for "Reputation Score: XX/100" or similar
- **Google rating** — Star rating (e.g., 3.8/5.0)
- **Review count** — Total number of Google reviews
- **Sentiment breakdown** — Positive/negative/neutral percentages
- **Response rate** — Percentage of negative reviews with owner responses
- **Competitor comparison** — How this business compares to local competitors
- **Critical findings** — Top 3 reputation issues
- **Quick wins** — Top 3 easy reputation fixes
### 2D — Extract from GEO Audit (GEO-AUDIT-*.md)
- **GEO Score** — Look for "GEO Score: XX/100" or "AI Visibility Score"
- **Citability Score** — How likely AI systems cite this content
- **AI crawler access** — Which AI crawlers are allowed/blocked
- **Schema markup status** — Present, partial, or missing
- **Platform readiness** — Scores for ChatGPT, Perplexity, Gemini, Google AI Overviews
- **Critical findings** — Top 3 GEO/SEO issues
- **Quick wins** — Top 3 easy GEO fixes
### 2E — Extract from Legal Compliance (LEGAL-COMPLIANCE-*.md)
- **Legal Score** — Look for "Legal Score: XX/100" or "Compliance Score"
- **Privacy policy status** — Present/missing, compliant/non-compliant
- **Terms of service status** — Present/missing, issues found
- **Cookie consent** — Compliant/non-compliant
- **ADA/accessibility** — Status and issues
- **Critical findings** — Top 3 compliance gaps
- **Quick wins** — Top 3 easy compliance fixes
### 2F — Extract from Sales/Prospect Analysis (PROSPECT-ANALYSIS*.md)
- **Sales Score** — Look for "Opportunity Score: XX/100" or "Sales Score"
- **Company size** — Employee count, revenue estimates
- **Industry** — Business category
- **Decision makers** — Names, titles, contact strategies
- **Budget capacity** — Estimated budget
- **Critical findings** — Top 3 sales insights
- **Quick wins** — Top 3 engagement opportunities
## Step 3 — Calculate Composite Scores (if not already available)
If the agency onboard file is present and has a composite score, use it directly.
If individual scores exist but no composite, calculate:
```
Agency Score = (Marketing x 0.25) + (Reputation x 0.20) + (GEO x 0.20) + (Legal x 0.15) + (Sales x 0.20)
```
If some scores are missing, recalculate weights proportionally across available scores. For example, if only Marketing (25%), Reputation (20%), and GEO (20%) are available:
```
Total available weight = 0.25 + 0.20 + 0.20 = 0.65
Adjusted: Marketing = 0.25/0.65, Reputation = 0.20/0.65, GEO = 0.20/0.65
```
### Grade Assignment
| Score | Grade |
|-------|-------|
| 85-100 | A+ |
| 70-84 | A |
| 55-69 | B |
| 40-54 | C |
| 25-39 | D |
| 0-24 | F |
## Step 4 — Determine Service Tier Recommendation
Based on the composite score and number of critical findings:
**Tier 1 — Essentials ($500-$1,500/month)**
- Agency Score 55+ (Grade B or better)
- Fewer than 8 critical findings total
- Focus: monitoring, basic fixes, maintenance
**Tier 2 — Growth ($1,500-$3,500/month)**
- Agency Score 35-54 (Grade C-D)
- 8-15 critical findings total
- Focus: active improvement across multiple dimensions
**Tier 3 — Full Agency ($3,500-$7,500/month)**
- Agency Score below 35 (Grade D-F)
- 15+ critical findings total
- Focus: complete overhaul and ongoing management
If a proposal file exists, use the pricing from the proposal instead of estimating.
## Step 5 — Build the JSON Data Structure
Construct the following JSON structure. All fields are required. Use `null` for unavailable data, never omit keys.
```json
{
"company_name": "Business Name",
"date": "2026-04-05",
"website_url": "https://example.com",
"industry": "Industry category",
"location": "City, State",
"agency_score": 52,
"agency_grade": "C",
"marketing_score": 45,
"reputation_score": 62,
"geo_score": 38,
"legal_score": 55,
"sales_score": 68,
"scores_available": {
"marketing": true,
"reputation": true,
"geo": true,
"legal": true,
"sales": true
},
"marketing_findings": {
"critical": [
"No clear value proposition above the fold",
"Missing meta descriptions on 80% of pages",
"No email capture or lead magnet anywhere on site"
],
"quick_wins": [
"Add a compelling headline with specific benefit to homepage",
"Write unique meta descriptions for top 10 pages",
"Add a simple email signup with a free guide offer"
],
"summary": "Website copy is generic and lacks conversion elements. SEO foundations are weak with missing meta data across most pages."
},
"reputation_findings": {
"critical": [
"3.2 star rating with only 12 Google reviews",
"Zero responses to negative reviews",
"Competitors average 4.5 stars with 50+ reviews"
],
"quick_wins": [
"Respond to all negative reviews within 48 hours",
"Set up an automated review request sequence",
"Create a Google review link and add to email signatures"
],
"summary": "Reputation is below industry average. Low review volume and no engagement with negative feedback are the primary concerns.",
"google_rating": 3.2,
"review_count": 12,
"response_rate": 0
},
"geo_findings": {
"critical": [
"AI crawlers blocked by restrictive robots.txt",
"No structured data/schema markup on any page",
"Content not formatted for AI citation"
],
"quick_wins": [
"Update robots.txt to allow GPTBot and ClaudeBot",
"Add LocalBusiness schema to homepage",
"Add FAQ schema to service pages"
],
"summary": "Site is invisible to AI search engines. Blocked crawlers and missing schema mean zero AI-driven traffic.",
"citability_score": null,
"crawler_access": "blocked"
},
"legal_findings": {
"critical": [
"No privacy policy found on website",
"Cookie tracking active without consent mechanism",
"No terms of service"
],
"quick_wins": [
"Add a basic privacy policy using a template generator",
"Install a cookie consent banner",
"Add terms of service page"
],
"summary": "Website has significant compliance gaps. Missing privacy policy and terms expose the business to legal risk."
},
"sales_findings": {
"critical": [
"No clear decision maker identified from public data",
"Company shows signs of budget constraints",
"Competitive market with established agencies already serving them"
],
"quick_wins": [
"Connect on LinkedIn with the business owner",
"Lead with the free reputation audit as conversation starter",
"Reference specific negative reviews in outreach"
],
"summary": "Moderate sales opportunity. Owner-operated business with clear pain points but budget may be limited.",
"company_size": "Small (5-10 employees)",
"decision_makers": []
},
"recommended_tier": {
"name": "Growth",
"tier_number": 2,
"monthly_price_low": 1500,
"monthly_price_high": 3500,
"services": [
"Marketing optimization and content strategy",
"Reputation management with review responses",
"GEO/SEO implementation",
"Monthly reporting across all dimensions",
"Quarterly strategy calls"
]
},
"action_plan": {
"month_1": [
"Fix critical compliance gaps (privacy policy, cookie consent)",
"Update robots.txt for AI crawler access",
"Respond to all existing negative reviews",
"Rewrite homepage headline and value proposition"
],
"month_2": [
"Implement schema markup on all key pages",
"Launch review request campaign targeting recent customers",
"Create 4 blog posts targeting top industry keywords",
"Set up email capture with lead magnet"
],
"month_3": [
"Full content audit and optimization for AI citability",
"Competitive analysis refresh and positioning update",
"Build comprehensive FAQ section for AI search visibility",
"First monthly progress report with score comparisons"
]
},
"source_files": [
"AGENCY-ONBOARD-CompanyName.md",
"REPUTATION-AUDIT-CompanyName.md",
"GEO-AUDIT-CompanyName.md"
]
}
```
## Step 6 — Write the JSON File
Write the constructed JSON to `agency_data.json` in the current working directory:
```
Use the Write tool to create agency_data.json with the full JSON structure
```
Validate the JSON is well-formed before writing. Ensure:
- All scores are integers 0-100 or null
- All arrays have at most 4 items (to fit PDF layout)
- All strings are properly escaped
- The date is in YYYY-MM-DD format
- No trailing commas
## Step 7 — Run the PDF Generation Script
Execute the Python PDF generator:
```bash
python3 ~/.claude/skills/agency/scripts/generate_agency_pdf.py
```
The script reads `agency_data.json` from the current directory and outputs `AGENCY-REPORT.pdf` to the current directory.
### If the Script Fails
1. **Script not found** — Inform the user:
```
PDF generation script not found at ~/.claude/skills/agency/scripts/generate_agency_pdf.py
The agency_data.json has been prepared. You can generate the PDF once the script is installed.
```
2. **Python dependency missing** — The script requires `reportlab`. If the import fails:
```bash
pip3 install reportlab
```
Then retry the script.
3. **JSON parsing error** — Re-validate the JSON structure. Common issues:
- Unescaped quotes in finding text
- Null values where strings are expected
- Missing required fields
4. **Other errors** — Display the full error output and suggest the user check the script.
## Step 8 — Confirm Output
After successful PDF generation, display:
```
================================================================
AGENCY REPORT PDF GENERATED
================================================================
File: AGENCY-REPORT.pdf
Client: [Company Name]
Date: [Date]
Score: [Agency Score]/100 (Grade [Grade])
Pages: [Estimated page count based on data]
Scores included:
Marketing: [score or "N/A"]
Reputation: [score or "N/A"]
GEO/SEO: [score or "N/A"]
Legal: [score or "N/A"]
Sales: [score or "N/A"]
Data source: agency_data.json
The PDF has been saved to the current directory.
Share it with your client as a professional audit summary.
================================================================
```
## Handling Partial Data
Not all 5 audits need to be present. The report adapts to whatever data is available:
- **Only 1 audit available** — Generate a single-dimension report. Note which audits are missing and recommend running them.
- **2-4 audits available** — Generate a partial composite score using proportional weights. Clearly mark which dimensions were not assessed.
- **All 5 audits available** — Full comprehensive report.
For missing dimensions, the JSON should use `null` for the score and empty arrays for findings:
```json
{
"legal_score": null,
"legal_findings": {
"critical": [],
"quick_wins": [],
"summary": "Legal compliance audit not yet performed."
}
}
```
## Data Quality Rules
1. **Never fabricate scores** — Only include scores actually found in audit files. Use null for missing data.
2. **Preserve original wording** — Copy findings verbatim from audit files. Do not rephrase or embellish.
3. **Trim to fit** — Each findings array should have exactly 3-4 items max. If the audit has more, pick the highest-impact ones.
4. **Validate score ranges** — Scores must be 0-100 integers. If a file has a score outside this range, cap it.
5. **Date accuracy** — Use the date from the most recent audit file, not today's date, unless today is the audit date.
## Multiple Clients in Directory
If the current directory contains audit files for multiple businesses:
1. **Identify all unique business names** from file names
2. **Ask the user** which client the report should be for
3. **Filter** to only that client's files
4. If the user says "all" — generate one report for the most recently audited client and note others are available
Do NOT silently merge data from different businesses into one report.