Custom SEO Reports: How to Build a Client-Ready Technical Audit Report
By Seth Black · Published
Nobody reads a 400-row issue spreadsheet top to bottom. A client opens it, scrolls for ten seconds, closes it, and emails you: “so is the site okay?” The crawl worked fine, and the report still failed.
A client-ready report answers three questions, in order: what’s broken, how much does it matter, and who fixes it. Everything else goes in an appendix or gets deleted.
Lead with findings that block indexing
Start with problems that keep pages out of search entirely. Say your client runs a React storefront and half the product text only shows up after JavaScript runs. That one finding outranks every missing alt attribute on the site. Accidental noindex tags go near the top too, along with contradictory robots meta tags, where one says index and another says noindex.
Canonical problems come next. A canonical with a query string, or two canonical tags on one page, sends search engines mixed signals about which URL counts. Clients don’t need the theory, just which template is causing it. Finding and fixing every broken canonical tag on your site covers how chains, loops, and bad targets form and how to resolve them across a whole crawl.
AI crawler access gets its own section now. Clients want to show up in AI answers, not just Google. If robots.txt blocks AI search bots, they should hear it from you before a competitor points it out. Present training bots and search bots separately, since they’re separate decisions.
Cut what doesn’t change a decision
Meta descriptions that run 10 characters long are real findings, but they’re not why the client hired you. Put them in a table at the back.
Test each finding: if the client ignores it for six months, does anything measurable happen? If not, it moves down. The report gets shorter, and what’s left gets taken seriously.
Group findings by who fixes them. Template problems go to the programmer. Content gaps go to whoever writes. Robots.txt and llms.txt belong to one specific person, so name them. That saves a week of “I thought you were handling that.”
Generate the base report
Black SEO Analyzer writes an HTML report that opens in any browser:
black-seo-analyzer --url-to-begin-crawl https://example.com \
--output-type html-folder --output-file ./audit
For a single-page app, add --spa so pages render in headless Chrome. Without it, you’re auditing the empty shell the server sends before JavaScript fills it in. The flag also turns on the warning when at least half the text, headings, or links depend on JavaScript, plus a flag for JSON-LD that only appears after rendering. On a JS-heavy site, those two findings are usually your headline. Why your JavaScript crawl is broken and how to fix it walks through the full diagnostic process.
Add the custom parts with JSON
The HTML report covers the standard checks. For anything client-specific, write data instead:
black-seo-analyzer --url-to-begin-crawl https://example.com \
--output-type json --output-file crawl.json
Pull the internal links into a list:
jq -r '.pages[] | .url as $src | .complete_analysis.link_analysis[]? | select(.is_internal) | [$src, .url] | @csv' crawl.json > links.csv
Count inbound links per page, fewest first:
cut -d, -f2 links.csv | sort | uniq -c | sort -n | head -20
Say the client’s highest-margin category page lands near the top of that list with two inbound links. That goes on page one of your report, in plain words, next to the URL. For charts instead of a raw sort, a Python script with pandas gets you there in about 15 lines. If broken connections cluster across templates, finding and fixing broken internal links at scale covers grouping them by source template and building a prioritized repair queue.
Write the summary yourself
The first page should be a short paragraph you wrote, plus three to five findings ranked by impact. No tool should write this part. You know the client needs the new product line indexed before a trade show. The crawler has no idea.
Close every finding with a next step and an owner. “Fix the canonical on the category template - programmer on the storefront team” gets done. “Canonical issues detected” gets forwarded twice and forgotten.
To try this on a real site, the free trial runs 14 days with every feature, no page limit, and no credit card.
Need reports you can hand a client? bseoa’s custom HTML reports work out of the box. Free trial.
-Sethers