Skip to content

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.

  • 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).

Give each site its own stream so its history stays separate:

  • Category: seo
  • Stream: example-com (one per audited site)

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.

Terminal window
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."
}
]
}
  • 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.

  • 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 seo category builds the navigation tree automatically.
  • Open the full audit — the table and markdown live in each report, one click from any widget.