Technical SEO
naturespath.com · Full-site SEO audit · April 16, 2026
What this page shows. A full technical-SEO audit of naturespath.com covering crawlability, indexability, URL structure, HTTPS / security, mobile optimization, Core Web Vitals, JavaScript rendering, international / hreflang, and technical schema. Each dimension scores independently; the composite is weighted by search-engine impact.
Technical foundations determine whether the brand even competes. A site with strong authority and rich content still underperforms when the crawl graph is dirty, schema is malformed, or Core Web Vitals fail on mobile. The findings below name the specific templates, <head> scripts, and metadata failures dragging NP’s technical score into needs-work territory.
How to read the findings. Start with the 9 Category Scores for the quick map, then Critical Issues for the fix-first shortlist. Each subsequent section drills into one dimension: script inventory, hreflang, CWV risk, indexability, security, multi-market. The Implementation Checklist at the bottom converts every finding into a stable-slug task.
What the data says about NP today. Shopify’s server-side rendering keeps raw HTML clean and indexable. The <head> carries 61 total scripts with 11 synchronous render-blockers, the homepage H1 is empty, the Organization schema is malformed on every page, and third-party tag weight is dragging Core Web Vitals into failing territory on mobile. Hreflang is a bright spot: all content types carry a complete 7-tag set across 6 locales.
9 Category Scores
What this grid shows. The nine technical-SEO dimensions scored independently 0–100. Each card is color-coded and carries a one-word status (PASS, NEEDS WORK, FAIL, IMPROVED).
Per-dimension scoring isolates where the fix belongs. A site can be fully crawlable and fully indexable yet still fail Core Web Vitals on mobile, so a composite technical score hides where the remediation effort should land. The grid makes the failing dimensions (CWV 35, Technical Schema 30) visible next to the passing ones (Crawlability 80, URL Structure 82) so prioritization is obvious.
How to read the colors. Green = passing (≥75). Amber = needs work (50–74). Red = failing (<50). Four of nine dimensions pass, three need work, two fail. The Hreflang score carries an IMPROVED status label because fr-CA was added and localized slugs shipped since the prior audit.
Critical Issues
What this section shows. The five highest-severity technical findings, each rendered as a critical callout with the symptom, the evidence, and the fix path. Every issue names the specific Shopify template or theme file where the remediation lands.
Critical-tier issues block downstream work across the audit. An empty homepage H1 caps every on-page keyword signal the content team can improve. A malformed Organization schema on every page makes the entire site invisible to AI crawlers and SGE despite DR 72 authority. Fixing the items here clears the path for the content, schema, and GEO workstreams below.
How to read the callouts. Each title names the problem; the body names the template, the scripts, or the specific JSON-LD fields. All five map 1:1 to Implementation Checklist items at the bottom of this page.
fetchpriority="high" and no <link rel="preload">fetchpriority="high" to the first above-the-fold <img> and a matching <link rel="preload" as="image"> in <head> is the single highest-impact Core Web Vitals change available.
<head>content.9gtb.com/loader.js (unrecognized third party) all load synchronously before render. Each is a cross-origin request adding DNS + TCP + TLS + download time. Total <head> scripts reached 61–62 per page — the primary driver of mobile CWV failures.
Recipe schema on 551 recipe pages<h1> element is present in the DOM but contains no text. The visible hero headline is rendered outside the H1. The primary on-page keyword signal for the homepage is effectively absent.
"@context": "http://schema.org" (HTTP, not HTTPS). "name": "Nature's Path" (HTML entity, not UTF-8). sameAs contains empty strings (3 of 8 values). Missing logo, @id, description, address, telephone, foundingDate, and the brand array. Pinterest URL points to the wrong canonical property.
Crawlability & Robots.txt
robots.txt at https://naturespath.com/robots.txt returns 200 (6.6 KB). Standard Shopify-generated file. Sitemap declared once at the default locale.
User-agent: *correctly disallows/admin,/cart,/orders,/checkouts/,/account,/search,/policies/, sort-by and multi-filter URLs- Nutch crawler fully blocked; AhrefsBot crawl-delay 10s; MJ12bot crawl-delay 10s; Pinterest crawl-delay 1s
- Hexadecimal remote product-variant regex disallow is correctly formed
/policies/disallow is harmless — actual compliance pages live at/pages/privacy-policy-1,/pages/terms-conditions,/pages/cookie-policy-1- No explicit directives for GPTBot, ClaudeBot, PerplexityBot, CCBot, Anthropic-AI — they fall under
User-agent: *with no crawl-delay - No
llms.txtfile present at site root - Sitemap index referenced only once; no per-locale sitemap declarations for Bing/Yandex discovery
Script Inventory (Render-Blocking <head>)
11 external synchronous scripts in <head>, plus 44 inline script blocks, plus a base64-encoded dynamic-optimization injector. Total <head> scripts: 61–62. HTML payload: 648 KB (homepage).
| Script / Origin | Category | Loading | Assessment |
|---|---|---|---|
| LinkGraph dynamic-optimization (inline base64) | SEO-testing injector | Synchronous | INVESTIGATE — may modify title/meta/body client-side |
analytics.ahrefs.com/analytics.js |
Analytics | Synchronous | ADD async |
consentmo.js |
Consent | Synchronous | ADD async — runs before user interaction anyway |
| jQuery 3.7.1 (Google CDN) | Library | Synchronous | ∼87 KB parsed + executed — defer |
static.klaviyo.com/onsite/js/WXqDpY/klaviyo.js |
Marketing | Synchronous | DEFER |
cdn-widgetsrepository.yotpo.com/v1/loader/... (×2) |
Reviews | Synchronous | DEFER — review widgets render post-interaction |
js-na3.hs-scripts.com/341595240.js |
HubSpot | Synchronous | DEFER |
config.gorgias.help/api/contact-forms/replace-mailto-script.js |
Support | Synchronous | DEFER |
content.9gtb.com/loader.js |
Unknown | Synchronous | INVESTIGATE — unrecognized third party |
| Rebuy, ReCharge, SMSBump, Printful | E-commerce | Loaded on page | TEMPLATE-GATE — only load on product/cart |
sa-dynamic-optimization script dynamically modifies page content after load via dashboard.linkgraph.com/scripts/dynamic_optimization.js. It may inject or modify titles, meta descriptions, or body text client-side — which means Googlebot (which renders JS) could see different content than the raw HTML. Confirm whether this is altering crawlable content or purely an analytics/testing tool.
Hreflang Status (Improved)
All 15 sampled pages ship a complete 7-tag set. Localized slugs present for es-MX and fr-CA. Bidirectional confirmation pending for three locale pages that failed to fetch during crawl.
| hreflang | Target URL | Status |
|---|---|---|
x-default | / | PASS |
en | / | AMBIGUOUS — en-US preferred |
en-GB | /en-gb/... | PASS |
en-MX | /en-mx/... | PASS |
es-MX | /es-mx/... | PASS — localized slugs (nuestro-camino, cereale) |
en-CA | /en-ca/... | VERIFY RECIPROCAL |
fr-CA | /fr-ca/... | NEW — localized (notre-chemin, recettes, granola-a-5-ans) |
- fr-CA locale newly added (was not in prior locale list)
- Localized slugs active for es-MX and fr-CA on content pages
- fr-CA blog index uses
/fr-ca/blogs/posts(same handle); recipes correctly localize to/fr-ca/blogs/recettes - No
en-AUor other English locales — non-US English visitors receive US default with USD pricing - Bidirectional confirmation pending on en-CA homepage, en-GB product, en-MX product (Cloudflare blocked during crawl)
Core Web Vitals (Lab Heuristic)
Source-level risk assessment against 2026 thresholds (LCP <2.5s, INP <200ms, CLS <0.1). Field data should be confirmed in PageSpeed Insights and GSC CrUX. See the Performance page for per-URL measurements.
| Metric | Source-Level Risk | Primary Drivers |
|---|---|---|
| LCP | HIGH | No preload, no fetchpriority="high", 11 render-blocking scripts, 648 KB HTML, no font preload |
| INP | MEDIUM | Klaviyo, Yotpo×2, HubSpot, Rebuy, ReCharge, Gorgias, SMSBump, Printful main-thread load; 32 carousel instances |
| CLS | LOW | 95/96 body images carry explicit width/height. Consentmo banner and Yotpo injection are the only residual risks. |
Indexability & Metadata Audit
What this table shows. Title length, meta description length, H1 state, and og:image presence for 10 representative pages across the site. Status values (EMPTY, MISSING, truncates) flag the specific metadata failures on each page.
Page-level metadata is the lowest-hanging optimization layer. Each empty H1 or missing og:image is a single template fix that lands visible SERP and social-share improvement inside a sprint. Homepage, About, Our Path, Blog index, Recipes index, and Careers all render text-only social share cards today. Two of those URLs have no H1 at all.
How to read the colors. Red-marked cells flag fields that are empty, generic, or truncated. Plain cells are compliant. “truncates” means the title or meta description exceeds Google’s SERP cutoff and renders with an ellipsis. The table drives the metadata-specific items in the Implementation Checklist below.
| Page | Title (len) | Meta Desc | H1 | og:image |
|---|---|---|---|---|
| Homepage | 56 | 150 | EMPTY | MISSING |
| About | 22 | 0 (missing) | Present | MISSING |
| Our Path | 32 | 253 (truncates) | NO H1 | MISSING |
| Cereal collection | 74 (truncates) | 153 | "Collection:Organic Cereal" | Present |
| Granola collection | 76 (truncates) | 155 | "Collection:..." prefix | Present |
| Blog index | 21 (generic) | — | Present | MISSING |
| Recipes index | 24 (generic) | — | Present | MISSING |
| Plant-protein blog post | 62 | 320 (truncates) | Present | Present |
| 5-Ingredient Granola recipe | 37 | — | Present | Present |
| Careers | 30 | 304 (truncates) | NO H1 | MISSING |
- All 15 sampled pages carry a self-referencing canonical; no cross-locale contamination
- No
noindexmeta found on any sampled page — all indexable - Collection H1s render with literal “Collection:” prefix from Shopify template variable
- 5 pages (Homepage, About, Our Path, Blog index, Recipes index, Careers) missing
og:image— text-only social cards
HTTPS & Security Headers
Response-header inspection was limited by the audit proxy (captured content-type and cf-ray only). Assessment based on Shopify platform defaults and visible source signals.
| Signal | Current State | Status |
|---|---|---|
| HTTPS enforced | All 15 sampled pages return HTTPS; canonicals all https:// | PASS |
| Mixed content in schema | Organization "@context": "http://schema.org" | MINOR |
| Protocol-relative CDN URLs | //naturespath.com/cdn/... present in inline JS | AMBIGUOUS |
| HSTS | Shopify default max-age=7889238 (∼91 days) | PARTIAL — below 1-year preload threshold |
| Content-Security-Policy | Shopify does not set by default | MISSING |
| X-Frame-Options / X-Content-Type-Options | Shopify platform defaults | PASS |
Multi-Market & Localization
Nature’s Path serves six active locale markets (en-US, en-CA, fr-CA, en-GB, en-MX, es-MX) from a single Shopify store. Hreflang is the strongest localization signal and is correctly deployed on content pages (see Hreflang Status above). The remaining localization surface is uneven: product pages miss hreflang entirely, es-MX is inconsistently applied across page types, UK region pricing is mis-configured, and the theme ships with locale files for markets that have never launched. Each gap is individually small; collectively they blur Nature’s Path’s entity resolution in non-US markets and dilute the authority that hreflang would otherwise concentrate on the correct locale.
| Issue | Detail | Fix |
|---|---|---|
| Hreflang missing on product pages | Hreflang is deployed on homepage, collections, FAQ, and blog pages (all 7 variants). Product pages carry only an oembed alternate link and no hreflang set. Products collectively drive significant organic traffic; without hreflang, cross-locale duplicate-content risk is real and locale ranking is left to Google heuristics. |
Extend hreflang implementation to sections/main-product.liquid. Every product template should emit the full 7-tag set matching its cross-locale counterparts. |
| es-MX coverage inconsistent across page types | The /blogs/recipes index page ships only 5 hreflang variants — missing es-MX — while the homepage carries all 7. Audit revealed a similar pattern on several deeper blog URLs. |
Audit every page type for consistent hreflang coverage across all 7 variants. Where es-MX content does not exist, decide: suppress the hreflang entry (don’t reference an untranslated page) or publish the localized content. Mixed signals are worse than a missing tag. |
| UK region shows USD pricing | The en-GB locale renders with USD pricing rather than GBP. Confusing for UK visitors, under-converts, and contradicts the en-GB hreflang declaration. | Verify Shopify Markets currency settings for the UK market (Admin → Markets → United Kingdom). If GBP is configured but not propagating, check theme overrides on theme.liquid and sections/main-product.liquid. |
| 9 locale files but only 6 active markets | The theme ships locale files for German (de), Italian (it), Japanese (ja), Dutch (nl), and Portuguese (pt) that correspond to no active market. These files add bundle weight and maintenance complexity with zero return. | Remove unused locale files from the theme to reduce theme bundle size and simplify future localization work. Retain only the 6 active markets plus x-default English. |
391 .context.{market}.json files |
The theme carries 391 market-specific section configuration files. This is Whisk’s mechanism for per-market section overrides. Not inherently a problem — but at this volume, SEO elements (meta titles, meta descriptions, schema, featured content) may drift across markets without anyone noticing. | Audit the .context.{market}.json files for per-market SEO consistency. Ensure titles, meta descriptions, and schema references are intentional in each market variant. Flag any market-specific template that breaks the sitewide schema or hreflang contract. |