=CHECKLIST("seo")
seo checklist
The working checklist we run on client sites, from meta tags to Core Web Vitals. Grouped by phase, with priorities. Check items off as you go; progress saves in this browser.
pre-go-live
before go-live
- critical
Write a unique title tag and meta description for every page: titles around 50 to 60 characters with the primary keyword near the front, descriptions around 150 to 160 characters that summarize the page and invite the click. Preview how they'll render in search results with a tool like Metatags.io before go-live.
- critical
Serve primary content and internal links in the raw HTML response rather than injecting them with client-side JavaScript: search engines render JavaScript inconsistently and most AI crawlers don't execute it at all. Compare the raw response against the rendered DOM with the Ahrefs SEO Toolbar for spot checks or Sitebulb's rendered hints at crawl scale, and move anything that only appears after rendering into the server response.
Case studies on server side rendering benefits Sitebulb guide to response vs render
- critical
Test every key template on PageSpeed Insights and make sure it passes the Core Web Vitals assessment on real-user field data: LCP of 2.5 seconds or less, INP of 200 milliseconds or less, and CLS of 0.1 or less. The report's Diagnostics and Insights sections name both the problem and the fix; monitor real users over time with the CrUX Dashboard rather than relying on one-off lab tests.
Test pages with PageSpeed Insights Core Web Vitals thresholds on web.dev
- critical
Group related content into logical subfolders (for example /services/, /blog/, /research/) so the URL path tells users and search engines where a page sits in the site. A clear directory structure makes sections easy to measure separately and keeps important pages within a few clicks of the homepage.
- critical
Name each URL slug with the page's target keyword, separate words with hyphens (never underscores), use lowercase only, and trim long titles to the core phrase: /household-waste-management beats /how-to-manage-household-waste-effectively-and-sustainably-in-urban-areas. Mixed-case slugs create confusion and duplicate versions of the same URL.
- critical
Serve a branded, helpful 404 page that returns a true HTTP 404 status at the requested URL. Never redirect dead URLs to the homepage and never return 200 OK with a page-not-found message (a soft 404); real 404s also keep broken backlinks discoverable so you can reclaim them.
- high
Meet WCAG basics: alt text on images, labels on form fields, sufficient color contrast, full keyboard navigation, and correct ARIA roles where native HTML isn't enough. Run the Lighthouse accessibility audit and work through the W3C's designing and developing tips; accessible markup is also easier for search engines and AI crawlers to parse.
W3C tips for accessible design How Lighthouse scores accessibility
- high
Place the primary keyword once in the H1 and within the first 100 words, in the first H2 where it fits, and after that only where it reads naturally; never stuff. Support it with related terms and specific named entities so the page's topic is unambiguous to search engines and AI systems.
Google's guidance on helpful content Semrush guide to SEO writing
- high
Publish robots.txt at the domain root: allow everything important, block only genuine crawl waste such as internal search results or filter URLs, and reference the XML sitemap. Before launch, confirm no staging Disallow: / rule survived; use noindex for pages that should stay out of results, not robots.txt.
- high
Keep the server's average response time to Googlebot under 200 milliseconds. Check it in Google Search Console under Settings, then Crawl stats, then the average response time chart; sustained values above 200ms waste crawl budget and point to server or hosting problems.
- high
Show a prominent, user-visible date on articles, clearly labeled with text like Published or Last updated, and mirror it in structured data with datePublished and dateModified. Keep the visible and structured dates consistent, and never use future dates or the date of the event the page describes.
- high
Scan the site at securityheaders.com, which grades HTTP security headers from F to A+, and record the baseline. Implement the headers the scan flags as missing, re-scan to confirm the grade improved, and pair it with a site-wide security audit in a crawler like Sitebulb.
- medium
Provide a square favicon of at least 8x8 pixels, though Google recommends larger than 48x48 so it looks sharp everywhere it appears, including next to your site name in search results. Keep it consistent across the site and make sure it's crawlable, not blocked by robots.txt.
- medium
Give every image a descriptive, keyword-rich filename (blue-ceramic-coffee-mug.jpg, not IMG_8342.jpg) and alt text that accurately describes what it shows. Declare width and height to prevent layout shift, compress to under 100KB where possible, serve WebP or AVIF, lazy-load below-the-fold images, and deliver through a CDN.
Google's image SEO best practices How to write good alt text
- medium
Use exactly one H1 stating the page topic, H2s for main sections, and H3s nested under their parent H2, never skipping levels. Choose heading tags for meaning and style them with CSS; a quick audit is to read only the headings top to bottom and check they form a coherent outline.
Example of correct heading structure (Escoffier) Example of correct heading structure (Investopedia)
- medium
Build trust and SEO signals into the blog template itself: author bylines with credential-rich author boxes and pages, a table of contents, breadcrumbs, both published and updated dates, cited sources, and expert quotes. Size hero images to roughly 450px tall on desktop and 225px on mobile so the opening keywords stay above the fold.
NN/g research on tables of contents Siege Media's blog design best practices
- medium
Add a dedicated press or newsroom page (for example at /press), or an in-the-news block on the homepage, linking to third-party coverage of the company rather than only self-published releases. Journalists check this page when researching a company, so keep it current and scannable.
NN/g guidance on press and news areas Example press page (Groww)
- medium
Treat the footer as a categorized index of the site: list the key pages grouped into labeled category columns instead of leaving just a copyright line and social icons. Mature sites like G2 make good layout models.
- medium
Add a breadcrumb trail to inner pages that mirrors the site's folder hierarchy, so users always know where they are and can move up a level. Mark it up with BreadcrumbList structured data so search results can show the path instead of a raw URL.
- medium
Google's quality rater guidelines make trust the most important part of E-E-A-T: untrustworthy pages score low no matter how expert they look. Publish real About, Contact (a working phone number and work email addresses on your own domain), team and leadership pages, author pages with credentials, and legal pages in the footer, and cite sources visibly with update history on articles.
- medium
Give every page in a paginated series its own unique URL, for example a ?page=n parameter, and link the pages sequentially with crawlable links. Keep filter and sort-order variants out of the index, and note that Google no longer uses rel=next/prev annotations.
- medium
Keep important content immediately visible on the page rather than collapsed behind accordions, tabs, or read-more toggles; Google's snippet guidance asks that content be visible to a human without interaction. Text that needs a click to reveal is less likely to be used in snippets and deep links into the page.
- medium
Give every major heading a stable id anchor and link a table of contents at the top of long pages to those anchors. Readers can jump straight to a section, and search engines can deep-link users to the matching part of the page from results.
Google's guidance on snippets and deep links NN/g research on tables of contents
post-go-live
after go-live
- critical
Run a full crawl of the live site with a tool like Screaming Frog or Sitebulb as soon as it launches. Fix broken links and 404s, redirect chains, missing or duplicate titles and descriptions, and any leftover noindex tags or staging URLs before they hurt indexing.
- high
Google lets readers select your site as a preferred source, which makes your content more likely to appear in Top Stories and adds a preferred badge in AI Mode and AI Overviews. Add a prompt on the site that guides regular readers through selecting you; only domain-level and subdomain-level sites are eligible, not subdirectories.
- high
Add a self-referencing rel="canonical" tag to every indexable page, pointing at its one preferred URL. This consolidates signals when the same content is reachable through parameters, http vs https, or www vs non-www variants; make sure the canonical matches the final URL after any redirects.
- high
Install GA4 and verify the site as a domain property in Google Search Console, then submit the XML sitemap and confirm data is flowing. Search Console's crawl stats and page indexing reports feed several other checks on this list, so set both up as soon as the site is live.
- high
Generate an XML sitemap that lists only canonical, indexable URLs returning 200, keep it automatically updated as pages change, and submit it in Google Search Console. Split it by content type on larger sites and respect the limits of 50,000 URLs or 50MB per file.
- high
Review the Pages (indexing) report in Google Search Console after launch and work through each reason listed under why pages aren't indexed: unexpected 404s, redirects, duplicates, and crawled but not indexed. The goal is an index that matches exactly the pages you want ranked; fewer high-value indexed URLs beat a bloated index.
- medium
Add the full social tag set to every page: og:title, og:description, og:url, og:type, og:image, and og:site_name, plus the matching twitter:card, twitter:title, twitter:description, and twitter:image tags. Mirror the meta title, meta description, and canonical URL rather than writing new copy, supply an og:image at 1200 x 630 pixels on an absolute URL, and use summary_large_image for the large preview.
- medium
Structure each page with one main, header, and footer, the H1 inside a header within main, and each H2 topic wrapped in its own section nested inside an article. Use purpose-built tags (time for dates, figure and figcaption for images, thead, th, tbody, and caption for tables) instead of generic divs, and keep the page under 900 DOM nodes.
Semantic HTML5 markup inspector HTML5 semantic elements reference
- medium
Qualify external links you don't editorially endorse: rel="sponsored" for paid placements, rel="ugc" for user-generated content, and rel="nofollow" when you don't want to vouch for the destination. Editorially cited, trustworthy sources can remain normal followed links.
- medium
Publish a human-readable sitemap page that lists the site's key pages grouped by section. It gives visitors a one-page map of the site and gives crawlers a shallow internal-link path to deeper pages.
- medium
Pick one preferred domain version, such as https with www, and set up 301 permanent redirects from every other combination of http, https, www, and non-www to it. Test each variation directly and confirm it resolves to the preferred URL in a single hop so signals aren't split across duplicates.
- medium
Run the key page templates through the W3C markup validator and fix structural errors such as unclosed tags, duplicate ids, and invalid nesting. Valid, clean markup parses more predictably for browsers, search engines, and AI crawlers.
- medium
Add JSON-LD structured data that matches each page type: Organization and WebSite on the homepage, Article or BlogPosting on posts, plus FAQPage, Product, HowTo, or Event where the content fits. Validate every template with Google's Rich Results Test before and after launch.
- medium
Respond to a successful form POST with a 303 See Other redirect to one dedicated thank-you URL instead of rendering the confirmation in the POST response, so refreshing never resubmits the form. A single thank-you page with its own URL also gives analytics one clean conversion goal for every form on the site.
Rather have it done for you? This is the work we do every day.