What CLS measures
CLS is unitless — it does not measure time or pixels, it measures cumulative shift impact across the lifetime of a page session. Each individual layout shift contributes an impact fraction (how much of the viewport shifted) multiplied by a distance fraction (how far it shifted). Those products sum into the final CLS score. Google considers under 0.1 'good' and over 0.25 'poor'. Most Squarespace 7.1 sites start somewhere between 0.15 and 0.35 before optimisation.
The three Squarespace CLS causes
Nearly every Squarespace CLS complaint reduces to one of three causes. (1) The custom font finishes loading after first paint and text reflows to its real dimensions, pushing content below the text downward. (2) An iframe — YouTube embed, Instagram embed, third-party widget — has no width or height attribute, so its container expands when the iframe contents load. (3) A late-mounting element (cookie banner, chat bubble, promotion bar) inserts itself into the DOM after the page has already rendered, pushing everything else down.
01. Font-swap shift
Custom fonts on Squarespace are served with default loading behaviour: text waits for the font file, then renders. If you have set Squarespace to render with a fallback first, the swap from fallback to brand font reflows text dimensions and pushes lower content down. The fix is font-display: optional (or swap) plus size-adjust on the fallback to match the brand font's metrics. All of it lives in Design > Custom CSS.
02. Iframes without dimensions
Squarespace's Embed Block accepts iframes from YouTube, Vimeo, Instagram, Twitter, and arbitrary third-party widgets. When the iframe loads without width and height attributes (or without a wrapping element with explicit dimensions), the browser allocates zero space until the iframe contents arrive, then expands. Lower content jumps. Fix it by adding aspect-ratio to the iframe's container, or width and height attributes directly on the iframe.
03. Late-mounting banners
Cookie consent banners, promotion bars, and chat widgets typically load via third-party scripts and mount into the DOM after the page has first painted. Every late mount that adds content above or below existing content pushes everything else, contributing to CLS. The fix is reserving space in the page at first paint for whatever the script is going to inject. A min-height on the wrapper element, or a placeholder div with the expected dimensions, keeps the layout stable.
Measure the result
After applying any of the three fixes, re-run PageSpeed Insights. Lab Data updates instantly — Lighthouse's CLS score should drop within seconds of saving the Custom CSS or Code Injection change. Field Data (real Chrome user data via CrUX) updates over the 28-day rolling window. Most Squarespace sites that apply all three fixes land in the 'good' band (CLS < 0.1) on the next lab run and on field data within four to eight weeks.