SEO audit reporting
What you’ll build: a per-site SEO dashboard — a health score and Core Web Vitals up top, the top issues in a table, and a ranking trend — produced by an audit agent on a schedule. Ideal for an agency reporting to clients.
pulsedeck.app / dashboards / seo
SCREENSHOT
Finished SEO dashboard: a performance score metric, an issues table, and a rankings chart.
Drop an image into public/shots/ and pass src.
What you’ll need
Section titled “What you’ll need”- PulseDeck running (Quickstart).
- A registered source and its
pd_…API key. - An audit step that produces the numbers (Lighthouse / PageSpeed, a crawler, your rank tracker).
1. Plan the structure
Section titled “1. Plan the structure”Give each site its own stream so its history stays separate:
- Category:
seo - Stream:
example-com(one per audited site)
2. Send the report
Section titled “2. Send the report”The audit agent posts a metric for the headline score, a chart for the ranking trend, a table of the issues found, and a markdown summary.
curl -X POST http://localhost:3001/api/v1/reports \ -H "Authorization: Bearer pd_xxxxx" \ -H "Idempotency-Key: seo-example-com-2026-06-23" \ -H "Content-Type: application/json" \ -d @seo.json{ "version": "1.0", "source": { "id": "src_…" }, "category": { "slug": "seo" }, "stream": { "slug": "example-com" }, "report": { "title": "SEO audit — example.com", "summary": "Performance 92, 3 issues to fix.", "severity": "warning", "occurred_at": "2026-06-23T03:00:00Z", "tags": ["seo", "example.com"] }, "blocks": [ { "id": "score", "type": "metric", "key": "perf", "label": "Performance", "value": 92, "unit": "/100", "format": "number", "trend": "up", "sentiment": "positive", "delta": 4, "comparison_label": "vs last week" }, { "id": "rankings", "type": "chart", "variant": "line", "title": "Avg. position — top keywords", "labels": ["W1", "W2", "W3", "W4"], "y_axis": "Position", "series": [{ "name": "Avg position", "data": [14, 12, 11, 9] }] }, { "id": "issues", "type": "table", "title": "Issues to fix", "columns": [ { "key": "issue", "label": "Issue", "type": "string" }, { "key": "pages", "label": "Pages", "type": "number" }, { "key": "severity", "label": "Severity", "type": "string" } ], "rows": [ { "issue": "Missing meta description", "pages": 8, "severity": "warning" }, { "issue": "Image without alt text", "pages": 23, "severity": "info" }, { "issue": "Broken internal link", "pages": 2, "severity": "critical" } ] }, { "id": "notes", "type": "markdown", "content": "## Notes\nLargest Contentful Paint improved after image compression. Next: fix the 2 broken links." } ]}3. Build the dashboard
Section titled “3. Build the dashboard”- A metric widget for the performance score.
- A chart widget for the ranking trend.
- A report_count widget to see audit cadence at a glance.
{ "version": 1, "widgets": [ { "id": "s", "type": "metric", "span": "third", "row": 0, "config": { "streamId": "str_example_com", "metricKey": "perf", "label": "Performance" } }, { "id": "r", "type": "chart", "span": "half", "row": 0, "config": { "streamId": "str_example_com", "metricKey": "perf", "variant": "line", "range": "30d" } }, { "id": "c", "type": "report_count", "span": "third", "row": 1, "config": { "scope": "stream", "targetId": "str_example_com", "bucket": "day", "range": "30d" } } ]} pulsedeck.app / dashboards / seo / edit
SCREENSHOT
Builder showing a performance metric, a trend chart, and an audit-count widget.
Drop an image into public/shots/ and pass src.
Make it your own
Section titled “Make it your own”- One workspace per client — each client sees only their sites; the agent posts to the right workspace.
- Many sites — one stream per site under the
seocategory builds the navigation tree automatically. - Open the full audit — the table and markdown live in each report, one click from any widget.