Website audit · demo.webverdio.com

Halvane Coffee Roasters Website Audit

UK webshop (ECOMMERCE) for freshly roasted coffee beans and brewing kits; primary conversion: online purchase for home delivery, secondary: newsletter signup.

Audit date 2026-10-23Scope 19 URLs checked, 12 pages reviewedViewports desktop 1280 px and mobile 390 pxPlatform Unknown (custom or static site behind Cloudflare; no generator tag found)
4
Critical
16
High
28
Medium
17
Low
6
Spelling and grammar fixes

Executive summary

Halvane Coffee Roasters has a clear product range, a simple navigation and an appealing brand. The product pages and listings follow one consistent layout, so fixes to shared templates and components will apply across the whole shop. This audit found 65 issues: 4 critical, 16 high, 28 medium and 17 low.

The shop is not yet ready to take orders. The checkout link returns a 404 error, and every 'Add to cart' button is a plain link to /cart/ with no product attached. Out-of-stock items can still be 'added', and the cart cannot be edited. The legal layer a UK webshop needs is also missing: the 'Terms & conditions' link returns 404, and there is no returns or cancellation policy and no company identity or geographic address. The privacy policy is four sentences long, and an analytics cookie is set before the visitor makes any consent choice. Key facts contradict each other. House Blend costs £8.95 on listings but £9.95 on its page and in the cart. One product is described as both 250 g and 1 kg. The free-delivery threshold appears as £40, £45 and £50, and the returns period as 14 days, 30 days and 'no returns'.

Most issues share two causes. First, facts such as prices, delivery terms, returns, opening hours and phone numbers are typed separately on each page instead of coming from one source, so they have drifted apart. Second, pages and features were linked before they were built: checkout, terms, gift cards and the brewing guide. Visibility and usability suffer as well. The homepage weighs 5.95 MB because of one unoptimised hero image, which gives a lab mobile LCP (the time until the main image or text appears) of 29.9 s. On the accessibility side, icon controls have no accessible name, keyboard focus is invisible, and SEO metadata is mostly left at defaults.

The ten issues to fix first

  1. Fix the House Blend price: it shows £8.95 on listings but £9.95 on its product page and in the cart. Use one price everywhere. K5
  2. Correct the self-contradicting pack size: the heading says 250 g but the description says 1 kg bag. P1
  3. Publish terms and conditions and fix the 404 'Terms & conditions' link in every footer. L1
  4. Publish one returns and cancellation policy, including the 14-day cancellation right and its exceptions, and replace the conflicting 14-day, 30-day and 'no returns' statements. L2 K6
  5. Add the legal entity name, company number and a geographic address to the footer and the contact page. L3
  6. Stop the analytics cookie from loading before consent, add a first-layer 'Reject' button and a cookie policy, and rewrite the privacy policy to cover UK GDPR Art. 13. V2 V1 V3
  7. Wire up the purchase flow: make 'Add to cart' add the chosen product, disable it for out-of-stock items, and make the checkout link work. C1 C2 C3
  8. Use one free-delivery threshold instead of £40, £45 and £50, and one set of opening hours and one phone number. K1 K2 K3
  9. Give the search, cart and image-link controls an accessible name, and add visible keyboard focus styles and a skip link. A1 A2
  10. Compress and resize the homepage hero image (page weight 5.95 MB, lab mobile LCP 29.9 s), and fix or hide the 404 'Gift cards' menu link. T1 N1

Patterns across the site

These root causes explain most of the individual findings. Fixing the cause is faster than fixing each symptom.

The same fact is told differently on different pages

Prices, the free-delivery threshold, returns, opening hours, phone numbers, pack sizes, roasting and dispatch times are typed separately on each page instead of coming from one source, so they have drifted apart. The clearest cases are House Blend at £8.95 versus £9.95, and a free-delivery threshold of £40, £45 or £50.

The legal and privacy layer is missing

The shop has no terms, no returns or cancellation policy, no company identity, a four-sentence privacy policy, and implied cookie consent with an analytics cookie set before any choice. A UK webshop needs all of these before it takes orders.

The purchase flow is not wired up

The 'Add to cart' buttons are plain links to /cart/, out-of-stock items can still be 'added', the cart cannot be edited, and the checkout link returns 404. The grind choice that is promised 'at checkout' therefore has nowhere to happen.

Links to pages that were never published

Menu and footer links point to pages that don't exist (gift cards, brewing guide, terms, checkout), and the sitemap lists a removed product.

A thin product template used for every product

One minimal template serves coffees and the brewing kit alike. It has no weight, unit price, grind, roast or delivery details, it carries coffee-only labels such as 'Tasting notes' onto the kit, and it uses generic titles with no metadata or structured data.

Platform SEO defaults left unconfigured

Meta descriptions, canonical tags, Open Graph tags and structured data are missing on almost every page, the logo links to /index.html, and the heading structure is inconsistent.

Shared components built without accessibility basics

The header, product cards and footer share the same gaps: icon controls with no name, images with no alt, invisible focus, low-contrast brand colours, tiny quantity buttons and form fields with no visible labels. Because they are shared, each fix applies sitewide.

Layouts not adapted for phones

The cookie banner, the large product images and fixed-width tables push key content and buttons off the first phone screen or past the edge of the screen, and the phone number and value proposition disappear on mobile.

Show:

Pricing & products

P1

Product weight contradicts itself: heading says 250 g, description says 1 kg bag

Quick winCritical
Page
/products/ethiopia-yirgacheffe/
Issue
The H1 reads "Ethiopia Yirgacheffe, 250 g", but the description directly below the £11.50 price says "Each 1 kg bag is roasted to order". A buyer cannot tell whether £11.50 buys 250 g or 1 kg.
“Ethiopia Yirgacheffe, 250 g” · “Each 1 kg bag is roasted to order and shipped within two days.”
Why it matters
The quantity is the basis of the price. Contradictory quantity information is misleading and can lead to complaints, returns or chargebacks. It is also a risk under the UK Consumer Protection from Unfair Trading Regulations and the Price Marking Order, because the unit price cannot be worked out. UK Consumer Protection from Unfair Trading Regulations 2008 · UK Price Marking Order 2004
Fix
Correct the description so it matches the actual pack size, and use the same weight everywhere. If the bag is 250 g, change the text to "Each 250 g bag is roasted to order and shipped within two days." Check the shop listing, cart and checkout for the same weight. If several sizes exist, add a size selector with a price per size. Consider showing a price per kg (for example "£46.00/kg" for 250 g).
See also
P3
Screenshot: The description mentions a 1 kg bag directly under a heading that says 250 g.
The description mentions a 1 kg bag directly under a heading that says 250 g. · live site, 2026-10-23
P2

Product pages lack key buying information: grind, roast, freshness, delivery cost and returns

LargerHigh
Page
All product pages (product template), checked on /products/house-blend/, /products/ethiopia-yirgacheffe/, /products/decaf/ and /products/cold-brew-kit/
Issue
Product pages give only a price, one or two sentences and tasting notes. On House Blend, Ethiopia Yirgacheffe, Swiss Water Decaf and the Cold Brew Kit, none shows a roast level, a roast date or freshness promise, a whole bean or ground choice, the delivery cost or time below the free-delivery threshold, or a link to the returns terms. The shop says "Choose whole bean or ground at checkout.", but /checkout/ returns 404. The Decaf page states no pack size at all and has about 25 words of body text. The Cold Brew Kit page does not say which coffee is included, the brew ratio or the yield.
“Our everyday blend of Brazilian and Colombian beans.” · “Returns within 14 days of delivery.” · “£9.95” · “Tasting notes: Cocoa, red apple”
Product body text: about 25 words
Why it matters
Coffee buyers decide on freshness, grind and roast. A buyer who doesn't know whether the beans are ground for their machine may abandon the purchase or return it. Consumer Contracts (Information, Cancellation and Additional Charges) Regulations 2013, Schedule 2 · Price Marking Order 2004 · UK Consumer Contracts Regulations 2013 (pre-contract information)
Fix
Add a structured info block to the product template covering roast level, roast date or dispatch promise, a whole-bean/ground selector, and delivery cost and time. For example: 'Roasted to order, dispatched within 2 working days. UK delivery £X, free over £40.' Add a link to the brewing guide for suitable methods.
See also
P3, C1, K8
Screenshot: Product details limited to tasting notes; no grind, roast date or delivery information
Product details limited to tasting notes; no grind, roast date or delivery information · live site, 2026-10-23
Screenshot: The product details block shows a price and tasting notes but no weight, grind, origin or delivery terms.
The product details block shows a price and tasting notes but no weight, grind, origin or delivery terms. · live site, 2026-10-23
P3

Prices on listings and product pages have no bag weight or unit price

Quick winMedium
Page
/, /shop/, All product pages (product template)
Issue
On the homepage and /shop/, the product cards show "£8.95", "£11.50", "£9.50" and "£9.95" with no bag weight and no price per kg. The Cold Brew Kit card says "two bags of coarse ground coffee" but gives no weight. Product pages that do state a weight, such as "House Blend, 250 g" at £9.95, still show no unit price (£39.80/kg).
“£8.95” · “£11.50” · “Glass jar, filter and two bags of coarse ground coffee” · “£9.50”
Calculated unit price: £39.80 per kg
Why it matters
Shoppers cannot compare value between coffees, or with other roasters, without a weight. Unit pricing rules for goods sold by quantity may also apply. Check this with an adviser. Price Marking Order 2004 (UK) · Price Marking Order 2004
Fix
Add the bag weight and a unit price under each price, for example '£8.95 · 250 g (£35.80/kg)'. Add the same information on the product pages, and state the weight of the bags in the Cold Brew Kit.
See also
P1, P2, K5
Screenshot: House Blend price shown without bag size or price per kg
House Blend price shown without bag size or price per kg · live site, 2026-10-23
Screenshot: Ethiopia card shows a price with no weight or price per kg
Ethiopia card shows a price with no weight or price per kg · live site, 2026-10-23
P4

Kit contents are labelled 'Tasting notes'

Quick winMedium
Page
/products/cold-brew-kit/
Issue
The field label reads "Tasting notes:", but its value lists the kit contents: "Glass jar, filter and two bags of coarse ground coffee". The kit gives no actual tasting notes for the coffee.
“Tasting notes:” · “Glass jar, filter and two bags of coarse ground coffee”
Why it matters
This is a coffee-bean template label reused for an equipment product. It looks careless and leaves buyers without the flavour information they expect.
Fix
Rename the label to 'What's in the box:' for kits, and add real tasting notes for the included coffee. Make the label a per-product field in the template, so equipment and kits don't inherit coffee-only labels.
See also
P5, P2
Screenshot: The 'Tasting notes' label is followed by a list of the kit's contents.
The 'Tasting notes' label is followed by a list of the kit's contents. · live site, 2026-10-23
P5

Product image shows a coffee bag, not the jar and filter kit

LargerMedium
Page
/products/cold-brew-kit/
Issue
The only image (cold-brew-kit.svg) is an illustration of a single coffee bag labelled "Cold Brew Kit". The product title promises a "1 L jar + 2 × 250 g" of coffee. There is no photo of the jar, the filter or the two bags, and no gallery.
“Cold Brew Kit, 1 L jar + 2 × 250 g”
Images on page: 1 (SVG illustration)
Why it matters
Buyers of brewing equipment want to see the jar's size, the filter and the build quality. A generic bag illustration suggests a different product and lowers trust.
Fix
Replace the illustration with real photos of the full kit contents. Add 3–4 images: the full kit, the jar with the filter in place, the two bags, and the jar in use. Serve them as WebP with srcset.
See also
P4
Screenshot: The product image shows a single coffee bag instead of the jar, filter and two bags.
The product image shows a single coffee bag instead of the jar, filter and two bags. · live site, 2026-10-23
P6

European shipping does not say which countries are covered or mention customs and import charges

Quick winMedium
Page
/shipping/
Issue
The table lists one row, "Europe", with DPD Classic, "3–6 working days" and "£9.95". It does not say which countries are included, or whether duties and import VAT are prepaid or charged to the customer on delivery.
“Europe” · “3–6 working days”
Why it matters
Since Brexit, EU customers can face import VAT and handling fees on UK parcels. Undisclosed charges lead to refused parcels and complaints. Not telling buyers about extra costs before purchase is also a consumer-law risk in the EU. EU Consumer Rights Directive 2011/83/EU Art. 6(1)(e)
Fix
List the destination countries and state clearly who pays import VAT and duties. Example: "Prices exclude import VAT and duties, which the carrier may collect on delivery." Alternatively, use IOSS to collect EU VAT at checkout.
Screenshot: Single 'Europe' row without country list or customs information
Single 'Europe' row without country list or customs information · live site, 2026-10-23

Conversion flow

C1

Checkout link in the cart leads to a 404 page, so no order can be completed

LargerCritical
Page
/cart/, /checkout/
Issue
The cart page links to /checkout/, which returns HTTP 404 with no redirect. This is the only checkout URL the crawl found, so the purchase flow ends on an error page.
HTTP status of /checkout/: 404 · Linked from: https://demo.webverdio.com/cart/
Why it matters
Checkout is the core conversion step of a webshop. If it returns 404, no visitor can buy, and every euro spent on attracting visitors is wasted.
Fix
Restore the checkout page or point the cart's checkout link to the working checkout URL. Check the platform's checkout route or slug and update the cart template link. Then place one test order from product page to payment confirmation to verify the whole flow, because this audit did not script the checkout.
See also
C2, L1
Screenshot: The checkout link in the cart, which leads to a 404 page
The checkout link in the cart, which leads to a 404 page · live site, 2026-10-23
C2

Every 'Add to cart' button is a plain link to /cart/ with no product attached

LargerHigh
Page
/, /shop/, All product pages (product template)
Issue
Every "Add to cart" control is a plain link to https://demo.webverdio.com/cart/ with no product ID, variant or quantity: 4 of 4 on the homepage, 5 of 5 on /shop/, and the main button on each product page. None of these pages has a form, so the quantity chosen with − and + on product pages is not sent anywhere. This audit did not script cart actions, so whether the product is actually added still needs a manual test.
“Add to cart” · “Quantity: 1”
Add to cart links pointing to identical URL /cart/: 5 of 5 · Forms on page: 0 · Add to cart links pointing to /cart/ without a product parameter: 4 of 4
Why it matters
If clicking 'Add to cart' leads to an empty cart, the main purchase path fails at the first step for every product.
Fix
Make 'Add to cart' a real add-to-cart action, a form or script that posts the product ID, or link it to the product page and label it 'Choose options'. Grind (whole bean or ground) is chosen later, so linking to the product page with a 'Choose options' label may be the clearest route. Confirm the fix by adding each product and checking the cart contents.
See also
C1, C3, C4
Screenshot: House Blend 'Add to cart', which links straight to /cart/ like all the other cards
House Blend 'Add to cart', which links straight to /cart/ like all the other cards · live site, 2026-10-23
Screenshot: "Add to cart" on the House Blend card links to the generic /cart/ page
"Add to cart" on the House Blend card links to the generic /cart/ page · live site, 2026-10-23
C3

Out-of-stock Cold Brew Kit still shows an active 'Add to cart' button

Quick winHigh
Page
/shop/, /products/cold-brew-kit/
Issue
On /shop/ and on /products/cold-brew-kit/, the Cold Brew Kit shows the badge "Out of stock" next to a fully styled orange "Add to cart" button that links to /cart/. The product page also keeps an active quantity selector and offers no restock date, no 'notify me' option and no alternative product.
“Out of stock” · “Add to cart”
Why it matters
Visitors either try to buy something that cannot be shipped, or they cannot tell whether the item is really unavailable. Both lead to failed orders, support questions and lost trust.
Fix
Replace the button with a disabled 'Out of stock' state or a 'Notify me when available' option for unavailable products. Apply this in the product card template, so every out-of-stock item behaves the same way. Optionally sort out-of-stock items to the end of the listing.
See also
C2
Screenshot: Cold Brew Kit card: the 'Out of stock' badge sits next to an active 'Add to cart' button
Cold Brew Kit card: the 'Out of stock' badge sits next to an active 'Add to cart' button · live site, 2026-10-23
Screenshot: The 'Out of stock' badge appears above a fully active 'Add to cart' button and quantity selector.
The 'Out of stock' badge appears above a fully active 'Add to cart' button and quantity selector. · live site, 2026-10-23
C4

Cart offers no way to change the quantity, remove an item or return to the product

LargerMedium
Page
/cart/
Issue
The cart line shows only the plain text "House Blend, 250 g 1 £9.95". There is no quantity selector, no remove button, no product image, no link to the product and no 'Continue shopping' link. The page data lists no forms and only one unlabelled button, which is in the header.
“House Blend, 250 g” · “1”
Forms on cart page: 0
Why it matters
Shoppers who want two bags or have added the wrong item cannot fix it in the cart, so they either abandon the order or go back through the shop.
Fix
Add a quantity stepper, a 'Remove' link and a product thumbnail that links to the product on each cart line. Recalculate the totals when the quantity changes, and add a 'Continue shopping' link to /shop/ next to 'Proceed to checkout'.
See also
C2
Screenshot: Cart line showing a fixed quantity of 1 with no edit or remove controls
Cart line showing a fixed quantity of 1 with no edit or remove controls · live site, 2026-10-23
C5

Phone numbers and email address are not clickable, and the phone number is hidden on mobile

Quick winMedium
Page
All pages (shared header), /contact/
Issue
No reviewed page has a tel: or mailto: link. The header shows "Call us: +44 20 7946 0123" as plain text on desktop, and the 390 px mobile header doesn't show it at all. On /contact/, "+44 20 7946 0456" and "hello@halvane-coffee.example" are plain text as well.
“Call us on +44 20 7946 0456 or email hello@halvane-coffee.example.” · “Call us: +44 20 7946 0123”
Why it matters
Mobile visitors cannot tap to call or email, so they have to copy the details by hand. This adds friction on the main contact page.
Fix
Wrap the numbers in tel: links and the email address in a mailto: link. Example: <a href="tel:+442079460456">+44 20 7946 0456</a>. Apply the same to the header "Call us" number.
See also
K3, U4
Screenshot: Phone number and email shown as plain text
Phone number and email shown as plain text · live site, 2026-10-23
Screenshot: The phone number in the header is plain text, not a link.
The phone number in the header is plain text, not a link. · live site, 2026-10-23

Consistency & wording

K5

House Blend costs £8.95 on listings but £9.95 on its product page and in the cart

Quick winCritical
Page
/, /shop/, /products/house-blend/, /cart/
Issue
Version A: the homepage and /shop/ cards show "House Blend Chocolate, hazelnut, caramel £8.95". Version B: /products/house-blend/ shows "House Blend, 250 g £9.95", and the cart line shows "House Blend, 250 g 1 £9.95". The other coffees show the same price on the listing and the product page, for example Ethiopia Yirgacheffe at £11.50 and Swiss Water Decaf at £9.95.
“House Blend Chocolate, hazelnut, caramel £8.95”
Why it matters
A shopper who clicks a £8.95 product and is then asked to pay £9.95 sees a higher price than advertised. That is a misleading-price risk under the Consumer Protection from Unfair Trading Regulations 2008 and the DMCC Act 2024, and it damages trust at the moment of purchase. Check this with a qualified adviser.
Fix
Confirm the correct House Blend price, then correct the listing cards or the product data so the homepage, shop, product page, cart and checkout all show the same amount. Pull listing prices from the product record instead of typing them into the cards.
Screenshot: House Blend costs £8.95 on listings but £9.95 on its product page and in the cart
House Blend costs £8.95 on listings but £9.95 on its product page and in the cart · live site, 2026-10-23
K1

Free-delivery threshold is given as £40, £45 and £50 on different pages

Quick winHigh
Page
All pages (promo bar), /faq/, /shipping/
Issue
The free-delivery threshold appears with three values. The orange bar on every page says "Free UK delivery on orders over £40". The FAQ answer says "Yes, UK delivery is free on orders over £50." The shipping page intro says "Free UK delivery on orders over £45.", and its table lists Royal Mail Tracked 48 as free from £45.
“Free UK delivery on orders over £40” · “Free UK delivery on orders over £45” · “Yes, UK delivery is free on orders over £50.”
Banner threshold: £40 · Shipping page threshold: £45
Why it matters
A customer with a £42 basket expects free delivery and then gets charged £3.95. This causes complaints and abandoned carts, and is a misleading-pricing risk under the UK Consumer Protection from Unfair Trading Regulations / DMCC Act 2024. UK DMCC Act 2024 (unfair commercial practices) · UK Consumer Protection from Unfair Trading Regulations 2008 (misleading actions)
Fix
Decide on one threshold and use it in the promo bar, the shipping page, the cart and the checkout logic. Check which value the cart actually applies. Then update the banner text, or the shipping intro and table, so all of them match. Ideally manage it from one setting.
See also
C7
Screenshot: Promo bar promises free UK delivery over £40
Promo bar promises free UK delivery over £40 · live site, 2026-10-23
Screenshot: Page text below sets the threshold at £45
Page text below sets the threshold at £45 · live site, 2026-10-23
K2

Opening hours on the page contradict the footer

Quick winHigh
Page
/contact/, All pages (shared footer)
Issue
The body says "Our roastery shop is open Monday to Saturday, 9:00–18:00", while the footer says "Mon–Fri 8:00–17:00". The two versions disagree on Saturdays and on both the opening and closing times.
“Our roastery shop is open Monday to Saturday, 9:00–18:00.” · “Mon–Fri 8:00–17:00”
Why it matters
Visitors may travel to a closed shop on a Saturday, or call outside the actual hours. This is misleading key information.
Fix
Confirm the real hours and use one version everywhere, including the footer template and Google Business Profile. If the shop hours and the phone or support hours differ, label them separately, for example "Shop: Mon–Sat 9:00–18:00 · Phone support: Mon–Fri 8:00–17:00".
See also
K9, L3
Screenshot: Body text: open Monday to Saturday, 9:00–18:00
Body text: open Monday to Saturday, 9:00–18:00 · live site, 2026-10-23
Screenshot: Footer: Mon–Fri 8:00–17:00
Footer: Mon–Fri 8:00–17:00 · live site, 2026-10-23
K3

Two different phone numbers on the contact page

Quick winHigh
Page
/contact/
Issue
The header says "Call us: +44 20 7946 0123", but the body text says "Call us on +44 20 7946 0456". A visitor cannot tell which number is correct.
“Call us: +44 20 7946 0123” · “Call us on +44 20 7946 0456”
Why it matters
Customers with order problems may call a dead or wrong line, which leads to lost calls and less trust. Inconsistent contact details also weaken local trust signals.
Fix
Choose one customer phone number and use it in the header, the contact page and the structured data. If both numbers are real, for example shop and wholesale, label each one clearly: "Orders: … / Wholesale: …".
See also
C5
Screenshot: Header phone number ending in 0123
Header phone number ending in 0123 · live site, 2026-10-23
Screenshot: Contact text gives a different number ending in 0456
Contact text gives a different number ending in 0456 · live site, 2026-10-23
K6

Returns period is 14 days on product pages, 30 days 'no questions asked' in the FAQ, and no returns on opened coffee on the shipping page

Quick winHigh
Page
/products/house-blend/, /faq/, /shipping/
Issue
Version A: /products/house-blend/ says "Returns within 14 days of delivery." Version B: /faq/ says "You can return any order within 30 days for a full refund, no questions asked." Version C: /shipping/ says "we cannot accept returns on opened coffee." The three statements disagree on the period and on whether opened coffee can be returned.
“You can return any order within 30 days for a full refund, no questions asked.”
Why it matters
Customers cannot tell what their rights are. The most generous public promise may be the one the shop is held to, and the conflict invites disputes and complaints.
Fix
Decide on one returns policy, publish it on a dedicated returns page (see L2), and use the same short wording, with a link to that page, on product pages, in the FAQ and on the shipping page.
Screenshot: Returns period is 14 days on product pages, 30 days 'no questions asked' in the FAQ, and no returns on opened coffee on the shipping page
Returns period is 14 days on product pages, 30 days 'no questions asked' in the FAQ, and no returns on opened coffee on the shipping page · live site, 2026-10-23
K4

Product name spelled 'Ethopia' on listings but 'Ethiopia' on the product page

Quick winMedium
Page
/, /shop/
Issue
The homepage and /shop/ name the product "Ethopia Yirgacheffe" in the card heading and the link text. The product page H1 ("Ethiopia Yirgacheffe, 250 g") and the URL /products/ethiopia-yirgacheffe/ use the correct spelling.
“Ethopia Yirgacheffe”
Why it matters
Searches for 'Ethiopia Yirgacheffe' may match this listing less well, and screen-reader users hear a wrong product name. A mismatch between visible text and source text also points to a fragile template.
Fix
Correct the product name to 'Ethiopia Yirgacheffe' in the product data, so the source text and the visible text match. Check the product title field in the CMS, and check for any CSS or script that rewrites the visible text.
Screenshot: Yirgacheffe product heading; the page source reads 'Ethopia'
Yirgacheffe product heading; the page source reads 'Ethopia' · live site, 2026-10-23
K7

Roasting schedule is 'roasted daily', 'roasted to order' and 'every Monday' on different pages

Quick winMedium
Page
/, /shop/, /products/ethiopia-yirgacheffe/, /about/
Issue
Version A: the homepage says "Small-batch beans, roasted daily in London and delivered to your door." Version B: /shop/ says "Every bag is roasted to order.", and the Ethiopia Yirgacheffe page says "Each 1 kg bag is roasted to order". Version C: /about/ says "We roast every Monday in small batches".
“We roast every Monday in small batches”
Why it matters
Freshness is the shop's main selling point. Three different roasting claims undermine trust, and a claim that doesn't match practice can be misleading.
Fix
State the real roasting schedule once, for example "We roast every Monday and dispatch within X working days", and use that wording on the homepage, shop, product pages and About page.
Screenshot: Roasting schedule is 'roasted daily', 'roasted to order' and 'every Monday' on different pages
Roasting schedule is 'roasted daily', 'roasted to order' and 'every Monday' on different pages · live site, 2026-10-23
K8

Dispatch time is 'same day before 2 pm' in the FAQ but 'within two days' on a product page

Quick winMedium
Page
/faq/, /products/ethiopia-yirgacheffe/, /shipping/
Issue
Version A: /faq/ says "Orders placed before 2 pm ship the same day." Version B: /products/ethiopia-yirgacheffe/ says the coffee is "roasted to order and shipped within two days". The shipping page gives no cut-off time at all, and the About page's weekly Monday roast does not fit either promise.
“Orders placed before 2 pm ship the same day.”
Why it matters
Customers who pay for next-day delivery, or order a gift, plan around the dispatch time. Conflicting promises lead to missed expectations, complaints and refund requests.
Fix
Set one dispatch rule, for example "Order by 14:00 Mon–Fri; dispatched within 1 working day", and show it in the FAQ, on the shipping page and in the product template.
Screenshot: Dispatch time is 'same day before 2 pm' in the FAQ but 'within two days' on a product page
Dispatch time is 'same day before 2 pm' in the FAQ but 'within two days' on a product page · live site, 2026-10-23

Navigation, links & CTAs

N1

"Gift cards" in the main navigation leads to a 404 page on every page

Quick winHigh
Page
All crawled pages, including https://demo.webverdio.com/, /shop/, /about/, /faq/ and /contact/, /gift-cards/
Issue
The main navigation item "Gift cards" links to /gift-cards/, which returns HTTP 404. The link was found on all 5 pages that were checked for links.
“Gift cards”
HTTP status of /gift-cards/: 404
Why it matters
A broken item in the main menu is seen by almost every visitor. It looks unfinished and loses gift buyers at the moment they show purchase intent.
Fix
Publish the gift cards page, or remove the "Gift cards" item from the navigation until it exists. If gift cards are sold as a product, link the menu item to that product page instead.
See also
N2, L1
Screenshot: The "Gift cards" menu item, which leads to a 404 page
The "Gift cards" menu item, which leads to a 404 page · live site, 2026-10-23

Performance

T1

Homepage weighs 5.95 MB because of an unoptimised hero image; mobile LCP is 29.9 s

Quick winHigh
Page
/
Issue
Lighthouse measures the homepage at 5,950,866 bytes in 9 requests, and estimates 5,783 KiB of savings from image delivery. LCP (the time until the main image or text appears) is 29.9 s on mobile and 4.9 s on desktop, against a target of 2.5 s. The hero image is /img/hero.png. Other templates weigh under 10 KB with an LCP of about 0.9 s. Real-user data from the Chrome UX Report is not available because the site has too little traffic, so these are lab figures.
Mobile LCP (home): 29.9 s · Desktop LCP (home): 4.9 s · Page weight (home): 5,950,866 bytes · Estimated image savings (mobile): 5,783 KiB · Performance score mobile / desktop: 68 / 66 · Shop mobile LCP / weight: 0.9 s / 9,397 bytes
Why it matters
The homepage is the main entry point. On a phone connection its main content takes about 30 seconds to appear, so many visitors will leave first. Core Web Vitals are also a search ranking signal. https://web.dev/articles/lcp
Fix
Replace hero.png with a resized, compressed WebP or AVIF image of about 150–250 KB. Export it at the largest display width (about 1600 px), serve smaller versions to phones through srcset/sizes, give it explicit width and height, and add fetchpriority="high" without lazy loading. Then re-run Lighthouse to confirm the mobile LCP is below 2.5 s.
See also
T5
Screenshot: The 5.9 MB hero image that delays the homepage on mobile
The 5.9 MB hero image that delays the homepage on mobile · live site, 2026-10-23
Screenshot: Hero image area, served as a 2200 px wide PNG
Hero image area, served as a 2200 px wide PNG · live site, 2026-10-23
T5

Layout shifts on the homepage and product pages exceed the 0.1 CLS limit

Quick winMedium
Page
/, /products/house-blend/
Issue
CLS (how much the layout jumps while loading) is 0.17 on mobile and 0.232 on desktop for the homepage, and 0.291 on mobile for the House Blend product page. The target is 0.1 or less. Lighthouse lists "Layout shift culprits" on both templates. Shop, cart and contact score 0 to 0.021.
CLS home mobile / desktop: 0.17 / 0.232 · CLS product page mobile: 0.291 · Performance score product page mobile: 85
Why it matters
Content that jumps while loading causes misclicks, for example on Add to cart, and counts against Core Web Vitals. https://web.dev/articles/cls
Fix
Reserve space for images and late-loading elements on the home and product templates. Add width and height attributes or a CSS aspect-ratio to the product and hero images, and give the promo and cookie bars a fixed height or overlay them so they don't push content down. Check the elements listed under Lighthouse's "Layout shift culprits".
See also
T1

Accessibility

A1

Icon-only buttons and links (search, cart, product images) have no accessible name

Quick winHigh
Page
12 of 12 scanned pages, /, /shop/, /products/house-blend/, Sitewide header, All pages (header) +8
Issue
axe reports "button-name" (critical) on 12 pages and 12 elements: the search icon button has only an SVG and no text or aria-label. It also reports "link-name" (serious) on 12 pages and 21 elements: the cart icon link (href /cart/) and the product image links (for example <a href="/products/house-blend/"><img src="/img/house-blend.svg"></a>) have no accessible text. The keyboard test confirms unnamed tab stops ("button", "a") in the header and the product grid.
“−” · “+”
button-name: 12 pages, 12 elements · link-name: 12 pages, 21 elements · Lighthouse accessibility score (mobile): 57–75 · Images without alt attribute: 5 of 5 · Unlabelled controls: 2 (search button, cart link) · Unlabelled buttons: 1
Why it matters
Screen reader users hear only "button" or "link" and cannot find the search or the cart, which are essential for shopping. This fails WCAG 4.1.2 and 2.4.4. WCAG 2.2 SC 4.1.2 · WCAG 2.2 SC 2.4.4 · WCAG 2.2 SC 1.1.1 · WCAG 2.2 SC 4.1.2 Name, Role, Value
Fix
Add aria-label="Search" to the search button and aria-label="Cart" to the cart link in the header template. Add aria-hidden="true" to the decorative SVGs. For product image links, give the image a meaningful alt (the product name), or set alt="" and tabindex="-1" on the image link so the duplicate link is skipped and the title link carries the name.
See also
A3, A5
Screenshot: Cart icon link without an accessible name
Cart icon link without an accessible name · live site, 2026-10-23
Screenshot: Cart icon link in the header has no text or label
Cart icon link in the header has no text or label · live site, 2026-10-23
A2

Keyboard focus is invisible on every element, and there is no skip link

Quick winHigh
Page
/, Likely sitewide (shared header and styles)
Issue
In the keyboard test on the homepage, none of the 25 tab stops showed a visible focus indicator. This includes the navigation, the "Add to cart" links, the email field and the "Subscribe" button. There is no skip link, so keyboard users must tab through the whole header on every page.
“Add to cart” · “Subscribe”
Tab stops with visible focus: 0 of 25 · Skip link present: No
Why it matters
Keyboard users cannot see where they are on the page, so they cannot shop or subscribe reliably. This fails WCAG 2.4.7 (focus visible) and 2.4.1 (bypass blocks). WCAG 2.2 SC 2.4.7 · WCAG 2.2 SC 2.4.1 · WCAG 2.2 SC 2.4.11
Fix
Restore a clear focus style for all interactive elements, and add a "Skip to content" link as the first element. For example: a:focus-visible, button:focus-visible, input:focus-visible { outline: 3px solid #1a1a1a; outline-offset: 2px; }. Remove any outline:none rules. Add <a class="skip-link" href="#main">Skip to content</a>, visible on focus, and give the main element id="main".
A3

14 images, including the hero and product images, have no alt attribute

Quick winMedium
Page
6 pages: https://demo.webverdio.com/, /shop/ and product pages, /shop/, /products/house-blend/, Likely all product pages, All product pages (product template), /products/decaf/ +1
Issue
axe "image-alt" (critical) reports 14 images on 6 pages with no alt attribute, for example /img/hero.png and /img/house-blend.svg on the homepage, and /img/ethiopia-yirgacheffe.svg on /shop/. The crawl shows 5 of 5 images without alt on the homepage and the shop, and 1 of 1 on each product page.
image-alt: 6 pages, 14 elements · Images without alt attribute: 5 of 5 · Image links without text: 5 · Images without alt: 1 of 1
Why it matters
Screen readers announce the file name or nothing, so blind shoppers miss the product images. Search engines also lose image context. This fails WCAG 1.1.1. WCAG 2.2 SC 1.1.1 · WCAG 2.2 SC 2.4.4
Fix
Add alt text to every product and hero image in the product and home templates. Use the product name plus a key detail, for example alt="House Blend coffee, 250 g bag". Use alt="" for purely decorative images.
See also
A1
Screenshot: Product image without alt text
Product image without alt text · live site, 2026-10-23
Screenshot: House Blend card; the product image above the title has no alt attribute
House Blend card; the product image above the title has no alt attribute · live site, 2026-10-23
A4

Text contrast is too low in the promo bar and the logo tagline, plus 90 other elements

Quick winMedium
Page
All pages (12 of 12 scanned pages)
Issue
The axe rule "color-contrast" flags 94 elements on 12 of 12 scanned pages. Measured examples: the promo bar "Free UK delivery on orders over £40" is #ffffff on #c8742c (3.5:1), and the logo tagline "Coffee Roasters" is #8a7b6c on #ffffff (4.09:1). The minimum for normal text is 4.5:1. The page reviews also show pale tasting notes such as "Chocolate, hazelnut, caramel", pale product descriptions on cream, and grey footer text ("Small-batch coffee, roasted in London.", "Mon–Fri 8:00–17:00", the copyright line) on dark brown. Those pairs were not measured individually.
“Free UK delivery on orders over £40” · “Chocolate, hazelnut, caramel” · “Read more about our coffee here.” · “Small-batch coffee, roasted in London.”
Promo bar #ffffff on #c8742c: 3.5:1 · Logo tagline #8a7b6c on #ffffff: 4.09:1 · Elements failing: 94 on 12 pages · Description contrast (estimated from screenshot): about 2:1 · Footer grey text contrast (estimated from screenshot): about 2.5–3:1
Why it matters
Low-contrast text is hard to read for people with low vision and on phones in daylight, and the free-delivery message is a key selling point. This fails WCAG 1.4.3. WCAG 2.2 SC 1.4.3 · WCAG 2.2 SC 2.4.4 · WCAG 2.2 SC 1.4.3 Contrast (Minimum)
Fix
Darken the brand orange behind white text to about #9e5a1f or darker, and darken the tagline to #6f6254 or darker. Check every pair with a contrast checker until it reaches at least 4.5:1, then re-run the scan to clear the other flagged elements, which probably use the same colour variables.
Screenshot: Promo bar with white text on orange at a 3.5:1 contrast ratio
Promo bar with white text on orange at a 3.5:1 contrast ratio · live site, 2026-10-23
Screenshot: Pale tasting-note text on the white product card
Pale tasting-note text on the white product card · live site, 2026-10-23
A5

Quantity − and + buttons on product pages are only 20×20 px

Quick winMedium
Page
4 product pages, including https://demo.webverdio.com/products/house-blend/ and /products/ethiopia-yirgacheffe/, /products/house-blend/, Likely all product pages, All product pages (product template), /products/decaf/, /products/cold-brew-kit/
Issue
axe "target-size" reports 8 elements on 4 product pages: the quantity buttons "−" and "+" are 20×20 px, below the 24×24 px minimum.
“−” · “+” · “Quantity: 1”
Button size: 20 × 20 px (minimum 24 × 24 px) · Elements: 8 on 4 pages · Approx. button size (screenshot): ≈20x20 px · WCAG 2.5.8 minimum: 24x24 px · Approx. button size (screenshot): ≈18×18 px · Quantity button size (estimated from screenshot): about 18–20 px
Why it matters
Small targets next to each other cause mis-taps on phones and are hard to use for people with limited motor control. This fails WCAG 2.5.8. WCAG 2.2 SC 2.5.8 · WCAG 2.2 SC 4.1.2
Fix
Increase the quantity buttons to at least 44×44 px on mobile, and at least 24×24 px everywhere. Add padding or a min-width and min-height to .qty button in the product template.
See also
A1
Screenshot: Quantity selector with 20 × 20 px − and + buttons
Quantity selector with 20 × 20 px − and + buttons · live site, 2026-10-23
Screenshot: Tiny quantity minus and plus buttons
Tiny quantity minus and plus buttons · live site, 2026-10-23
A6

Homepage carousels and customer quotes rotate automatically with no pause button

LargerMedium
Page
/
Issue
The homepage has 3 carousels that advance by themselves. The customer quote (“Lovely packaging and you can taste how fresh it is.” — M., Glasgow) changed within 5 seconds without any interaction. There is no pause, stop or hide control.
““Lovely packaging and you can taste how fresh it is.””
Auto-advancing carousels: 3 · Pause control: none
Why it matters
Moving content distracts people with attention or reading difficulties. Screen reader and slow readers can lose the text before they finish it. WCAG 2.2.2
Fix
Stop the carousels from advancing automatically, or add a visible pause/play button to each one. Also pause rotation when the carousel has keyboard focus or mouse hover, and do not auto-rotate when the visitor's system asks for reduced motion (prefers-reduced-motion).
Screenshot: Customer quote on the homepage that changes by itself, with no pause control
Customer quote on the homepage that changes by itself, with no pause control · live site, 2026-10-23
A7

Cart prices and total stick out past the screen edge at 320 px

LargerMedium
Page
/cart/
Issue
At 320 px wide (400% zoom), the cart table cells '£9.95', '£3.95' and the total '£13.90' end at 336 px, 16 px beyond the right edge of the screen. In the 320 px homepage screenshot, the last menu item is also cut off and shows only 'Con'.
“£13.90” · “Con”
Right edge of total cell at 320 px: 336 px · Overflow: 16 px
Why it matters
People who zoom in or use small phones may not see the prices and order total, which they need to decide whether to buy. WCAG 1.4.10
Fix
Make the cart table fit narrow screens, for example by stacking each row's cells or letting the price column shrink. Remove fixed widths and padding on the table at small widths. For the header menu, wrap the items or move them into a menu button so 'Contact' is fully visible.
See also
U3
Screenshot: Cart total row extending past the right edge on a narrow screen
Cart total row extending past the right edge on a narrow screen · live site, 2026-10-23
A8

Form fields use placeholder-only labels and no autocomplete

Quick winMedium
Page
/contact/
Issue
In the screenshots, "Name", "Email" and "Your message" appear only as placeholder text inside the fields, and vanish when the user types. The autocomplete attribute is empty on name and email, and no field is marked required.
“Name” · “Email” · “Your message”
Fields with autocomplete: 0 of 3
Why it matters
Users with memory or cognitive impairments lose the field's purpose once they start typing. Missing autocomplete fails WCAG 1.3.5 (Identify Input Purpose) and slows mobile entry. Light grey placeholder text may also have low contrast. WCAG 2.2 SC 1.3.5 · WCAG 2.2 SC 3.3.2
Fix
Show a visible label above each field and add autocomplete="name" and autocomplete="email". Mark Email and Message as required, with inline error messages in English, if they are needed for a reply.
See also
V4
Screenshot: Email field labelled only by placeholder text
Email field labelled only by placeholder text · live site, 2026-10-23

Privacy & consent

V1

Cookie banner relies on implied consent and has no first-layer reject option

LargerHigh
Page
All pages (sitewide cookie banner)
Issue
Every page shows the same first-visit cookie banner: "We use cookies to improve your experience and for marketing. By continuing to browse, you agree to our use of cookies." On the homepage, the first layer offers only "Accept all" and a "Cookie settings" text link, with no equally prominent reject button. This audit could not reject cookies through the banner and had to hide it for later screenshots. The same banner was seen on the home, shop, product, cart, about, FAQ, contact, shipping and privacy pages.
“We use cookies to improve your experience and for marketing. By continuing to browse, you agree to our use of cookies.” · “Accept all” · “Cookie settings” · “By continuing to browse, you agree to our use of cookies.”
Banner coverage desktop: 30% · Banner coverage phone: 24%
Why it matters
Under UK GDPR and PECR, consent for non-essential cookies must be a clear affirmative action, and refusing should be as easy as accepting. Treating continued browsing as consent is not valid consent and is a regulatory risk (ICO guidance). This is a compliance risk, not legal advice; check with a qualified adviser. UK GDPR Art. 4(11) and Art. 7 · PECR Regulation 6 · ICO guidance on cookies and similar technologies · UK GDPR Art. 4(11), Art. 7
Fix
Replace the implied-consent wording and add a "Reject all" button with the same size and style as "Accept all" on the first layer. Suggested text: "We use essential cookies to run the shop. With your permission we also use analytics and marketing cookies." Buttons: "Accept all" / "Reject all" / "Settings". Make sure no marketing or analytics tags fire until the visitor accepts. The pre-consent request log in the technical stage should confirm this.
See also
V2, U1
Screenshot: Cookie banner treats continued browsing as consent and has only "Accept all" and a "Cookie settings" link
Cookie banner treats continued browsing as consent and has only "Accept all" and a "Cookie settings" link · live site, 2026-10-23
Screenshot: Cookie banner with implied-consent wording and no visible reject option
Cookie banner with implied-consent wording and no visible reject option · live site, 2026-10-23
V2

An analytics cookie is set before the visitor makes a consent choice, and there is no cookie policy

Quick winHigh
Page
/, Sitewide
Issue
A cookie banner is shown, but the first-party cookie "_hv_analytics" is already set before any choice is made. The cookie has Secure=false, HttpOnly=false and SameSite=Lax. No cookie policy page was found: 6 common URLs were tried (/cookie-policy, /cookies and others), all 404, and none is linked from the site. No third-party requests were observed before consent.
Cookies set before consent: 1 (_hv_analytics, demo.webverdio.com) · Third-party hosts before consent: 0 · Cookie policy URLs tried: 6, all 404
Why it matters
Under UK PECR, non-essential cookies such as analytics generally need consent before they are set. Recent UK changes allow limited exemptions for analytics, but only under specific conditions. Setting the cookie first makes the banner ineffective and creates a regulatory risk. This is not legal advice. Privacy and Electronic Communications Regulations 2003, reg. 6 · UK GDPR Art. 13
Fix
Delay the analytics script and its cookie until the visitor accepts analytics cookies. Connect the analytics tag to the consent banner so it only runs after opt-in, or confirm with an adviser that it qualifies for a UK analytics exemption. Publish a cookie policy listing each cookie, its purpose and how long it lasts, and link it from the banner and the footer. Set the Secure flag on the cookie, because the site is HTTPS-only.
See also
V1, V3
V3

Privacy policy is missing almost all information UK GDPR Art. 13 requires

LargerHigh
Page
/privacy/
Issue
The whole policy is four sentences. It does not name the data controller (legal entity, address, contact email). It gives no lawful basis per purpose, no retention periods, and no list of data subject rights. It does not mention the right to complain to the ICO. Recipients are only described as "trusted partners", and international transfers (for example payment, email or analytics providers) are not covered. There is no 'last updated' date.
“We respect your privacy.” · “We may share it with trusted partners who help us run our business.” · “If you have any questions about this policy, please contact us.”
Word count of policy body: about 65 words
Why it matters
A webshop that processes order, payment, delivery and newsletter data must give this information. A placeholder-style policy creates regulatory risk with the ICO and undermines trust at checkout. This is not legal advice; check with a qualified adviser. UK GDPR Art. 13 · Data Protection Act 2018 · ICO guidance: Right to be informed · UK GDPR Art. 12 and Art. 13(1)(a)
Fix
Replace the text with a full privacy notice that covers every UK GDPR Art. 13 item. Include: the controller's legal name, registered address and privacy contact email. For each purpose (order fulfilment, payment, delivery, newsletter, analytics, marketing cookies), give the data used, the lawful basis and the retention period. Name categories or names of processors (payment provider, courier, email platform, hosting), cover international transfers and safeguards, and list the rights (access, rectification, erasure, objection, portability, withdrawing consent). Add the right to complain to the ICO (ico.org.uk), link to a cookie policy, and add a 'Last updated' date.
See also
V2, L3
Screenshot: The entire privacy policy is three short paragraphs, with no controller identity, legal bases, retention or rights.
The entire privacy policy is three short paragraphs, with no controller identity, legal bases, retention or rights. · live site, 2026-10-23
Screenshot: 'Please contact us' is plain text with no link, email or address.
'Please contact us' is plain text with no link, email or address. · live site, 2026-10-23
V4

Newsletter and contact forms collect personal data without a privacy notice

Quick winMedium
Page
/, /contact/
Issue
Two forms collect personal data without a privacy notice. The homepage newsletter form "Get 10% off your first order" asks for an email address but gives no privacy link, no statement of how the email is used and no discount conditions, and the field has no autocomplete="email". The /contact/ form (Name, Email, Your message) has no text or privacy link near the "Send" button; the only privacy link is in the footer.
“Get 10% off your first order” · “Join our newsletter for new coffees and brewing tips.” · “Send”
Why it matters
UK GDPR Art. 13 requires information at the point of collection. Missing discount conditions can lead to disputes. The missing autocomplete attribute fails WCAG 1.3.5. UK GDPR Art. 13 · PECR Regulation 22 · WCAG 2.2 SC 1.3.5
Fix
Add a line under the form with a link to the privacy policy, and set autocomplete="email" and required on the field. For example: "We'll email you new coffees and brewing tips. Unsubscribe anytime. See our Privacy policy. Discount valid once per customer."
See also
V3, A8
Screenshot: Newsletter form without a privacy notice or discount conditions
Newsletter form without a privacy notice or discount conditions · live site, 2026-10-23
Screenshot: Form with no privacy notice before the Send button
Form with no privacy notice before the Send button · live site, 2026-10-23

Spelling & grammar

#PageCurrentCorrectSeverity
S1/Ethopia YirgacheffeEthiopia YirgacheffeMedium
S2/products/house-blend/it's aroma fills the kitchen every morningits aroma fills the kitchen every morningMedium
S3/products/cold-brew-kit/two bags of coarse ground coffeetwo bags of coarse-ground coffeeLow
S4/about/so we can accomodate special requestsso we can accommodate special requestsLow
S5/faq/When will I recieve my order?When will I receive my order?Medium
S6/shipping/may be shipped seperatelymay be shipped separatelyLow

Appendix: smaller improvements

25 more findings with less impact, listed briefly. Each is real and has a concrete fix; deal with them after the issues above.

IDSeverityIssuePageFix
T3Medium 12 of 13 pages have no meta descriptionAll pages except the homepageWrite a unique meta description of 120–155 characters for the shop, each product and the key service pages.
T4Medium No structured data on any page, including product pagesAll 13 crawled pagesAdd Product + Offer JSON-LD to the product template and Organization + WebSite JSON-LD to the homepage.
T2Medium Product page titles are generic or incomplete ('Halvane Coffee', 'Decaf')
/products/house-blend/, /products/ethiopia-yirgacheffe/ +1Set the titles to "House Blend | Halvane Coffee Roasters" and "Ethiopia Yirgacheffe | Halvane Coffee Roasters".
N2Medium Sitewide link to the brewing guide returns 404
All crawled pages, including https://demo.webverdio.com/, /shop/, /about/, /faq/ and /contact/, /blog/brewing-guide/Publish the brewing guide at /blog/brewing-guide/, or remove or redirect the link.
U1Medium Cookie banner covers 45% of the phone screen on arrival, hiding products and buttons
All pages (sitewide cookie banner)Shrink the banner on mobile to a compact bar of no more than about 25% of the screen.
U2Medium Add to cart button sits below the first phone screen on every product page
All product pages (product template), measured on 4 product pagesBring price and Add to cart into the first phone screen.
U3Medium Delivery time, cost and free-from columns are cut off on mobile
/shipping/Make the table responsive by stacking each row as a card on narrow screens.
X1Medium Key security headers are missing: HSTS, CSP, frame protection and Permissions-Policy/ (response headers)Add the missing headers through Cloudflare (Transform Rules or SSL/TLS > Edge Certificates > HSTS) or at the origin server.
L7Low Cart total does not say whether VAT is included
/cart/Add 'incl. VAT' next to the total, or a 'VAT included' line under it.
C7Low Cart charges £3.95 delivery without showing how close the order is to free delivery
/cart/Add a line under the totals such as 'Add £30.05 more for free UK delivery'.
C6Low No order cut-off time or dispatch time for 'Next working day' delivery
/shipping/Add a cut-off time and dispatch rule, for example "Order by 13:00 Mon–Fri for next-working-day delivery".
C8Low Form has no reply-time promise and no order or topic field
/contact/Add an optional topic dropdown (Order / Wholesale / Other) and an order number field, and state a reply time.
P7Low Unclear whether separate Cold Brew Kit shipments cost extra or change delivery times
/shipping/Explain in one sentence what happens to orders that include a Cold Brew Kit.
A9Low Promo and notice bars sit outside page landmarks, and a link is labelled only "here"12 of 12 scanned pages, /Place the promo and notice bars inside the header landmark, and rewrite the "here" link to describe its destination.
A10Low Cart table has no column headers and marks the total row as headers
/cart/Add a header row with 'Product', 'Quantity' and 'Price' as column headers, and make the total row ordinary cells.
K9Low Contact page describes a roastery shop open six days, while the About page says visits must be arranged
/about/, /contact/State clearly whether the roastery has a walk-in shop or takes visits by appointment only, give the address, and use the same wording on the About and Contact pages.
T11Low Lighthouse logs browser console errors on all 5 tested pages/, /shop/ +3Open the browser console on these pages, especially in a fresh session, and fix the reported errors.
T7Low Logo links to /index.html instead of the root URL
All pages (shared header)Point the logo link to "/" and 301-redirect /index.html to the root.
T8Low No canonical tags on any pageAll 13 crawled pagesAdd a self-referencing absolute canonical tag to every page template.
T9Low No Open Graph tags, so shared links have no image or proper titleAll 13 crawled pagesAdd og:title, og:description, og:image and og:url to all templates, with the product photo as og:image on product pages.
T6Low Heading structure is broken: two H1s on the homepage, none on About, skipped levels
/, /about/ +1Keep one H1 per page: change the second homepage H1 to an H2, and mark up the About page title as an H1.
T10Low XML sitemap likely lists a product URL that returns 404/sitemap.xml, /products/seasonal-blend/Remove /products/seasonal-blend/ from the sitemap, or 301-redirect it to the closest current product.
N3Low External link in the demo notice bar fails to resolve
All crawled pages, including https://demo.webverdio.com/, /shop/, /about/, /faq/ and /contact/Correct the link target in the notice bar, or remove the link.
U4Low Mobile hero drops the value proposition and the phone number
/Show a short version of the subline on mobile, and make the phone number a tel: link that also appears on mobile.
U5Low FAQ is too thin to answer common coffee-shop questions
/faq/Add 6–10 questions based on real customer queries and link the answers to the relevant pages.

WCAG 2.2 AA review

All 55 success criteria at levels A and AA, evaluated on 4 key pages with automated tests, scripted browser tests (zoom, reflow, text spacing, keyboard, motion) and an AI review of screenshots and the accessibility tree, which is what screen readers receive. Criteria marked "manual check" need a person with assistive technology, or a completed process such as a form, login or checkout, which this audit never submits. This review is not a formal conformance statement.

19 · Pass15 · Fail15 · Manual check6 · Not applicable
CriterionLevelResultNotesFindings
1.1.1 Non-text ContentAFailThe hero image and product images have no alt attribute (14 images on 6 pages), and the search button, cart link and product image links have no text alternative.A1, A3
1.2.1 Audio-only and Video-only (Prerecorded)ANot applicableNo audio or video was found on the tested pages.
1.2.2 Captions (Prerecorded)ANot applicableNo video or embedded players were found on the tested pages.
1.2.3 Audio Description or Media Alternative (Prerecorded)ANot applicableNo video was found on the tested pages.
1.2.4 Captions (Live)AANot applicableThe site has no live audio or video streams.
1.2.5 Audio Description (Prerecorded)AANot applicableNo video was found on the tested pages.
1.3.1 Info and RelationshipsAFailHeading levels jump from H1 to H3 on the homepage and shop, the homepage has two H1 headings, the demo and promo bars sit outside page landmarks, and the cart table has no column headers while its total row is marked up as headers.T6, A9, A10
1.3.2 Meaningful SequenceAPassOn the 4 tested pages, the reading order passed to screen readers matches the visual order in the screenshots: notice bars, header, main content, footer.
1.3.3 Sensory CharacteristicsAPassThe text on the 4 tested pages contains no instructions that depend only on shape, colour, size or position.
1.3.4 OrientationAAPassThe homepage displays normally on a phone held sideways, with no message asking to rotate the device.
1.3.5 Identify Input PurposeAAFailThe newsletter email field and the contact form's Name and Email fields have no autocomplete attribute, so browsers cannot reliably fill them in.A8, V4
1.4.1 Use of ColorAPassThe automated check found no in-text links told apart by colour alone, and the screenshots show no information conveyed only by colour.
1.4.2 Audio ControlAPassNo audio or video plays automatically on the tested pages.
1.4.3 Contrast (Minimum)AAFail94 text elements on 12 pages have too little contrast, for example the white promo bar text on orange (3.5:1) and the grey 'Coffee Roasters' logo tagline (4.09:1), against the required 4.5:1.A4
1.4.4 Resize TextAAPassAt 640 px wide (200% zoom), none of the 4 tested pages needed sideways scrolling or had clipped or overflowing content.
1.4.5 Images of TextAAPassHeadings, the hero text and buttons are real text. The only text in images is the brand label on the product packaging, which is allowed.
1.4.10 ReflowAAFailAt 320 px wide, the prices and total in the cart table stick out past the right edge of the screen (to 336 px). In the homepage screenshot the 'Contact' menu item is also cut off at the edge.U3, A7
1.4.11 Non-text ContrastAAManual checkThe header icons are dark on white and clear, but the form field borders are not visible in the screenshots. Check that the newsletter and contact form field borders have at least 3:1 contrast with the background.
1.4.12 Text SpacingAAPassWith increased letter, word, line and paragraph spacing applied, no text was clipped on the 4 tested pages.
1.4.13 Content on Hover or FocusAAManual checkNo hover menus or tooltips were seen, but this was not tested by hand. Check that any content that appears on hover or focus can be dismissed with Escape, can be hovered, and stays visible.
2.1.1 KeyboardAPassOn the 4 tested pages, every visible link, button and form field was reachable with the Tab key. All controls are standard HTML elements, with no custom widgets.
2.1.2 No Keyboard TrapAPassFocus moved through every page and returned to the start without getting stuck.
2.1.4 Character Key ShortcutsAManual checkNo single-key keyboard shortcuts were seen. Check whether the site uses any. If it does, they must be possible to turn off or remap.
2.2.1 Timing AdjustableAPassNo automatic page refresh or redirect was found on the tested pages. Time limits in the checkout were not tested.
2.2.2 Pause, Stop, HideAFailThe homepage has 3 automatically advancing carousels, and the customer quote changes by itself, with no pause or stop control.A6
2.3.1 Three Flashes or Below ThresholdAManual checkThere is no video and no endless animation. Check that the rotating homepage carousels do not flash more than three times per second.
2.4.1 Bypass BlocksAFailThere is no skip link, so keyboard users must tab through 9 header stops on every page before reaching the content. A main landmark exists and helps screen reader users only.A2
2.4.2 Page TitledAFailProduct pages use the generic title 'Halvane Coffee', so House Blend and Ethiopia Yirgacheffe have the same title and it does not name the product.T2
2.4.3 Focus OrderAPassOn the 4 tested pages, the tab order follows the visual layout: header from left to right, then the main content, then the footer columns.
2.4.4 Link Purpose (In Context)AFailThe cart link and product image links have no text at all, so their purpose cannot be determined.A1, A3, A4, A9
2.4.5 Multiple WaysAAManual checkPages can be reached through the main menu and footer, but no working search or sitemap page was detected. Check that the header search button opens a working site search, or add an HTML sitemap.
2.4.6 Headings and LabelsAAFailHeadings ('Your cart', 'Contact us', product names) and form labels ('Name', 'Email', 'Your message') describe their topic or purpose.T6
2.4.7 Focus VisibleAAFailOn all 4 tested pages, not a single tab stop showed a visible change when it received keyboard focus.A2
2.4.11 Focus Not Obscured (Minimum)AAFailWith the cookie banner handled, no focused element was hidden behind sticky or fixed content on the 4 tested pages. Check by hand that the cookie banner does not cover focused elements before a choice is made.A2
2.5.1 Pointer GesturesAManual checkThe homepage has 3 carousels. Check that they can be moved with single taps or buttons, not only by swiping.
2.5.2 Pointer CancellationAManual checkCheck that buttons and links act only when the finger or mouse is released, and that the action can be cancelled by moving away.
2.5.3 Label in NameAPassWherever controls have visible text (for example 'Shop coffee', 'Add to cart', 'Subscribe'), the name given to screen readers matches it.
2.5.4 Motion ActuationAManual checkNo shake or tilt features were seen. Confirm that no function is triggered by moving the device.
2.5.7 Dragging MovementsAAManual checkNo sliders were seen. Check that the homepage carousels do not need dragging and offer single-tap controls.
2.5.8 Target Size (Minimum)AAFailThe quantity − and + buttons on product pages measure 20 × 20 px, below the 24 × 24 px minimum.A5
3.1.1 Language of PageAPassAll 14 crawled pages declare English (lang="en").
3.1.2 Language of PartsAAPassNo passages in another language were found on the tested pages.
3.2.1 On FocusAPassNo page change or new window happened when elements received keyboard focus.
3.2.2 On InputAManual checkCheck that changing the quantity or entering form values does not unexpectedly submit a form or move to another page.
3.2.3 Consistent NavigationAAPassThe main menu has the same links in the same order on all 4 tested pages.
3.2.4 Consistent IdentificationAAPassRepeated functions (search, cart, 'Add to cart') look and are labelled the same way on every tested page. They still need proper names, which is a separate issue.
3.2.6 Consistent HelpAPassFAQ and Contact links in the header, the phone number, and the FAQ link in the footer appear in the same place on all 4 tested pages.
3.3.1 Error IdentificationAManual checkSubmit the newsletter and contact forms with empty or invalid values, and check that each error is described in text.
3.3.2 Labels or InstructionsAFailThe newsletter and contact form fields appear to be labelled only by placeholder text, which disappears once someone starts typing.A8
3.3.3 Error SuggestionAAManual checkSubmit forms with a wrong email format, and check that the error message suggests how to fix it.
3.3.4 Error Prevention (Legal, Financial, Data)AAManual checkGo through the checkout up to the final step, and check that the order can be reviewed and corrected before payment.
3.3.7 Redundant EntryAManual checkGo through the checkout, and check that details already entered (such as the delivery address) are not requested again.
3.3.8 Accessible Authentication (Minimum)AANot applicableNo login form was found on the tested pages.
4.1.2 Name, Role, ValueAFailThe header search button and cart link have no accessible name on 12 pages, and the quantity buttons are announced only as '−' and '+'.A1, A5
4.1.3 Status MessagesAAManual checkWith a screen reader, add a product to the cart and submit the forms, then check that confirmation and error messages are announced without moving focus.

Technical test results

Raw results of the automated tests. The findings they produced are listed in the sections above.

Speed: Lighthouse lab measurements

Lighthouse simulates a mid-range phone on a 4G connection for mobile, and a fast connection for desktop. One run per page; expect about ±10 points of variation between runs. LCP (Largest Contentful Paint) is the time until the main image or text appears; under 2.5 s is good. Desktop is measured on fewer pages (by default the homepage), because mobile results matter most.

PageMobile scoreMobile LCPMobile FCPPage weightDesktop scoreDesktop LCP
/68 29.9 s0.9 s 5.7 MB66 4.9 s
/shop/100 0.9 s0.9 s 0.0 MB– –
/products/house-blend/85 0.9 s0.9 s 0.0 MB– –
/cart/100 0.9 s0.9 s 0.0 MB– –
/contact/100 0.9 s0.9 s 0.0 MB– –

Speed: real visitors (Chrome UX Report)

What real Chrome visitors experienced over the last 28 days, at the 75th percentile: three out of four visits were at least this fast. INP measures how quickly the page responds to taps and clicks, which lab tests cannot measure. Good: LCP up to 2.5 s, INP up to 200 ms, CLS up to 0.1.

The Chrome UX Report has no real-user data for this site: it has too little Chrome traffic to be included.

HTTP status and redirects

Requested URLResultFinal status
http://demo.webverdio.com/301 http://demo.webverdio.com/ → 200 https://demo.webverdio.com/200
https://demo.webverdio.com/200 https://demo.webverdio.com/200
https://demo.webverdio.com/shop308 https://demo.webverdio.com/shop → 200 https://demo.webverdio.com/shop/200
https://demo.webverdio.com/SHOP/404 https://demo.webverdio.com/SHOP/404
https://demo.webverdio.com/index.php404 https://demo.webverdio.com/index.php404
https://demo.webverdio.com/page-not-found-test-mvksunxn/404 https://demo.webverdio.com/page-not-found-test-mvksunxn/404

Broken or unreachable links

LinkStatusFound on
https://demo.webverdio.com/gift-cards/404/, /shop/
https://demo.webverdio.com/terms/404/, /shop/
https://demo.webverdio.com/blog/brewing-guide/404/, /shop/
https://demo.webverdio.com/checkout/404/cart/
https://www.webverdio.com/getaddrinfo ENOTFOUND www.webverdio.com/, /shop/

Indexing signals

Accessibility: automated scan (axe-core, WCAG 2.2 AA)

RuleImpactPagesElementsWCAG
Buttons must have discernible textcritical12124.1.2
Elements must meet minimum color contrast ratio thresholdsserious12941.4.3
Links must have discernible textserious12212.4.4, 4.1.2
All page content should be contained by landmarksmoderate1224best practice
Images must have alternative textcritical6141.1.1
All touch targets must be 24px large, or leave sufficient spaceserious482.5.8
Heading levels should only increase by onemoderate22best practice
Page should contain a level-one headingmoderate11best practice

Accessibility: keyboard test

TestResult
Skip linknot present
Visible focus (first 25 tab stops)25 without visible focus

Security headers

HeaderValue
strict-transport-securitymissing
content-security-policymissing
x-frame-optionsmissing
x-content-type-optionsnosniff
referrer-policystrict-origin-when-cross-origin
permissions-policymissing
servercloudflare
x-powered-bymissing

JavaScript and network

Prioritized action plan

Ordered by risk first (legal and money), then conversion, then growth. The IDs refer to the findings above.

This week: legal, money and blocking issues

Quick wins

  1. Set the House Blend price to one value on listings, the product page and the cart. K5
  2. Correct the product weight so the heading and description state the same bag size. P1
  3. Choose one free-delivery threshold and update every page that mentions it. K1
  4. Remove the contradictory returns statements from the FAQ, product pages and shipping page until one policy is published. K6
  5. Add the legal entity, company number and geographic address to the footer and the contact page. L3
  6. Make the opening hours on the contact page match the footer, and keep one phone number. K2 K3
  7. Block the analytics cookie until the visitor gives consent, and publish a short cookie policy. V2
  8. Show out-of-stock products as unavailable and disable their 'Add to cart' button. C3
  9. Hide the 'Gift cards' menu link until the page exists. N1
  10. State 'incl. VAT' next to the cart total. L7

Larger improvements

  1. Write and publish terms and conditions, and point the footer link to them. L1
  2. Write a full returns and cancellation policy covering the 14-day cancellation right, its exceptions for opened coffee, who pays return postage, and how to return an item. L2
  3. Build a working checkout, and make 'Add to cart' submit the chosen product, grind and quantity. C1 C2
  4. Replace the implied-consent cookie banner with one that offers 'Accept' and 'Reject' on the first layer, and make it smaller on phones. V1 U1
  5. Rewrite the privacy policy to cover the identity of the controller, purposes, legal bases, retention, recipients and data subject rights (UK GDPR Art. 13). V3

Next two weeks: flows and content accuracy

Quick wins

  1. Compress and resize the hero image, serve it as WebP or AVIF with srcset, and reserve image space to cut layout shifts. T1 T5
  2. Give icon-only controls an aria-label, add visible focus styles, and add a skip link. A1 A2
  3. Align the roasting schedule, dispatch time and shop-visit wording across all pages, and spell 'Ethiopia' correctly on the listings. K7 K8 K9 K4
  4. Show bag weight and price per kg on product cards and product pages. P3
  5. Relabel 'Tasting notes' as 'What's in the kit' on the brewing kit page. P4
  6. List the European countries covered and mention customs and import charges, and explain the delivery cost and timing of separate Cold Brew Kit shipments. P6 P7
  7. Make the phone numbers and email address click-to-call and mailto links, and show the phone number on mobile. C5
  8. Add an order cut-off time for next-working-day delivery, a reply-time promise and a topic or order field on the contact form. C6 C8
  9. Add the source of the '4.9 from 2,000+' rating and a statement on how reviews are checked, and soften the absolute decaf claims. L4 L5
  10. Add a short privacy notice with a link to the policy beside the newsletter and contact forms. V4
  11. Fix or remove the broken brewing guide link and the external link in the notice bar. N2 N3

Larger improvements

  1. Extend the product template with grind options, roast level, roast date or freshness, delivery cost and returns information. P2
  2. Let shoppers change the quantity, remove items and go back to the product from the cart, and show how much more is needed for free delivery. C4 C7
  3. Photograph the brewing kit itself (the jar and filter) instead of a coffee bag. P5
  4. Expand the About page with evidence for the sourcing claims, such as farms, importers and certifications. L6
  5. Move 'Add to cart' into the first phone screen on product pages, and make the delivery table readable on mobile. U2 U3

Within a month: visibility, speed and polish

Quick wins

  1. Write unique product page titles and meta descriptions. T2 T3
  2. Add canonical tags and Open Graph tags, and point the logo to the root URL. T8 T9 T7
  3. Fix the heading structure, remove the 404 URL from the sitemap, and fix the console errors. T6 T10 T11
  4. Add alt text to all images, raise the contrast of the promo bar and tagline, and enlarge the quantity buttons to at least 24×24 px. A3 A4 A5
  5. Add visible labels and autocomplete attributes to form fields, put the promo and notice bars inside landmarks, rename the 'here' link, and fix the cart table headers. A8 A9 A10
  6. Add the HSTS, Content-Security-Policy, frame-ancestors and Permissions-Policy headers. X1
  7. Restore the value proposition and the phone number in the mobile hero. U4

Larger improvements

  1. Add Product, Offer, Organization and BreadcrumbList structured data. T4
  2. Add pause controls to the carousels and the rotating quotes, and respect prefers-reduced-motion. A6
  3. Make the cart layout reflow at 320 px without content running past the screen edge. A7
  4. Expand the FAQ with questions on grind, freshness, storage, subscriptions and delivery. U5

Method, scope and limitations

Audit date: 2026-10-23. This audit crawled 19 internal URLs for automated checks and reviewed 12 pages individually at desktop and phone widths. It used Playwright (Chromium), Lighthouse 13 (5 pages) and axe-core 4 (12 pages). Findings about a shared template or component apply to every page that uses it.

Before any consent choice, the engine recorded which cookies and requests loaded. It then rejected non-essential cookies and closed popups for the remaining screenshots. Banner findings are based on the first-visit screenshot.

Conversion flows were not scripted: no products were added to a cart through a live session, no checkout was opened beyond its link, no orders were placed and no forms were submitted. The findings on 'Add to cart' and checkout come from the link targets and the pages they lead to. To confirm the full flow once it is fixed, the owner should place one test order.

No test account was provided, so nothing behind a login was audited.

Speed figures are Lighthouse lab measurements only. The Chrome UX Report has no real-user data for this site, because it has too little Chrome traffic to be included.

The WCAG 2.2 AA review covered 4 key pages. 19 criteria pass, 15 fail, 15 need a manual check by a person using assistive technology or completing a process (forms, login, checkout), and 6 do not apply. This is not a formal conformance statement.

Whether Google indexes the pages was not checked, because that requires Search Console access. The sitemap finding (T10) is marked as likely.

Security checks were passive only: response headers and public files. No vulnerability testing was done.

3 evidence screenshots could not be re-located on the live site; the related text may have changed since it was collected.

Legal points describe risks under UK rules (UK GDPR, PECR, the Consumer Contracts Regulations 2013, company disclosure rules, the DMCC Act 2024). They are not legal advice; check them with a qualified adviser.

Want to know what changed?

Websites change every week. A re-audit in 30 days shows what has been fixed, what is still open and what is new, with fresh screenshots of the live site.

Get your next audit at webverdio.com