Web Quality Audit: The Produce Society
Website: https://www.theproducesociety.com.au/ | Date: 2026-08-24 | Platform: Shopify (theme id 185703825701) | Industry: Fresh Produce / Premium Grocery (D2C, Sydney)
Assessment basis: CrUX real-user field data (CrUX Vis), Lighthouse lab data via PageSpeed Insights UI (mobile + desktop, Lighthouse 13.4.1), rendered-DOM inspection via browser (Shopify is JS-rendered — curl-only checks were cross-verified), security headers via curl -sI, robots.txt/sitemap, and business analysis context (business-analysis.md).
Executive Summary
The Produce Society is a brand-new (CrUX history begins 2026-07-05), small-traffic Shopify store. Real-world performance is genuinely good — Core Web Vitals are passing on all devices in the field (LCP ~1.5s, INP ~77ms, CLS 0.00) — but lab-measured mobile performance is poor (Lighthouse Performance 48), driven by a hero slider image that is lazily-loaded, oversized images, and heavy third-party script bloat. Accessibility (99) and SEO (92) are strong; Best Practices (73) is dragged down by an incomplete Content-Security-Policy and sub-optimal HSTS.
The most brand-relevant finding is a content-quality/authenticity gap: a flagship curated product ("Fruit + Veg Box – Curated Small") uses a ChatGPT-generated hero image, and every sampled product has an empty description (which also causes the missing meta-description problem on product/collection pages). For a brand that sells on "60 years of heritage" and "hand-selected freshness," AI imagery and empty copy undercut the premium story.
| Category | Mobile Score | Desktop Score | Grade |
|---|---|---|---|
| Performance | 48 | 82 | 🔴 (Mobile) / 🟡 (Desktop) |
| Accessibility | 99 | 95 | 🟢 |
| Best Practices | 73 | 73 | 🟡 |
| SEO | 92 | 92 | 🟢 |
| Overall | 78 | 86 | 🟡 |
Mobile vs. desktop Performance gap is 1.7× (48 vs 82). The gap is real but not catastrophic; the bigger story is that mobile lab LCP (15.8s on slow-4G emulation) is an artifact of throttled testing AND a config problem (LCP image is loading="lazy"). Field data shows real mobile users are fine.
1. Performance Audit
1.1 CrUX Real-World Field Data
Core Web Vitals Assessment: Passing on both mobile and desktop. All three metrics (LCP, INP, CLS) meet the "Good" threshold in the field. (Note: CrUX Vis does not surface a phone/desktop/form-factor split for this origin — data availability only, not a metric failure. Source: CrUX Vis, as-of 2026-08-15.)
Latest two periods (CrUX Vis "Core Web Vitals" summary, all devices):
| Period | LCP | INP | CLS | Verdict |
|---|---|---|---|---|
| 2026-07-12 → 2026-08-08 | 1438 ms | 78 ms | 0.00 | Good (all) |
| 2026-07-19 → 2026-08-15 | 1567 ms | 77 ms | 0.00 | Good (all) |
- LCP 1567 ms — Good (threshold ≤ 2500 ms). Trend flagged by CrUX Vis as "good but regressing" (+129 ms vs prior period). Worth watching as traffic/script load grows.
- INP 77 ms — Good (≤ 200 ms), "good and stable."
- CLS 0.00 — Good (≤ 0.10), "good and stable."
Interpretation: Real users get a fast, stable experience. The lab-score problems below are throttling/render-config artifacts, not field failures — but they will bite as the store scales or on weaker devices/networks.
1.2 Core Web Vitals (Lighthouse Lab Data)
| Metric | Mobile (Slow 4G) | Rating | Desktop | Rating | Threshold (Good / Poor) |
|---|---|---|---|---|---|
| FCP | 2.9 s | Needs Improvement | 0.5 s | Good | ≤1.8s / >3.0s |
| LCP | 15.8 s | Poor | 1.7 s | Good | ≤2.5s / >4.0s |
| TBT | 490 ms | Needs Improvement | 130 ms | Good | ≤200ms / >600ms |
| CLS | 0.00 | Good | 0.001 | Good | ≤0.10 / >0.25 |
| SI | 13.5 s | Poor | 4.5 s | Needs Improvement | ≤3.4s / >5.8s |
- Mobile LCP 15.8s is 6.3× the Good threshold and 9.3× the desktop lab LCP (1.7s). This is the headline performance problem. Root cause (§1.3): the hero slider image is the LCP element but is marked
loading="lazy"(Lighthouse explicitly warns "LCP resources should not use loading=lazy; fetchpriority=high should be applied"), and it is a 3040×1710 px image served at full size for a hero displayed ~721×1282 on mobile.
1.3 LCP Phase Breakdown (Mobile)
LCP element: div#element-... > figure.lazy-image > img.img (hero slider image, Untitled_design-79.jpg, 3040×1710).
| Phase | Duration | Note |
|---|---|---|
| Time to First Byte | 10 ms | Excellent (Shopify/Cloudflare edge) |
| Resource Load Delay | 490 ms | Render-blocking CSS/JS delaying discovery |
| Resource Load Duration | 520 ms | Oversized image (3040px wide, ~270 KiB+) |
| Element Render Delay | 690 ms | loading="lazy" + JS-driven slider delays paint |
| Total LCP | ~15.8 s (incl. throttling) | Pre-resource delay significant |
Key pattern: loading="lazy" on the LCP element is a direct bug — it tells the browser to defer the single most important above-the-fold image. Combined with the slider's JS rendering and slow-4G throttling, the browser paints the hero very late.
1.4 Performance Issues by Impact
Critical (mobile lab)
| Issue | Evidence | Est. Savings | Recommendation |
|---|---|---|---|
Hero/LCP image loading="lazy" | Lighthouse: "LCP resources should not use loading=lazy; fetchpriority=high should be applied"; <img ... sizes="(max-width:1023px) calc(80vh*1.777...)..." loading="lazy"> | Up to several seconds of LCP | Add fetchpriority="high" and remove loading="lazy" from the hero slider's first slide; preload with <link rel="preload" as="image">. |
| Oversized images (no responsive sizing) | Untitled_design-83.jpg 2100×3356 displayed at 721×1282 (235 KiB savings); IMG_6903_2.heic 1540×2053 displayed at 405×539 (560 KiB savings) | Mobile 1,219 KiB; Desktop 1,611 KiB | Use srcset/sizes correctly; Shopify CDN can auto-resize via ?width= — ensure theme requests appropriately sized variants. |
High
| Issue | Evidence | Est. Savings | Recommendation |
|---|---|---|---|
| Third-party script bloat | Google Tag Manager 806 KiB (4 containers: AW, G-R9S6HMHH0E, GT-P3JRZ537, +cx), Facebook fbevents 182 KiB, EcomSend 249 KiB, Omnisend, Loox, PickEasy, giftbox ds-cdn, Maps JS | ~1 MB transfer | Consolidate GTM containers (4 is excessive); load fb/analytics after interaction; review必要性 of every app (EcomSend, giftbox, maps). |
| Render-blocking CSS | 3 preload CSS + theme.css (600ms), section-header.css, accelerated-checkout CSS | 150 ms (mobile) | Inline critical CSS; defer non-critical; reduce preconnect to ≤4 origins (Lighthouse warns "More than 4 preconnect connections"). |
| TBT 490 ms (mobile) | Forced reflow 192 ms; GTM script eval 655 ms | — | Reduce third-party JS; defer app scripts. |
| Large DOM (2,823 elements, 2,587 desktop) | Lighthouse DOM stats | — | Trim slider/carousel widget nesting. |
Medium / Low
- Short cache lifetimes on some third-party assets (Maps JS 20m, fbevents 20m) — 283 KiB savings.
- Legacy JavaScript (23 KiB) and font-display (30 ms).
- Source maps (
.js.map) return HTML 404 — minor dev hygiene.
1.5 Resource Transfer Summary (Mobile)
| Category | Transfer | Notes |
|---|---|---|
| First-party (site) | ~2.0 MB | Images dominate (heic/jpg 840–2100px) |
| Google Tag Manager | 807 KiB | 4 containers — unusually high |
| Shopify hosting (apps) | 250–442 KiB | EcomSend, instafeed, slots, webmcp |
| 182 KiB | fbevents | |
| Omnisend / Loox / others | ~200 KiB | CRM, reviews |
2. Accessibility Audit
Scores: Mobile 99 / Desktop 95 — excellent. Shopify theme is well-built for a11y.
2.1 Critical Issues
None. <html lang="en"> present, <meta name="viewport"> present, single <h1> on every template (homepage H1 = "The Most Stunning Fruit & Veg Australia Has To Offer!", product H1 = product name — both valid), skip-to-content link present, form labels present.
2.2 High Priority Issues
- Empty
alt=""on content/product images. On the homepage, 35 of 72 images carryalt="". Many are decorative slider/background images (acceptable), but product-grid and category images also use empty alt, losing them to screen readers and image search. (35 empty-alt on home; the rendered DOM shows product cards withalt="".) Recommend descriptive alt on all product imagery. - Heading-order nit: a footer
<h4 class="footer-item__title">usesdisplay:block(Lighthouse "Failing Elements: Address"); cosmetic, not blocking.
2.3 Positive Findings
- 99/100 mobile a11y — logical heading hierarchy, visible focus, ARIA on slider controls (
aria-label="Show slide 2",role="button",tabindex), cookie-consent buttons labelled, reviews widget has rating text alternatives. - Color contrast: no failures detected.
3. SEO Audit
Scores: Mobile 92 / Desktop 92 — strong.
3.1 Technical SEO
| Check | Status | Evidence |
|---|---|---|
| robots.txt | ✅ | Allows crawl; disallows cart/checkout/account; includes Sitemap: directive. |
| XML Sitemap | ✅ | sitemap.xml index links product/collection/page/blog + agentic-discovery sitemaps. |
| Canonical URLs | ✅ | Self-referencing on homepage, product, collection, pages (verified via DOM + curl). |
| Indexation | ✅ | No noindex on key pages; checkout/cart correctly disallowed. |
| URL structure | ✅ | Clean, hyphenated, descriptive (/products/apple-granny-smith, /collections/curated-boxes). |
| HTTPS | ✅ | Enforced (HSTS, Cloudflare); no mixed content. |
| Mobile-friendly | ✅ | Responsive theme; viewport configured; content parity. |
| hreflang / i18n | N/A | Single locale (en-AU), Australia-only. No multilingual needed. |
3.2 On-Page SEO Issues
| Issue | Severity | Evidence | Fix |
|---|---|---|---|
| Missing meta descriptions on product, collection, blog, and policy pages | High | Verified: product apple-granny-smith, collections/fruit, collections/all, blogs/news, policies/privacy-policy all have NO description. Homepage + static /pages/ do. | Bulk-populate via theme/CSV. Root cause = empty product descriptions (see §6.2). |
Missing twitter:image site-wide | Medium | twitter:card + twitter:title/description present, but no twitter:image on any template. | Add twitter:image (reuse og:image) in theme.liquid. |
| Homepage H1 is aspirational, not keyword-targeted | Low | H1 = "The Most Stunning Fruit & Veg Australia Has To Offer!" (good copy, but "premium Sydney fruit delivery" keywords sit in body, not H1). | Acceptable for brand; ensure category/collection H1s carry keywords (they do: "Fruit", "Curated Boxes"). |
| Title length 79 chars | Low | Homepage title "Freshness, Perfected. Sydney's Finest Produce, Delivered. – The Produce Society" — slightly long but within range and keyword-rich. | Trim to ≤70 chars if desired. |
3.3 Schema Markup
| Type | Homepage | Product | Collection | Status |
|---|---|---|---|---|
| WebSite | ✅ (name, url) | — | — | Missing potentialAction SearchAction (sitelinks search box opportunity) |
| Organization | ✅ (name, url) | — | — | Missing sameAs (social URLs), logo, contactPoint, address, foundingDate. Not typed as LocalBusiness. |
| BreadcrumbList | ✅ | ✅ | ✅ | Present & visible |
| Product | — | ✅ (name, brand, offers.price, availability, url) | — | Missing aggregateRating / review despite visible Loox 5.0/5 reviews; empty description; brand name has trailing space "The Produce Society " (entity mismatch risk). |
| ItemList | — | — | ❌ | Collections have no ItemList of products (missed rich-result opportunity). |
Recommendation: Add aggregateRating + review to Product schema (Loox data is available), enrich Organization with sameAs/contact/address and mark as LocalBusiness (PO Box 137 Revesby North NSW 2212), add SearchAction to WebSite, and add ItemList to collection pages. Fix the trailing-space brand string in Product.brand.name.
3.4 Image SEO
- Filenames are largely non-descriptive:
IMG_6894_2.heic,Untitled_design-83.jpg,1_1f920915-....png. No keyword filenames. (Acceptable for a small grocer but a missed opportunity.) alt=""on many product images → lost image search visibility (see §2.2).
3.5 Internal Linking
- Good: category grid, "This Week's Picks" → product links, footer quick-links, breadcrumbs.
- Minor: "SHOP NOW" / "Shop Now" button appears multiple times with identical link text to
/collections/all(Lighthouse flags duplicate link text) — use descriptive anchors.
3.6 E-E-A-T
- Experience/Expertise: heritage "since 1963," daily-sourcing model, 100% quality guarantee — strong on-page narrative.
- Authoritativeness: No press/awards (expected for a new store).
- Trustworthiness: HTTPS, visible policies (FAQ/delivery/returns), contact email, 5.0/5 Loox reviews, PO Box address. Solid for a new entrant.
4. International SEO
Not applicable — single locale (en-AU), Australia-only delivery, no multilingual content or hreflang. No action required.
5. Best Practices & Security
Score: 73 / 73 (both platforms).
5.1 Security Headers
| Header | Value observed | Assessment |
|---|---|---|
| Strict-Transport-Security | max-age=7889238 | ⚠️ max-age ~91 days (low); no includeSubDomains; no preload |
| X-Frame-Options | DENY | ✅ |
| X-Content-Type-Options | nosniff | ✅ |
| Content-Security-Policy | block-all-mixed-content; frame-ancestors 'none'; upgrade-insecure-requests | ⚠️ No script-src (Lighthouse: "missing script-src can allow execution of unsafe scripts") and no object-src (recommend 'none') |
| X-XSS-Protection | 1; mode=block | ✅ (legacy) |
| COOP | — | ⚠️ Missing (Cross-Origin-Opener-Policy) |
| Trusted Types | — | ⚠️ No CSP Trusted-Types directive |
Risk note: The CSP lacks script-src, so it does not actually constrain JavaScript execution — inline/app scripts run unrestricted. For a store handling checkout, tightening CSP (script-src with nonces/hashes, object-src 'none', add frame-ancestors already present) is advisable. HSTS should add includeSubDomains; preload and a longer max-age.
5.2 Modern Standards
- ✅ Valid HTML5, UTF-8 charset, no
document.write, no synchronous XHR detected. - ⚠️ Product images uploaded as
.heic(Apple format): e.g.IMG_6894_2.heic?...&width=840. HEIC is not natively supported by Chrome/Edge/Firefox. Verify rendering on non-Apple browsers — if Shopify CDN is not transcoding to JPEG/WebP, a large share of (non-iPhone) visitors could see broken product photos. This is a potential High-severity content/UX issue worth immediate verification. - Images not served in next-gen (WebP/AVIF) formats where
.jpgis used;.heicoriginals are an even bigger compatibility risk. - Deprecated
Attribution Reporting APIused by Shopify WPM (warning only).
6. Content Quality Assessment
6.1 Image Quality & Authenticity — AI-Generated Image (Brand-Critical)
Finding (High / brand-critical): The product "Fruit + Veggie Box – Curated Small" uses a ChatGPT-generated image as its hero photo. Confirmed: the asset ChatGPTImageAug13_2026at08_11_27AM.png is the src/srcset for the product image with alt="Fruit + Veg Box - Curated Small" (22 references on its product page; also rendered on the Curated Boxes collection). This is a single product (not store-wide), but it is a flagship curated box — exactly the hero product a premium "hand-selected, 60-years-heritage" brand should photograph with real produce.
Per the audit severity rubric, AI imagery for a brand whose entire positioning is "real, fresh, hand-selected produce" is a brand-authenticity mismatch. Recommend replacing with a real photograph.
No other AI-image signals found (no Gemini/Picsart/midjourney patterns across the 39 collections or product sitemap).
6.2 Thin / Empty Content (Root Cause of Missing Meta Descriptions)
Finding (High): All sampled products return an empty description in the Shopify product object (apple-gala, kiwi-fruit-gold, avocado-large-ea, strawberries-250g-punnet, eggs-... all ""). This is the direct cause of the missing meta descriptions on product and collection pages (Shopify auto-generates meta description from the product description when none is set). Empty descriptions also mean the Product JSON-LD description field is blank and there is no on-page SEO copy for category pages.
Recommendation: Write concise, keyword-rich descriptions for the ~200 SKUs (prioritise boxes, hero fruit/veg, and collections). This single fix resolves the meta-description gap at scale.
6.3 Trust Signals
- ✅ Phone/email (info@theproducesociety.com.au), PO Box address, delivery/returns/FAQ policies, 5.0/5 Loox reviews with photos, Instagram feed widget, ABR/registration not surfaced but not required.
- ⚠️ Organization schema does not expose contact/address/social
sameAs(see §3.3) — structured trust signals are under-used.
7. Priority Recommendations
🔴 Immediate (This Week)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 1 | Remove loading="lazy" + add fetchpriority="high" (and preload) to hero slider LCP image | Mobile LCP 15.8s → near-desktop; biggest single perf win | Low (theme edit) |
| 2 | Replace the ChatGPT-generated "Fruit + Veg Box – Curated Small" image with a real photo | Brand authenticity for flagship product | Low |
| 3 | Verify .heic product images render on Chrome/Android; convert to JPEG/WebP if broken | Prevents broken product photos for non-Apple visitors | Low–Med |
🟡 Short-Term (This Month)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 4 | Write product descriptions for all SKUs (fixes missing meta descriptions at scale) | SERP CTR + on-page SEO + Product schema | Med (bulk CSV) |
| 5 | Add twitter:image to all templates via theme.liquid | Social share previews | Low |
| 6 | Tighten CSP (script-src with nonce/hash, object-src 'none') + HSTS includeSubDomains; preload | Security hardening | Low–Med |
| 7 | Consolidate the 4 Google Tag Manager containers; defer Facebook/analytics; review app JS (EcomSend, giftbox, Maps) | ~1 MB less transfer; TBT ↓ | Med |
| 8 | Add aggregateRating/review to Product schema; enrich Organization (LocalBusiness, sameAs, contact, address); add SearchAction + ItemList | Rich results (stars, sitelinks) | Med (app/theme) |
🟢 Long-Term (This Quarter)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 9 | Implement responsive srcset/sizes correctly for all imagery (mobile saved 1.2 MB) | Perf + data savings | Med |
| 10 | Descriptive alt text on product/category images; keyword-rich image filenames | Image search + a11y | Med (bulk) |
| 11 | Reduce DOM size / slider nesting; trim preconnect to ≤4 origins | Perf headroom | Low–Med |
| 12 | Watch CrUX LCP trend ("good but regressing" +129 ms) as traffic grows | Early warning | Monitor |
Summary Score Card
| Category | Score | Grade |
|---|---|---|
| Performance (Mobile) | 48/100 | 🔴 |
| Performance (Desktop) | 82/100 | 🟡 |
| Accessibility | 99/100 | 🟢 |
| Best Practices | 73/100 | 🟡 |
| SEO | 92/100 | 🟢 |
| Content Quality | 70/100 | 🟡 (empty descriptions, 1 AI image) |
| Security | 75/100 | 🟡 (CSP incomplete, HSTS not preloaded) |
| Overall | ~80/100 | 🟡 |
Bottom line: A new store with strong foundations — real-user speed is good, accessibility and SEO are excellent. The work is (a) fix the mobile LCP config bug (lazy hero image), (b) close the content gap (write product descriptions; replace the one AI image), and (c) harden security headers. None are structural; all are fixable within a sprint.
Sources & Citations
- CrUX Vis (cruxvis.withgoogle.com) — field CWV: LCP 1567 ms / INP 77 ms / CLS 0.00 (as of 2026-08-15); "good but regressing" LCP trend. Accessed 2026-08-24.
- PageSpeed Insights UI (pagespeed.web.dev) — Lighthouse 13.4.1 lab scores: Mobile Perf 48 / A11y 99 / BP 73 / SEO 92; Desktop Perf 82 / A11y 95 / BP 73 / SEO 92. Mobile LCP 15.8s, FCP 2.9s, TBT 490ms, CLS 0; Desktop LCP 1.7s. Accessed 2026-08-24.
- Live DOM (browser console) — scripts 108, stylesheets 26, iframes 3, total elements 2,823 (home); images 72, empty-alt 35; single H1; lang=en; viewport present; JSON-LD types WebSite/Organization/BreadcrumbList (home), Product+BreadcrumbList (product, missing aggregateRating, empty description).
curl -sI— security headers (HSTS, X-Frame-Options DENY, X-Content-Type-Options nosniff, CSP partial, X-XSS-Protection).- robots.txt / sitemap.xml — crawl rules + sitemap index (products/collections/pages/blogs + agentic-discovery).
- product sitemap +
.jsendpoints — 200 SKUs; empty product descriptions confirmed on 5 sampled products. - collection sitemap (39 collections) + per-collection HTML — meta descriptions missing on collections; one ChatGPT-generated image on Curated Boxes / "Fruit + Veg Box – Curated Small".
- business-analysis.md (t_0ff4b098) — company context: Shopify D2C, heritage since 1963, $70 min order, Sydney metro, Loox reviews, app stack (Loox, Omnisend, PickEasy, EcomSend).
- PageSpeed Insights API — attempted; returned HTTP 429 (quota exhausted for default project), so lab data was obtained via the PSI browser UI instead (per established workflow).