Website Audit — In Plain English, Not Scores
Pricing
from $3.00 / 1,000 results
Website Audit — In Plain English, Not Scores
Audit any list of websites and get findings a business owner actually understands: what is wrong, what it costs them, and the exact fix. Every row ships a paste-ready summary for a client email. No browser, no API key, no anti-bot.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
alaudin burki
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Every other site auditor hands you a number and a list of tag names. This one hands you three sentences per problem: what is wrong, what it is costing the business, and the exact fix — written the way you would say it to the owner.
Feed it a client list. Get back a column you can paste straight into an email.
Why this exists
The findings are not generated from a template. They come from a working agency's own prospecting tool, where the audit's only job is "having something specific and true to say to a stranger about their own business." The checks are ordinary. The wording is the product.
No phone number, email or contact form on the page. A visitor ready to buy has no way tosay so. This is the single most expensive omission a small business site can have.Fix: Put a phone number in the header. Not on a separate contact page - in the header.
That is one row of the emailSummary field. Fourteen checks, all of them worded like that.
What you get
| Field | Description |
|---|---|
domain | The site audited |
score | 0–100, weighted by severity |
grade | A–F, with a plain-words verdict |
criticalCount · importantCount · minorCount | How much is wrong, at a glance |
topIssue · topIssueFound | The worst problem, flattened for sorting in a spreadsheet |
emailSummary | Paste-ready paragraph for a client email |
findings | Every finding: id, label, severity, found, why, fix |
passed | What the site got right — useful for not insulting a prospect |
platform | WordPress, Shopify, Wix, Squarespace… |
auditStatus | audited · unknown · invalid_url — see below |
Sample output
One row per site. Real output, from example.com (findings trimmed to two for length):
{"domain": "example.com","url": "https://example.com/","auditStatus": "audited","score": 47,"grade": "D","verdict": "Costing the business enquiries","criticalCount": 2,"importantCount": 2,"minorCount": 3,"topIssue": "Page title","topIssueFound": "Title is only \"Example Domain\"","reachable": true,"responseMs": 229,"pageBytes": 559,"auditedAt": "2026-09-03T09:36:18.180Z","emailSummary": "Title is only \"Example Domain\". Too short to say what the business does, so search results carry no message. Fix: Aim for 50-60 characters: name, service, location.\n\nNo phone number, email or contact form on the page. A visitor ready to buy has no way to say so. This is the single most expensive omission a small business site can have. Fix: Put a phone number in the header. Not on a separate contact page - in the header.","findings": [{"id": "title","label": "Page title","severity": "critical","found": "Title is only \"Example Domain\"","why": "Too short to say what the business does, so search results carry no message.","fix": "Aim for 50-60 characters: name, service, location."},{"id": "contact","label": "Visible contact details","severity": "critical","found": "No phone number, email or contact form on the page","why": "A visitor ready to buy has no way to say so. This is the single most expensive omission a small business site can have.","fix": "Put a phone number in the header. Not on a separate contact page - in the header."}],"passed": ["Secure connection (HTTPS)", "Mobile ready", "Main heading", "Image alt text"]}
passed is there so you do not open a conversation by listing only faults —
telling a prospect what they got right is what makes the rest land.
How to use it
- Paste your client list into Websites. Domains or full URLs both work.
- Run it. Nothing to configure — the default input runs as-is.
- Export to CSV and sort by
score, or open the Ready to send view and work down theemailSummarycolumn.
Chains onto any Google Maps or lead-finder actor: pass its output straight in
as startUrls.
Pricing
$0.003 per site audited, plus a near-zero $0.00005 to start a run.
| You audit | You pay |
|---|---|
| 100 sites | $0.30 |
| 500 sites | $1.50 |
| 5,000 sites | $15.00 |
A site that could not be checked (unknown) still costs a result — the request
was made. That is why the concurrency default is low: needlessly provoking bot
protection would cost you rows that tell you nothing.
Priced above the $0.001 site-checking utilities on purpose. A row here is a paragraph you send to a client, not a data point you still have to write up.
Limitations
- It reads HTML and response headers, not a rendered page. A site that paints its entire content with JavaScript will look emptier than it is. That is the trade for being fast and cheap enough to run across 500 sites.
- It audits one page — the address you give it, following redirects. It is not a crawler.
- Response time is one sample, taken from Apify's infrastructure, not a benchmark from your customer's location.
- Sites that refuse us are not graded. See above. Expect a few
unknownrows on any large list; that is the actor being honest, not failing.
What it checks
HTTPS · page title · meta description · mobile viewport · h1 · image alt text ·
Open Graph tags · page weight · response time · visible contact details · analytics ·
canonical URL · structured data · favicon.
No browser, no API key, no proxy, no anti-bot. Everything measured here is in the HTML and the response headers, which is why it is fast and cheap to run across a list of 500.
The thing that makes it trustworthy
A site that refuses us is reported as unknown, never as a bad grade.
This is not a detail. Measured on a real run of 1,564 audits in the source tool: 299 of the 389 F grades — 77% of them — were bot protection returning 403, recorded as "their website address does not work." One of them was a complete, working law firm site that loads fine in any browser.
Telling a business its working website is broken is a worse email than any other you could send,
because it is specific and they can disprove it in one click. So 401, 403, 429 and 5xx
come back as auditStatus: "unknown" with the reason in auditNote — never as a score. A real
404 is graded F, because an address that genuinely does not work is a fact about the
business, and the most sellable finding here.
Unreachable sites are still returned as rows. If you paid for 500 audits you can see which ones did not happen.
Input
{"domains": ["example.com", "bobs-plumbing.co.uk"],"maxItems": 100,"minSeverity": "all","concurrency": 4}
startUrls is accepted as an alternative, in Apify's URL-list format, so this chains directly
onto a Google Maps scraper or a lead finder with no transform step in between.
concurrency is capped at 10 and defaults to 4 on purpose — hitting sites hard is what makes
bot protection return the 403s described above.
Development
The audit engine is vendored, not forked. src/lib/factory/ is copied verbatim from the
agency tool that is its source of truth, with only import paths rewritten:
npm run vendor # re-sync from the factorynpm test # fails if the vendored copy has drifted
A hand-maintained fork would stop receiving improvements on day one and then slowly start
disagreeing with the source about what a website's problems are — which is worse than not
sharing the code, because two products would tell the same business two different things.
src/lib/factory/vendor.test.mjs is what prevents that.
The engine itself has zero npm dependencies — it is Node standard library only. apify is
the actor's single dependency.