SEO Features
Peregrine treats SEO as a built-in system, not an afterthought — heading structure, structured data and page speed are handled by the theme so you don't need an app to fix them.
Merchant-controlled heading tags
Every section heading has a Heading tag (H1–H6) control next to its text field. Slide it and the heading renders as that tag — <h3> instead of <h2>, say — without changing the visual size at all. Tag = meaning for search engines; theme settings = appearance. They're deliberately independent, so you can build a perfect semantic outline without ever compromising the design.
The H1 guarantee
Exactly one H1 on every page, with zero effort — and full override control when you want it. Three tiers, top priority first:
- Your explicit choice wins. Set any section's heading tag to H1 — an About block at the bottom of the homepage, anywhere — and that's the page's H1. The theme's automatic H1 detects it and steps down to H2 by itself.
- Automatic assignment. With no explicit H1, the slideshow's Auto mode gives the H1 to the first slide that has a heading — surviving image-only first slides, slide deletion and reordering.
- The safety net. If nothing on the page provides an H1 at all (an image-only homepage, for instance), Peregrine injects a visually-hidden H1 containing your store name — invisible to shoppers, fully visible to search engines and screen readers.
Structured data (JSON-LD)
Rendered server-side on every relevant page — no app, no JavaScript dependency. Entities carry stable @id identifiers and reference each other (the website declares the organization as its publisher, breadcrumbs are anchored to their page), so search engines see one connected graph rather than disconnected fragments:
| Schema | Where | What it earns |
|---|---|---|
| Organization | Every page | Brand identity + social profiles (sameAs) |
| WebSite + SearchAction | Homepage | Eligibility for the Google sitelinks search box |
| Product (per-variant offers) | Product pages | Price, availability and review-ready rich results |
| CollectionPage + ItemList | Collection pages | Declares the page and its product list as structured entities |
| Blog + BlogPosting | Blog index and articles | Article rich results — headline, image, author, dates |
| FAQPage | Any page carrying an FAQ section, when its own switch is on | Describes your questions and answers as a structured Q&A set. See the note below on what this does and does not do today. |
| BreadcrumbList | Product, collection, page, blog, article, search | Breadcrumb trails in search listings |
Where the data comes from — and how to change it
Peregrine doesn't invent any of this content — every tag and schema value is read from data you already control in the Shopify admin. If something looks wrong in a search result or a social share, this table tells you where to fix it:
| Output | Comes from | Edit it at |
|---|---|---|
| Page title & meta description | Each resource's search engine listing | The Search engine listing panel at the bottom of any product, collection, page or blog post edit screen (click Edit website SEO). Homepage: Online Store → Preferences. |
| Product structured data | The product record | Product edit screen — title, description, images, price and compare-at price, SKU, and inventory (which drives availability). |
| Organization structured data | Store identity + theme settings | Store name in Settings → Store details; social profile links in Theme settings → Social accounts (these become the sameAs profile links). |
| Website + sitelinks search | Store name and domain | Settings → Store details and Settings → Domains (primary domain). |
| Breadcrumb structured data | Your titles and navigation path | Rename the product, collection or page — the trail and its markup follow automatically. |
| Social share image (Open Graph / Twitter) | The page's featured image — or the variant's, on a variant link | Product featured image, collection image or article image; the selected variant's own photo where it has one; store-wide fallback under Online Store → Preferences → Social sharing image. |
| Share price and availability (Facebook, Pinterest Rich Pins) | The variant being shared | Nothing to edit — read from the product's price and stock at the moment the page is fetched. |
| Product identifiers (GTIN) | Each variant's Barcode field | Product edit screen → the variant → Barcode. Only genuine 8, 12, 13 or 14-digit GTINs are sent; anything else in the field is left out rather than sent wrong, so internal codes do no harm. |
| Canonical URL | Shopify, automatically | Nothing to edit — Shopify generates it from your primary domain. |
Sharing a specific variant
A product link can carry a variant — /products/harness?variant=123 — and posting one is worth doing when the campaign is about a particular colour or size: the shopper lands with it already selected, priced and ready to add, rather than on the default and having to find what they clicked.
Peregrine makes those links preview correctly. The share image follows the variant where that variant has its own photo, and the price and availability sent to Facebook and Pinterest are the variant's, so a share of the £40 size never advertises the £35 one.
To make that work, two tags deliberately disagree on a variant URL:
rel="canonical"always points at the clean product URL. This is what Google reads, and it's what keeps every variant consolidated into one page in search rather than competing with each other.og:urlcarries the variant when one is in the link. Social scrapers treat this tag as the identity of the thing being shared — point it somewhere else and the preview they show is that other page's, which is how a post about the pink one ends up displaying the default photo.
The trade-off is that likes and shares on a variant link count against that link rather than pooling on the product. For a campaign post about one colourway that's the right way round. Ordinary product links — anything without ?variant= — keep the clean address and pool their shares as before.
Do variant links hurt your SEO?
No, and it's worth knowing why, because it's a common worry. Google consolidates a parameter URL onto its canonical, so the ranking signals arrive at the product page rather than being split across variants. There's also nothing on the storefront linking to a variant URL for a crawler to follow — the parameter is written into the address bar as a shopper switches, which crawlers don't do. And Shopify's own robots.txt already keeps crawlers out of the genuinely expensive parameter space: sorted collections, and any URL combining two or more filters.
SEO settings & the kill switch
Theme settings → SEO controls the theme's entire SEO output. If you run an SEO app that outputs its own structured data or social tags, turn the theme's off — a master switch kills everything at once, or use the granular switches (each JSON-LD type, social sharing tags, utility-page noindex) to mix the theme's output with your app's. This avoids the classic duplicate-markup conflict where theme and app both describe the same product.
Page titles, meta descriptions, canonical URLs and the H1 guarantee are deliberately always on: SEO apps edit those values rather than rendering their own tags, so there's nothing to conflict with — and every page needs them.
HTML sitemap
Peregrine ships a built-in HTML sitemap — crawlable pages linking to everything on your store, so nothing is ever orphaned and internal link equity flows to your whole catalog. It stays current on its own as your store grows: no lists to maintain, no links to add by hand.
Rather than one enormous document, it works as a hub and its indexes. The hub lists your site pages and policies directly, then links out to a dedicated page for each large group. A store with thousands of products never has to render them all in one response.
| Template | What the page shows |
|---|---|
html_sitemap | The hub — home, every site page, links to the indexes below, store policies |
html_sitemap_collections | Every collection, 250 per page |
html_sitemap_products | Every product, 250 per page |
html_sitemap_blogs | Every blog and article, grouped by blog |
Setup:
- Admin → Online Store → Pages → Add page. Name it whatever you like — the page title becomes the heading. Anything you type in the body renders as an intro paragraph.
- In the page's Theme template dropdown, pick the template you want from the table above.
- Repeat for each index you want. The pages find each other automatically — as soon as a page exists on one of these templates, the hub links to it and that page links back. There is nothing to wire up.
- Link the hub in your footer: either add the page to your footer menu, or pick it in the footer section's Sitemap page setting to render a link beside the copyright on every page.
Create only what you need. The hub works on its own, and each group appears the moment its page exists.
Blogs are a special case worth knowing about. Shopify's template language can't list blogs or articles, so that one page reads your store's own sitemap.xml — the same file search engines use — in the browser. New posts appear there automatically with no input from you. The trade-off: those particular links are added after the page loads, so they won't show in "view source" (check the inspector instead). Every other group is rendered server-side.
Analytics & SEO tools: nothing to configure — your analytics (GA4, Clarity) load on these pages like any other, and crawlers (Google, Ahrefs, Semrush) discover them through the footer link. After a few days, check they appear in your page reports, and if you run site audits, you should see internal-links coverage improve — the "no orphaned pages" effect made visible.
To turn any of it off, switch that page back to the default template or delete it — the page is the switch. You can also hide individual groups from the hub in the section's settings.
Breadcrumbs
A breadcrumb section ships on product and collection templates (removable like any section) — Home → Collection → Product, with the matching BreadcrumbList markup. On product pages it prefers the collection the shopper navigated through.
Art-directed mobile images = mobile speed
Wherever you set a mobile image, Peregrine uses true <picture> art direction: the phone downloads only the mobile file, never the desktop one. Smaller transfers, better Largest Contentful Paint — and LCP is a ranking signal.
Image quality tuning
Theme settings → SEO → Images is Peregrine's built-in answer to image optimizer apps. Tune image sizes for speed serves smaller image files sized to how they actually display, and the Image quality selector sets how aggressive that is:
- High — full 2× screen density everywhere. The sharpest option and the largest files; this is what the theme serves with tuning switched off.
- Balanced (the default) — serves images at 1.5× density instead of 2×. On real screens the difference is rarely visible, but the files are dramatically smaller.
- Performance — 1× density, the smallest files. Worth trying on image-heavy stores; check your product grid looks acceptable on a phone before committing.
Two things you don't need a setting for, because they're automatic: Shopify's CDN already picks the best file format (WebP or AVIF) for every visitor's browser, and Peregrine lazy-loads every image below the fold while deliberately eager-loading the one image at the top of each page — lazy-loading your largest visible image is a classic speed mistake, and the theme won't make it.
The product page's zoom viewer always fetches the full-sharpness image regardless of this setting — zoom exists to show detail, so capping it would defeat the point.
Image focal points
When Peregrine crops an image to fit a shape — product cards, collection banners, blog cards, the gallery under a fixed ratio — it honours the focal point you set in Shopify admin (edit the image and drag the focus marker). Set the focal point on a tall pack shot to its label, and every cropped rendering keeps the label in frame. No focal point set means the standard centred crop.
Hygiene handled for you
- Cart, search results and account pages are
noindex— thin pages stay out of the index. - Canonical URLs, Open Graph and Twitter Card tags on every page.
- Exactly one H1 per template, headings in a sane hierarchy out of the box.
- Per-section asset loading keeps pages light — speed is the SEO feature everything else sits on.