Audit
Audit has a catalog SEO scan, Checkbot-style SEO checks, a Pages template scan, a slug checker, and an on-demand storefront speed pull. None of these spend Generate or NeuronWriter credits.
Catalog issues
Read-only scan of products, collections, and articles:
- Missing meta title
- Missing meta description
- Duplicate meta title or description across the scanned items
- Title over about 60 characters
- Description over about 160 characters
- Thin body copy (under about 50 words)
- Missing alt text when an image is present
Open issues show as a count, then one card per item. Fix the item on Products, Collections, Blogs, or Image alt. This catalog scan does not write to Shopify. The monthly report's audit number is still this live open-issue count.
SEO checks
Grouped Errors and Warnings with counts. Each row links to the Invenio editor or Shopify admin:
- Missing or duplicate title tags and meta descriptions
- Title or meta length
- Missing H1 or multiple H1s on theme templates
- Broken internal links (paths that are not a current product, collection, page, or article)
- Redirect chains
- Missing image alt (Warning only)
- Missing canonical (when page HTML is present)
- noindex on a live page
Pages
Read-only list of Online Store pages and every templates/*.json or templates/*.liquid file on the main theme. Pages use title, handle, body or bodySummary, templateSuffix, and global title_tag / description_tag metafields for SEO (not Page.seo). Templates come from theme(id).files with filenames: templates/*, paginated, on the MAIN role theme (read_themes). Section Liquid is loaded in a second sections/* plus blocks/* pass so JSON templates can be judged on what they render. Each template shows the sections it uses, whether those sections render an H1, and which pages use it. H1 counts only a heading setting rendered as h1 once per section or block instance (heading_tag or tag, or heading_size when Liquid uses it as the HTML tag), or one hardcoded <h1 in the section Liquid after the schema is stripped. Schema defaults, heading_size used as a CSS class, and h2 through h6 do not count. When a collection URL is reachable, storefront HTML is used as a check. Password-protected storefronts skip that fetch. If section files are missing and the storefront is blocked, the H1 column is hidden and Audit shows H1 checks coming later.
Slug checker
Rescan slugs loads product, collection, page, and blog article handles through the Admin API and stores the result with a last-scanned time. Opening Audit does not scan Shopify again until you rescan. If the scan fails, Audit stays on this page and shows the error next to the checker. It does not crash to Application Error.
By default it flags only clearly bad handles:
copy-ofprefixes- Trailing copy numbers such as
-1or-2 - Random IDs or hashes
- Handles over about 60 characters
- Underscores or uppercase
- Duplicate handles
Missing mapped keyword is an advisory note for collections, pages, and articles (invenio- tags, local page town, or a matching store keyword). Product handles are never flagged for a missing store keyword. Product keywords come from the product's own category, type, and tags, and those values are not prepended onto a product name slug.
Suggestions keep stop words that are part of a product name or title (georgia-on-my-mind). Long article slugs shorten to a coherent phrase from the main keyword plus location (best-kids-clothing-stores-grand-junction), not a chopped word list.
If Search Console shows clicks or impressions on that URL in the last 90 days, the row says Leave as is (has traffic) and has no Apply button. Low or no traffic rows have Apply, which renames the handle and creates a 301 redirect. Apply selected does the same for checked rows after you confirm. Undo puts the old handle back and deletes that redirect. Nothing is renamed until you click Apply.
Connect Search Console on Rankings so traffic locks can run. Without it, every weak handle is treated as no traffic.
Storefront speed
Pull speed data loads the latest Watchtower Lighthouse run for this shop. It queries shop { primaryDomain { host } }, the myshopify domain, and the shop domains list, then tries each host with and without www. Tried domains lists every host it used. It is on demand. Nothing is scheduled.
Run speed test in Watchtower calls POST {WATCHTOWER_API_URL}/api/runs with the primary host only, then polls GET /api/runs for that run. A development store with only a myshopify host is expected when no custom domain is connected. Password-protected stores cannot be tested. If the run is still going, pull again when it finishes. If a pull finds no match, Audit lists the domains it tried and links to Watchtower.
The host needs:
WATCHTOWER_API_URLset to the Lighthouse base, such ashttps://cornflowerblue-lapwing-804525.hostingersite.com/lighthouseWATCHTOWER_API_KEYif Watchtower requires a shared secret (Authorization: BearerandX-Watchtower-Key)
If WATCHTOWER_API_URL is unset, Invenio uses that public Lighthouse URL. Invenio reads GET {WATCHTOWER_API_URL}/api/runs and keeps performance score, LCP, CLS, INP or TBT, FCP, mobile and desktop when Watchtower sends a device, and the run date.