A complete audit and fix pack, before you pay for one
This is what AuditTag hands a Shopify store, in the order that matters. First the tracking tags it found, with the on-page issues counted separately. Then a design of the Guardrails emails. Then the Fix Pack in full, with 19 admin fields to paste, one theme snippet and the decisions I left for a person. A Fix Pack for a store this size is £39.
Ashcombe Coffee Roasters is fictional. I invented it, because publishing a real company's site as an example of bad work would be using somebody else's reputation as our marketing. Its pages are built the way a real Shopify theme serves them, and the tags, issues and fixes in sections 1 and 3 were found and packaged by the same code that runs on your store. The titles, descriptions and alt text in this sample were written by hand so the sample can be rebuilt offline. A real pack has them written from your own page text and checked, so read the copy before you use it.
It reads the HTML your pages serve, so it shows which tags are installed, not whether a purchase actually fires.
1 · free audit · automatedThe tracking tags on the store
The free audit read the HTML that 6 pages on ashcombecoffee.example serve and listed the tags on them. It gives two counts and keeps them apart, so a store is not marked down on its SEO for the tags it chooses not to run.
2Tags present
We look for four tags, which are Google Analytics 4, Tag Manager, Google Ads and the Meta Pixel. Not finding Tag Manager or Google Ads is fine if you do not use them.
- Theme onlyGA4G-ASH7K2QP4M in theme codeon 6 of 6 pages
- Not foundGoogle Tag Manager
- Not foundGoogle Ads
- Theme onlyMeta Pixelin theme codeon 6 of 6 pages
- RetiredUniversal Analyticsretired, still loadingon 6 of 6 pages
warning GA4 is only in your theme code, which does not run on checkout
What we saw. GA4 (G-ASH7K2QP4M) is loaded from your theme code, and Shopify does not load theme code on the checkout or the thank-you page, so this tag cannot record a purchase or its revenue. We did not find GA4 connected through a Shopify app, which would run on checkout. If your purchases reach GA4 another way, such as server-side tagging, this does not apply. Fix. Connect GA4 through the Google & YouTube app, or send purchases from a custom pixel under Settings → Customer events, then remove the theme snippet so storefront page views are not counted twice. Place a test order and confirm the purchase shows in GA4.
warning Your Meta Pixel is only in theme code, which does not run on checkout
What we saw. Your Meta Pixel is loaded from your theme code, and Shopify does not load theme code on the checkout or the thank-you page, so a Purchase event cannot fire from it and Meta cannot optimise your campaigns against sales. We did not find the pixel connected through Shopify's Facebook & Instagram app, which would run on checkout. If Purchase reaches Meta another way, such as the Conversions API, this does not apply. Fix. Connect the pixel through the Facebook & Instagram app, or send Purchase from a custom pixel under Settings → Customer events, then remove the theme snippet so PageView is not counted twice. Place a test order and check Meta Events Manager.
notice A retired Universal Analytics tag is still loading
What we saw. Alongside your current analytics we found a Universal Analytics tag. Google stopped processing it in 2023, so it collects nothing, but it still loads on every page. It is usually hardcoded in the theme and forgotten. Fix. Remove the Universal Analytics snippet (a UA- id, or analytics.js / ga.js) from your theme or tag manager. Check your GA4 tag still fires afterwards.
So the tags are there, in the theme. GA4 and the Meta Pixel are both installed. The audit can also see where. Both are in theme code, which Shopify does not load on checkout, so neither can see a sale from there. Whether they send the events your reporting and your ad spend depend on is a different question, and it takes a test order to answer. What the audit checks, and what it cannot see →
2 · Guardrails · designWhat Guardrails would send this store
Guardrails reads your public pages and tells you when a tag it has seen disappears or doubles up. It does not say whether a purchase fired. Guardrails is in early access, so I set each site up by hand, and I write its emails by hand and send them myself. The two emails below are designs for the fictional store. They are written out from the sample's own audit by the same code that will write a real one, and no real store has received either.
- From
- AuditTag
- Subject
- Guardrails checked ashcombecoffee.example, nothing has changed
Guardrails, weekly note
ashcombecoffee.example
Checked on Monday 14 September. We read 6 of 6 pages we watch for ashcombecoffee.example.
Nothing has changed since Monday 7 September. Every tag we had seen is still on your pages.
Tags present
We found 2 tags on your pages, GA4 and Meta Pixel.
We did not find Google Tag Manager and Google Ads. Not finding Tag Manager or Google Ads is fine if you do not use them.
On-page issues
The audit found 35 on-page issues, on the pages we watch. It is the same audit as the free report.
If a tag you expect is not on the list, or one is listed that should not be, just reply to this email.
Guardrails reads your public pages and tells you when a tag it has seen disappears or doubles up. It does not say whether a purchase fired.
An alert, for the week a theme update went out. This is the kind of message the tags above are watched for. The snippet hash is a 12 character fingerprint of the tag's code. It is worked out from the pixel snippet in this store's own theme, so a hash that no longer appears on any page tells you the snippet was edited or removed.
- From
- AuditTag
- Subject
- Meta Pixel is no longer on ashcombecoffee.example
Guardrails alert
Meta Pixel is no longer on your pages
On Monday 14 September we saw Meta Pixel (2817640051938472) on 6 of 6 pages we read for ashcombecoffee.example. On Monday 21 September it was on 0 of 6 pages.
We read the page again after a short wait to be sure, and it was still missing.
The snippet we saw before has the snippet hash 561fc7184fb4. Nothing on the page has that hash now.
Common causes are a theme update that replaced the file the snippet lived in, or an app that was switched off. That is a guess from how these usually go, not something we saw on your site.
Once it is back, place a test order and look for the purchase in Meta Events Manager. That is the only way to know a purchase is arriving.
This is the start of the snippet we saw before.
<script>!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;n.
Alert reference gr-ashcombe-1
If this alert looks wrong, just reply to this email. The person who reads it built Guardrails, and a wrong alert goes on the public list of things we got wrong.
Neither design says whether a purchase fired, because Guardrails reads the same served pages the free audit does and cannot know. How Guardrails works →
3 · Fix Pack · automatedThe Fix Pack, in full
The rest of the audit is the on-page layer under the tracking: titles, descriptions, alt text, structured data and social tags on the pages your campaigns send people to. On Shopify these live in admin fields and one theme snippet, so that is how the pack is built. The Fix Pack fixes these on-page tags. It does not fix tracking.
On-page issues
35issues across 6 pages
What is in the zip
Start with PACK_NOTES.md. It is the first file, and it says what was written, what was held back and what needs a person. README.md is the full change list. Then shopify/INSTALL.md walks through the two jobs step by step, and nothing in the pack touches your store until you choose to paste or install it.
- PACK_NOTES.md
- README.md
- site/index.html
- site/blogs/journal/dialling-in-espresso-at-home.html
- site/collections/coffee.html
- site/pages/about.html
- site/products/ethiopia-guji.html
- site/products/house-espresso.html
- shopify/snippets/audittag-seo.liquid
- shopify/seo-fields.csv
- shopify/products.csv
- shopify/INSTALL.md
PACK_NOTES.md, the first file, in full
# Read this first
This pack is for ashcombecoffee.example. We read all 6 pages on 1 September 2026.
Nothing in this pack has been applied to your live site. These are files for you to review and use yourself.
## What we wrote
This pack writes 3 titles, 6 descriptions, 10 alt texts and 4 structured data blocks.
The copy comes from your own page text. We told the writing step not to add facts from outside it, and an automated check looks for some kinds of claim that your pages do not make, such as prices, numbers, delivery and returns promises, reviews and superlatives. It is a safety net and can miss wording, so read the copy before you use it.
## What still needs a person
6 things need a decision from you.
- 2 H1 headings on one page
- Article has no named author
- Heading order jumps from H1 to H3
- GA4 is only in your theme code, which does not run on checkout
- Your Meta Pixel is only in theme code, which does not run on checkout
README.md has the full list under Needs a human.
## What this pack does not do
It fixes the tags and fields on your pages, such as titles, meta descriptions, headings, image alt text, canonical links, structured data, social tags, robots.txt and sitemap.xml. It does not fix tracking, and it does not promise rankings.
The audit that came before it is a presence check. It reads the HTML your pages serve, so it shows which tags are installed, not whether a purchase actually fires.
The audit saw GA4, Meta Pixel and Universal Analytics in your pages. It did not see Google Tag Manager and Google Ads, which is fine if you do not use them.
After you deploy, place a test order and watch it arrive in GA4 DebugView and, if you run ads, in Meta Test Events and Google Tag Assistant. Only a test order shows that a purchase fires.
## Where to start
Open shopify/INSTALL.md. It takes you through the admin fields and the one theme snippet.
The full change log is README.md.
The admin fields: 19 values, each with the screen it goes on
This is shopify/seo-fields.csv, rendered. Your theme reads titles, descriptions and alt text from these fields, so that is where the corrected copy goes, not into a snippet that would print a second title.
| Page | Field | Where to change it | Now | Corrected |
|---|---|---|---|---|
/ |
SEO title | Online Store → Preferences → Title and meta description | Ashcombe Coffee Roasters | Speciality coffee roasted to order | Ashcombe Coffee |
/pages/about |
SEO title | Content → Pages → about → Search engine listing → Edit | Ashcombe Coffee Roasters | Our story: roasting in Frome since 2018 | Ashcombe |
/products/ethiopia-guji |
SEO title | Products → ethiopia-guji → Search engine listing → Edit | Ethiopia Guji Natural Single Origin Coffee Beans 250g, Whole Bean or Ground - Ashcombe Coffee Roasters | Ethiopia Guji Natural coffee, 250g | Ashcombe |
/ |
SEO description | Online Store → Preferences → Title and meta description | (empty) | Small-batch speciality coffee roasted twice a week in Frome and posted the day it is roasted. Free UK delivery over £30. |
/blogs/journal/dialling-in-espresso-at-home |
SEO description | Content → Blog posts → dialling-in-espresso-at-home → Search engine listing → Edit | (empty) | Most bad home espresso is the grind. Set a dose and a yield, change one thing at a time, and expect to grind finer as a bag ages. |
/collections/coffee |
SEO description | Products → Collections → coffee → Search engine listing → Edit | (empty) | Every coffee Ashcombe roasts, from House Espresso to Ethiopia Guji Natural. Whole bean or ground to order, posted the day it is roasted. |
/pages/about |
SEO description | Content → Pages → about → Search engine listing → Edit | (empty) | Ashcombe began in 2018 with a 5kg roaster in a Frome garage. We now roast twice a week in Mill Yard and publish the price paid for every lot. |
/products/ethiopia-guji |
SEO description | Products → ethiopia-guji → Search engine listing → Edit | Speciality coffee roasted to order in small batches and posted the same week. | A natural-process heirloom lot from Guji, light roast. Strawberry, bergamot and a honeyed finish, best as pour-over or AeroPress. 250g, £13.00. |
/products/house-espresso |
SEO description | Products → house-espresso → Search engine listing → Edit | Speciality coffee roasted to order in small batches and posted the same week. | Brazil Cerrado and Colombia Huila, roasted medium-dark. Chocolate, hazelnut and dried fruit, for espresso or a moka pot. 250g, £11.50. |
/ |
Alt text for roaster-drum.jpg | Content → Files, or the theme section this image is set in | (empty) | Coffee beans turning in the drum of the Ashcombe roaster |
/ |
Alt text for house-espresso-bag.jpg | Products → the product this image belongs to → Media → select the image → Alt text | (empty) | A 250g bag of Ashcombe House Espresso |
/ |
Alt text for ethiopia-guji-bag.jpg | Products → the product this image belongs to → Media → select the image → Alt text | (empty) | A 250g bag of Ashcombe Ethiopia Guji Natural |
/blogs/journal/dialling-in-espresso-at-home |
Alt text for espresso-scale.jpg | Content → Files, or the theme section this image is set in | (empty) | An espresso shot being weighed on a scale as it pours |
/collections/coffee |
Alt text for house-espresso-bag.jpg | Products → the product this image belongs to → Media → select the image → Alt text | (empty) | A 250g bag of Ashcombe House Espresso |
/collections/coffee |
Alt text for ethiopia-guji-bag.jpg | Products → the product this image belongs to → Media → select the image → Alt text | (empty) | A 250g bag of Ashcombe Ethiopia Guji Natural |
/collections/coffee |
Alt text for decaf-colombia-bag.jpg | Products → the product this image belongs to → Media → select the image → Alt text | (empty) | A 250g bag of Ashcombe Decaf Colombia |
/pages/about |
Alt text for mill-yard-roastery.jpg | Content → Files, or the theme section this image is set in | (empty) | The Ashcombe roastery at Mill Yard, Frome |
/products/ethiopia-guji |
Alt text for ethiopia-guji-250g.jpg | Products → ethiopia-guji → Media → select the image → Alt text | (empty) | A 250g bag of Ethiopia Guji Natural coffee beans |
/products/house-espresso |
Alt text for house-espresso-1kg.jpg | Products → house-espresso → Media → select the image → Alt text | house-espresso-1kg.jpg | A bag of Ashcombe House Espresso coffee beans |
The theme snippet: only the tags your theme does not print
This is shopify/snippets/audittag-seo.liquid, in full. It adds Twitter cards and structured data that were absent, targets each page by its product, page or article handle, and leaves every tag your theme already prints alone.
{%- comment -%}
AuditTag head tags for ashcombecoffee.example
Generated from an audit of your live pages. Every tag below was
ABSENT when we crawled; nothing here duplicates or overrides a tag
your theme already prints.
Install: put this file at snippets/audittag-seo.liquid, then add
{% render 'audittag-seo' %}
immediately before </head> in layout/theme.liquid.
Nothing here calls out to a remote service.
{%- endcomment -%}
{%- comment -%}
Each block below targets a page by its own resource
(product.handle, collection.handle, page.handle, …), not by URL.
A product reached through a collection is served at
/collections/x/products/y, so matching request.path would miss it;
the resource handle is the same however the page was reached.
{%- endcomment -%}
{%- if request.path == '/' -%}
{%- comment -%} https://ashcombecoffee.example/ {%- endcomment -%}
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Speciality coffee roasted to order | Ashcombe Coffee">
<meta name="twitter:description" content="Small-batch speciality coffee roasted twice a week in Frome and posted the day it is roasted. Free UK delivery over £30.">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Ashcombe Coffee Roasters","url":"https://ashcombecoffee.example/","logo":"https://ashcombecoffee.example/cdn/shop/files/ashcombe-logo.png","address":{"@type":"PostalAddress","streetAddress":"Unit 4, Mill Yard","addressLocality":"Frome","postalCode":"BA11 1AB","addressCountry":"GB"},"sameAs":["https://www.instagram.com/ashcombecoffee"]}</script>
{%- endif -%}
{%- if article.handle == 'dialling-in-espresso-at-home' -%}
{%- comment -%} https://ashcombecoffee.example/blogs/journal/dialling-in-espresso-at-home {%- endcomment -%}
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Dialling in espresso at home - Ashcombe Journal">
<meta name="twitter:description" content="Most bad home espresso is the grind. Set a dose and a yield, change one thing at a time, and expect to grind finer as a bag ages.">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","headline":"Dialling in espresso at home","datePublished":"2026-07-02","url":"https://ashcombecoffee.example/blogs/journal/dialling-in-espresso-at-home","publisher":{"@type":"Organization","name":"Ashcombe Coffee Roasters"}}</script>
{%- endif -%}
{%- if product.handle == 'ethiopia-guji' -%}
{%- comment -%} https://ashcombecoffee.example/products/ethiopia-guji {%- endcomment -%}
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Ethiopia Guji Natural coffee, 250g | Ashcombe">
<meta name="twitter:description" content="A natural-process heirloom lot from Guji, light roast. Strawberry, bergamot and a honeyed finish, best as pour-over or AeroPress. 250g, £13.00.">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Product","name":"Ethiopia Guji Natural","sku":"ASH-EG-250","description":"A natural-process heirloom lot from the Guji zone, light roast. Strawberry, bergamot and a honeyed finish.","image":"https://ashcombecoffee.example/cdn/shop/products/ethiopia-guji-250g.jpg","brand":{"@type":"Brand","name":"Ashcombe Coffee Roasters"},"offers":{"@type":"Offer","price":"13.00","priceCurrency":"GBP","url":"https://ashcombecoffee.example/products/ethiopia-guji"}}</script>
{%- endif -%}
{%- if product.handle == 'house-espresso' -%}
{%- comment -%} https://ashcombecoffee.example/products/house-espresso {%- endcomment -%}
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="House Espresso - Ashcombe Coffee Roasters">
<meta name="twitter:description" content="Brazil Cerrado and Colombia Huila, roasted medium-dark. Chocolate, hazelnut and dried fruit, for espresso or a moka pot. 250g, £11.50.">
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Product","name":"House Espresso","sku":"ASH-HE-250","description":"Brazil Cerrado and Colombia Huila, roasted medium-dark. Chocolate, hazelnut and a little dried fruit.","image":"https://ashcombecoffee.example/cdn/shop/products/house-espresso-1kg.jpg","brand":{"@type":"Brand","name":"Ashcombe Coffee Roasters"},"offers":{"@type":"Offer","price":"11.50","priceCurrency":"GBP","url":"https://ashcombecoffee.example/products/house-espresso"}}</script>
{%- endif -%}
{%- if collection.handle == 'coffee' -%}
{%- comment -%} https://ashcombecoffee.example/collections/coffee {%- endcomment -%}
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Coffee - Ashcombe Coffee Roasters">
<meta name="twitter:description" content="Every coffee Ashcombe roasts, from House Espresso to Ethiopia Guji Natural. Whole bean or ground to order, posted the day it is roasted.">
{%- endif -%}
{%- if page.handle == 'about' -%}
{%- comment -%} https://ashcombecoffee.example/pages/about {%- endcomment -%}
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Our story: roasting in Frome since 2018 | Ashcombe">
<meta name="twitter:description" content="Ashcombe began in 2018 with a 5kg roaster in a Frome garage. We now roast twice a week in Mill Yard and publish the price paid for every lot.">
{%- endif -%}
What we would not change
Real findings we left alone, because guessing would have been worse than leaving them, or because Shopify will not let a field or a snippet do it safely. They are in the pack as decisions for you, not as edits.
- 2 H1 headings on one page Keep "Speciality coffee, roasted to order in Frome" as the H1. Your logo image ("Ashcombe Coffee Roasters") is also wrapped in an H1. A logo does not need to be a heading at all, so change that wrapper to a <div>, checking the styling still holds.
- Article has no named author Add a named author with a real bio, and mark it up with Person schema or a rel="author" link. We cannot invent an author for you.
- Heading order jumps from H1 to H3 Change "Where we source" to an H2, or add the missing level above it.
- Open Graph is incomplete Some Open Graph tags are already present, so adding more from a snippet would leave you with both sets. Complete them in snippets/meta-tags.liquid instead. Affects 6 pages.
Every change as it lands on each page (32 changes, the record in site/)
On Shopify the site/ folder is not something you deploy. It is each rendered page with the corrections spliced in, so you can see exactly what changes before you type anything into your store.
warning Title "Ashcombe Coffee Roasters" is used on 2 pages
warning No meta description
warning Homepage has no Organization schema
warning 1 profile linked from the site but not declared as the same entity
Added to the new structured data block on this page rather than as a separate edit.
warning 3 images with no alt text
Applied to 3 of 3 images.
notice Open Graph is missing og:description, og:image
notice No Twitter card tags
warning No meta description
warning Article page has no Article schema
warning 1 image with no alt text
Applied to 1 of 1 image.
notice Open Graph is missing og:description, og:image
notice No Twitter card tags
warning No meta description
warning 3 images with no alt text
Applied to 3 of 3 images.
notice Open Graph is missing og:description, og:image
notice No Twitter card tags
warning Title "Ashcombe Coffee Roasters" is used on 2 pages
warning No meta description
warning 1 image with no alt text
Applied to 1 of 1 image.
notice Open Graph is missing og:description, og:image
notice No Twitter card tags
warning Title is 102 characters, so it will be cut off in search results
warning Meta description is shared with 1 other page
warning Product page has no Product schema
warning 1 image with no alt text
Applied to 1 of 1 image.
notice Open Graph is missing og:description, og:image
notice No Twitter card tags
warning Meta description is shared with 1 other page
warning Product page has no Product schema
warning 1 image using the filename as alt text
Applied to 1 of 1 image.
notice Open Graph is missing og:description, og:image
notice No Twitter card tags
What we leave out, on purpose
We keep Critical for problems that take a page out of search or out of your numbers. Some audits mark the things below as urgent. They are not, so you will not find them in your list.
- A missing llms.txt file.Google has said it does not use one, so not having one costs you nothing in search.
- An empty alt on a decorative image.That is the correct markup. It tells screen readers to skip the image.
- A folder blocked in robots.txt.That is usually deliberate, so we only speak up when robots.txt blocks the whole site.
- Keyword density and word counts.Google does not rank pages on either.
- The meta keywords tag.Google has ignored it since 2009.
Now run it on your own store
The audit is free, needs no account and no access to your store. It reads your public pages and never logs in.