The first thing you should do when you sign a new SEO client is audit their site. Not a quick glance — a structured, documented audit that establishes a baseline, identifies quick wins, and shows the client exactly where they stand.
Most agencies do this manually. Open a spreadsheet, check title tags one by one, test page speed, look for broken links. It takes 2-4 hours per site and the output is inconsistent between team members.
Here's a better approach: automate the audit, document the results, and start the engagement with data — not opinions.
These are the checks that matter for every new client site, organized by category.
| # | Check | Why It Matters |
|---|---|---|
| 1 | Title tag exists | No title = invisible in search results |
| 2 | Title length (50-60 chars) | Too long gets truncated, too short wastes space |
| 3 | Meta description exists | Controls the snippet in search results |
| 4 | Meta description length (120-160 chars) | Same truncation issue as title |
| 5 | H1 tag present | Primary heading signals page topic to Google |
| 6 | Single H1 per page | Multiple H1s dilute topic signal |
| 7 | Heading hierarchy (H1→H2→H3) | Skipping levels confuses crawlers |
| 8 | Content length (300+ words) | Thin content rarely ranks |
| 9 | Image alt text coverage | Accessibility + image search visibility |
| 10 | Readability score | Content too complex = high bounce rate |
| # | Check | Why It Matters |
|---|---|---|
| 11 | HTTPS enabled | Ranking signal since 2014, trust signal for users |
| 12 | SSL certificate valid | Expired cert = browser warning = bounced visitors |
| 13 | Response time (<500ms) | Slow servers hurt Core Web Vitals |
| 14 | Canonical URL set | Prevents duplicate content penalties |
| 15 | Mobile viewport meta tag | Required for mobile-first indexing |
| 16 | robots.txt present | Controls what gets crawled |
| 17 | XML sitemap present | Helps Google discover all pages |
| 18 | Structured data (JSON-LD) | Enables rich snippets in search results |
| # | Check | Why It Matters |
|---|---|---|
| 19 | OG title set | Controls how links appear on Facebook/LinkedIn |
| 20 | OG description set | The preview text when shared |
| 21 | OG image set | Posts with images get 2-3x more engagement |
| 22 | Twitter Card tags | Same as OG but for Twitter/X |
| 23 | Favicon present | Browser tabs, bookmarks, professionalism |
| # | Check | Why It Matters |
|---|---|---|
| 24 | Page size (<3MB) | Large pages = slow loads = high bounce |
| 25 | DOM complexity | Overly complex DOM slows rendering |
| 26 | Compression enabled (gzip/brotli) | 60-80% reduction in transfer size |
| # | Check | Why It Matters |
|---|---|---|
| 27 | Language attribute on HTML | Screen readers need to know the language |
| 28 | ARIA landmarks | Helps assistive technology navigate the page |
Instead of checking these 28 points manually, run one API call:
curl -H "X-API-Key: YOUR_KEY" \
"https://seoscoreapi.com/audit?url=https://newclient.com"
You get back every check with a pass/warning/fail status, an overall score, and prioritized fix recommendations. What used to take 2 hours takes 3 seconds.
New clients usually care about more than their homepage. Audit their key pages in one script:
from seoscoreapi import audit, report_url
client_pages = [
"https://newclient.com",
"https://newclient.com/services",
"https://newclient.com/about",
"https://newclient.com/contact",
"https://newclient.com/blog",
]
print("NEW CLIENT ONBOARDING AUDIT")
print("=" * 50)
total_issues = 0
for url in client_pages:
result = audit(url, api_key="YOUR_KEY")
issues = len(result.get("priorities", []))
total_issues += issues
print(f"\n{url}")
print(f" Score: {result['score']}/100 ({result['grade']})")
print(f" Issues: {issues}")
for p in result["priorities"][:3]:
print(f" [{p['severity']}] {p['issue']}")
domain = "newclient.com"
print(f"\nTotal issues across {len(client_pages)} pages: {total_issues}")
print(f"Shareable report: {report_url(domain)}")
Take the output from the audit and present three things in your kickoff meeting:
https://seoscoreapi.com/report/newclient.com so they can see the details themselvesThis positions you as data-driven from day one. No vague promises — concrete numbers and a plan.
Once the baseline audit is done, set up monitoring so you catch regressions between check-ins:
from seoscoreapi import add_monitor
add_monitor("https://newclient.com", api_key="YOUR_KEY", frequency="daily")
You'll get an email alert if their score drops by 5+ points. This is how you catch it when their dev team pushes a template change that breaks meta tags — before the client notices the traffic drop.
Here's the complete flow for every new client:
Steps 2-5 take under 10 minutes with the API. That's the difference between onboarding a client in an afternoon vs. a week.
Try SEO Score API free