The ULTIMATE 50-Point Technical SEO Audit Checklist
You may make a copy of this Google Sheet for your own personal use, but please do not distribute it publicly.
© 2020 Pam Ann Marketing, LLC DO NOT DISTRIBUTE.
|If you would like us to perform this audit for you, visit the link on the right for details on our technical SEO audit services.||SEO Technical Audit Service|
|Category||Item #||Best Practices||Additional Information||Relevant Plugins or Tools||Status||Notes||Who is Responsible for Resolving This?|
|DOMAIN & CMS||1||The website should be run by a well-supported open-source CMS, preferably WordPress.||FAQ: Why We Prefer Open Source for SEO|
|2||All content, including and especially the blog, should be hosted on the primary website domain (definitely NOT on a separate domain, and preferably not a subdomain.)|
|3||Use of subdomains for any public-facing content should be avoided whenever possible. If unavoidable, minimize use of them as much as possible.|
|MOBILE||4||A responsive design should be applied to the site, so that the site renders in a device-specific manner dependent upon the specific device accessing the site. Separate mobile sites and/or separate mobile subdomains should be avoided. If this cannot be avoided, take extra care to avoid faulty redirects.|
|5||All pages should have the meta viewport tag configured as follows: |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|Most responsive themes have this in place already, but it's good to double-check it.|
|6||Site should pass the Google Mobile-Friendly Test. Ensure that there aren’t any blocked resources that keep the visual preview from loading properly on the test results, and that there are no on-domain resources that say “Googlebot blocked by robots.txt.”||Google Mobile-Friendly Test|
|7||Test mobile user experience in Search Console. Eliminate or keep errors to a minimum.||Search Console|
|8a||Google indexes AMP pages to provide a fast, reliable web experience. More information can be found in the “AMP on Google Search Guidelines”. |
Currently, because of the additional resources required to properly build out AMP pages, we are only requiring that it be implemented on blog posts. Implementing AMP on pages is great if you can do it, but we are only requiring blog posts as the bare minimum at this time.
|AMP on Google Search guidelines||OPTION 1: The “AMP” Plugin by AMP Project Contributors. |
(see embedded note for more info)
|OPTION 2: The “AMP for WP” plugin by Ahmed Kaludi & Mohammed Kaludi. |
(see embedded note for more info)
|8b||CRITICAL: Implementing either of these plugins does NOT automatically carry over your Google Analytics tracking script to AMP pages. AMP-specific Google Analytics code has to be implemented in the plugin’s “Analytics” settings or through Google Tag Manager.||Regardless of the implementation method, AMP-specific Google Analytics code needs to be formatted in JSON as follows.|
Replace the purple text with your Google Analytics property ID.
|(If using plugin option 1, enter "googleanalytics" without quotes as the "type")|
|8c||CRITICAL: AMP pages must contain a “rel=canonical” tag that points to the main version of the page. Both of the above plugins should take care of that by default, but we recommend testing this to be sure.||Also check for AMP errors in Search Console after all AMP pages have been crawled by googlebot.||Search Console|
|8d||Embedded videos *should* work on AMP pages when using either of the above two plugins, but definitely double-check this after implementation.||Pull up an AMP page or post that has an embedded video in it and make sure it works.|
Also check for AMP errors in Search Console after all AMP pages have been crawled by googlebot.
|8e||IMPORTANT: Ensure that there are no critical AMP errors in Search Console and that your AMP pages validate with the AMP testing tool.||If you get a structured data error on the AMP testing tool for a missing publisher logo:|
If using plugin option 1, add an image under “Site Icon” in Appearance -> Customize -> Site Identity
If using plugin option 2, add an image under AMP settings > Structured Data > Upload Default Structured Data Logo
|AMP Testing Tool|
|CONTENT LAYOUT||9||Interstitial pop-ups should generally be avoided, especially on mobile. There is a specific penalty for pop-ups that take up more than 25% of the above-the-fold view or that "block the user from completing tasks." Please see Google’s documentation for more information. ||Google Webmaster Blog: Helping users easily access content on mobile|
|10||All physical office locations should have their own individual pages with unique content as well as:|
|10a||An embedded Google map, pointing to the company’s verified Google My Business listing (pull embed code from that)|
|10b||Schema markup on the address, company name, and telephone number (see Schema section below)|
Use the Structured Data Testing Tool to ensure that the Schema markup validates
|Structured Data Testing Tool|
|11||Duplicate content should be avoided, both within the site (e.g. having two different URLs display the same content or having duplicate Title Tags, Meta Descriptions, and /or H1s), and externally (e.g. copying product descriptions from a manufacturer)||Screaming Frog|
|12||Avoid duplicate content via www redirects i.e canonical URLs (.htaccess or IIS). This means that the domain name without the “www” typed in should redirect to the version with the “www”, or vice versa, but non-www pointing to www is preferred.||Canonical domain check on httpstatus.io||httpstatus.io|
|13||On WordPress sites, avoid duplicate content by setting media and attachment URL redirects to “Yes” in Yoast under SEO -> Search Appearance -> Media.||Yoast|
|14||Do not use “one page” designs.|
|15||Implement a breadcrumb trail (included in WordPress SEO by Yoast plugin, but needs to be manually implemented). Mark up breadcrumb with Schema markup.||https://schema.org/BreadcrumbList||Yoast|
|16||Each page should have a conversion form (e.g. a contact form or newsletter signup) placed in a highly visible area.|
|AUTHORITY||17||Author Bylines & Bio Page: Google’s “Authoritative User” patent and Quality Rater Guidelines both indicate that you should display author names on content, and make it easy to read a bio about the credibility of that author. |
For YMYL content (“Your Money or Your Life,” i.e. medical, financial, and other life-impacting content), this is of utmost importance.
|(See additional general guidance about Schema in the “Schema Markup” section of this document before completing this implementation.)|
|17a||Byline: All article content on the website (whether blog or knowledge center type articles) should show the author name on the byline, in the same way they use it elsewhere on the social web.||(i.e. if Joseph Smith usually goes by “Joe Smith Sr.” on social media, then the byline on their articles should be written that way).|
|17b||Byline Link & Bio Page: The author name on the byline should click through to a bio about them, with the following properties and Schema markup.||On WordPress, by default, the author name on the byline clicks through to the author archive (list of posts by that author.) To satisfy this requirement, either a bio can be added to the top of the author archive, or the byline can be modified to click through to a standard bio page instead|
|17c||The bio page for each author needs to have the following required information|
1) First & Last Name
3) Job Title
4) Description (mentioning as many credibility-boosting facts as possible, i.e. awards, certifications, licenses, college degrees, etc.)
5) Social Media Profile Links (At Least LinkedIn)
|17d||The bio page for each author should be marked up as per the Schema Implementation Guidance document||Schema Implementation Guidance document|
|SOCIAL||18a||Make it VERY easy for visitors to find and follow your presence on social media sites (Facebook, Twitter, LinkedIn, YouTube, etc.) Place links in site footer or sidebar for each profile so that they’re accessible from all website pages||There is a correlation between content that is shared a lot on social media and content that ranks high on search engines. Share your own content, and encourage others to share it as well, as much as possible.|
|18b||Make it VERY easy for visitors to share your content on social media. Social share buttons for all major networks (Facebook, Twitter, LinkedIn) should be on every page.|
|18c||Make it perfectly clear which buttons are for following vs. which ones are for sharing.|
|SPEED||19||Site speed optimizations should be in place for desktop and mobile. These optimizations are crucial, as page speed is a ranking factor (now on BOTH desktop and mobile) and dramatically affects bounce and conversion rates -->|
WPRocket is our favorite solution for speed optimizations, as it is the most comprehensive. However, a mix of other plugins can be used so long as all of the different aspects of page speed optimization are addressed (i.e. Page Caching, Browser Caching, Cache Preloading, Sitemap Preloading, GZIP Compression, Minification / Concatenation, Database Optimization, Google Fonts Optimization, Remove Query Strings from Static Resources, Lazyload, Defer JS Loading, CloudFlare Compatibility, DNS Prefetching, etc.)
|19a||Page load time is to be kept as low as possible and should be monitored in Google Analytics. Average page load time for both Mobile and Desktop users should not greatly exceed 3 seconds.||Behavior -> Site Speed -> Overview. Add segments for "Mobile Traffic" and "Tablet and Desktop Traffic" (or if using a Pam Ann Google account, use "Mobile - United States" and "Desktop - United States")||Google Analytics|
|19b||Google PageSpeed Insights scores should be at or above 90 for desktop and at or above 65 for mobile.||PageSpeed Insights|
|19c||GTMetrix PageSpeed and Yslow grades for Chrome/Desktop/United States should be no lower than B (ideally A). |
(Sign up for a free account in order to be able to change the settings to Chrome/Desktop/United States.)
|19d||GTMetrix “Onload” and “Fully Loaded Time” for Chrome/Desktop/United States should be around 3 seconds or less.|
|19e||Server response time (TTFB) must be less than 200ms on desktop and less than 600ms on mobile.|
Use GTMetrix to measure desktop TTFB, and PageSpeed Insights to measure mobile.
|Hosting company and hosting package can make a difference in server response time. Shared hosting providers are notorious for overloading their servers with too many clients hosted on a single web server. If you must use one of those hosts, consider upgrading to a VPS or dedicated server hosting package. |
However, there are other factors involved in server response time as well - beyond the performance of the physical server. Please read Google’s documentation on this here: https://developers.google.com/speed/docs/insights/Server
|HTTP STATUS CODES||20||Broken links should be avoided whenever possible. Use 301 redirects (per our guidelines) to correct broken links and preserve existing search engine rankings. |
In the case of a website redesign, if URLs change, be sure to redirect ALL old URLs to their new equivalent URLs. To identify which URLs Google has indexed currently, refer to the “Valid” section of the “Index Coverage” report in Search Console.
|If a plugin will be used for this, be sure to select one that does not bloat the database with logs of redirect executions. The popular plugin called “Redirection” by John Godley does create log entries by default, but there is an option to turn this off in the settings (highly recommended.)||Search Console|
|21||302 and 307 Redirects should generally be avoided. They are intended to be temporary and do not pass link equity.||Screaming Frog|
|22||Implement a monitoring solution to get notified when 404 errors occur.||Search Console email notifications can be used for this. Ensure that all people involved in maintaining the website have their email addresses listed as users in Search Console.||Search Console|
|23||Custom 404 error pages with “human-friendly” language and links in the body of the page (either a high-level sitemap, or a handful of the most frequently visited pages.)|
|26||Do not use Flash.||Screaming Frog|
|INDEXATION||27||iFramed text content should be avoided whenever possible.|
|28a||Dynamic XML sitemap (taken care of by WordPress SEO by Yoast plugin).||Yoast|
|28b||Ensure that the XML sitemap has been submitted to Search Console and does not contain any errors.||Search Console|
|28c||Ensure that the XML sitemap does not contain "thank you" / form confirmation pages or any other content that shouldn't be public|
|29a||HTML sitemap page that is dynamically generated/updated.||WP Sitemap Page by Tony Archambeau generates a shortcode that can be used for this purpose||WP Sitemap Page By Tony Archambeau|
|29b||Link to the HTML sitemap page from the footer of the website.|
|29c||Ensure that the HTML sitemap does not contain "thank you" / form confirmation pages or any other content that shouldn't be public|
|30||Robots.txt file that includes the following:|
ENSURE that the following directive, which blocks the whole site from search engines, is NOT present upon launch of a live/production site.
|Cross Check's Search Engine Visibility Monitoring plugin can generate email alerts if the robots.txt file is blocking search engines via the Disallow / directive.||Cross Check's Search Engine Visibility & Robots.txt Monitoring & Email Alerts Plugin for WordPress|
|31||The meta robots “noindex” tag should only be used on content that should never show up in search engines, such as contact form confirmation pages (it is a best practice to use the noindex tag on those). |
For WordPress sites, please ensure that the Search Engine Visibility box (in WordPress "Reading" settings), is UNCHECKED on all live production sites.
****PLEASE TAKE CARE TO ENSURE THAT THE SEARCH ENGINE VISIBILITY BOX IS UNCHECKED THE MOMENT A SITE IS LAUNCHED FROM DEVELOPMENT INTO PRODUCTION.****
|Cross Check's Search Engine Visibility Monitoring plugin can generate email alerts if the Search Engine Visibility checkbox is checked||Cross Check's Search Engine Visibility & Robots.txt Monitoring & Email Alerts Plugin for WordPress|
|32||Automatic insertion of the canonical tag (taken care of by WordPress SEO by Yoast plugin), unless it is an e-commerce site with products that have multiple variants, such as color or size. In that case, a manual assessment of the best way to canonicalize that particular site should be performed.||Yoast|
|33||Use text links in navigation as opposed to images|
|34||A WYSIWYG (what you see is what you get) editor in the CMS to facilitate internal linking via easy link creation*||If using WordPress, this is automatically satisfied|
|35||RSS feeds should be present for blog content and any custom post types||If using WordPress, this is automatically satisfied|
|36a||Blog articles should have dates on the byline.|
|36b||If possible, in addition to the original post date, also include a “last updated” field to pull in the date the post was last modified. The plugin WP Last Modified Info by Sayan Datta may be able to help with this.||WP Last Modified Info by Sayan Datta|
|36c||If there is a “Resource/Knowledge Center” or information library of some sort with more “evergreen” (timeless) content, those articles should have an author name on the byline, but not a date.|
|37a||Security hardening tactics: Follow best practices for implementation of website security measures such as not using “admin” as a user login name, implementation of a firewall, automatic malware monitoring, etc.||Google does not want to index sites that have malware on them, and instances of site hacks are at an all time high (even for small business websites), so it is very important to have security best practices in place.|
|37b||Regularly scheduled CMS updates: CMS systems like WordPress need to be updated regularly (preferably weekly) so that both the core application and any plugins or add-ons consistently have the latest security fixes applied. Since updates can occasionally conflict, be sure to make a backup prior to implementing each set of updates.|
|SCHEMA||38||Schema.org markup plays a very important role in helping Google understand content via machine knowledge.|
IMPORTANT: Ensure that all contents shown in Schema markup match content visible to users on the page. Google specifically prohibits “misleading” Schema markup that is “not representative” of the content on the page, or that refers to content that is hidden from users.
Utilize Schema.org markup as follows:
|SCHEMA IMPLEMENTATION GUIDANCE|
|38a||Company names, addresses, and phone numbers should be marked up with schema code per http://schema.org/Organization for national businesses, OR http://schema.org/LocalBusiness||If the company desires to get found by users (or only serves customers) in a certain geographical region, use LocalBusiness. Otherwise, use Organization.|
If using LocalBusiness, check under “More specific types” at the bottom of https://schema.org/LocalBusiness to see if there’s a specific subtype that matches the organization. If so, use that instead of LocalBusiness.
See the Schema Implementation Guidance document for required fields.
|38b||Video schema should be utilized on all video content. See http://schema.org/VideoObject||Required properties: name, description, thumbnailUrl, uploadDate|
WP YouTube Lyte by Frank Goossens is a plugin that will automatically generate Schema for embedded YouTube videos (but it requires an API key for pulling that data directly from the YouTube channel)
|WP YouTube Lyte by Frank Goossens|
|38c||Article markup should be added to article content (blog articles, knowledge/resource center articles, etc.) This markup should be present both on AMP and non-AMP content. See https://schema.org/Article ||Article markup should be dynamically generated for each article. Use of a plugin is typically the easiest way to implement Article markup (the two AMP plugins mentioned herein will generate this markup for AMP content, but not for non-AMP content.)|
See the Schema Implementation Guidance document for required fields and plugin recommendations.
|38d||Implement Person markup on the author bio page (see “Authority” section of this doc). See https://schema.org/Person|
See the Schema Implementation Guidance document for required fields
|See the Schema Implementation Guidance document for required fields|
|38e||Product schema is crucial for e-commerce sites. Implement as many properties from http://schema.org/Product as possible (but do not add “Product” schema to product category pages. Only add it to individual product pages.)|
Also include Offer, Review, and AggregateRating properties for each product.
|38f||Implement as many other types of Schema markup as is applicable and feasible|
|39||CRITICAL: Ensure that all Schema markup validates with the Structured Data Testing Tool||Structured Data Testing Tool|
|URLs||40||Ensure that the site has a valid SSL certificate.||In order to satisfy Google’s requirements, SSL certificates must come from a third-party certificate authority (meaning they cannot be self-signed).|
|41||301 redirects should be implemented for all HTTP URLs, including image URLs. Internal links should also be adjusted to reflect HTTPS URLs.||Care should be taken to avoid redirect chains. Redirects should NOT look like this: http://sitename.com → http://www.sitename.com → https://www.sitename.com|
|42||Use of search engine friendly URLs (i.e. no parameters, underscores, file extensions).||Screaming Frog|
|TITLE, META, and HEADER TAGS||43||Title tags should contain carefully-chosen often-searched keywords, yet read naturally (shouldn’t sound “stuffed.”)||If we have performed keyword mapping for this site, refer to the Flowsheet for what keywords to include in title tags on keyword-mapped pages.||Screaming Frog|
|44||No ancillary information such as site title or company name should be appended to the page title in the title tag.||Remove "Site Title" in Yoast Search Appearance settings.||Screaming Frog|
|45a||Each page should have exactly ONE H1 tag, as that tells the search engine what the most important heading on the page is. Add a single H1 tag to pages that are missing H1 tags completely, and resolve duplicates on pages that have more than one H1 tag.||If we have performed keyword mapping for this site, refer to the Flowsheet for what keywords to include in the H1 tag for each keyword-mapped page.||Screaming Frog|
|45b||The homepage (as with all other pages) should have a visible and editable H1 tag that contains 2 to 3 researched phrases, as high as possible on the page. That should be followed by at least one paragraph (but ideally more) of body copy. ||If we have performed keyword mapping for this site, refer to the Flowsheet for what keywords to include in the homepage H1 tag.||Screaming Frog|
|45c||On the blog index page (the page that shows the whole list of articles), and the index pages for any custom post types, the article titles should be enclosed in H2 tags, and there should be one main title for that page enclosed in an H1. |
That H1 tag should be easily editable through a widget or other manner that doesn't require hard coding.
|45d||The blog index page should show excerpts of articles, not full text.|
|45e||Category pages should also have an editable H1 and (ideally) paragraph copy.|
|46||Meta descriptions should be present for key pages, and can be configured via the Yoast plugin settings on each page. |
The meta description is displayed on Google search results and is extremely important in influencing the searcher’s decision to click on your page.
|Make sure to write a short, yet compelling description that will entice searchers to visit your website. This should be a one-sentence summary of the content, 150 to 170 characters, that contains the page’s primary key phrase.|
If we have performed keyword mapping for this site, refer to the Flowsheet for what keywords to include in the meta descriptions on keyword-mapped pages.
|47||Images should contain optimized alt text. ||Image alt tags should be added to each image on the site, with a short and accurate description of what is represented in the image. |
One of the main images for the page/article should also use the primary key phrase(s) assigned to that page (if it is possible to incorporate it in an accurate description of the image.)
|TRACKING||48||Google Analytics code should appear on every page.||-Check using the Tag Assistant Chrome Extension in an Incognito window (To enable Tag Assistant in incognito, go to the 3 dot Chrome Menu -> More Tools -> Extensions -> -Click on "Details" by Tag Assistant -> Toggle "Allow in Incognito" to "on.")|
-Then open the website in incognito, click on Tag Assistant, click Enable, then refresh.
-As long as you see a Google Analytics tag that is either blue or green (not red) then this passes. If red or missing, fail.
|Tag Assistant Chrome Extension|
|49||A Google Search Console "Domain Property" should be established||Go into Search Console, click find the website in the upper right, and ensure that a "domain property" exists for it.|