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.

CategoryMobile ScoreDesktop ScoreGrade
Performance4882🔴 (Mobile) / 🟡 (Desktop)
Accessibility9995🟢
Best Practices7373🟡
SEO9292🟢
Overall7886🟡
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):

PeriodLCPINPCLSVerdict
2026-07-12 → 2026-08-081438 ms78 ms0.00Good (all)
2026-07-19 → 2026-08-151567 ms77 ms0.00Good (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)

MetricMobile (Slow 4G)RatingDesktopRatingThreshold (Good / Poor)
FCP2.9 sNeeds Improvement0.5 sGood≤1.8s / >3.0s
LCP15.8 sPoor1.7 sGood≤2.5s / >4.0s
TBT490 msNeeds Improvement130 msGood≤200ms / >600ms
CLS0.00Good0.001Good≤0.10 / >0.25
SI13.5 sPoor4.5 sNeeds 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).

PhaseDurationNote
Time to First Byte10 msExcellent (Shopify/Cloudflare edge)
Resource Load Delay490 msRender-blocking CSS/JS delaying discovery
Resource Load Duration520 msOversized image (3040px wide, ~270 KiB+)
Element Render Delay690 msloading="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)

IssueEvidenceEst. SavingsRecommendation
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 LCPAdd 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 KiBUse srcset/sizes correctly; Shopify CDN can auto-resize via ?width= — ensure theme requests appropriately sized variants.

High

IssueEvidenceEst. SavingsRecommendation
Third-party script bloatGoogle 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 transferConsolidate GTM containers (4 is excessive); load fb/analytics after interaction; review必要性 of every app (EcomSend, giftbox, maps).
Render-blocking CSS3 preload CSS + theme.css (600ms), section-header.css, accelerated-checkout CSS150 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 msReduce third-party JS; defer app scripts.
Large DOM (2,823 elements, 2,587 desktop)Lighthouse DOM statsTrim 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)

CategoryTransferNotes
First-party (site)~2.0 MBImages dominate (heic/jpg 840–2100px)
Google Tag Manager807 KiB4 containers — unusually high
Shopify hosting (apps)250–442 KiBEcomSend, instafeed, slots, webmcp
Facebook182 KiBfbevents
Omnisend / Loox / others~200 KiBCRM, 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 carry alt="". 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 with alt="".) Recommend descriptive alt on all product imagery.
  • Heading-order nit: a footer <h4 class="footer-item__title"> uses display: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

CheckStatusEvidence
robots.txtAllows crawl; disallows cart/checkout/account; includes Sitemap: directive.
XML Sitemapsitemap.xml index links product/collection/page/blog + agentic-discovery sitemaps.
Canonical URLsSelf-referencing on homepage, product, collection, pages (verified via DOM + curl).
IndexationNo noindex on key pages; checkout/cart correctly disallowed.
URL structureClean, hyphenated, descriptive (/products/apple-granny-smith, /collections/curated-boxes).
HTTPSEnforced (HSTS, Cloudflare); no mixed content.
Mobile-friendlyResponsive theme; viewport configured; content parity.
hreflang / i18nN/ASingle locale (en-AU), Australia-only. No multilingual needed.

3.2 On-Page SEO Issues

IssueSeverityEvidenceFix
Missing meta descriptions on product, collection, blog, and policy pagesHighVerified: 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-wideMediumtwitter: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-targetedLowH1 = "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 charsLowHomepage 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

TypeHomepageProductCollectionStatus
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.
BreadcrumbListPresent & 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).
ItemListCollections 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

HeaderValue observedAssessment
Strict-Transport-Securitymax-age=7889238⚠️ max-age ~91 days (low); no includeSubDomains; no preload
X-Frame-OptionsDENY
X-Content-Type-Optionsnosniff
Content-Security-Policyblock-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-Protection1; 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 .jpg is used; .heic originals are an even bigger compatibility risk.
  • Deprecated Attribution Reporting API used 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)

#IssueImpactEffort
1Remove loading="lazy" + add fetchpriority="high" (and preload) to hero slider LCP imageMobile LCP 15.8s → near-desktop; biggest single perf winLow (theme edit)
2Replace the ChatGPT-generated "Fruit + Veg Box – Curated Small" image with a real photoBrand authenticity for flagship productLow
3Verify .heic product images render on Chrome/Android; convert to JPEG/WebP if brokenPrevents broken product photos for non-Apple visitorsLow–Med

🟡 Short-Term (This Month)

#IssueImpactEffort
4Write product descriptions for all SKUs (fixes missing meta descriptions at scale)SERP CTR + on-page SEO + Product schemaMed (bulk CSV)
5Add twitter:image to all templates via theme.liquidSocial share previewsLow
6Tighten CSP (script-src with nonce/hash, object-src 'none') + HSTS includeSubDomains; preloadSecurity hardeningLow–Med
7Consolidate the 4 Google Tag Manager containers; defer Facebook/analytics; review app JS (EcomSend, giftbox, Maps)~1 MB less transfer; TBT ↓Med
8Add aggregateRating/review to Product schema; enrich Organization (LocalBusiness, sameAs, contact, address); add SearchAction + ItemListRich results (stars, sitelinks)Med (app/theme)

🟢 Long-Term (This Quarter)

#IssueImpactEffort
9Implement responsive srcset/sizes correctly for all imagery (mobile saved 1.2 MB)Perf + data savingsMed
10Descriptive alt text on product/category images; keyword-rich image filenamesImage search + a11yMed (bulk)
11Reduce DOM size / slider nesting; trim preconnect to ≤4 originsPerf headroomLow–Med
12Watch CrUX LCP trend ("good but regressing" +129 ms) as traffic growsEarly warningMonitor

Summary Score Card

CategoryScoreGrade
Performance (Mobile)48/100🔴
Performance (Desktop)82/100🟡
Accessibility99/100🟢
Best Practices73/100🟡
SEO92/100🟢
Content Quality70/100🟡 (empty descriptions, 1 AI image)
Security75/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 + .js endpoints — 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).