A two-phase audit: a crawl task is posted to DataForSEO and its id is parked on the site record, then a later pass collects the finished summary. Seven issue classes are counted as errors (broken links, duplicate title, duplicate description, no title, no description, 4xx, 5xx) and everything else in the checks map is counted as warnings. Each completed crawl is stored as its own dated row with the full checks payload.
Also called: technical SEO audit · broken links · missing meta descriptions · site errors
- 1startAudit() posts an on_page crawl task for the domain; the returned task id is stored in seo_sites.settings.pendingAuditTask.
- 2The daily cron — and a manual 'collect' action — call auditSummary() and only store the result once crawl_progress is 'finished'.
- 3Errors are summed across the seven blocking classes; the remainder of the checks become warnings.
- 4The row lands in seo_audits with score, page count, errors, warnings and the raw issues map.
- 5A non-zero error count triggers a 'health' proposal in the next weekly audit.
The health proposal states the stake in one line: "Crawl errors depress every ranking on the domain at once." Splitting the crawl into post-then-collect was forced by reality — a full crawl outlives any single serverless invocation, so blocking on it would either time out or burn an invocation waiting. Parking the task id and collecting later is the same outbox shape used elsewhere in the platform.
- Technical problems degraded every ranking silently.
- A crawl takes longer than a request, so it could not be run inline.
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →