Adray

The full rubric

The 34 criteria we grade a store against

This is what your site is measured against in the free audit: what our browser checks, why each one costs sales, and the concrete fix. Published in full so you can judge the criteria before you accept the verdict.

34 criteria

Conversion path

8

Add-to-cart works

Critical
What we check
Synthetic add-to-cart yields a successful cart update (XHR 2xx, count increments).
Why it costs sales
If add-to-cart fails or silently no-ops, there is no path to a sale at all.
How to fix it
Ensure add-to-cart updates the cart (200 response, item count rises) without requiring login.

Checkout reachable as a guest

Important
What we check
From a fresh session the cart reaches the checkout entry without a forced login.
Why it costs sales
Forced account creation is a top abandonment driver for first-time buyers.
How to fix it
Enable guest checkout so shoppers can reach the checkout without an account.

Clear cart & checkout CTA

Important
What we check
Cart page exposes a reachable, unambiguous checkout control.
Why it costs sales
A buried or ambiguous checkout button loses ready-to-buy shoppers at the last step.
How to fix it
Make the cart and a single, prominent checkout button obvious on the cart page.

Shipping shown before checkout

Important
What we check
Cart/product page shows a shipping estimate or free-shipping threshold pre-checkout.
Why it costs sales
A shipping cost that only appears at checkout is the classic late "sticker shock" abandon.
How to fix it
Surface shipping cost or a free-shipping threshold on the product/cart page.

Enough product photos

Important
What we check
The product gallery exposes 3+ unique images on the walked product page.
Why it costs sales
Photos are the shopper's only substitute for handling the product; too few leave doubts that stall the sale or drive returns.
How to fix it
Show at least 3 images (ideally 6+): alternate angles, a detail/zoom shot, the product in use, and a scale reference.

Price clearly visible

Important
What we check
A visible price renders above the fold at font-size ≥18px on the product page.
Why it costs sales
Price is the second thing a shopper looks for after the name; hidden, tiny, or below-the-fold pricing breeds doubt before they consider buying.
How to fix it
Show the price above the fold near the title at 18px or larger, in high contrast.

Add-to-cart visible without scrolling

Important
What we check
The add-to-cart control sits within the initial viewport (no scroll) on desktop and on a phone viewport.
Why it costs sales
Shoppers decide in seconds; if they can't see how to buy without scrolling (especially on a phone), many bounce before engaging.
How to fix it
Place the purchase block (price + add-to-cart) within the first screen on both desktop and mobile.

Button variant selectors (not dropdowns)

Minor
What we check
Variant options on the product page use buttons/swatches rather than a <select> dropdown.
Why it costs sales
Button/swatch selectors show every size/colour at a glance and reduce wrong-variant orders versus a hidden dropdown menu.
How to fix it
Replace size/colour <select> dropdowns with visible button or swatch selectors.

Trust

3

Trust signals present

Important
What we check
Returns/shipping/contact links and payment-trust badges are present.
Why it costs sales
No visible returns/shipping/contact policy or payment badges raises last-step doubt.
How to fix it
Link returns, shipping and contact policies in the footer and add payment-security badges near checkout.

Star rating + review count visible

Important
What we check
A star rating and a numeric review count are present in the product page DOM.
Why it costs sales
Most shoppers lean on ratings before buying; a visible star rating with a review count is among the most-used trust signals on a product page.
How to fix it
Show a star rating and a numeric review count near the product title (schema.org markup helps search engines too).

Customer reviews present

Minor
What we check
A reviews container or a reviews heading is present in the product page DOM.
Why it costs sales
Shoppers read other buyers' reviews to resolve doubts; a product with no reviews on the page reads as new or risky.
How to fix it
Add a reviews section (Yotpo, Stamped, Trustpilot, or native) with rating, reviewer, date and a verified-purchase badge.

Performance

3

Fast first load

Important
What we check
Key pages reach interactive under the load budget on a throttled visit.
Why it costs sales
Every extra second of load time sheds conversions, hardest on mobile.
How to fix it
Compress hero images, defer non-critical scripts, and keep the product page under ~3s on 4G.

Modern image formats

Minor
What we check
Most images on the walked pages are served as WebP or AVIF.
Why it costs sales
WebP/AVIF are 25-50% lighter than JPEG/PNG at equal quality, so pages paint faster. Most of all on mobile data.
How to fix it
Serve images as WebP/AVIF (via your CDN or a <picture> element with a JPEG/PNG fallback).

Nothing blocking first paint

Minor
What we check
No synchronous <script src> without async/defer in the document <head>.
Why it costs sales
Synchronous scripts in the <head> hold up the first paint, so the shopper stares at a blank page and may leave.
How to fix it
Add async/defer to head scripts (or move them to the end of <body>); inline only critical CSS.

Mobile

6

Mobile-ready layout

Critical
What we check
Responsive viewport meta present; primary controls are not tiny/overlapping.
Why it costs sales
Most storefront traffic is mobile; a missing/!zoomed viewport makes the store unusable on phones.
How to fix it
Add a responsive <meta name="viewport" content="width=device-width, initial-scale=1"> and verify tap targets.

Tappable add-to-cart button

Important
What we check
The located add-to-cart control measures at least 44×44px on the walked page.
Why it costs sales
A small add-to-cart button is hard to tap on a phone. Mistaps and frustration cost the sale; a sub-24px target is also an EU accessibility failure.
How to fix it
Give the add-to-cart button a tap target of at least 44×44px (use padding); never below 24×24px.

Readable add-to-cart button

Important
What we check
The located add-to-cart control meets the WCAG AA contrast ratio for its text size.
Why it costs sales
A low-contrast add-to-cart button is hard to read in sunlight on a phone. Shoppers can't find where to buy.
How to fix it
Raise the button text/background contrast to WCAG AA (4.5:1 normal text, 3:1 large/bold).

Add-to-cart stays in reach on scroll

Important
What we check
A fixed/sticky add-to-cart control is visible after scrolling down the product page.
Why it costs sales
On a phone the main button scrolls away as the shopper reads; a sticky add-to-cart bar removes the scroll-back friction right when they decide to buy.
How to fix it
Add a fixed bottom bar with the product name, price and add-to-cart that appears once the primary button scrolls out of view.

Images have alt text

Minor
What we check
No <img> elements are missing an alt attribute on the walked pages.
Why it costs sales
Missing alt text shuts out screen-reader shoppers and costs image-search traffic.
How to fix it
Add descriptive alt text to product and content images (empty alt only for purely decorative ones).

Readable text contrast

Minor
What we check
Sampled text on the walked pages meets the WCAG AA contrast ratio against its effective background.
Why it costs sales
Low-contrast text is unreadable in sunlight and for low-vision shoppers. Copy a shopper can't read can't convert.
How to fix it
Raise the failing text/background pairs to WCAG AA contrast (4.5:1 for normal text, 3:1 for large text).

Security

3

Served over HTTPS

Critical
What we check
Final page URL scheme is https and no insecure redirect in the chain.
Why it costs sales
A non-secure storefront triggers browser warnings that scare shoppers off before they buy.
How to fix it
Force HTTPS on every page and redirect any http:// URL to https://.

No mixed content

Critical
What we check
No http:// subresource requests on an https document (blocked/mixed-content).
Why it costs sales
http subresources on an https page get blocked. Broken styles/scripts and a "not secure" flag.
How to fix it
Load all images, scripts and styles over https (or protocol-relative).

Security headers (HSTS/CSP)

Minor
What we check
The document response carries Strict-Transport-Security and Content-Security-Policy headers.
Why it costs sales
Missing HSTS/CSP weakens defenses against protocol downgrade and script injection; some browsers nudge users.
How to fix it
Add Strict-Transport-Security and a Content-Security-Policy header at the edge/CDN.

Technical hygiene

4

No broken images or resources

Important
What we check
No image requests (or other 4xx/5xx resources) fail during the visit.
Why it costs sales
Missing product images and 404 assets read as "broken/untrustworthy" and stall the buy.
How to fix it
Fix the 404ing images/resources or remove the dead references.

No JavaScript errors on key pages

Important
What we check
No uncaught page errors that can break the page fire across the walked pages (third-party tag / browser-extension noise warns instead of failing).
Why it costs sales
A thrown JS error can silently break add-to-cart, variant pickers, or the checkout button.
How to fix it
Resolve the console errors on the home, product, and cart pages.

No dead/unresponsive controls

Minor
What we check
No button/role=button elements lack any click affordance after interaction.
Why it costs sales
Buttons that look clickable but do nothing cause rage clicks and abandonment.
How to fix it
Audit controls with no handler/href for a broken wire-up or a slow response with no feedback.

Page language declared

Minor
What we check
The <html> element carries a non-empty lang attribute.
Why it costs sales
The lang attribute lets screen readers pick the right voice and accent for shoppers using assistive tech.
How to fix it
Set <html lang="es-MX"> (or your store's language) at the template level.

Discoverability

5

Product data Google can read

Important
What we check
Valid Product JSON-LD with name, image, price, priceCurrency, and availability.
Why it costs sales
Product structured data is what lets you appear in Google Shopping rich results with price, photo, and availability.
How to fix it
Emit complete JSON-LD Product markup (name, image, price, currency, availability) on every product page.

Discoverability basics

Minor
What we check
Document has a non-empty <title>, meta description, and OG tags.
Why it costs sales
Missing title/description/social tags cost free traffic and look broken when shared.
How to fix it
Set a unique page title, meta description, and Open Graph tags per page.

One clear page heading

Minor
What we check
Exactly one visible <h1> element on the walked page.
Why it costs sales
A single descriptive <h1> helps search engines, screen readers, and AI shopping assistants identify the product.
How to fix it
Wrap the product name in exactly one <h1>; make every other heading h2 or lower.

Search snippet of the right length

Minor
What we check
A meta description is present and 120-160 characters long.
Why it costs sales
The meta description is your free ad in Google results; empty or truncated copy costs clicks before the shopper even arrives.
How to fix it
Write a 120-160 character meta description from the product name + key benefit.

Rich link preview when shared

Minor
What we check
All four share-preview Open Graph tags (title, description, image, url) are present.
Why it costs sales
Without complete Open Graph tags, links shared on WhatsApp/Instagram/Facebook show a broken preview and rarely get opened.
How to fix it
Set og:title, og:description, og:image (1200×630) and og:url on every product page.

Measurement integrity

2

One analytics/ads ID per platform

Critical
What we check
A real browser load fires beacons to more than one ID of the same platform (google-analytics.com/collect tid=, facebook.com/tr id=).
Why it costs sales
Two GA4 properties or two Meta pixels receiving the same visit count every conversion twice. Google and Meta then optimize bidding on inflated numbers. Ad budget is steered by counts that are ~2× reality.
How to fix it
In GTM/GA/Meta, remove the duplicate tag or container. Common cause: your commerce platform's native integration AND a hardcoded/GTM tag both send the same events to different IDs.

Each event fires once per action

Critical
What we check
A real browser load fires the same (platform, ID, event) 3+ times within a few seconds on one page, with no navigation between them.
Why it costs sales
A trigger scoped to fire on every DOM change (instead of once per page) sends the same event several times for one action, double-counting conversions the same way a duplicate ID does.
How to fix it
In GTM, set the tag's trigger to "Once per page"/"Once per event" and remove any trigger bound to a repeating DOM/history event.

Severity orders the list inside each area; it is not a grade of your store.

What this rubric is NOT

  • An anonymous walk sees your store the way a stranger sees it: it does not enter your checkout with a card, and it does not measure your real shoppers' behaviour.
  • A criterion we could not evaluate is reported as “not checked”, and that never means it is fine.
  • Passing all 34 does not guarantee sales. They are necessary conditions most stores break quietly, not a formula.
Audit my site