Skip to main content
Checklist

CLS (Cumulative Layout Shift) Checklist: 12 Items Every Ecommerce Store Should Audit

By ยท Updated ยท 7 min read

Why CLS Audits Require Ecommerce-Specific Checks

Cumulative Layout Shift (CLS) measures how much page content moves unexpectedly during load. Google's Core Web Vitals threshold for a passing score is 0.1 or below; scores above 0.25 are considered poor. For ecommerce stores, CLS is particularly damaging because layout shifts happen near add-to-cart buttons, price displays, and promotional banners โ€” exactly where purchase decisions are made.

Generic CLS guides cover image sizing and font loading, but ecommerce stores introduce additional sources of shift: dynamic inventory badges, personalization widgets, cookie consent banners, review carousels, and live pricing. This checklist targets all 12 of those vectors with explicit pass/fail criteria so any developer or in-house team can run the audit without guessing.

The 12-Item CLS Audit Checklist

1. IMAGE DIMENSIONS DECLARED IN HTML โ€” Pass: every <img> tag includes explicit width and height attributes or an aspect-ratio CSS rule. Fail: any image loads without reserved space, causing the surrounding content to reflow when the image renders.

2. PRODUCT IMAGE CONTAINERS USE ASPECT-RATIO CSS โ€” Pass: product image wrappers define aspect-ratio (e.g., aspect-ratio: 1/1) so the container holds its height before the image byte arrives. Fail: containers collapse to zero height and expand on load, shifting product titles and prices downward.

3. WEB FONTS LOADED WITH font-display: optional OR swap โ€” Pass: all custom typefaces use font-display: optional (preferred for stability) or font-display: swap with a closely matched fallback. Fail: fonts load with default block behavior or swap to a significantly different metric font, causing text reflow that shifts surrounding elements.

4. FONT FALLBACK METRICS MATCH PRIMARY FONT โ€” Pass: fallback fonts use size-adjust, ascent-override, and descent-override CSS descriptors to match the primary font's metrics. Fail: the fallback font is noticeably taller or wider than the web font, producing visible text jump when the custom font swaps in.

5. COOKIE CONSENT BANNER DOES NOT PUSH CONTENT โ€” Pass: the consent banner is fixed-position or absolute-position so it overlays content rather than inserting into the document flow. Fail: the banner renders as a block element that pushes the header, hero image, or navigation downward on load.

6. PROMOTIONAL BANNERS AND ANNOUNCEMENT BARS HAVE RESERVED HEIGHT โ€” Pass: the space for the announcement bar or promotional ribbon is pre-allocated in the page layout, even before the CMS content loads. Fail: the bar injects dynamically and shifts the navigation or hero section when it appears.

7. REVIEW AND RATING WIDGETS HAVE FIXED CONTAINERS โ€” Pass: star-rating and review count widgets load inside a container with a declared min-height that matches the rendered widget. Fail: the widget renders late via JavaScript and displaces the add-to-cart button or product description.

8. PERSONALIZATION AND RECOMMENDATIONS SLOTS ARE SKELETON-LOADED โ€” Pass: any dynamic recommendation carousel, recently-viewed module, or personalized upsell block shows a skeleton placeholder with fixed dimensions before the real content populates. Fail: the slot is empty (height: 0) until the API call resolves, then expands and pushes footer or sibling content.

9. INVENTORY BADGES AND URGENCY LABELS ARE PRE-ALLOCATED โ€” Pass: 'Low stock', 'Only 3 left', and 'Sale' badges are either always present (hidden or visible) or their container space is reserved regardless of badge state. Fail: badges inject on top of product titles or price elements after the initial paint, causing a visible shift.

10. THIRD-PARTY CHAT AND SUPPORT WIDGETS ARE POSITIONED FIXED โ€” Pass: live chat buttons, support launchers, and exit-intent overlays use position: fixed and do not affect document flow. Fail: any third-party widget renders inline or triggers a layout recalculation that moves product grid items.

11. LAZY-LOADED IMAGES BELOW THE FOLD USE EXPLICIT DIMENSIONS โ€” Pass: all images with loading='lazy' still carry width, height, or aspect-ratio attributes so the browser reserves space before the image enters the viewport. Fail: lazy images have no dimensions, causing a sudden layout shift when the user scrolls near them.

12. CLS IS MEASURED IN THE FIELD (CrUX DATA), NOT ONLY IN LAB โ€” Pass: the store monitors CLS using real-user data from Google Search Console's Core Web Vitals report or a Real User Monitoring (RUM) tool, and the 75th-percentile CLS is at or below 0.1. Fail: the team relies solely on Lighthouse scores, which run in a controlled lab environment and miss shifts triggered by dynamic content, A/B tests, and personalization.

How to Run the Audit Efficiently

Start with Google Search Console's Core Web Vitals report to identify which URL groups (PDPs, category pages, checkout) have failing field CLS. This focuses effort on the highest-traffic pages first rather than auditing everything simultaneously.

For each flagged URL, open Chrome DevTools and record a Performance trace. The Layout Shift Clusters panel names every element that shifted and the cumulative score contribution. Cross-reference that element list against the 12 checklist items above to find the exact cause. WebPageTest's filmstrip view gives a frame-by-frame visual that is faster for non-developers to interpret.

Common Ecommerce CLS Failure Patterns by Page Type

Product detail pages fail most frequently on checks 7, 8, and 9 โ€” review widgets, recommendation slots, and inventory badges all load asynchronously after the main product image. Category and collection pages fail most often on checks 2 and 6, because product image grids without aspect-ratio containers collapse and re-expand as images trickle in.

Checkout pages carry lower traffic but high conversion value, and fail most on checks 5 and 10 โ€” cookie banners and chat widgets shift the payment form. A single layout shift near a 'Place Order' button is a measurable conversion threat. Cart pages and upsell modals fail on check 8 when recommendation APIs run slower than the page paint.

Actionable Fix Priority for the Highest CLS Impact

Fix checks 1 and 2 first โ€” image dimensions and aspect-ratio containers โ€” because images are the single largest source of CLS on most ecommerce pages and the fix is a few lines of CSS or HTML attributes. No JavaScript changes are required, and the improvement shows up in field data within 28 days as Google refreshes CrUX.

Address checks 5 and 6 second, as consent banners and announcement bars are architectural issues that block all other fixes if left in document flow. Then move to checks 7, 8, and 9, which require coordination with your review platform vendor, recommendation engine, and inventory feed. Set a specific target: every dynamic block receives a skeleton loader with a min-height equal to the rendered component's median height across the product catalog.

Frequently asked questions

What is a passing CLS score for an ecommerce store?

Google classifies a CLS score of 0.1 or below as 'Good.' Scores between 0.1 and 0.25 need improvement, and scores above 0.25 are 'Poor.' The threshold applies to the 75th percentile of page loads measured in real-user field data, not just lab scores. Ecommerce stores should target 0.1 or below on product pages, category pages, and checkout flows.

How does a cookie consent banner cause CLS?

When a consent banner renders as a block-level element in the document flow, the browser inserts it above existing content and pushes the header, navigation, or hero image downward. This reflow counts as layout shift. The fix is positioning the banner as fixed or absolute so it overlays content without affecting the document flow and contributes zero to the CLS score.

Why does Lighthouse show a good CLS score but Search Console shows a failing score?

Lighthouse runs a single lab simulation with no personalization, A/B tests, or third-party widgets fully loaded. Field data in Search Console captures real users experiencing dynamic content: recommendation carousels, logged-in price variants, inventory badges, and chat widgets. These inject after initial paint and register as layout shifts that lab tools never trigger. Always treat field CLS as the authoritative score.

Does lazy loading images cause CLS?

Lazy loading does not cause CLS if images include explicit width and height attributes or an aspect-ratio CSS rule. The browser reserves the correct space before the image loads. CLS occurs when lazy-loaded images have no declared dimensions, so the container collapses to zero height and expands when the image enters the viewport, shifting surrounding content as the user scrolls.

How often should an ecommerce store re-run this CLS checklist?

Run the full checklist after any theme update, new app or widget installation, changes to the promotion bar or consent banner setup, and whenever the Google Search Console Core Web Vitals report shows a score regression. For large stores deploying weekly, a monthly automated Lighthouse CI check against each page type catches regressions before they accumulate in the 28-day CrUX field data window.

MG
Written by

Matt is the founder of RunOctopus. He built All Angles Creatures from zero to page-1 rankings in reptile feeder insects in under 60 days using exactly this method โ€” turning a hard, entrenched niche into RunOctopus's proof store for programmatic SEO and AI search citation.

Connect on LinkedIn →

See what Otto would build for your store

Free architecture preview. No card required. Five minutes.

Generate Preview →