Every Squarespace fix we catalog

SEOLZ catalogs 167 fixes for Squarespace across 6 areas — SEO, answer-engine readiness, accessibility, security and site-health. Each lists the exact steps for Squarespace, with a link to the official docs.

SEO · 45 fixes

Catalog coverageModerate effort

Ensure every product and category page is crawlable and discoverable by submitting a complete XML sitemap, fixing internal links, and removing any crawl blocks so Google can index your full catalog.

On Squarespace

  1. Sitemap: Squarespace auto-generates a sitemap at /sitemap.xml. Submit it via Google Search Console. Ensure your store pages are not set to 'Not Linked' or hidden, as unlisted pages may be excluded.
  2. Noindex: In Pages panel, click the gear icon (⚙) next to each Store page or product category → SEO tab → confirm 'Hide Page from Search Engines' is unchecked.
  3. Store visibility: Commerce → Inventory → confirm all products are set to 'Visible'. Squarespace excludes hidden/out-of-stock products from the sitemap depending on your settings.
  4. Internal linking: Ensure your store page appears in your Main Navigation (Pages → drag store to Main Navigation section). Add category links as folder navigation items if needed.
  5. Individual product SEO: In Commerce → Inventory → click a product → SEO tab → verify the SEO title and description are set and the page is indexable.
Cwv clsModerate effort

Eliminate unexpected layout shifts by reserving explicit space for every image, video, embed, ad, and late-loading widget before it loads, so nothing on your page jumps around as it renders.

On Squarespace

  1. Images: Squarespace automatically outputs width and height on images rendered through its native Image Blocks and Product Gallery blocks — keep images in these native blocks rather than embedding raw <img> tags in Code Blocks.
  2. Avoid using Code Blocks to inject images or external embeds above the fold; use native Squarespace content blocks wherever possible.
  3. Fonts: Go to Design > Fonts and choose from Squarespace's built-in font library. These are loaded with font-display: swap by Squarespace's renderer. If you have added custom fonts via Design > Custom CSS (@font-face), add font-display: swap; to each declaration.
  4. Announcement bars and banners: Use the native Announcement Bar (Pages > Announcement Bar) rather than injecting a banner via Settings > Advanced > Code Injection. The native bar is pre-sized in the layout.
  5. Third-party scripts and pop-ups: Scripts added via Settings > Advanced > Code Injection (Header) run early and can cause CLS. Move non-critical scripts to the Footer injection area. Configure any pop-up or chat widget to be position: fixed so it does not displace page content.
  6. Cookie banners: Use Squarespace's built-in Cookie Banner (Settings > Cookies & Visitor Data) which renders in a fixed position. Third-party cookie scripts injected into the header are a common CLS culprit on Squarespace — switch to the native option.
Cwv lcpModerate effort

Reduce Largest Contentful Paint (LCP) to under 2.5 seconds by serving your hero image in a modern format, preloading it, and eliminating render-blocking resources.

On Squarespace

  1. Replace your hero/banner image with a WebP version: Pages → click your homepage → click the banner/header block → Edit → swap the image for a WebP file. Squarespace's CDN (powered by Fastly) serves images efficiently but uses the format you upload.
  2. Keep the hero image file size under 500 KB before uploading: Squarespace does not allow direct control over preload tags without Custom Code injection.
  3. Inject a preload hint: go to Settings → Advanced → Code Injection → paste into the Header field: <link rel='preload' as='image' href='YOUR-WEBP-IMAGE-URL' fetchpriority='high'>. Find the exact CDN URL by right-clicking the image on your live page → Copy Image Address.
  4. Reduce render-blocking third-party scripts: Settings → Advanced → Code Injection → review any scripts in Header/Footer and move non-critical ones to the Footer field. Add 'defer' attribute to any script tags you control.
  5. Disable unnecessary Squarespace extensions/plugins (Extensions → your installed extensions) that inject JS on every page load.
  6. Verify with PageSpeed Insights. Note: Squarespace limits low-level performance tuning; if LCP remains above 2.5s after these steps, consider whether a platform with more control is appropriate for your business.
Duplicate meta descriptionModerate effort

Write a unique, page-specific meta description for every page on your store so Google can display a relevant snippet in search results.

On Squarespace

  1. For regular pages: in the Pages panel, hover over the page → click the gear icon (Settings) → SEO tab → fill in 'SEO Description' → Save.
  2. For product pages: open the Store page → click the product → click the gear/settings icon → SEO tab → 'SEO Description' → Save.
  3. For blog posts: open the post in the editor → gear icon → SEO tab → 'SEO Description' → Save.
  4. For the homepage: Pages → hover over the homepage → gear icon → SEO tab → SEO Description.
  5. Note: Squarespace does not have a native bulk-edit SEO tool; you must edit descriptions page by page, or use a third-party SEO integration (e.g. SEOSpace or Yoast for Squarespace) for batch workflows.
Duplicate titleModerate effort

Write a unique, descriptive title tag for every page on your store so no two pages share the same title.

On Squarespace

  1. For regular pages: In the Pages panel, hover over the page, click the gear icon (Page Settings), go to the 'SEO' tab, and enter a unique title in the 'SEO Title' field.
  2. For product pages (Commerce): go to the store section, click on a product to edit it, then select the 'SEO' tab within the product editor and fill in the 'SEO Title'.
  3. For blog posts: open the post editor, click the gear icon, go to the 'SEO' tab, and set a unique 'SEO Post Title'.
  4. For site-wide defaults: Settings → SEO → set the 'Site Title Format' to a pattern that includes the page name (e.g. Page Title | Site Title) — this helps auto-generate distinct titles for pages that don't yet have a manually set SEO title.
  5. Note: Squarespace does not allow direct editing of theme template files for title tags in standard plans; use the per-page SEO fields as described above.
Faceted url indexableModerate effort

Point every faceted/filter URL's canonical tag to the clean, unfiltered category URL (or add noindex) so Google treats filtered pages as one authoritative page instead of thousands of duplicates.

On Squarespace

  1. Squarespace does not have a built-in faceted/layered navigation system, so filter parameters typically come from third-party JavaScript widgets or custom code blocks.
  2. Go to Pages → the relevant Shop or Category page → Settings (gear icon) → SEO tab. Confirm the canonical URL shown is the clean page URL without parameters. Squarespace sets this automatically and it should not include query strings.
  3. If you have embedded a third-party filter widget (e.g., via Code Block or Code Injection), check that widget's settings for a canonical or noindex option and set it to point to the base page URL.
  4. To add a noindex tag to parameterized filter URLs, go to Settings → Advanced → Code Injection and add JavaScript that conditionally injects `<meta name='robots' content='noindex'>` into the `<head>` when URL parameters are detected: use `if (window.location.search) { document.querySelector('head').insertAdjacentHTML('beforeend', '<meta name="robots" content="noindex, follow">'); }`
  5. Squarespace's sitemap is auto-generated and does not include query-string URLs, so no sitemap action is needed.
Images missing altModerate effort

Add descriptive alt text to every image on your store so search engines can understand them and all shoppers can access your content.

On Squarespace

  1. In the Pages panel, open the page and click on an image block to enter edit mode.
  2. Click the image, then click the pencil (Edit) icon.
  3. In the image editor dialog, click the 'Design' or 'Image' tab and look for the 'Alt Text' field. Enter your description and click 'Apply'.
  4. FOR PRODUCT IMAGES (Squarespace Commerce): Go to Commerce > Inventory, open a product, scroll to the images section, hover over an image, click the pencil icon, and fill in the 'Alt Text' field.
  5. FOR GALLERY BLOCKS: Click the gallery block > pencil icon > select an individual image > fill in the 'Alt text' field in the image settings.
Low performance scoreLarger project

Improve your Lighthouse/PageSpeed performance score by reducing page weight, deferring JavaScript, optimizing images, and fixing Core Web Vitals metrics so your store loads fast on mobile and desktop.

On Squarespace

  1. Images — In the Pages panel, edit each page and click every image block → Image Settings → set focal point; Squarespace auto-serves WebP and resizes via its CDN when you upload correctly-sized originals (keep source files under 500 KB and no wider than 2500 px).
  2. Remove third-party scripts — Settings → Advanced → Code Injection: audit the <head> and footer code blocks. Remove any unused analytics, chat, or marketing scripts.
  3. Fonts — Design → Fonts: limit your selection to 1–2 font families; each additional font family adds an external request. Use system fonts (e.g., '-apple-system, sans-serif') via custom CSS for body text if performance is critical.
  4. Page sections — Edit each page and delete or hide any sections/blocks that are not visible or not needed; hidden blocks still load their assets in some Squarespace versions.
  5. Commerce scripts — Extensions → (review): uninstall any Squarespace Extensions that inject scripts if you are not actively using them.
  6. Video — Replace background videos on mobile by going to the section settings and toggling 'Disable video on mobile' — this alone dramatically improves mobile LCP.
Meta description too longQuick win

Shorten your meta description to 150–160 characters so Google displays your full message in search results instead of cutting it off with "…".

On Squarespace

  1. For regular pages: in your Squarespace editor, hover over the page in the Pages panel and click the gear icon (Page Settings) → SEO tab. Edit the 'SEO Description' field. Keep it under 160 characters.
  2. For Products (Squarespace Commerce): go to Commerce → Inventory → click the product → click the SEO tab → edit 'Description'.
  3. For Blog posts: open the post → click the gear/settings icon → SEO tab → edit the description.
  4. Squarespace does not enforce a limit in the field; count characters manually or use a browser extension.
  5. Click 'Save' to apply changes. No separate publishing step is required.
Meta description too shortModerate effort

Expand every meta description to 120–160 characters so Google shows your custom summary in search results instead of auto-generating one.

On Squarespace

  1. For a standard page: In the Pages panel, hover over the page → click the gear icon → 'SEO' tab → edit the 'SEO Description' field → Save.
  2. For a product: Commerce → Inventory → click the product → 'SEO' tab → edit the 'SEO Description' → Save.
  3. For a blog post: open the post editor → click the gear icon (top right) → 'SEO' tab → SEO Description → Save.
  4. For a collection/folder landing page: Pages panel → gear icon on the folder → SEO tab → SEO Description → Save.
  5. Note: Squarespace caps its SEO description field display at around 400 characters but Google will truncate at ~160; aim for 120–160 characters.
Missing canonicalModerate effort

Add a self-referencing canonical tag to every page so Google knows which URL is the "official" version of that content.

On Squarespace

  1. Squarespace automatically generates self-referencing canonical tags for all pages — no manual configuration is needed.
  2. Confirm the tag is present by opening any page, right-clicking → View Page Source, and searching for `rel="canonical"`.
  3. If you need to override the canonical for a specific page (rare), go to Pages → click the gear icon next to the page → SEO tab → Advanced → paste the preferred URL into the 'Canonical Tag' override field (available on Business plans and above).
  4. For product pages in Squarespace Commerce, the canonical is set to the clean product URL automatically; ensure you are not duplicating products across multiple pages which would require manual canonical management.
Missing h1Quick win

Add a single, descriptive H1 heading to every page that currently lacks one, so search engines and shoppers immediately understand what the page is about.

On Squarespace

  1. Open the page in the Squarespace Pages editor.
  2. Click the text block that should serve as your main page heading.
  3. Highlight the text, open the text format toolbar, and select **'Heading 1'** from the style dropdown. Squarespace outputs Heading 1 as `<h1>`.
  4. For **Squarespace Commerce product pages**, the product title is automatically output as an H1 by the built-in product block — ensure the product has a clear, keyword-rich title under Commerce → Inventory → [product] → Title.
  5. For **blog posts**, the post title field is automatically the H1 — make sure every post has a descriptive title.
  6. Save/publish and verify using your browser's 'View Page Source' (Ctrl+U / Cmd+U) and search for `<h1>` to confirm it is present and contains the right text.
Missing meta descriptionQuick win

Write a unique meta description of 120–160 characters for every page so Google has compelling snippet text to show in search results.

On Squarespace

  1. For a regular page: open the Pages panel → hover over the page → click the settings gear (⚙) → go to the 'SEO' tab → fill in 'SEO Description' → Save.
  2. For a product (Squarespace Commerce): Pages → your store page → click the product → switch to the 'SEO' tab in the product editor → fill SEO Description → Save.
  3. For the homepage: Pages → hover over the homepage → settings gear → SEO tab → fill description.
  4. For blog posts: open the blog page → click the post → Content tab → Post Settings → SEO tab → fill SEO Description.
  5. Note: Squarespace has a 400-character field limit but aim for 160 characters to avoid truncation in Google.
Missing og descriptionQuick win

Add an og:description meta tag to every page so social platforms display a compelling preview when your store's links are shared.

On Squarespace

  1. For a regular page: in the Pages panel, hover over the page → click the gear icon (Page Settings) → SEO tab → fill in 'SEO Description'. Squarespace uses this value as og:description.
  2. For a product: open the product editor → click the gear/settings icon → SEO tab → fill in 'SEO Description'.
  3. For a blog post: open the post editor → Post Settings → SEO tab → fill in 'SEO Description'.
  4. For a site-wide fallback: Settings → SEO → Site Description — Squarespace falls back to this when no page-level description is set.
  5. Preview how the share card looks via Settings → Social Links → connect your Facebook account, or paste the URL into the Facebook Sharing Debugger.
  6. Note: Squarespace does not expose direct HTML head editing on most plans; using the SEO Description fields is the supported path.
Missing og imageModerate effort

Add an og:image meta tag to every page so social media platforms and messaging apps display a rich preview image when someone shares your store's link.

On Squarespace

  1. For a site-wide social sharing image (used as the og:image fallback): go to Settings → Social Links → scroll down to 'SEO' or 'Social Sharing' → upload a 'Social Sharing Logo' or 'Default Social Image' (1200×630 px recommended).
  2. For individual pages: open the Pages panel, hover over the page → click the gear icon (Page Settings) → Social Image tab → upload a custom image for that specific page.
  3. For product pages in Squarespace Commerce: the product's main image is used automatically as the og:image. Ensure every product has a clear, high-resolution primary image uploaded.
  4. For blog posts: set a Thumbnail Image in the post settings (click the post → Settings → Thumbnail) — Squarespace uses this as the og:image for the post.
  5. Validate with the Meta Sharing Debugger to confirm images appear correctly.
Missing og titleQuick win

Add an og:title meta tag to every page so your store looks great when shared on Facebook, Pinterest, LinkedIn, and other social platforms.

On Squarespace

  1. Squarespace automatically outputs og:title for most pages based on the page title and SEO title fields — verify these are populated first.
  2. For any page: in the Pages panel, hover over the page → click the gear/settings icon → SEO tab → fill in 'SEO Title'. Squarespace uses this value as the og:title.
  3. For Squarespace Commerce products: go to Commerce → Inventory → click a product → click the gear icon → SEO → set the 'SEO Title' field.
  4. For blog posts: open the post → click the gear icon → SEO tab → set the title.
  5. If you need to inject a fully custom og:title (advanced use): go to Website → Pages → click the gear on a page → Advanced → Page Header Code Injection and add: <meta property="og:title" content="Your Custom Title" />. Note this overrides per-page only.
  6. Validate using the Facebook Sharing Debugger after publishing changes.
Missing titleQuick win

Add a unique, descriptive title tag (30–60 characters) to every page that is missing one.

On Squarespace

  1. For a regular page: open the Pages panel → hover over the page → click the gear icon (Settings) → go to the 'SEO' tab → fill in the 'SEO Title' field.
  2. For a product: go to Commerce → Inventory → select the product → click the 'SEO' tab → fill in 'SEO Title'.
  3. For the homepage: Pages → hover over the homepage → gear icon → SEO tab → SEO Title.
  4. If the SEO Title field is left blank, Squarespace falls back to the page/product title — make sure at least the page title is set even if you don't customise the SEO title separately.
  5. Click Save.
Multiple h1Moderate effort

Reduce every page to exactly one H1 tag that clearly describes the page's main topic, removing or converting all extra H1s to lower-level headings (H2, H3, etc.).

On Squarespace

  1. Open Pages in your Squarespace dashboard and click 'Edit' on the affected page.
  2. Click each text block. Squarespace text blocks show a format picker — look for any block set to 'Heading 1' that is not the page's primary title.
  3. Click such a block, select all its text, and change the format from 'Heading 1' to 'Heading 2' or 'Heading 3' in the format dropdown.
  4. Note: Squarespace automatically wraps certain page/collection titles in an H1 via its template (e.g., blog post title, product name). Avoid also adding a manual 'Heading 1' text block for the same content.
  5. For the site-wide header (Business Name / Site Title): Squarespace renders this in a <h1> on the homepage but as a <p> or logo on inner pages in most templates — confirm this by viewing page source (Ctrl+U) and searching for '<h1'.
  6. After saving and publishing, use a browser DevTools check or the 'Headings Map' extension to confirm exactly one H1 per page.
Noindex detectedQuick win

Remove or replace the `noindex` directive on any page you want Google to find and rank, then verify the change with Google Search Console.

On Squarespace

  1. For individual pages: open the Pages panel → hover over the page → click the gear icon (Page Settings) → SEO tab → look for 'SEO Visibility' or 'Hide Page from Search Engines' — ensure it is NOT enabled.
  2. For the whole site: Settings → SEO → Site Visibility — confirm it is set to 'Public' and search engine visibility is enabled.
  3. Squarespace does not natively allow injecting noindex per-page without Code Injection, so also check: Settings → Advanced → Code Injection (or per-page Settings → Advanced → Page Header Code Injection) for a manually added `<meta name="robots">` tag and remove it.
Non self canonicalModerate effort

Ensure every page's canonical tag points to that same page's own URL — fix any canonical that currently points to a different page unless the redirect is genuinely intentional.

On Squarespace

  1. Squarespace outputs self-referencing canonical tags automatically for all page types.
  2. A non-self canonical in Squarespace almost always comes from a custom code injection. Go to Pages → click the affected page gear icon (Settings) → Advanced → 'Page Header Code Injection'.
  3. Look for a <link rel="canonical"> tag injected there and remove or correct it.
  4. Also check Settings → Advanced → Code Injection (site-wide header injection) for a stray canonical tag that applies to all pages.
  5. If you use a third-party SEO plugin connected via Developer mode, check that plugin's configuration.
Page speed warningModerate effort

Reduce your page load time to under 1.5 seconds by compressing images, eliminating render-blocking resources, and enabling caching so Google and shoppers experience a fast site.

On Squarespace

  1. Images: In the Pages panel, edit each section and click each image block. Upload images at the actual display width (Squarespace max display is ~2500px; use that as your ceiling). Squarespace automatically converts to WebP and serves via Fastly CDN.
  2. Third-party scripts: In Settings → Advanced → Code Injection, audit any scripts in 'Header' or 'Footer'. Move scripts to Footer and add 'defer' attributes. Remove scripts for tools you no longer use.
  3. Extensions/integrations: In Extensions (Commerce plans), remove any unused extensions.
  4. Video: Avoid full-page autoplaying video banners on mobile. In the Design panel for video blocks, disable autoplay on mobile.
  5. Fonts: In Design → Fonts, limit the number of different font families to 2 — each additional font family adds an extra HTTP request.
  6. Verify: Run Google PageSpeed Insights. Squarespace controls core infrastructure, so the biggest owner-controllable wins are image optimisation and reducing injected scripts.
Search results indexableModerate effort

Add a noindex robots meta tag to all internal search results pages and block the search path in robots.txt to prevent thin, duplicate, near-infinite pages from polluting Google's index.

On Squarespace

  1. In your Squarespace admin, go to Pages and locate your Search Page.
  2. Click the gear icon → SEO tab and check 'Hide Page from Search Engines' — this inserts a noindex meta tag.
  3. For robots.txt: Squarespace automatically generates robots.txt but does not currently provide a user-editable interface. You can inject a noindex meta tag via Settings → Advanced → Code Injection (add it only conditionally using Squarespace's {squarespace.page} context, or apply site-wide with a JavaScript check on window.location).
  4. Use a Code Block with custom JavaScript or the Header Code Injection to detect the search URL and insert the meta tag: if(window.location.pathname.includes('/search')){document.head.insertAdjacentHTML('beforeend','<meta name="robots" content="noindex,follow">')}
  5. Verify by loading a search results URL and using a browser extension or View Source to confirm the noindex tag.
Seo category description missingQuick win

Write a unique 100–200 word description for every product category page explaining what it contains and who it's for.

On Squarespace

  1. In your Squarespace admin, go to Pages and open the Category or Folder page that acts as your category landing page.
  2. Click 'Edit' to open the page editor, then add a Text Block above or below your product grid.
  3. Write your 100–200 word description in the Text Block.
  4. For the SEO meta description, click the gear icon (Page Settings) → SEO tab → fill in the 'SEO Description' field.
  5. If you're using Squarespace Commerce category pages specifically, note that native category pages have limited customisation; consider using a Regular Page as a category landing page with a Products Block filtered by category for full editorial control.
  6. Click 'Save' and then 'Done'.
Seo category description thinModerate effort

Expand your category page description to at least 150–300 words of genuinely useful, keyword-rich content that explains what shoppers will find in the category.

On Squarespace

  1. In Squarespace, go to the Commerce section → Categories (if using the built-in store category feature), or navigate to the Store page in Pages.
  2. Squarespace does not have a native per-category description field in older versions — add a Text Block above or below the Product Block on the category page.
  3. Click the '+' icon to add a block, choose 'Text', and write your expanded description.
  4. For Squarespace 7.1 stores, you can also edit the Category page directly by clicking into the page and inserting a text section above the product grid.
  5. Click 'Save' when finished.
Seo category emptyQuick win

Either populate the empty category with relevant products, or apply a noindex tag and remove it from navigation so Google does not waste crawl budget on a page with no content.

On Squarespace

  1. To ADD products: Pages panel → click your Store page → click the empty category folder → Add products or drag existing products into that category.
  2. To NOINDEX: Pages panel → hover the store category page → gear icon (Settings) → SEO tab → paste <meta name='robots' content='noindex'> into 'Page Header Code Injection' → Save. (Requires a Business plan or higher for code injection.)
  3. To HIDE from nav: Pages panel → drag the category page from the main navigation into the 'Not Linked' section so it no longer appears in menus but still exists, or delete it outright.
  4. To DELETE and REDIRECT: Pages panel → hover the page → Settings → delete. Then go to Settings → Advanced → URL Redirects → add a 301 from the old path to the parent store or relevant category.
Seo category sparseModerate effort

Add more products to the category or consolidate it with a closely related one so Google sees a substantive, valuable page worth ranking.

On Squarespace

  1. In the Squarespace Pages panel, locate the Store page and find the sparse category.
  2. To add products: open each relevant product, click 'Organize' in the product editor, and assign it to the target category.
  3. To add a category description: Squarespace doesn't natively show a category description on the page by default — add descriptive text via a 'Text' or 'Markdown' block above the product grid on the category page if your template supports it, or add it as a page header.
  4. To merge: reassign all products to the target category, then delete the old/empty category from the Store settings.
  5. Create a URL redirect: go to Settings → Advanced → URL Mappings and add a line such as: /store/old-category-slug → /store/new-category-slug 301
  6. Submit the target category URL in Google Search Console and request indexing.
Seo facet url not canonicalizedModerate effort

Add a canonical tag pointing filtered and sorted category URLs back to the clean (unfiltered) category page URL to prevent duplicate content and crawl waste.

On Squarespace

  1. Squarespace Commerce does not natively support faceted filtering in the same way as other platforms, so filter-generated duplicate URLs are less common. However, tag and category filter URLs (e.g., /shop?tag=X) can create duplicates.
  2. Squarespace automatically sets canonical tags on most page types, but custom canonical control per URL is limited in the standard interface.
  3. Go to Pages → select the Shop page → gear icon (Settings) → SEO tab. Confirm the SEO settings look correct. There is no per-filter-URL canonical field here.
  4. For stores that need filter URL canonicalization, inject a canonical tag via Settings → Advanced → Code Injection (available on Business plan and above). In the 'Header' code injection box, add JavaScript that checks for query parameters and injects a canonical link element pointing to the clean shop URL: `<script>if(window.location.search){var l=document.createElement('link');l.rel='canonical';l.href=window.location.origin+window.location.pathname;document.head.appendChild(l);}</script>`
  5. Test by visiting a filtered shop URL, viewing source, and confirming a canonical tag is present pointing to the base shop URL.
Seo product description minimalModerate effort

Expand thin product descriptions to at least 300 words by adding specifications, use cases, and benefits so Google has enough content to rank and shoppers have enough information to buy.

On Squarespace

  1. Go to your Squarespace Dashboard → Commerce (or Pages) → your product collection, then click the product.
  2. In the product editor, click the 'Description' field to open the inline block editor.
  3. Add content blocks: use Text blocks for paragraphs, Bullet List blocks for specs, and additional Text blocks for use cases and FAQs.
  4. To add a specs table, insert a Markdown block and write a Markdown table, or use the built-in Table block if your template supports it.
  5. For additional structured content (e.g. 'What's in the Box'), scroll down to 'Additional Info' / 'More Details' — in Squarespace 7.1 this is handled via additional content blocks inside the same product editor.
  6. Click 'Save' when finished.
Seo product description missingModerate effort

Write and publish a 200–400 word product description covering what the product is, its key specs, who it's for, and how to use it.

On Squarespace

  1. In your Squarespace Dashboard, go to Commerce → Inventory (or Products, depending on your version) and click the product.
  2. In the product editor, locate the Description field below the product images.
  3. Click Edit and write your 200–400 word description. Use the text toolbar for bullet lists and bold text.
  4. Click Save. Squarespace automatically includes this description in the page body and in its product JSON-LD markup.
  5. For additional SEO control, click the SEO tab inside the product editor and fill in the SEO Description field with a concise 150–160 character meta description summary.
Seo product description thinModerate effort

Expand thin product descriptions to at least 300 words of unique, keyword-rich content that answers real shopper questions and gives Google enough text to understand what you sell.

On Squarespace

  1. Go to your Squarespace dashboard → Commerce (or Pages if using a product block) → Inventory → click the product.
  2. In the product editor, click into the 'Description' field.
  3. Use the rich-text toolbar to write your expanded description — add paragraphs, bullet lists, and bold headings.
  4. Click 'Save'. Squarespace Commerce renders product descriptions in the page HTML and they are crawlable by Google.
  5. Note: Squarespace does not offer a separate 'long description vs. short description' split — put all content in this single field and use formatting to create visual hierarchy.
Seo product image alt filenameModerate effort

Replace filename-based alt text on product images with short, descriptive phrases that accurately describe each image's content.

On Squarespace

  1. Open a product page in the Squarespace Pages panel.
  2. Click on the product image block to select it, then click the pencil (Edit) icon.
  3. In the image editor, click 'Design' and then find the 'Alt text' field (labeled 'Alt Text' or 'Filename / Alt Text' depending on your version).
  4. Enter your descriptive alt text and click 'Apply'.
  5. For Squarespace Commerce products: go to Commerce → Inventory → open a product → click the product image → look for the alt text/caption field in the image editor that appears.
  6. Note: Squarespace 7.1 surfaces alt text in the image block settings; if you cannot find the field, switch to the 'Design' tab inside the image editor.
Seo product missing brandQuick win

Add a `brand` property to your Product structured data (schema.org/Product) so search engines can match your listings to brand-specific queries.

On Squarespace

  1. Squarespace Commerce auto-generates basic Product schema but does not natively expose a brand field in the UI.
  2. Go to Website → Pages → select your product page. Open Page Settings → Advanced → 'Page Header Code Injection'.
  3. Paste a complete JSON-LD Product script block (see code example above) with the `brand` property hard-coded or using Squarespace's template tags if available (`{productName}`, etc.).
  4. For multi-brand stores, consider a third-party SEO app from the Squarespace Extensions marketplace (e.g. 'SEOmatic' via integration) that lets you map brand data dynamically.
  5. Validate with Google's Rich Results Test.
Seo product missing gtinModerate effort

Add a valid GTIN (and/or MPN) to your Product structured data so Google can match your listings to its product catalog and show them in Shopping results and AI-powered product features.

On Squarespace

  1. In your Squarespace admin, go to Commerce → Inventory → select a product.
  2. Squarespace does not have a native GTIN field. To add GTIN to structured data, go to Pages → select the product page → click the gear icon (Page Settings) → Advanced → Header Code Injection.
  3. Paste a JSON-LD Product schema block containing the 'gtin' and 'mpn' properties for that specific product into the Header Code Injection field.
  4. For site-wide or automated injection, use a third-party SEO plugin compatible with Squarespace (check the Squarespace Extensions marketplace for 'SEO' tools that support structured data customization).
  5. Verify the injected schema using Google's Rich Results Test on the product URL.
Seo product missing stock statusModerate effort

Add visible stock availability text to each product page and set the correct `availability` property (InStock, OutOfStock, or PreOrder) in your Product structured data (JSON-LD schema).

On Squarespace

  1. In Squarespace Commerce, go to your product editor (Commerce → Inventory → click a product) and ensure the product has stock quantity set — Squarespace uses this to determine `InStock` vs `OutOfStock` in its auto-generated schema.
  2. Squarespace generates Product schema automatically for Commerce plans; the `availability` value reflects whether inventory is tracked and whether stock > 0.
  3. To show a visible 'In Stock' / 'Out of Stock' label, use a Product Block or enable the 'Show stock countdown' option in the product editor under 'Inventory'.
  4. For custom schema, go to Pages → select the product page → click the gear icon → Advanced → and paste a JSON-LD block into the 'Page Header Code Injection' field (available on Business plan and above).
  5. Verify the final schema output with Google's Rich Results Test.
Seo product no imagesModerate effort

Add at least one high-quality image to every product page so Google can index it and shoppers can see what they're buying.

On Squarespace

  1. In your Squarespace admin, go to Commerce → Inventory (or Pages → your Store page).
  2. Click the product to open its editor.
  3. In the 'Media' tab, click the '+' icon or the empty image area and upload your product photos.
  4. To add alt text in Squarespace, go to the image in the product editor, hover over it, click the pencil icon, and enter descriptive alt text in the 'Filename/Alt Text' field.
  5. Click 'Save'. Squarespace Commerce includes product images in its generated JSON-LD structured data automatically.
Seo product no spec tableModerate effort

Add a structured specifications table or list to every product page so search engines and AI tools can extract and surface factual product details, and shoppers can make faster buying decisions.

On Squarespace

  1. Open the product in Commerce → Inventory → select product.
  2. Scroll to the 'Additional Info' or 'Description' section. Use the text editor to insert a table: click the table icon in the rich-text toolbar and build a two-column spec table (Attribute | Value).
  3. For a dedicated 'Specifications' tab, use a Page Section with a two-column layout block below the main product content, or add a new 'Additional Details' accordion block.
  4. Squarespace Commerce does not natively support structured product attributes/metafields (as of 2024). The practical solution is to enter specs as a formatted table in the product description or an additional content block, and keep a consistent format across all products.
  5. For large catalogs, use the Squarespace Commerce Product Import CSV — add spec content as HTML in the 'description' column.
  6. Consider a third-party embedded tool (e.g., an Ecwid overlay or a Squarespace-compatible spec table widget via embed code block) for more structured output.
Seo product price not in htmlModerate effort

Render product prices in server-side HTML so search engines and rich-result parsers can read them without executing JavaScript.

On Squarespace

  1. Squarespace Commerce renders product prices server-side through its built-in product blocks — if you are using a standard Squarespace product page, the price should already be in the HTML.
  2. Check whether a custom Code Block or custom JavaScript injection (Settings → Advanced → Code Injection) is overriding or hiding the default price display. If so, remove or replace it with a native product element.
  3. In the Page Editor, ensure your product page uses the native Product Block (with price displayed) rather than a manually coded section that fetches price via JS.
  4. Squarespace automatically generates Product JSON-LD for Commerce products; verify by using View Page Source on your live product page and searching for 'application/ld+json'.
  5. If you need to customize price display styling, use CSS overrides (Design → Custom CSS) rather than replacing the price element with a JavaScript-rendered alternative.
Seo product single imageModerate effort

Add at least 4 high-quality product images (multiple angles, detail shots, and lifestyle/in-use photos) to every product listing to increase click-through rates and conversions.

On Squarespace

  1. Go to the Pages panel → navigate to your Store page → click the product to open its editor.
  2. In the 'Media' tab of the product editor, click the '+' or 'Add Image' button to upload additional product photos.
  3. After uploading, click each image and select 'Edit' → fill in the 'Alt Text' field.
  4. Drag images within the media panel to reorder them (leftmost = main image). Click 'Save' or 'Publish'.
Seo product title genericQuick win

Rewrite generic product page titles to include the product name plus at least one differentiating attribute (material, colour, size, pack size, or brand) in a natural, keyword-rich format.

On Squarespace

  1. Go to the Commerce panel → Inventory → [select your product] → Edit.
  2. Click the 'SEO' tab (within the product editor modal).
  3. Update the 'SEO Title' field with your optimised product title.
  4. Click 'Save'. Squarespace renders this as the <title> tag for the product page.
  5. Note: if the SEO Title field is left blank, Squarespace defaults to the product name + site title — always fill it in explicitly for product pages.
Seo variant urls in sitemapModerate effort

Remove product variant URLs (e.g. ?variant=, ?sku=) from your XML sitemap so only the canonical product page URL is submitted to Google.

On Squarespace

  1. Squarespace auto-generates its sitemap at yoursite.com/sitemap.xml and does not include query-parameter variant URLs by default — Squarespace Commerce product options do not create separate URLs.
  2. If variant URLs are appearing in the sitemap, they are likely being added by a third-party integration or by manually adding pages. Go to Pages panel and check for any pages whose URL slugs contain query strings.
  3. Squarespace does not provide direct sitemap editing. To exclude a specific page entirely, go to Pages → (select the page) → gear icon → SEO tab → enable 'Hide page from search results' (adds noindex) — but this is a last resort; the better fix is ensuring variant URLs are never created as standalone pages.
  4. Verify canonical tags by viewing source on any variant-like URL — Squarespace injects a canonical tag automatically pointing to the clean page URL.
  5. Resubmit yoursite.com/sitemap.xml in Google Search Console after confirming variant URLs are no longer present.
Seo variant urls not canonicalizedModerate effort

Add a canonical tag to every product variant URL pointing back to the base product page, so Google consolidates ranking signals onto one authoritative URL instead of splitting them across hundreds of near-duplicate pages.

On Squarespace

  1. Squarespace Commerce product pages with variant selectors do not create separate indexable URLs by default (variants are handled client-side without changing the URL path), so this issue typically does not apply to standard Squarespace stores.
  2. If you have added custom URL parameters via third-party scripts or integrations that expose variant URLs, go to Pages → the product page → gear icon → SEO tab and ensure 'SEO Title' and canonical settings point to the base product.
  3. For advanced canonical injection, go to Website → Pages → select the page → gear icon → Advanced → 'Page Header Code Injection' and add: <link rel="canonical" href="https://www.yourstore.com/shop/product-slug">
  4. Note: Squarespace does not allow full head-level canonical overrides globally via admin; if you need site-wide canonical logic for many products, consider whether a different platform better fits your catalogue scale.
Slow pageLarger project

Reduce page load time to under 3 seconds by compressing images, minifying CSS/JS, enabling caching, and improving server response speed.

On Squarespace

  1. Images: In the Pages panel, edit each content block and re-upload images at the correct display size (Squarespace recommends max 2500px on the longest side). Squarespace serves images via its CDN and auto-generates WebP versions for supported browsers.
  2. Enable built-in lazy loading: Squarespace 7.1 has lazy loading for images on by default. Ensure you are on a 7.1 template (Settings → Website → Pages shows your version).
  3. Custom code: Go to Settings → Advanced → Code Injection and audit any custom <script> or <link> tags in the Header/Footer injection areas. Move scripts to the Footer and add 'defer' where possible.
  4. Extensions: In the Squarespace Extensions marketplace (Commerce → Extensions), remove any third-party integrations you no longer use.
  5. Fonts: In Design → Fonts, choose system fonts or limit the number of custom web fonts to 1-2 families, as each font file is an additional network request.
  6. Squarespace manages server infrastructure and CDN delivery automatically — if speed is still poor after the above steps, reduce the number of content blocks, embedded videos, and third-party widgets on the page.
Thin contentModerate effort

Expand thin pages to at least 300 words of unique, helpful content that genuinely describes your products, category, or topic.

On Squarespace

  1. Product pages: Pages → Shop → [select product] → click the product to edit → expand the 'Description' field and write detailed content. Squarespace renders this below the product images.
  2. Category/shop pages: Open the page in the Editor → add a 'Text Block' above the product grid using the block inserter (+). Write your category intro here.
  3. For pages you cannot enrich (e.g. tag index pages), go to Pages → [page] → gear icon → SEO tab → enable 'Hide page from search results' (noindex) to prevent thin pages from being indexed.
Title too longQuick win

Shorten your page title tag to 60 characters or fewer so it displays in full — not truncated — in Google search results.

On Squarespace

  1. For a regular page: open Pages panel → hover over the page → click the gear icon → 'SEO' tab → edit the 'SEO Title' field (separate from the page display name).
  2. For a product (Commerce): go to the Products page in the Pages panel → click the product to edit it → click the gear icon → 'SEO' tab → 'SEO Title'.
  3. For a blog post: Pages → Blog → click the post → gear icon → 'SEO' tab → 'SEO Title'.
  4. Squarespace does not show a live character counter; use a SERP preview tool to verify length before saving.
  5. Note: if the 'SEO Title' field is left blank, Squarespace uses the page/product name — make sure to fill it in explicitly so you control what appears in search results.
Title too shortQuick win

Expand your page title to between 50 and 60 characters so it displays fully in Google search results and gives shoppers a clear reason to click.

On Squarespace

  1. Open the page or product in the Squarespace editor.
  2. For regular pages: click the gear icon (⚙) on the page in the Pages panel, then select the 'SEO' tab and update 'SEO Title'.
  3. For product pages: open the product in Commerce → Inventory, click the product, go to the 'SEO' tab, and update the 'SEO Title' field.
  4. Aim for 50–60 characters; Squarespace shows a character count guideline.
  5. Click 'Save' — changes publish automatically on your live site.

Answer Engine Optimization · 15 fixes

Article missing authorModerate effort

Add a structured-data author field (schema.org Person) to every article and blog post so AI engines and search crawlers can verify who wrote the content.

On Squarespace

  1. Squarespace injects some structured data automatically, but author sameAs is not included by default.
  2. Go to Website → Pages → select your Blog page → Settings (gear icon) → Blog Post settings and ensure Author is set to a real user with a complete profile.
  3. To inject a custom JSON-LD author block, go to Settings → Advanced → Code Injection and paste a <script type='application/ld+json'> block in the 'Page Header' field. For blog-post-specific injection, open the individual post editor → post settings → Advanced → Post Header Code Injection.
  4. Use static values for the author name and sameAs URLs in the snippet (Squarespace does not expose blog author variables in header injection).
  5. Save and preview, then test with Google's Rich Results Test.
Invalid rating valueModerate effort

Fix the AggregateRating.ratingValue in your structured data so it falls within the valid numeric range (1–5 by default, or within the declared bestRating/worstRating bounds).

On Squarespace

  1. Squarespace auto-generates product structured data; direct JSON-LD editing is not available in the standard interface.
  2. Ensure all product reviews stored in Squarespace Commerce use the built-in 1–5 star rating system and that no review has a rating of 0.
  3. For custom schema, go to Website > Pages > select page > gear icon > Advanced > Page Header Code Injection, and inject a corrected JSON-LD <script> block with valid ratingValue, worstRating, and bestRating.
  4. If using a third-party review app, check that app's schema settings for valid rating bounds.
  5. Validate with the Rich Results Test.
Low answer first scoreModerate effort

Restructure your page content to lead with a direct, concise answer and add FAQ schema so search engines and AI assistants can surface your content as a featured snippet or direct answer.

On Squarespace

  1. Open Pages, click the page to edit, and click into the first content block.
  2. Rewrite the opening text as a short direct-answer summary.
  3. Edit section headers to question format using the H2/H3 text style in the block editor.
  4. For FAQ schema: Squarespace has a native Accordion block — Pages → Edit → Add Block → Accordion. Structure each accordion item as a question (title) and answer (body); Squarespace 7.1 outputs basic FAQ markup for accordion blocks automatically.
  5. For explicit JSON-LD control: go to Website → Pages → select the page → Settings (gear icon) → Advanced → Page Header Code Injection, and paste the FAQPage JSON-LD <script> block there.
  6. Verify with Google's Rich Results Test.
Low review countModerate effort

Collect at least 5 published reviews so Google can display star ratings in search results for your product pages.

On Squarespace

  1. In Squarespace, go to Commerce → Products → [Product] → Reviews to see current review counts (requires a Commerce plan).
  2. Enable automated review request emails: Commerce → Store → Notifications → 'Review Request' and set your preferred send delay.
  3. Squarespace Commerce injects aggregateRating JSON-LD automatically when reviews are present; the reviewCount field updates as reviews are approved.
  4. For more advanced review collection (drip sequences, incentives), consider a third-party embed via Squarespace Extensions (e.g. Trustpilot or Okendo), though these require custom code blocks to surface schema.
  5. Once 5 reviews are live, test the product URL in the Rich Results Test to confirm the aggregateRating snippet is valid.
Missing schema articleModerate effort

Add Article and BreadcrumbList JSON-LD structured data to every editorial/blog page so search engines and AI answer engines can correctly identify, understand, and feature your content.

On Squarespace

  1. Squarespace outputs some built-in structured data for blog posts, but Article schema completeness varies by template version.
  2. To inject custom JSON-LD, go to Settings › Advanced › Code Injection › Header, and paste a <script type='application/ld+json'> block. Note: this injects on ALL pages, so use JavaScript to conditionally check document.location to only apply to blog post URLs.
  3. For per-post injection on Squarespace 7.1, open the Blog Post editor, click the '+' block inserter, add a Code Block, paste your JSON-LD there — Squarespace renders Code Blocks in the page body, which search engines can still read.
  4. Populate values manually or use JavaScript to pull values from the page's existing meta tags (document.querySelector('meta[property="og:title"]').content) to build the schema dynamically.
  5. Validate with Google's Rich Results Test after publishing the post.
Missing schema breadcrumblistModerate effort

Add BreadcrumbList structured data (JSON-LD) to every page so Google can display your site's navigation path directly in search results.

On Squarespace

  1. In Squarespace, go to Website → Pages → click the Settings gear on a specific page → Advanced → Code Injection (this option is available on Business plan and above).
  2. Paste your <script type="application/ld+json"> BreadcrumbList block into the Header code injection field for that page.
  3. For site-wide injection across all pages (more efficient), go to Settings → Advanced → Code Injection → Header and add the script there — but note this requires you to hard-code or use Squarespace JSON template tags to dynamically generate the breadcrumb path per page type, which is limited.
  4. For a more automated solution, consider a third-party SEO integration or Squarespace Extension that handles structured data — search the Squarespace Extensions directory for 'SEO' or 'structured data'.
  5. After saving, test individual page URLs in Google's Rich Results Test to confirm the BreadcrumbList is detected.
Missing schema faqpageModerate effort

Add FAQPage (and BreadcrumbList) JSON-LD structured data to pages that contain FAQ content so Google can display rich results directly in search.

On Squarespace

  1. In the Squarespace editor, go to Pages › select the FAQ page › Page Settings › Advanced tab.
  2. In the 'Page Header Code Injection' box, paste your <script type='application/ld+json'> FAQPage block.
  3. For BreadcrumbList: paste the BreadcrumbList JSON-LD block in the same 'Page Header Code Injection' area (or in Settings › Advanced › Code Injection › Header for site-wide injection).
  4. Note: Squarespace's built-in FAQ blocks do NOT automatically emit FAQPage schema — manual injection is required.
  5. If you are on a Squarespace Business plan or higher, the Code Injection feature is available; Personal plan users must upgrade.
  6. Publish and validate with Google's Rich Results Test.
Missing schema howtoModerate effort

Add HowTo and BreadcrumbList structured data (JSON-LD) to pages that contain step-by-step instructions so Google can display them as rich results and answer-engine snippets.

On Squarespace

  1. Go to Pages › select your instructional page › Edit.
  2. Add a Code Block (Insert Point › Code) anywhere on the page.
  3. Paste the full <script type='application/ld+json'>…</script> block; ensure 'Display Source' is unchecked so it doesn't show as visible text.
  4. For Squarespace 7.1 with Code Injection access (Business plan or higher): Settings › Advanced › Code Injection › paste into the Header or Footer field and wrap in Squarespace's {% raw %}…{% endraw %} tags if needed to avoid template parsing.
  5. Squarespace generates its own BreadcrumbList for blogs/shop categories — verify before duplicating.
  6. Validate with Google's Rich Results Test.
Missing schema localbusinessQuick win

Add a LocalBusiness JSON-LD schema block to your store so search engines and AI assistants can surface your business name, address, phone number, and hours in rich results and answer boxes.

On Squarespace

  1. In the Squarespace admin go to Settings → Advanced → Code Injection.
  2. Paste your full <script type='application/ld+json'>…</script> block into the Header field.
  3. Click Save — the code is injected into the <head> of every page sitewide.
  4. Validate with Google's Rich Results Test after saving.
  5. Note: Squarespace Business and Commerce plans support Code Injection; Personal plan does not — upgrade if needed.
Missing schema organizationQuick win

Add Organization schema markup to your store's homepage so search engines and AI systems can definitively identify your business, logo, and social profiles.

On Squarespace

  1. In Squarespace, go to Website → Pages and select your Homepage.
  2. Click the gear icon (Page Settings) → Advanced tab.
  3. In the 'Page Header Code Injection' field, paste your <script type='application/ld+json'>…</script> block.
  4. For sitewide injection (recommended), go to Settings → Advanced → Code Injection and paste the script in the 'Header' field instead.
  5. Save and publish, then validate with Google's Rich Results Test.
Missing schema productModerate effort

Add Product schema (JSON-LD structured data) to every product page so search engines can display rich results like price, availability, and ratings directly in search listings.

On Squarespace

  1. Squarespace Commerce automatically injects basic Product schema on product pages — verify this is working by checking a product URL in Google's Rich Results Test.
  2. To add additional or custom schema fields (e.g. brand, gtin, more detailed offers): go to Settings → Advanced → Code Injection → Footer, and paste a <script type='application/ld+json'> block.
  3. Because Code Injection is site-wide, use a JavaScript conditional (if (window.location.pathname.includes('/shop/')) { ... }) to restrict the script to product pages only, or use Page Settings → Advanced → Page Header Code Injection on individual product pages.
  4. For Squarespace 7.1 with a Developer Console, you can also edit the product.item template directly to include dynamic schema.
  5. Validate with Google's Rich Results Test after publishing.
Missing schema webpageModerate effort

Add WebPage (and Organization) JSON-LD schema markup to every page so search engines and AI answer engines can confidently understand and describe your site's content.

On Squarespace

  1. Go to Website → Pages → Settings (gear icon) for the target page → Advanced → Page Header Code Injection.
  2. Paste your WebPage JSON-LD <script type='application/ld+json'> block into the code injection area. This adds the script only to that specific page.
  3. For sitewide Organization schema: go to Website → Pages → (not a specific page) → click the gear icon next to your site title, then Settings → Advanced → Code Injection → Header. Paste the Organization JSON-LD block here so it appears on every page.
  4. Note: Squarespace Business plan or higher is required for code injection. On lower plans, consider upgrading or using a third-party SEO integration.
  5. Validate using Google's Rich Results Test.
Non iso dateModerate effort

Change all datePublished (and dateModified) values in your structured data from informal formats like "09/23/2019 00:00:00" to the ISO-8601 format "2019-09-23" so search engines can correctly read your content's publication date.

On Squarespace

  1. Squarespace generates structured data for Blog Posts and Products automatically using its built-in schema templates — date formatting is handled by the platform natively in most cases.
  2. If you have injected custom JSON-LD via Settings → Advanced → Code Injection (site-wide header/footer) or via a page's Page Header Code Injection, review those scripts for any date fields.
  3. In the Code Injection editor, locate any date strings and manually update them to ISO-8601 format: '2019-09-23' or '2019-09-23T00:00:00Z'.
  4. If you use a third-party SEO extension (e.g. via Squarespace Extensions marketplace), check that extension's schema/structured data output settings.
  5. For Blog posts specifically, the published date Squarespace uses in its auto-generated schema is pulled from the post's published date set in the Blog Post Editor — ensure this is set correctly (Squarespace handles the formatting itself).
  6. Validate pages using Google's Rich Results Test after any code injection changes.
Org missing sameasQuick win

Add a `sameAs` array to your Organization structured data, linking to your official social profiles, Wikipedia page, LinkedIn, and other authoritative directories so search engines can confidently identify your brand as a distinct entity.

On Squarespace

  1. In your Squarespace admin, go to Settings → Advanced → Code Injection.
  2. Paste the Organization JSON-LD block (with `sameAs`) into the 'Header' code injection field.
  3. Save, then verify with Google's Rich Results Test using your live homepage URL.
Page unreachableModerate effort

Ensure every page that should appear in AI-powered answers and rich results is actually reachable by crawlers, then add structured data so search engines and AI systems can read and surface its content.

On Squarespace

  1. In the Squarespace Pages panel, confirm the page is not in 'Draft' mode — click the page, look for the Draft badge, and click 'Publish'.
  2. Check Pages → (page) → Settings → SEO → ensure 'Hide page from search engines' (noindex) is NOT enabled.
  3. For store pages, go to Commerce → Inventory and confirm the product is set to 'Active' and not hidden.
  4. For 404 errors from old URLs, go to Settings → Developer Tools → URL Redirects (or Settings → Advanced → URL Mappings) and add a 301 redirect mapping the broken URL to the correct live page.
  5. To add custom structured data (JSON-LD), go to Pages → (page) → Settings → Advanced → Page Header Code Injection and paste your <script type='application/ld+json'> block. Note: Squarespace already generates some Product schema for Commerce products automatically.
  6. Re-test with Google Search Console URL Inspection and the Rich Results Test.

Accessibility (WCAG) · 63 fixes

Aria allowed attrModerate effort

Remove or replace any ARIA attributes that are not permitted on an element's assigned role so that assistive technologies can correctly interpret the element.

On Squarespace

  1. In the Squarespace Pages panel, navigate to the page containing the flagged element and open the Page Settings → Advanced → Page Header Code Injection or Block-level Code Block if the ARIA attribute was added via a custom code block.
  2. If the element is part of a built-in Squarespace block (e.g. a gallery, accordion, or button), the markup is generated by Squarespace itself — submit a bug report via Squarespace Support referencing WCAG 4.1.2.
  3. If the attribute was added via Website → Pages → (page) → Edit → a Code Block or via Settings → Advanced → Code Injection, open that code block, locate the offending `aria-*` attribute, remove or correct it, and save.
  4. For site-wide custom code, go to Website → Pages → Website Tools → Code Injection (Header/Footer) and search there.
  5. Re-test with axe DevTools after publishing.
Aria allowed roleModerate effort

Remove or replace the invalid `role="presentation"` (or other disallowed ARIA role) on HTML elements where that role is not permitted, so assistive technologies can correctly interpret your page.

On Squarespace

  1. In the Squarespace editor, open the page containing the flagged element.
  2. If the element is a native Squarespace block (button, image, etc.), there is no direct role attribute to edit — check whether a Code Block or custom Markdown block is injecting HTML with the invalid role.
  3. Open the Code Block or Custom HTML block and remove or correct the `role` attribute in the raw HTML.
  4. For site-wide injections, go to Website → Pages → Website Tools → Code Injection (header/footer) and search for the offending role attribute there.
  5. Save and verify with axe DevTools.
Aria command nameModerate effort

Add a discernible, screen-reader-accessible name to every button, link, and menuitem that uses an ARIA command role so assistive technology can announce what it does.

On Squarespace

  1. Squarespace has limited direct HTML editing; go to Website → Pages, open the page, and click Edit on the relevant section.
  2. For standard Squarespace buttons, use the button's text field to ensure there is always visible label text — never leave a button with only an icon and no text.
  3. For custom Code Blocks (Website → Pages → Edit → Add Block → Code), locate the HTML and add `aria-label="Descriptive action"` directly to the button or link tag.
  4. For site-wide elements (navigation, cart icon), go to Settings → Advanced → Code Injection and add a small JavaScript snippet: `document.querySelectorAll('.your-selector').forEach(el => el.setAttribute('aria-label', 'Open cart'));` — use browser DevTools to identify the correct CSS selector.
  5. Save and republish; verify with the axe browser extension.
Aria dialog nameModerate effort

Add a descriptive accessible name to every dialog and alertdialog element using aria-label or aria-labelledby so screen-reader users know what the dialog is about.

On Squarespace

  1. Squarespace has limited direct HTML access. Go to Website → Pages and identify which page or section contains the popup/announcement bar/lightbox.
  2. For announcement bars and promotional popups, go to Marketing → Promotional Pop-Up or Website → Announcement Bar and check if an ARIA label option exists in the settings panel.
  3. For custom Code Blocks or Embed Blocks, click the block, choose Edit, and add your dialog HTML with aria-labelledby or aria-label included in the markup.
  4. For site-wide injection, go to Settings → Advanced → Code Injection, and in the Footer section add a small JavaScript snippet that runs after load and patches the aria attribute: document.querySelectorAll('[role="dialog"]').forEach(el => { if (!el.getAttribute('aria-label') && !el.getAttribute('aria-labelledby')) { el.setAttribute('aria-label', 'Site notification'); } });
  5. Publish changes and verify with axe DevTools.
Aria hidden focusModerate effort

Remove `aria-hidden="true"` from any element that contains focusable children (links, buttons, inputs), or remove the focusable elements from inside the hidden container.

On Squarespace

  1. In Squarespace Admin, go to Website → Pages, then open the affected page in the editor.
  2. Squarespace uses template-driven HTML you cannot fully edit natively. If the issue is in a **native Squarespace block** (e.g. a navigation menu or button block), report it to Squarespace Support as an accessibility defect in their templates.
  3. If you have injected custom HTML via a Code Block or via Settings → Advanced → Code Injection, locate that code and fix the `aria-hidden` conflict directly in the code block.
  4. For custom CSS or JS injections causing the issue, go to Website → Design → Custom CSS or Settings → Advanced → Code Injection and review any injected scripts that manipulate ARIA attributes.
  5. After editing, preview and test with axe DevTools.
Aria input field nameModerate effort

Add a meaningful accessible name (label) to every ARIA input field so screen readers can identify and announce it to users.

On Squarespace

  1. In the Squarespace editor, click on the Form Block or Search Block containing the unlabeled input.
  2. For Form Blocks: click Edit on the form, select the specific field, and ensure the 'Label' field is filled in and 'Show Label' is enabled — Squarespace renders this as a proper <label> element.
  3. For the Search Block: Squarespace's built-in search input should have an accessible label by default; if it doesn't (e.g., in older templates), go to Pages → Not Linked → add a Code Block with a CSS/JS override using aria-label injection: document.querySelector('input[type=search]').setAttribute('aria-label', 'Search site');
  4. Add that JavaScript via Settings → Advanced → Code Injection → Footer, or via a Code Block on the relevant page.
  5. Verify in the live preview using the axe browser extension.
Aria meter nameModerate effort

Add a descriptive accessible name (via aria-label, aria-labelledby, or a visible <label>) to every element that uses role="meter" so screen readers can announce what the meter represents.

On Squarespace

  1. Squarespace has limited direct HTML editing. Go to Website → Pages → open the page containing the meter element.
  2. If the meter is inside a Code Block (Insert Point → Code), edit the block and add `aria-label="Average customer rating"` directly to the meter element's HTML.
  3. If the meter is rendered by a built-in Squarespace block (e.g. a product rating), go to Settings → Advanced → Code Injection and add a short JavaScript snippet that queries the meter element and sets its aria-label: `document.querySelectorAll('[role=meter]').forEach(el => { if (!el.getAttribute('aria-label')) el.setAttribute('aria-label', 'Product rating'); });`
  4. Save and test with axe DevTools.
Aria progressbar nameQuick win

Add a descriptive accessible name to every progress bar element so screen readers can announce what it represents.

On Squarespace

  1. Squarespace does not expose direct HTML editing for most blocks. First check if the progress bar block (e.g., a Chart or Progress Bar block) has an accessible title field in its block settings — click the block → Edit → look for a Title or Accessible Name field.
  2. If not available, go to Website → Pages → the page containing the bar → Page Settings → Advanced → Page Header Code Injection and add a JavaScript snippet that runs after load: `document.querySelectorAll('[role="progressbar"]').forEach(el => { if (!el.getAttribute('aria-label')) el.setAttribute('aria-label', 'YOUR DESCRIPTIVE LABEL'); });`
  3. Alternatively use Settings → Advanced → Code Injection (site-wide footer) for a global fix across all pages.
  4. For Squarespace Commerce order/checkout progress indicators, the same footer injection approach applies — target the specific element with a CSS selector for precision.
  5. Save and test using browser DevTools Accessibility panel.
Aria prohibited attrModerate effort

Remove or replace ARIA attributes that are explicitly prohibited on an element's assigned role, ensuring every ARIA attribute used is valid for its context.

On Squarespace

  1. In your Squarespace admin, go to Website → Pages and open the page containing the flagged element.
  2. If the element is inside a Code Block or Embed Block, click that block to edit it and correct the prohibited ARIA attribute in the raw HTML.
  3. For site-wide injected code, go to Settings → Advanced → Code Injection — check the Header and Footer injection areas for any scripts or HTML that add the prohibited attribute.
  4. If the issue is in Squarespace's own generated markup (e.g., navigation or gallery components), use the CSS Editor (Design → Custom CSS) only where layout can be adjusted, or submit a support request to Squarespace since their core templates are not directly editable.
  5. Verify with axe DevTools on your published site.
Aria required attrModerate effort

Add the required `aria-level` attribute (and any other missing required ARIA attributes) to every element that uses an ARIA role which mandates them.

On Squarespace

  1. In the Squarespace Editor, go to Pages → select the page with the issue → click Edit.
  2. For standard blocks (text, image, etc.), switch the block type to the correct semantic element: use a 'Heading' text block rather than a 'Body' block styled to look like a heading — Squarespace will output the correct `<h2>` tag natively.
  3. For Code Blocks or custom HTML injections (Settings → Advanced → Code Injection or a Code Block), locate the element with `role=` and add the missing required attribute directly in that HTML snippet.
  4. For theme-level changes, go to Design → Custom CSS — note this controls style only; for markup changes use Code Injection or a Code Block.
  5. Save and publish, then verify with axe DevTools.
Aria required childrenModerate effort

Ensure every ARIA parent role contains only its required, permitted child roles — and remove focusable elements (e.g. tabindex on img or a) that are not allowed inside that ARIA context.

On Squarespace

  1. Squarespace controls most structural HTML — if the violation is in a native Squarespace block (navigation, gallery, etc.), you must work around it via Code Injection or report it to Squarespace support.
  2. Go to Website → Pages → (affected page) → Edit → click the block causing the issue → Block Settings. Check if a custom HTML block or Code Block is introducing a role= attribute and correct it there.
  3. For site-wide injection (e.g. a custom navigation script), go to Website → Website Tools → Code Injection. Locate any script or HTML snippet that sets role= and fix the parent/child role pairing.
  4. In Squarespace 7.1, go to Design → Custom CSS for CSS-only changes; for structural HTML fixes in Developer Mode (7.0), edit the relevant .region or .block template file in your connected Git repository.
  5. Remove tabindex from any img or a that sits inside a restricted ARIA parent in your injected code. Re-test with axe DevTools.
Aria required parentModerate effort

Wrap every ARIA child role (such as `tab`, `option`, `listitem`, `row`, etc.) in the correct required ARIA parent container role (such as `tablist`, `listbox`, `list`, `rowgroup`, or `grid`) so assistive technologies can correctly interpret the widget's structure.

On Squarespace

  1. In Squarespace, go to Pages → select the page → click Edit, then click the block containing the flagged widget.
  2. If the widget is a native Squarespace block (e.g., Accordion, Tab block), you cannot directly edit its ARIA structure — report the issue to Squarespace Support.
  3. If using a Code Block (Insert → Code), edit the raw HTML directly in that block to add the required container role, e.g., wrap `role="tab"` elements in `<div role="tablist">`.
  4. For custom CSS/JS injected via Settings → Advanced → Code Injection, add a JavaScript snippet that programmatically sets the `role` attribute on the parent container after DOM load.
  5. Preview the page and test with an axe browser extension to confirm the fix.
Aria rolesModerate effort

Audit every element that has a `role` attribute and replace any invalid, misspelled, or non-existent ARIA role value with a valid WAI-ARIA role from the official specification.

On Squarespace

  1. In Squarespace, direct HTML editing is limited. Go to your Page settings → Advanced → Page Header Code Injection or Footer Code Injection if you previously injected custom HTML with role attributes — correct the role values there.
  2. For site-wide injected code, go to Settings → Advanced → Code Injection and search for any `role=` attributes in the Header or Footer fields.
  3. If the invalid role is in a Code Block on a specific page, open the page editor, click the Code Block, and edit the HTML directly — fix the invalid role value.
  4. For roles generated by Squarespace's own components (navigation, sections, etc.), these cannot be edited directly. Use the Settings → Accessibility options if available, or submit a bug report to Squarespace support.
  5. After saving, republish and test with axe DevTools.
Aria toggle field nameModerate effort

Give every toggle control (checkbox, switch, or ARIA toggle button) a descriptive accessible name so screen readers can announce what it does.

On Squarespace

  1. In the Squarespace editor, click on the block or form containing the toggle/checkbox.
  2. For built-in Form Blocks: click Edit on the form, select the checkbox field, and fill in the 'Label' field — Squarespace renders this as a visible and accessible <label> linked to the input.
  3. For custom toggle UI added via a Code Block: click the block → Edit, and add aria-label='...' or a proper <label for='...'> pairing in the HTML.
  4. For site-wide custom CSS/JS injections (Squarespace Business plan or higher), go to Settings → Advanced → Code Injection and add a JS snippet that sets setAttribute('aria-label', '...') on targeted elements if template editing is not available.
  5. Preview and validate with the axe DevTools browser extension.
Aria tooltip nameModerate effort

Add a visible, descriptive text label to every element that has role="tooltip" so screen readers can announce its purpose.

On Squarespace

  1. In Squarespace, tooltips are most commonly added via Code Blocks, custom HTML in the Page Header injection, or third-party embed scripts.
  2. Navigate to the page containing the tooltip. Click Edit on the page, then click the Code Block or Custom HTML block that contains the tooltip markup.
  3. In the HTML source, find the element with role="tooltip" and add a descriptive aria-label attribute or ensure it contains visible text, e.g.: <div role="tooltip" aria-label="Free returns">Free returns</div>.
  4. For site-wide tooltip scripts injected via Settings → Advanced → Code Injection (Header or Footer), edit the script there to add aria-label to all tooltip elements.
  5. Save changes, then use the axe browser extension in your browser's developer tools to verify the accessible name is present.
Aria valid attrModerate effort

Find every misspelled or non-existent ARIA attribute name in your HTML (e.g. `aria-labeledby` instead of `aria-labelledby`) and correct each one to a valid ARIA attribute name.

On Squarespace

  1. In your Squarespace admin, go to Website → Pages → (the affected page) → Edit.
  2. If the error is in a Code Block or Embed Block, click the block to edit it and find and fix the misspelled ARIA attribute in the raw HTML.
  3. For site-wide code injections, go to Settings → Advanced → Code Injection and check the Header and Footer fields for misspelled ARIA attributes.
  4. If the error lives in Squarespace's own theme components (e.g. navigation, footer), you may need to use Custom CSS or a Code Block workaround, as direct template editing is not available on most plans. Contact Squarespace support if it is a platform-generated attribute.
  5. Publish, then verify with the axe DevTools browser extension.
Aria valid attr valueModerate effort

Audit every ARIA attribute on your pages and correct any that point to a non-existent element ID, use a disallowed value, or reference an empty/misspelled target so that assistive technologies can correctly interpret your page.

On Squarespace

  1. Go to Website → Pages and open the page containing the failing element in the page editor.
  2. If the issue is in a built-in Squarespace block (e.g., a gallery, button, or form), check the block's content settings for a label or description field — Squarespace auto-generates ARIA from these fields; filling them in correctly often resolves the issue.
  3. For custom code (CSS/JS injected via Settings → Advanced → Code Injection or a Code Block), locate the snippet and correct the ARIA attribute value directly.
  4. Squarespace 7.1 themes do not expose full template editing, so if the invalid ARIA comes from a core Squarespace component you cannot edit, file a bug report via Squarespace Support.
  5. After saving, use the axe DevTools browser extension to verify the violation is resolved.
Autocomplete validModerate effort

Add a valid, correctly matched `autocomplete` attribute to every personal-data form field so browsers and assistive technologies can autofill them reliably.

On Squarespace

  1. Squarespace's built-in form blocks and Commerce checkout fields have limited direct HTML editing capabilities.
  2. For built-in Form Blocks: go to the page, click Edit on the form, then click the field to edit it — Squarespace does not expose the autocomplete attribute in the UI, so you must use a CSS/JS injection workaround.
  3. Go to Website → Pages → select the page → Settings (gear icon) → Advanced → Page Header Code Injection, or site-wide via Settings → Advanced → Code Injection.
  4. Add a small JavaScript snippet that runs on DOMContentLoaded and sets the autocomplete attribute on each input by its name or placeholder: document.querySelector('input[name="name"]').setAttribute('autocomplete','name');
  5. For Squarespace Commerce checkout (hosted), autocomplete attributes are managed by Squarespace; contact Squarespace support for compliance concerns.
Avoid inline spacingModerate effort

Remove hard-coded text-spacing CSS properties from inline `style` attributes so users can override them with their own stylesheets.

On Squarespace

  1. Go to Website → Pages, open the page, and click Edit on the text block with the inline spacing.
  2. Highlight the text, open the text formatting toolbar, and look for any custom spacing set via the 'More' or Design options — remove it to revert to the site style.
  3. For site-wide typography spacing, go to Design → Fonts and adjust Line Height / Letter Spacing there; this writes to the global stylesheet rather than inline styles.
  4. If a Code Block or custom HTML injection is responsible, click Edit on that block, locate the `style=` attribute in the markup, move the spacing value to a `<style>` tag in the same block or to Design → Custom CSS, and remove the inline attribute.
  5. Use Design → Custom CSS to add overriding class-based rules, then verify with axe.
Button nameModerate effort

Add a visible or programmatically accessible name to every button so screen readers can announce what it does.

On Squarespace

  1. Squarespace has limited direct HTML editing. Go to Website → Pages, open the page with the offending button, and click Edit.
  2. If the button is inside a Code Block, click the code block and add aria-label="Descriptive name" to the <button> tag in the HTML.
  3. For theme-level buttons (navigation, cart icon), go to Website → Custom CSS (or Design → Custom CSS) — you cannot add ARIA attributes via CSS, so instead use Settings → Advanced → Code Injection → Footer to add a JavaScript snippet: document.querySelectorAll('.cart-btn').forEach(el => el.setAttribute('aria-label', 'Open cart'));
  4. Use the most specific CSS selector you can find in browser DevTools to target only the correct button(s).
  5. Verify with axe DevTools after saving.
Color contrastModerate effort

Increase the contrast ratio between your text color and its background color to at least 4.5:1 so all users — including those with low vision — can read your content.

On Squarespace

  1. In the Pages panel, open Website → Website Tools → Custom CSS, or go to Design → Custom CSS.
  2. Add a targeted override for the failing element, e.g.: `a, .your-class { color: #005f8e !important; }` — choose the exact selector and a value that passes 4.5:1.
  3. Alternatively, go to Design → Fonts & Colors (some templates) and adjust the global color palette slot used by that element.
  4. Save and preview; test with Lighthouse Accessibility audit.
Definition listModerate effort

Fix all `<dl>` (definition list) elements so they contain only valid `<dt>` and `<dd>` child elements, in the correct order, with no stray tags or text directly inside the list wrapper.

On Squarespace

  1. Open the Pages panel and edit the affected page. Squarespace does not expose raw theme HTML, but you can inject corrected markup via a Code Block.
  2. If the `<dl>` is inside a Code Block: click the block → Edit, switch to HTML view, and fix the markup so only `<dt>` and `<dd>` elements are direct children of `<dl>`.
  3. If the `<dl>` is being generated by a Squarespace native block (e.g., a Summary or Product block), you cannot edit its HTML directly. Instead, replace it with a Code Block containing a correctly structured `<dl>` and apply matching CSS under Design → Custom CSS.
  4. For site-wide injection (e.g., a footer spec list), go to Settings → Advanced → Code Injection and add or correct the markup there.
  5. Save and preview, then rerun your accessibility scanner to confirm the fix.
DlitemQuick win

Wrap every `<dt>` (term) and `<dd>` (description) element inside a parent `<dl>` element so screen readers can correctly announce the list structure.

On Squarespace

  1. In your Squarespace admin, go to Pages → select the affected page → click Edit.
  2. If the `<dt>`/`<dd>` tags are inside a Code Block, click the block, select Edit, and update the HTML to wrap orphaned `<dt>`/`<dd>` tags in a `<dl>` element.
  3. If the tags come from a theme template, go to Design → Custom CSS for minor style tweaks; for structural HTML changes, use Settings → Advanced → Code Injection (site-wide) or the per-page Code Injection panel (available on Business plan and above) — but note that full template editing is not available on all plans.
  4. On Developer-enabled Squarespace sites, edit the relevant `.region` or `.block` template file via the Squarespace Developer platform (local development with the Squarespace CLI), wrapping the orphaned tags in `<dl>`.
  5. Save and publish, then verify with axe DevTools on the live page.
Document titleQuick win

Add a unique, descriptive <title> element to every page so browsers, screen readers, and search engines can identify it.

On Squarespace

  1. For the homepage title: Pages → (gear icon next to Homepage) → SEO tab → 'SEO Title' field.
  2. For other pages (About, Contact, etc.): Pages → click the gear icon (⚙) next to any page → SEO tab → 'SEO Page Title'.
  3. For product pages: Commerce → Inventory → [select product] → SEO tab → 'SEO Title'.
  4. For blog posts: Pages → Blog → click the blog post → Settings (gear icon) → SEO tab → 'SEO Title'.
  5. For site-wide title format defaults: Settings → SEO → 'Site Title Format' — set a pattern that appends your site name to every page title automatically.
  6. Note: Squarespace 7.1 uses the page title as the default SEO title; always check the SEO tab to ensure it hasn't been left blank or overridden with an empty value.
Empty headingModerate effort

Find every empty heading tag on your store and add meaningful, visible text to it — or remove the tag entirely if it serves no structural purpose.

On Squarespace

  1. Open Pages and click Edit on the affected page.
  2. Click on each content block. For Text blocks, look for lines formatted as Heading 1–4 that have no visible text (may appear as an empty line with heading formatting).
  3. Click the empty heading line and either type meaningful text or select that line and delete it with Backspace/Delete.
  4. For sections with custom code blocks (</> Code blocks), click Edit on the code block and search for empty `<h1>`–`<h6>` tags to fix in the HTML directly.
  5. Save and Preview. Use the WAVE extension on the live URL to confirm no empty headings remain.
Empty table headerModerate effort

Add descriptive text to every table header cell (`<th>`) so that screen readers can announce what each column or row represents.

On Squarespace

  1. In the Squarespace editor, tables are inserted as Content Blocks. Click on the table block to edit it and ensure every header row cell contains descriptive text — Squarespace renders the first row as `<th>` elements when 'Header Row' is enabled.
  2. If a column intentionally has a blank header for visual reasons, you must inject a fix via a Code Block or Custom CSS: go to Pages → the relevant page → add a Code Block near the table with a `<script>` that adds `aria-label` attributes to the empty `<th>` elements on page load, OR use Settings → Advanced → Code Injection to apply site-wide JavaScript.
  3. For custom code areas (Developer mode / Custom Code): go to Settings → Developer Tools (if on a Developer plan) or Settings → Advanced → Code Injection, and add JavaScript that targets empty `<th>` elements and assigns them `aria-label` values.
  4. Re-test with WAVE or axe DevTools after publishing changes.
Frame titleQuick win

Add a descriptive `title` attribute to every `<iframe>` element on your store so screen readers can identify the frame's content.

On Squarespace

  1. Open Pages in your Squarespace admin and edit the page containing the iframe.
  2. Click the Code Block or Embed Block that contains the `<iframe>` HTML, then click 'Edit'.
  3. In the code/embed editor, find the `<iframe>` opening tag and add `title="Your descriptive label"` as an attribute, then save the block.
  4. For Squarespace Video Blocks or third-party embed blocks (e.g., YouTube, Vimeo): these are generated by Squarespace. Go to Settings → Advanced → Code Injection and add a footer script: `<script>document.querySelectorAll('iframe:not([title])').forEach(function(el){ el.setAttribute('title', el.src.includes('youtube') ? 'YouTube video player' : el.src.includes('vimeo') ? 'Vimeo video player' : 'Embedded content'); });</script>` — customize label logic per iframe src.
  5. Save and check in browser DevTools that all iframes now have descriptive title attributes.
Heading orderModerate effort

Fix heading tags so they follow a logical, sequential order (H1 → H2 → H3…) without skipping levels anywhere on the page.

On Squarespace

  1. Open the page in the Squarespace Editor and click the text block containing the heading.
  2. Highlight the heading text, then use the text style dropdown in the toolbar — it will show options like 'Heading 1', 'Heading 2', 'Heading 3'. Select the level that maintains correct sequential order.
  3. Squarespace maps Heading 1 → <h1>, Heading 2 → <h2>, Heading 3 → <h3>. If a heading looks too large or small at the correct level, adjust the font size for that heading style globally via Design → Fonts rather than changing its semantic level.
  4. Save the page and use the WAVE extension in your browser to verify the heading structure is sequential.
Html has langQuick win

Add a valid `lang` attribute to the `<html>` element so browsers and assistive technologies know what language your page is written in.

On Squarespace

  1. Squarespace automatically injects the `lang` attribute based on your site's language setting.
  2. To set the language: in the Home Menu go to Settings → Regional → Language & Region → Site Language, and choose the correct language.
  3. Squarespace will automatically add the correct `lang` value to the `<html>` element on all pages — no code editing needed.
  4. If you need a custom or override value, you can inject code via Settings → Advanced → Code Injection: add `<script>document.documentElement.lang='en';</script>` in the Header section as a last resort, but setting the correct Site Language is always preferable.
  5. Verify on the published site using View Page Source.
Html lang validQuick win

Set a valid BCP 47 language code on the `lang` attribute of your page's `<html>` element (e.g., `lang="en"`) so browsers, screen readers, and search engines correctly identify the page language.

On Squarespace

  1. Squarespace sets the `lang` attribute based on your site's language setting. Go to Home Menu → Settings → Region → Site Language and select the correct language.
  2. Save and publish. View your page source to confirm `<html lang="en">` (or your chosen language code) is present.
  3. If you need a language not listed, you can inject a custom `<html>` override via Settings → Advanced → Code Injection — but note this is an advanced step and Squarespace may not support full overrides of the `<html>` tag directly; contact Squarespace support if the platform-set language tag is rendering incorrectly.
Image altModerate effort

Add a descriptive `alt` attribute to every `<img>` element on your store so screen readers and search engines can understand what each image shows.

On Squarespace

  1. **Content images:** In the Page Editor, click on an image block → click the pencil/edit icon → in the 'Image' settings panel, enter a description in the 'Alt Text' field → Apply.
  2. **Gallery images:** Edit the gallery block → click on an individual image → select 'Edit' → fill in the 'Alt Text' (or 'Title' + 'Description' depending on gallery type — the Description maps to alt text in most gallery styles).
  3. **Product images (Squarespace Commerce):** Pages → your store page → click a product → in the product editor, click an image → enter text in the 'Alt text' or 'Filename/Caption' field. For newer versions (7.1): edit a product → click each image → 'Alt Text' field appears in the right panel.
  4. **Squarespace 7.1 SEO image alt:** Settings → SEO → does not bulk-set alt text; each image must be edited individually in the content editor as described above.
  5. **Custom code / Code Blocks:** If you've added raw `<img>` tags via a Code Block, edit that block (Pages → open page → click Code Block → Edit) and add `alt` attributes directly to the HTML.
Image redundant altModerate effort

Remove or empty the alt attribute on images whose caption or surrounding text already describes them, so screen readers don't announce the same information twice.

On Squarespace

  1. Click the image block on your page to select it → click the pencil (Edit) icon → go to the 'Design' or 'Content' tab → find 'Caption' or 'Filename' used as alt → switch to the 'Accessibility' or 'Alt Text' field (available in Squarespace 7.1) and clear it if the surrounding content already describes the image.
  2. For product images in Squarespace Commerce: go to Commerce → Inventory → select product → click the product image → find the 'Image Alt Text' field in the image dialog and clear it.
  3. For gallery blocks: click the gallery → Edit → click the pencil on each image → clear the 'Alt Text' field.
  4. Squarespace uses the image filename as a fallback alt if no alt text is set; rename image files to empty or generic names (e.g., decorative.jpg) to avoid filename-based redundancy.
Input button nameQuick win

Add a descriptive label to every input button so screen readers can announce what the button does.

On Squarespace

  1. In the Squarespace editor, click the button block or form block containing the unlabelled button.
  2. For standard Button blocks: click the block to edit it and ensure the 'Button Text' field has a descriptive label — Squarespace uses this text as the accessible name.
  3. For Form blocks: click the form, then click the Submit button and edit the 'Button Text' field to add a meaningful label (e.g., 'Send Message', 'Subscribe').
  4. For advanced customisation (e.g., a custom code block), go to Pages → a page → add a Code Block, and write your `<input>` with a proper `value` attribute.
  5. If you need to inject a fix across all pages, go to Settings → Advanced → Code Injection and add a JavaScript snippet that finds empty-value input buttons and sets their `value`: e.g., `document.querySelectorAll('input[type="submit"][value=""]').forEach(el => el.value = 'Submit');`.
  6. Save and preview, then test with VoiceOver or a browser accessibility tool.
LabelModerate effort

Add a visible or programmatic label to every form input so assistive technologies can identify its purpose.

On Squarespace

  1. In the Pages panel, click Edit on the page containing the form, then click the Form Block to open its settings.
  2. Each form field in Squarespace Form Blocks has a 'Label' field in its options — ensure a descriptive label is entered for every field (do not leave it blank).
  3. For Newsletter Blocks, go to the block's Design tab and enable 'Show label' or enter placeholder text supplemented by a title attribute — note that Squarespace Newsletter Blocks are limited; consider switching to a Form Block for full label control.
  4. Custom code injections (Settings → Advanced → Code Injection, or Page Settings → Advanced) can be used to add aria-label attributes via JavaScript if Squarespace's UI does not expose a label option for a specific widget.
  5. Publish and verify with the axe DevTools browser extension.
Label title onlyModerate effort

Add a visible, persistent label to every form field so it is never labeled only by a tooltip (title) or hidden description (aria-describedby).

On Squarespace

  1. In the Squarespace editor, click on the Form Block containing the flagged fields.
  2. Click 'Edit' on the form, then select each field. Ensure the 'Label' field is filled in with descriptive text and the label display is set to 'Show' (not hidden). Squarespace form fields support visible labels natively — do not rely solely on placeholder text.
  3. For the built-in Newsletter Block or search field, go to Pages → Not Linked → or insert the block and configure its settings to display a visible label. If the template hides labels via CSS, add a CSS override via Design → Custom CSS to remove `display:none` from label elements rather than deleting them.
  4. Squarespace does not give direct HTML access to most form elements; if a form requires fully custom accessible markup, use a Code Block embedding a custom HTML form with proper `<label>` elements.
  5. Save, preview, and verify with an accessibility scanning browser extension.
Landmark banner is top levelModerate effort

Ensure your site's banner landmark (<header> or role="banner") sits at the top level of the page, not nested inside another landmark region.

On Squarespace

  1. Squarespace controls page structure through its core templates. Go to Website → Pages → click the gear icon on your page → Advanced → and check any Custom CSS or Code Injection that may be adding landmark roles.
  2. Go to Settings → Advanced → Code Injection and check the Header code block — ensure no wrapping element with a landmark role (e.g., `<main>`, `<section>`) is being injected around your header content.
  3. In the Squarespace Style Editor (Design → Site Styles or Design → Custom CSS), look for any CSS that uses `role` attributes in selectors, which might hint at injected ARIA roles.
  4. If you have Developer Mode enabled (legacy Squarespace 7.0), open `base.region` or your template's layout files via the Template Editor and confirm the `<header>` block is a direct child of `<body>`.
  5. Re-test with axe DevTools or WAVE after saving changes.
Landmark complementary is top levelModerate effort

Move any `<aside>` element (or element with `role="complementary"`) so it is a direct child of `<body>`, not nested inside another landmark region like `<main>`, `<header>`, `<footer>`, or `<nav>`.

On Squarespace

  1. Squarespace controls landmark HTML through its template engine. Go to Pages → (select page) → Edit, and review how your sidebars or complementary content blocks are arranged.
  2. Squarespace does not expose raw `<aside>` tags for editing in the standard editor. To inject a corrected structure, go to Settings → Advanced → Code Injection (for site-wide) or use a Page Header Code Injection block for a specific page.
  3. In the code injection area, add a `<style>` block to restructure layout if needed, and if your theme renders an `<aside>` inside `<main>`, add a `<script>` that uses JavaScript to move the DOM node: `document.body.appendChild(document.querySelector('aside'))` — this is a client-side workaround for themes that cannot be edited directly.
  4. For deeper control, use Squarespace Developer Mode (available on certain plans) to edit template `.region` and `.block` files and reposition the aside in the HTML structure.
  5. Re-test with axe DevTools after publishing.
Landmark contentinfo is top levelModerate effort

Move your footer element (or any element with role="contentinfo") to the top level of the page so it is not nested inside another landmark region.

On Squarespace

  1. Squarespace manages its global footer as a top-level page region — it is automatically rendered outside the main content area in standard templates.
  2. If you have injected custom HTML (via Settings → Advanced → Code Injection → Footer, or via a Code Block on a page) that includes a `<footer>` tag or `role="contentinfo"` element, edit that code to ensure it does not wrap a footer/contentinfo element inside another landmark.
  3. Go to Pages → select a page → click on any Code Block that might contain footer-like HTML; remove or restructure any nested `<footer>` or `role="contentinfo"` from within `<main>` or `<article>` wrappers.
  4. For Squarespace Developer Platform (custom templates): edit your `base.html` or equivalent layout template via the template files, and ensure `{squarespace-footers}` or your custom `<footer>` is a sibling of `<main>`, not a child.
  5. Preview and validate with axe DevTools.
Landmark main is top levelModerate effort

Move the `<main>` element (or `role="main"`) so it is a direct child of `<body>` and not nested inside any other landmark element such as `<header>`, `<nav>`, `<aside>`, or `<footer>`.

On Squarespace

  1. Squarespace controls its own HTML output; you cannot directly edit the `<main>` tag placement from the standard UI.
  2. Go to Website → Pages → select a page → Edit. Avoid placing your primary content blocks inside Header or Footer sections, as Squarespace may output those with landmark roles that would wrap your content.
  3. If your Squarespace template supports Code Injection (Settings → Advanced → Code Injection), review any custom HTML you have added to the Header or Footer injection areas for stray `<main>` or `role="main"` attributes, and remove them.
  4. For Squarespace 7.1 custom CSS/code, navigate to Website → Design → Custom CSS and ensure no custom layout code is introducing a nested `<main>`.
  5. Contact Squarespace Support or raise a feature request if the platform's own template is emitting a nested `<main>` — this is a platform-level bug outside your direct control.
  6. Test with WAVE or axe DevTools to check the current state of your pages.
Landmark no duplicate bannerModerate effort

Ensure your page has only one banner landmark (a single `<header>` element or `role="banner"`) so assistive technologies can navigate your site correctly.

On Squarespace

  1. Squarespace controls most structural HTML automatically. Go to Pages → select any page → click Edit.
  2. Ensure you do not have a second 'Header' section added as a manual page section at the very top of the page (separate from the global site Header).
  3. Go to Design → Site Header to configure the ONE official site header. Do not add a duplicate header-style banner block inside page content.
  4. If you have injected custom HTML that includes a <header> tag or role="banner", go to Settings → Advanced → Code Injection (Page Header or Footer), or to a Content Block with custom HTML, and change <header> to <div> and remove any role="banner".
  5. For Developer Mode / custom templates, edit the relevant .region or .block file to remove the duplicate <header> element.
  6. Publish and verify with the axe DevTools browser extension.
Landmark no duplicate contentinfoModerate effort

Remove duplicate `<footer>` elements or `role="contentinfo"` landmarks so your page has exactly one, site-wide footer region.

On Squarespace

  1. Squarespace themes automatically render one site footer. The most common cause of a duplicate is a custom Code Block or Footer Injection that wraps content in `<footer>` tags.
  2. Go to Pages → scroll to the bottom of your page list → click on 'Footer' to inspect footer content blocks. Check any Code Blocks for `<footer>` or `role="contentinfo"` HTML and replace those wrapper tags with `<div>`.
  3. Go to Settings → Advanced → Code Injection → Footer section. If any injected code uses `<footer>` as a wrapper element, change it to `<div>`.
  4. Also inspect any third-party embed codes added via Embed Blocks for `<footer>` tags and update accordingly.
  5. Use browser DevTools or the axe extension on a preview/published page to confirm only one footer landmark remains.
Landmark no duplicate mainModerate effort

Ensure each page contains exactly one `<main>` landmark element (or one element with `role="main"`) so screen-reader users can navigate directly to the page's primary content.

On Squarespace

  1. Squarespace controls most of its page structure automatically. Open Pages › (your page) › Edit, and check whether you have added any Code Blocks (Insert Point › Code) that contain a '<main>' tag — if so, change it to '<section>' or '<div>'.
  2. Go to Design › Custom CSS or Website › Pages › (page) › Advanced › Page Header Code Injection and search for any 'role="main"' or '<main' strings; remove duplicates.
  3. If using a Developer Platform (Local Development) template, open the template's '.region' or '.block' files and consolidate to one '<main>' in the base layout.
  4. Re-test the live page with the axe DevTools or WAVE browser extension to confirm no duplicate main landmarks.
Landmark one mainQuick win

Add a single `<main>` landmark element (or `role="main"`) to every page so that screen-reader users and assistive technologies can skip directly to the primary content.

On Squarespace

  1. Squarespace 7.1 templates already wrap page content in a `<main>` element in most themes — verify by running axe DevTools on your live site first.
  2. If the landmark is missing, go to Pages → select the page → click the gear icon → Advanced → and in the 'Page Header Code Injection' or 'Code Injection' (Settings → Advanced → Code Injection) add a `<style>` note that Squarespace does not allow direct HTML template editing.
  3. As a workaround, use a Code Block (Insert Point → +) at the very top of page content and insert `<a href="#main-content" class="skip-link" style="position:absolute;left:-9999px;">Skip to main content</a>` plus `<span id="main-content"></span>`.
  4. For deeper template changes, switch to Developer Mode (Settings → Advanced → Developer Mode) and edit `base.region` or the relevant `.region` file to wrap content in `<main id="main-content">`.
  5. Re-publish and re-test with axe DevTools.
Landmark uniqueModerate effort

Add a unique aria-label (or aria-labelledby) to every repeated landmark role so assistive technologies can distinguish between them.

On Squarespace

  1. In your Squarespace admin, go to Website → Pages → click the gear icon on any page → Advanced → Page Header Code Injection, or go to Settings → Advanced → Code Injection for site-wide changes.
  2. Inject a small JavaScript snippet in the footer code injection that selects each duplicate landmark by a unique selector and adds the aria-label: document.querySelector('nav.primary-nav')?.setAttribute('aria-label','Primary navigation'); document.querySelector('nav.footer-nav')?.setAttribute('aria-label','Footer navigation');
  3. Alternatively, use Settings → Advanced → Code Injection → Footer to add the script so it runs on every page.
  4. For Squarespace 7.1 with access to Custom CSS and developer mode, you may be able to use Custom Code blocks; however, structural nav elements are rendered by Squarespace and cannot be edited directly in HTML.
  5. Test after saving by inspecting the live page with browser DevTools (F12) to confirm the aria-label attributes appear on the correct elements.
Link in text blockModerate effort

Make inline links visually distinguishable from surrounding body text by ensuring at least 3:1 color contrast between the link color and the non-link text color, or by adding a non-color visual cue (such as underline) to every link.

On Squarespace

  1. Go to Website → Pages → (any page with a text block) → Edit → click a text block → select a hyperlinked word.
  2. In the text toolbar, change the link color using the text-color picker to a value with ≥3:1 contrast against surrounding text, OR enable the underline button so the link is visually distinct without relying on color alone.
  3. For global link styling: go to Design → Custom CSS and add: `a { color: #0056b3 !important; text-decoration: underline !important; }` — use a color that passes contrast checks against your body text color.
  4. In Squarespace 7.1 you can also go to Design → Fonts → Additional Styles to set global link decoration.
  5. Save and preview across Blog, Products, and static page text blocks to ensure the rule applies everywhere.
Link nameModerate effort

Add a descriptive, screen-reader-accessible label to every link on your store so assistive technologies can announce where each link leads.

On Squarespace

  1. For linked images: click the image block → Edit → Content tab → fill in 'Alt Text' with a description of the link destination.
  2. For navigation icon links (social icons in the footer): go to Pages → Not Linked → Footer, or visit Design → Style Editor → Social Links; Squarespace auto-generates aria-labels for built-in social icons — if they are missing, report via Squarespace support as this is a platform-level template issue.
  3. For Button blocks with vague labels ('Read More'): click the button → Edit → Button Text and change the label to something descriptive.
  4. For custom code blocks (Settings → Advanced → Code Injection, or individual page Code Blocks): manually add aria-label attributes to any <a> tags you have written.
  5. Use CSS injection (Design → Custom CSS) to add a .visually-hidden utility class if you want to include hidden text inside links added via code blocks.
ListModerate effort

Fix all HTML list elements so that `<ul>` and `<ol>` contain only valid `<li>` children, and `<li>` elements appear only inside a proper list container, ensuring correct semantic list structure throughout your store.

On Squarespace

  1. In the Squarespace Editor, go to Pages → select the affected page → Edit.
  2. For content blocks, click a Text block and use the built-in bulleted or numbered list buttons in the toolbar (rather than manually entering dashes or numbers). This ensures Squarespace outputs proper <ul>/<li> or <ol>/<li> markup.
  3. For navigation, Squarespace's built-in navigation renders semantically correct list HTML. Avoid injecting custom navigation via Code Blocks unless you are certain of correct list structure.
  4. If you have injected custom HTML via Settings → Advanced → Code Injection or a Code Block, click that block, review any <ul>/<ol>/<li> usage, and correct invalid nesting.
  5. After publishing, run axe DevTools or WAVE on the live URL to confirm the list structure passes.
ListitemQuick win

Wrap every `<li>` element in a proper `<ul>` or `<ol>` parent so screen readers and browsers can correctly identify and announce list structure.

On Squarespace

  1. In the Squarespace editor, navigate to the page or section with the issue.
  2. If the `<li>` is inside a Code Block (Insert → Code), click Edit on that block and wrap the orphaned `<li>` items in `<ul>…</ul>` in the code editor.
  3. If the issue is in a text block, avoid manually typing list items as plain text — instead use the text editor's List button (bulleted or numbered) to create proper list formatting, which outputs valid `<ul>/<li>` HTML.
  4. For Squarespace 7.1 sites using Custom CSS or Code Injection (Settings → Advanced → Code Injection), check the header/footer injection areas for any stray `<li>` tags and fix them there.
  5. Save and preview the page, then verify with the axe browser extension.
Meta refreshQuick win

Remove or disable any `<meta http-equiv="refresh">` tag that automatically redirects or reloads the page in under 20 hours.

On Squarespace

  1. Squarespace does not allow direct editing of `<head>` HTML on a per-template basis, but custom code can be injected via Website → Pages → (select a page) → Page Settings → Advanced → Page Header Code Injection, or site-wide via Website → Website Tools → Code Injection → Header.
  2. Check both the site-wide Header injection field and the per-page Advanced Header Code Injection field on every page for any `<meta http-equiv="refresh" ...>` tag and delete it.
  3. Also review any Developer Mode custom files if your site was built with Squarespace Developer Platform — check the 'site.region' file for head-section meta tags.
  4. For redirects, use Website → Not Linked → URL Mappings (Squarespace native 301/302 redirect feature) instead of meta-refresh.
Meta viewportQuick win

Remove `user-scalable=no` (and any `maximum-scale` value below 5) from your site's `<meta name="viewport">` tag so visitors can pinch-to-zoom on mobile devices.

On Squarespace

  1. Squarespace controls the viewport meta tag at the platform level and it is not directly editable.
  2. Check whether a third-party code injection is causing the problem: go to Settings → Advanced → Code Injection and inspect the Header field for any `<meta name="viewport">` tag you or a developer added.
  3. If found, delete `user-scalable=no` and fix `maximum-scale` in that injected snippet, then save.
  4. Also check individual pages: Pages → (select a page) → gear icon → Advanced → Page Header Code Injection.
  5. If no custom injection exists and the default Squarespace tag is the problem, contact Squarespace Support.
Meta viewport largeQuick win

Remove or raise the `maximum-scale` value in your site's `<meta name="viewport">` tag so mobile users can pinch-to-zoom freely.

On Squarespace

  1. Squarespace injects the viewport tag at the platform level; it cannot be removed via the UI.
  2. Go to Website → Pages → any page → Edit → click the gear icon, then Advanced → Page Header Code Injection.
  3. Add `<meta name="viewport" content="width=device-width, initial-scale=1.0">` there — this places a corrected tag after the platform's tag and most mobile browsers will use the last-declared value.
  4. Alternatively, use Settings → Advanced → Code Injection → Header to apply it site-wide.
  5. Test on a mobile device. If the Squarespace platform tag still overrides yours, raise a support ticket referencing WCAG 1.4.4 compliance.
Nested interactiveModerate effort

Remove or restructure focusable elements nested inside interactive controls so that no interactive element contains another focusable child.

On Squarespace

  1. In your Squarespace Admin go to Pages → (your page) → Edit, and identify the section/block containing the nested interactive element.
  2. For product blocks and summary blocks, Squarespace renders HTML you cannot edit directly in the standard editor. Go to Website → Pages → (any page) → Edit → click the block → Design to check available layout options that may reduce nesting.
  3. For custom code blocks or custom CSS, go to Website → Design → Custom CSS or insert a Code Block to inject corrective markup. You can use CSS to reorder or overlay elements to remove the visual need for a nesting pattern.
  4. For broader structural fixes (e.g. navigation), go to Design → Custom Code → Header (or Footer) Code Injection and add a small JavaScript snippet that removes the tabindex or restructures the DOM after page load — note this is a workaround, not a true fix.
  5. If your template supports Developer Mode (older Squarespace 7.0 templates), enable it and edit the .item block files directly to restructure the HTML.
  6. Test keyboard navigation after saving.
Object altQuick win

Add a descriptive text alternative to every `<object>` element so screen readers can convey its content to users who cannot see it.

On Squarespace

  1. In the Squarespace editor, click on the block that contains the embedded object (usually a Code Block or Embed Block).
  2. If it is a Code Block: click the pencil/edit icon, switch to 'HTML' mode, and add `aria-label="Descriptive text here"` to the `<object>` tag.
  3. If it is an Embed Block with a raw embed code, click the block → Edit → paste the corrected HTML with the `aria-label` attribute into the code field.
  4. For content injected via Settings → Advanced → Code Injection, find your `<object>` snippet and add the attribute there.
  5. Save and apply, then test with the axe DevTools browser extension in a preview or published view.
Page has heading oneModerate effort

Add a single, descriptive `<h1>` heading to every page so screen readers and search engines can identify the page's main topic.

On Squarespace

  1. Open the page in the Pages panel and click 'Edit'.
  2. Click on the main title or first text block. In the text editor, highlight the heading text and select **'Heading 1'** from the text-format toolbar.
  3. For **Squarespace Commerce** product pages: the product name is automatically rendered as an `<h1>` by the platform in standard templates — do not remove or override this block.
  4. For custom pages or blog posts: ensure the first content heading in each page uses the Heading 1 style, not Heading 2 or a 'Display' style (which may not output `<h1>` depending on the template version).
  5. Save and preview; right-click the heading and choose Inspect to confirm the tag is `<h1>`.
Presentation role conflictModerate effort

Remove conflicting ARIA attributes and tabindex from elements that are marked as presentational (role="presentation" or role="none"), so screen readers consistently ignore them.

On Squarespace

  1. In Squarespace, most HTML is auto-generated. Open your Pages panel, navigate to the affected page, and click Edit.
  2. If you added a Code Block containing the conflicting element, click that block to open it and edit the raw HTML — remove the conflicting ARIA attribute or tabindex per the generic steps.
  3. If it's in a built-in Squarespace component (e.g. gallery, slideshow), you cannot edit that HTML directly. Instead, go to Website → Custom CSS / Inject Code (Settings → Advanced → Code Injection) and check whether any custom code snippet introduced the conflict.
  4. Remove or correct the conflicting snippet in Code Injection or the Custom CSS area.
  5. Preview and verify using the axe browser extension.
RegionModerate effort

Wrap all visible page content inside HTML landmark elements (such as `<main>`, `<nav>`, `<header>`, `<footer>`, or ARIA `role` attributes) so screen-reader users can navigate your store efficiently.

On Squarespace

  1. Squarespace controls its HTML output through its built-in templates; you cannot change core landmark tags directly. First, verify you are using a modern Squarespace template (Fluid Engine / 7.1) — these output better semantic HTML than legacy 7.0 templates.
  2. In the Pages panel, ensure every page has a Header and Footer enabled (Pages → [Page] → Page Settings → check that header/footer are not hidden), as Squarespace maps these to `<header>` and `<footer>` landmark roles.
  3. Go to Design → Custom CSS to add CSS only — you cannot inject landmark tags via CSS, so for missing `<main>` or `role` attributes you must use Code Injection: go to Settings → Advanced → Code Injection and add a `<script>` that sets `document.querySelector('#page')?.setAttribute('role', 'main')` as a stopgap until Squarespace fixes its template output.
  4. For individual pages, use the Page Header / Page Content blocks and keep all content sections within the page canvas (not injected via footer code injection) so they fall inside Squarespace's main content wrapper.
  5. Re-run axe DevTools after each change to verify improvement; note that some landmark issues on Squarespace require a template update from Squarespace itself.
Role img altQuick win

Add an accessible text label (aria-label) to every element that has role="img" so screen readers can announce what the image conveys.

On Squarespace

  1. In your Squarespace editor, click the image or icon block that contains the element.
  2. For standard Image Blocks, open block settings and fill in the Alt Text field — Squarespace maps this to the accessible label.
  3. For custom SVG or icon elements injected via a Code Block (Settings → Advanced → Code Injection or a Code Block on the page), edit the HTML directly and add aria-label="[descriptive text]" to the element with role="img".
  4. For purely decorative icons in code blocks, add aria-hidden="true" instead.
  5. Save and preview the page, then run axe DevTools to confirm the label is present.
Scrollable region focusableQuick win

Make every scrollable region on your store reachable and operable by keyboard by adding tabindex="0" (or placing focusable content inside it) so users who cannot use a mouse can scroll it.

On Squarespace

  1. In the Squarespace Pages panel, open the page containing the scrollable block and click Edit.
  2. Click the scrollable content block to select it, then open its Block Settings.
  3. Squarespace does not expose tabindex via the GUI; you must use the Code Injection feature. Go to Settings → Advanced → Code Injection and add a small JavaScript snippet: document.querySelectorAll('.your-scrollable-class').forEach(el => { el.setAttribute('tabindex','0'); el.setAttribute('aria-label','Product description'); });
  4. Add a CSS rule via Design → Custom CSS: .your-scrollable-class:focus { outline: 2px solid #005fcc; outline-offset: 2px; }
  5. Replace .your-scrollable-class with the actual CSS class visible in browser DevTools.
  6. Save and verify with keyboard Tab navigation.
Select nameModerate effort

Add a descriptive, programmatically associated label to every `<select>` dropdown element on the site so assistive technologies can announce its purpose to users.

On Squarespace

  1. For form blocks: click the form block → Edit → click the dropdown field → ensure the 'Label' field contains descriptive text. Squarespace automatically associates this label with the <select>.
  2. For product variant dropdowns (Commerce plans): Squarespace renders these automatically. If the label is missing, go to Pages → [Product page] → Edit → click the product block, and ensure variant option names (e.g. 'Size', 'Color') are set in the Products catalog under the Variants tab — Squarespace uses those names as labels.
  3. For custom code injections (Settings → Advanced → Code Injection or a Code Block): find the <select> in your injected HTML and manually add a <label for="ID">Text</label> or aria-label attribute.
  4. Preview and test. Note: deep template-level edits require Squarespace Developer mode or a custom template.
Skip linkQuick win

Add a valid, matching target ID to every skip-navigation link so keyboard and assistive-technology users can bypass repeated header content and jump directly to the main content area.

On Squarespace

  1. In Squarespace Admin go to Website → Pages → (any page) → Edit → then open Design → Custom CSS for site-wide styles, and Settings → Advanced → Code Injection for site-wide HTML injection.
  2. In the Header Code Injection box (Settings → Advanced → Code Injection → Header), paste: `<a href='#page' class='skip-link'>Skip to main content</a>` followed by the CSS from the code example above.
  3. Squarespace wraps all page content in a `<div id='page'>` element — verify this by inspecting your live page in browser DevTools. If the id differs for your template version, update the href to match.
  4. Add `tabindex='-1'` to the `#page` element: since you cannot directly edit Squarespace's core HTML, use the Code Injection footer to run `document.getElementById('page').setAttribute('tabindex','-1');`
  5. Save and test with Tab → Enter to confirm focus lands inside the main content.
Svg img altModerate effort

Add a meaningful text alternative to every SVG image so screen readers can describe it to visually impaired shoppers.

On Squarespace

  1. Squarespace compiles SVG icons internally; you cannot directly edit SVG markup in most block types.
  2. For SVGs uploaded as images (PNG/SVG uploads via the Image Block), click the image → Edit → fill in the 'Alt text' field with a descriptive label.
  3. For built-in SVG icons (social icons, logo marks), go to Design → Logo & Title and upload an SVG logo; Squarespace wraps it with an accessible label based on your site title — verify this is meaningful.
  4. For custom SVGs injected via Code Blocks (Settings → Advanced → Code Injection or a Code Block on a page), add the `<title>` + `aria-labelledby` + `role='img'` pattern directly in your HTML.
  5. Test in Preview mode with the axe browser extension.
TabindexModerate effort

Remove all positive tabindex values (tabindex="1" or higher) from your store's HTML elements, replacing them with tabindex="0" or relying on natural document order to control keyboard focus.

On Squarespace

  1. Log in → Pages → edit the affected page.
  2. Squarespace's built-in blocks do not let you set tabindex through the visual UI. If a positive tabindex is present, it is inside a Code Block or Markdown Block: click the block to edit it, find the tabindex attribute in the raw HTML, and remove or correct it.
  3. For site-wide code injections: go to Settings → Advanced → Code Injection. Search the header/footer injection fields for 'tabindex' and correct any positive values there.
  4. For template-level customization (Squarespace 7.0 only): Settings → Advanced → Code Injection, or the Developer Platform for custom templates — edit the relevant .region or .block file.
  5. Preview the page and tab through it to confirm correct focus order.
Valid langModerate effort

Add a valid BCP 47 language code to every `lang` attribute on your pages so assistive technologies can read content in the correct language.

On Squarespace

  1. Squarespace automatically sets the `<html lang>` attribute from the site language you configure.
  2. Go to Settings → Regional → Site Language and select the correct language from the dropdown. Squarespace outputs the corresponding valid BCP 47 code.
  3. For Code Injection or custom HTML blocks (Pages → Edit → Add Block → Code) that contain a `lang` attribute, open that block and correct the value to a valid BCP 47 tag.
  4. Squarespace does not expose theme HTML directly, so if the auto-generated `lang` value is still wrong after updating the Regional setting, contact Squarespace Support — it may be a platform bug.
  5. Publish and verify with the axe extension.

Security (OWASP) · 23 fixes

Dmarc policy noneModerate effort

Strengthen your DMARC policy from p=none (monitor-only) to p=quarantine, then p=reject, to actively block email spoofing of your domain.

On Squarespace

  1. If your domain is managed by Squarespace: go to Squarespace Admin > Settings > Domains > click your domain > DNS Settings.
  2. If your domain is external: log in to your registrar's DNS panel.
  3. Locate the TXT record with Host _dmarc and click the edit/pencil icon.
  4. Update the value to change p=none to p=quarantine and save.
  5. If you use Squarespace Email Campaigns or a connected ESP, verify DKIM is enabled in that platform's settings and that its sending domain is aligned.
  6. After verifying reports show no legitimate failures, edit the record again and set p=reject.
Hsts disabledQuick win

Enable HTTP Strict-Transport-Security (HSTS) by setting a max-age of at least 31536000 seconds (one year) so browsers always use HTTPS when visiting your store.

On Squarespace

  1. Squarespace automatically enables SSL and sets HSTS headers for all sites — no manual configuration is available or required for sites hosted on Squarespace infrastructure.
  2. Ensure SSL is active: Squarespace Admin → Settings → Advanced → SSL and set to 'Secure (Preferred)' or 'Secure Only'.
  3. If 'Secure Only' is selected, Squarespace forces HTTPS redirects and maintains appropriate transport security headers.
  4. If a scanner still reports HSTS as disabled, ensure you are not using a legacy Squarespace version 7.0 plan with a custom proxy; contact Squarespace Support to investigate.
Hsts max age too shortQuick win

Increase your HSTS max-age to at least 31536000 (one year) so browsers enforce HTTPS-only connections for a meaningful period.

On Squarespace

  1. Squarespace sets HTTPS and HSTS automatically for all sites; you cannot edit HTTP response headers directly from the Squarespace admin panel.
  2. If a third-party CDN or proxy is in front of your Squarespace site and is setting its own (shorter) HSTS max-age, configure that CDN to send max-age=31536000; includeSubDomains.
  3. If the issue is with Squarespace's own header, contact Squarespace Support and reference OWASP A02:2021 / HSTS max-age requirement.
  4. Verify the header at securityheaders.com.
Https not availableQuick win

Enable HTTPS by installing a valid SSL/TLS certificate and redirecting all HTTP traffic to the secure HTTPS version of your store.

On Squarespace

  1. Squarespace automatically issues and renews a free SSL certificate for all sites on a paid plan.
  2. In your Squarespace Admin panel, go to Settings → Domains.
  3. Click your custom domain and confirm 'SSL' shows as Active.
  4. Go to Settings → Advanced → SSL and set the Security preference to 'Secure (HTTPS)' and enable 'HSTS' if the option is available in your plan.
  5. Squarespace automatically redirects HTTP to HTTPS; no manual redirect rules are required.
Info disclosure serverQuick win

Remove or obscure the Server HTTP response header so your web server software name and version are no longer exposed to the public internet.

On Squarespace

  1. Squarespace is a fully hosted platform with no access to server configuration for merchants.
  2. Squarespace manages its own CDN and response headers; exploitable server version strings are not exposed.
  3. If a penetration test or scanner flags a `Server` header on a Squarespace-hosted domain, report it to Squarespace support — this is outside merchant control.
  4. If you proxy your Squarespace site through Cloudflare, use Cloudflare → Rules → Transform Rules → Modify Response Header to remove the `Server` header at the edge.
Info disclosure x powered byQuick win

Remove or mask the X-Powered-By HTTP response header to stop advertising your server technology stack to attackers.

On Squarespace

  1. Squarespace is a fully managed SaaS platform; HTTP headers are controlled by Squarespace's infrastructure and cannot be modified by the site owner.
  2. If flagged, note this as a platform-level finding. Contact Squarespace Support to report the concern.
  3. If you have connected a custom external back-end or API, suppress the header at that service's server or CDN level.
Insecure cookieModerate effort

Set the HttpOnly, Secure, and SameSite=Strict flags on every session and CSRF cookie your store sets so they cannot be stolen by malicious scripts or sent over unencrypted connections.

On Squarespace

  1. Squarespace-managed session and CSRF cookies are set by Squarespace's infrastructure. Ensure HTTPS is enabled: Settings → Advanced → SSL and set to 'Secure' (HTTPS only) with 'HSTS' toggled on.
  2. Squarespace does not expose server-side cookie configuration to store owners for platform cookies — if a Squarespace-native cookie is missing flags, report it via Squarespace Help → Contact Support.
  3. For cookies set via custom Code Injection (Settings → Advanced → Code Injection) or page Header/Footer code blocks: audit any `document.cookie` writes; append `; Secure; SameSite=Strict` to each. Note: HttpOnly cannot be set via client-side JS — remove sensitive cookie logic from injected scripts entirely.
  4. For cookies introduced by third-party extensions or connected services (e.g., Mailchimp popup, live chat): update the integration and check the vendor's documentation for cookie-security options.
Missing content security policyModerate effort

Add a Content-Security-Policy (CSP) response header to every page so browsers block unauthorized scripts, styles, and resources from loading.

On Squarespace

  1. Squarespace does not support custom HTTP response headers through its admin panel.
  2. Proxy your Squarespace site behind Cloudflare (change your domain's nameservers to Cloudflare), then set the CSP header via Cloudflare Dashboard → your domain → Rules → Transform Rules → Modify Response Headers → Add `Content-Security-Policy` header.
  3. Ensure your Cloudflare CSP policy includes Squarespace's own CDN domains (e.g., `static1.squarespace.com`, `use.typekit.net` if using custom fonts) to avoid breaking your site design.
  4. Test the live site with browser DevTools after deployment to confirm no critical resources are blocked.
Missing dmarcQuick win

Add a DMARC DNS TXT record at _dmarc.yourdomain.com to protect your domain from email spoofing and phishing.

On Squarespace

  1. In your Squarespace dashboard, go to Settings → Domains (or Website → Domains on older panel versions).
  2. If your domain is managed by Squarespace: click on the domain → DNS Settings → scroll to 'Custom Records' → click 'Add Record'. Set Type = TXT, Host = '_dmarc', Data = v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com. Save.
  3. If your domain DNS is managed externally (e.g. GoDaddy): log in to that provider and add the TXT record there.
  4. Squarespace sends transactional and marketing emails via its own infrastructure. Review Squarespace's official guide on 'Email Authentication' (SPF/DKIM) under Settings → Email to ensure Squarespace emails are authenticated and will pass DMARC alignment.
  5. If you use Squarespace Email Campaigns or a connected ESP, authenticate your sender domain in that platform too before setting p=reject.
Missing permissions policyQuick win

Add a Permissions-Policy HTTP response header to explicitly restrict which browser features (camera, microphone, geolocation, etc.) your store's pages are allowed to use.

On Squarespace

  1. Squarespace does not allow direct HTTP header configuration from the admin panel.
  2. Add your domain to Cloudflare (change your domain's nameservers at your registrar to Cloudflare's), then in Cloudflare: Rules → Transform Rules → Modify Response Headers → Create a rule to add 'Permissions-Policy' header.
  3. As a limited fallback, go to Squarespace Admin → Settings → Advanced → Code Injection → Header section and add: <meta http-equiv='Permissions-Policy' content='camera=(), microphone=(), geolocation=()'> — this is not a true HTTP header but is the only native option.
  4. Verify using Chrome DevTools → Network → Response Headers.
Missing referrer policyQuick win

Add a `Referrer-Policy: strict-origin-when-cross-origin` HTTP response header to every page so browsers control what referrer information is sent with requests.

On Squarespace

  1. Squarespace does not expose HTTP response header configuration in its admin panel.
  2. Inject the meta tag via Website → Pages → select any page → Page Settings → Advanced → Header Code injection (available on Business plan and above): add `<meta name="referrer" content="strict-origin-when-cross-origin">`.
  3. For site-wide injection, use Settings → Advanced → Code Injection → Header section to add the same meta tag once for all pages.
  4. For a true HTTP header, proxy through Cloudflare and add a Modify Response Header Transform Rule.
Missing spfQuick win

Add a DNS TXT record containing a valid SPF policy to your domain so email servers can verify that messages sent from your domain are legitimate.

On Squarespace

  1. If your domain is registered through Squarespace: go to your Squarespace account Home → Domains → click your domain → click 'DNS Settings'.
  2. Scroll to 'Custom Records' → click 'Add Record' → Type: TXT → Host: @ → Data: your SPF string → Save.
  3. If your domain is registered externally (you only pointed it to Squarespace), log in to your external registrar's DNS dashboard and add the TXT record there.
  4. Squarespace sends transactional store emails (order confirmations, etc.) via its own mail infrastructure; check Squarespace's current documentation for the correct SPF include tag to add for Squarespace-originated mail.
  5. If you use Google Workspace for your @yourdomain.com business email, add 'include:_spf.google.com' as well.
  6. Verify propagation with a free SPF lookup tool.
Missing strict transport securityQuick win

Add an HTTP Strict-Transport-Security (HSTS) response header with at least `max-age=31536000; includeSubDomains` to every HTTPS response your store sends.

On Squarespace

  1. Squarespace handles all SSL and security headers at the infrastructure level; individual header values are not configurable via the Squarespace dashboard.
  2. Confirm your domain has SSL enabled: Squarespace Admin → Settings → Domains → your domain should show a green lock / 'SSL Active'.
  3. Squarespace enables HSTS for all sites on its platform. If a scanner flags the header as missing on your Squarespace site, it may be scanning an HTTP URL before the redirect — test the HTTPS version directly.
  4. If you proxy Squarespace through Cloudflare, add HSTS in Cloudflare: SSL/TLS → Edge Certificates → HSTS → Enable, Max-Age 1 year, Include Subdomains.
Missing x content type optionsQuick win

Add the `X-Content-Type-Options: nosniff` HTTP response header to every page of your store so browsers never guess at file types.

On Squarespace

  1. Squarespace automatically includes X-Content-Type-Options: nosniff on all hosted storefronts — verify this in browser dev-tools (Network tab → Response Headers).
  2. Squarespace does not expose server-level header configuration to store owners; you cannot add or modify HTTP response headers manually via the Squarespace dashboard.
  3. If the header is confirmed missing, contact Squarespace Support to report the issue, as it is a platform-level infrastructure setting outside your control.
  4. For any external APIs or backend services you connect to your Squarespace site, ensure those services send the header independently.
Missing x frame optionsQuick win

Add an X-Frame-Options HTTP response header set to DENY or SAMEORIGIN to prevent your store's pages from being embedded in iframes on other websites.

On Squarespace

  1. Squarespace controls server-level headers and sets X-Frame-Options: SAMEORIGIN by default for most pages.
  2. Verify the header is present on your storefront pages via DevTools → Network → Response Headers.
  3. If missing, contact Squarespace Support — direct HTTP header configuration is not exposed in the Squarespace admin panel.
  4. If your domain is proxied through Cloudflare, add the header via Rules → Transform Rules → Response Header Modification → Add X-Frame-Options: SAMEORIGIN.
Passive scan onlyModerate effort

Complement passive security scans with active Dynamic Application Security Testing (DAST) against a staging copy of your store before each release.

On Squarespace

  1. Squarespace is fully managed SaaS infrastructure; running DAST scans against Squarespace's servers directly is not permitted and not actionable.
  2. Focus security efforts on any custom JavaScript injected via Settings → Advanced → Code Injection or via Custom CSS — review this code manually against OWASP guidelines for XSS and data exposure.
  3. Audit all third-party integrations and extensions in your Squarespace Extensions panel (Commerce → Extensions) — keep them updated and remove unused ones.
  4. If you use Squarespace's API or webhooks to connect external services, deploy a staging version of that external service and run OWASP ZAP against it.
  5. Ensure your custom domain has HTTPS enforced (Settings → Domains → SSL) and review cookie settings under Settings → Advanced.
  6. For stores requiring deeper security assurance, consider whether a self-hosted platform would give you the control needed to implement and evidence a full DAST programme.
Ssl cert expiring soonQuick win

Renew your SSL/TLS certificate before it expires to keep your store secure, trusted, and visible in search results.

On Squarespace

  1. Squarespace automatically provisions and renews SSL certificates for all sites — you cannot manually upload a certificate.
  2. To verify: go to Squarespace Admin → Settings → Domains → click your domain → the SSL badge should show 'Active'.
  3. If SSL is inactive or showing an error, go to Settings → Advanced → SSL and ensure 'Secure (HTTPS)' is selected and 'HSTS' is enabled.
  4. If your custom domain's SSL is stuck, the fix is almost always updating your domain registrar's DNS records to match Squarespace's required A/CNAME values, then waiting up to 72 hours for propagation. Squarespace Support can expedite this.
Ssl cert invalidModerate effort

Install a valid SSL/TLS certificate that exactly matches your store's domain name, so browsers trust your site and customer data is encrypted in transit.

On Squarespace

  1. Squarespace automatically provisions and renews free SSL certificates for all sites and connected custom domains.
  2. Go to Home Menu → Settings → Domains. Click your custom domain and confirm it shows 'Active' with SSL enabled.
  3. If SSL is listed as 'Pending' or 'Not Secure', the issue is almost always a DNS misconfiguration. Ensure your domain registrar has the exact DNS records Squarespace requires: an A record pointing to 198.185.159.144 / 198.185.159.145 and CNAME www pointing to ext-cust.squarespace.com.
  4. After correcting DNS, SSL provisioning can take up to 72 hours for DNS propagation. Squarespace handles renewal automatically.
  5. Squarespace does not support uploading custom SSL certificates.
Ssl errorModerate effort

Replace or reissue your SSL/TLS certificate so it is valid for the exact domain name your store uses, eliminating the hostname mismatch error.

On Squarespace

  1. Squarespace automatically provisions free SSL certificates (via Let's Encrypt) for all sites, including custom domains.
  2. Go to: Squarespace Admin → Settings → Domains (or Website → Pages → Website Tools on older navigation).
  3. Click your custom domain and confirm it is 'Active' with SSL enabled.
  4. If SSL shows as unavailable, the most common cause is incorrect DNS — ensure your domain's CNAME record points to ext-cust.squarespace.com (for subdomains/www) and/or the A record is pointed to Squarespace's correct IP.
  5. Toggle 'HTTPS Encryption' on under Settings → Advanced → SSL if it appears disabled.
  6. Allow up to 72 hours after DNS correction for the certificate to be issued. Contact Squarespace Support if the issue persists.
Ssl not accessibleModerate effort

Enable HTTPS on your store by opening port 443 and installing a valid SSL/TLS certificate so every page is served over a secure connection.

On Squarespace

  1. Squarespace automatically provisions a free SSL certificate (via Comodo/Sectigo) for all sites and keeps port 443 open — firewall configuration is not in your control.
  2. Go to Home Menu → Settings → Security & SSL.
  3. Ensure 'Secure (HTTPS)' is selected (not 'Insecure (HTTP)'). Toggle 'HTTPS Encryption' to ON.
  4. Enable 'Automatic SSL Renewal' to prevent future certificate expiry.
  5. For custom domains, confirm DNS is pointed to Squarespace per Settings → Domains. Certificate provisioning happens automatically within 72 hours of DNS propagation.
  6. If the SSL status shows an error, click 'Troubleshoot SSL' on the same page or contact Squarespace Support.
Weak spfQuick win

Add a hard-fail (-all) or soft-fail (~all) mechanism to your SPF DNS record so that mail servers are explicitly told to reject or flag email from senders not listed in your record.

On Squarespace

  1. Go to Squarespace Dashboard → Settings (or Domains panel) → Domains → click your domain → 'DNS Settings'.
  2. Scroll to the TXT records section. Find the record starting with v=spf1.
  3. Click the edit (pencil) icon and append -all or ~all to the end of the record value.
  4. If you use Google Workspace through Squarespace, ensure 'include:_spf.google.com' is present before the closing -all.
  5. Click Save. Verify with an external SPF checker.
X content type options weakQuick win

Set the X-Content-Type-Options response header to exactly `nosniff` (once, not duplicated) on every page and asset your store serves.

On Squarespace

  1. Squarespace automatically sets `X-Content-Type-Options: nosniff` on all hosted stores — no manual configuration is available or needed within the Squarespace UI.
  2. If a duplicate header is detected, audit any Cloudflare or CDN layer connected to your custom domain: Cloudflare Dashboard → Rules → Transform Rules → Modify Response Headers — remove any rule setting this header.
  3. Contact Squarespace Support if the platform itself is emitting a malformed or repeated value.
X frame options weakQuick win

Change the X-Frame-Options response header from its current weak or missing value to either DENY or SAMEORIGIN so your store cannot be embedded in a malicious iframe.

On Squarespace

  1. Squarespace does not allow direct HTTP response header customisation for standard plans — headers are controlled at the platform infrastructure level.
  2. Verify the current header value using DevTools (F12 → Network → document → Response Headers) or securityheaders.com.
  3. If X-Frame-Options is missing or weak, route your custom domain through Cloudflare (set DNS to Cloudflare proxied), then in Cloudflare dashboard → Rules → Transform Rules → Modify Response Header → add X-Frame-Options = DENY for all requests.
  4. Contact Squarespace support to report the missing header and request they apply it platform-wide.

Site Lifecycle · 12 fixes

Cms versionModerate effort

Identify your ecommerce platform and CMS version, then ensure it is always kept up to date to protect your store from security vulnerabilities and avoid loss of vendor support.

On Squarespace

  1. Squarespace is a fully hosted SaaS platform — all core updates are applied automatically.
  2. Log in to Squarespace Admin → Pages or Design → Template: check if your template version has any available updates or migration notices from Squarespace (they email account owners).
  3. If you are on an older Squarespace 7.0 template, consider migrating to a Squarespace 7.1 template, which receives ongoing updates and new Commerce features.
  4. Go to Commerce → Extensions: review all connected extensions for active support status.
Domain expiryQuick win

Enable auto-renew on your domain registration and set calendar reminders well before expiry to prevent accidental loss of your store's address.

On Squarespace

  1. For domains registered through Squarespace: log in → Home Menu → Settings → Domains. Click the domain → Domain Settings. Toggle Auto-Renew ON.
  2. Verify the billing card under Account → Billing — Squarespace charges the card on file for domain renewals.
  3. For externally registered domains pointed to Squarespace: manage auto-renew at your external registrar (e.g. GoDaddy, Google Domains).
Gtm auditModerate effort

Install Google Tag Manager on your store and configure GA4 with ecommerce event tracking (view_item, add_to_cart, purchase) so you can measure what's driving revenue.

On Squarespace

  1. In Squarespace, go to Settings → Developer Tools → External API Keys (on Business plan or higher) — note that direct GTM injection requires a Business plan or above.
  2. Paste the GTM <head> snippet into Settings → Advanced → Code Injection → Header field.
  3. Paste the GTM <body> snippet into Settings → Advanced → Code Injection → Footer field (it will render near the body, which is acceptable).
  4. For Squarespace Commerce ecommerce events, use a third-party solution such as 'Littledata' or 'Analyzify' which integrates with Squarespace to push GA4 ecommerce dataLayer events for add_to_cart and purchase.
  5. Configure GA4 tags in GTM, test with Preview and DebugView, then publish.
Html langQuick win

Add a correct `lang` attribute to your site's `<html>` tag so browsers, search engines, and assistive technologies know what language your store is written in.

On Squarespace

  1. Squarespace sets the lang attribute automatically based on your site's region/language setting.
  2. Go to your Squarespace admin › Settings › Language & Region (or Settings › Regional for older versions) and set the Site Language to your primary language.
  3. Squarespace will output the correct lang attribute on the <html> tag without any code editing needed.
  4. If you use Squarespace's Multiple Language feature (Business plan and above), each language page will carry its own lang value.
  5. Verify by opening your live site, right-clicking › View Page Source, and confirming <html lang=...> shows the correct code.
Lifecycle oos schema not updatedModerate effort

Update the `offers.availability` field in your Product schema to `OutOfStock` (or `PreOrder`/`Discontinued`) whenever a product sells out, so Google's data matches your real inventory.

On Squarespace

  1. Squarespace Commerce automatically outputs Product schema for store products, and it reads availability from the product's inventory status.
  2. Go to your Squarespace dashboard > Commerce > Inventory. Find the out-of-stock product and ensure its stock quantity is set to 0 and inventory tracking is enabled (the product's 'Track quantity' toggle is on).
  3. When stock is 0, Squarespace will mark the product as sold out on the front end and should reflect this in its schema output.
  4. Squarespace does not provide a native JSON-LD editor. If you need to inject or override schema manually, use Settings > Advanced > Code Injection (available on Business plan and above) to add a <script type='application/ld+json'> block with the correct availability value in the site-wide footer injection.
  5. For page-level schema injection on a per-product basis, use a Code Block within the product page (if your plan supports it) or a third-party schema app.
  6. Validate with Google's Rich Results Test.
Lifecycle orphaned productsModerate effort

Add internal links from category pages, navigation, and related-product sections to every product page so crawlers and shoppers can find them without relying solely on your sitemap.

On Squarespace

  1. In the Squarespace admin, go to Commerce → Inventory. Products not in any category appear under 'Uncategorized' in the sidebar — identify these as your orphan candidates.
  2. Click into each orphaned product and use the 'Categories' field to assign it to a relevant category. Categories appear as filterable tabs on your store page.
  3. Ensure your store page (which lists all categories) is linked from your main navigation: go to Pages, and confirm your Store page is in the main or secondary navigation.
  4. To add related/featured products: use the Squarespace block editor to add a 'Products' block to relevant content pages or blog posts, configured to show specific products or a category.
  5. For contextual links in blog posts: edit the relevant Blog post, select the product name text in the content editor, and use the link tool to add a hyperlink to the product URL.
  6. Consider adding a 'Featured Products' or 'Shop the Look' section to your homepage using a Products block, manually selecting the previously-orphaned products.
Lifecycle products missing from sitemapModerate effort

Add every canonical product URL to your XML sitemap so search engines can discover and index your products faster.

On Squarespace

  1. Squarespace automatically generates a sitemap at yourdomain.com/sitemap.xml for all published pages and products.
  2. Products must be in a published state and their parent page must not be password-protected or set to 'Not Linked'. Go to Pages → your Store page → ensure it is published.
  3. Individual products: open the store page editor, click the product → make sure it is published (not hidden/draft).
  4. Go to Pages → SEO (gear icon on each page) → confirm 'Enable SEO' is ON for your store page.
  5. Submit the sitemap in Google Search Console → Sitemaps.
Lifecycle products too deepModerate effort

Reduce the number of clicks required to reach every product page to 4 or fewer from the homepage by flattening your site structure or surfacing buried products on shallower category pages.

On Squarespace

  1. Pages panel (left sidebar): Squarespace does not support nested sub-folders beyond one level natively. If you have a Shop page with multiple category folders inside folders, reorganise by moving category index pages to the top level of the Pages panel.
  2. Squarespace Commerce → Products: reassign deeply nested products to a top-level category. Open the product → Category field → select or create a shallower category.
  3. Add a 'Products Block' to your homepage (Edit page → + Add Block → Products) and configure it to display items from the buried category, reducing click depth to 1.
  4. Edit your main navigation (Pages → Navigation) and add direct links to any category or product that is otherwise more than 3 clicks deep.
  5. Use the 'Summary Block' on a top-level page to pull in and display products from a buried category folder, giving those products an additional shallow entry point.
  6. Click through the live site from the homepage to confirm that all products are reachable within 4 clicks.
Mixed contentModerate effort

Audit every page, asset, and third-party embed on your store to ensure no HTTP resources are loaded on HTTPS pages, and fix any mixed-content violations before they silently break security warnings or block content in visitors' browsers.

On Squarespace

  1. Squarespace enforces HTTPS automatically; mixed content almost always comes from custom code blocks or external embeds.
  2. Go to Pages → click any page → Edit → find any Code Block or Embed Block, and check the HTML/code inside for http:// URLs. Replace with https://.
  3. Check Website → Pages → Page Settings → Advanced (for individual pages) or Design → Custom CSS for any hardcoded http:// asset references.
  4. In Settings → Advanced → Code Injection (Header / Footer), review any injected scripts or stylesheets for HTTP URLs and update them.
  5. If you use third-party integrations (e.g. embedded maps, chat widgets) added via Extensions or Code Injection, get the HTTPS version of the embed code from the provider.
  6. Republish or save your changes and check the site in an incognito browser with DevTools open (Console tab) to confirm the padlock is clean.
Mobile viewportQuick win

Confirm your store has a correct responsive viewport meta tag so it displays properly on phones and tablets.

On Squarespace

  1. Squarespace automatically outputs the correct responsive viewport meta tag on all templates — no manual action is needed.
  2. If you have injected custom code via Settings → Advanced → Code Injection that overrides or duplicates the viewport tag, review and remove any conflicting entries in the 'Header' injection box.
  3. Confirm by viewing your page source and searching for 'viewport', or run Google's Mobile-Friendly Test on your live URL.
Server versionModerate effort

Remove or suppress the Server version header so your web server software and version number are no longer exposed in every HTTP response.

On Squarespace

  1. Squarespace is a fully hosted SaaS platform — server header configuration is entirely managed by Squarespace.
  2. You cannot modify response headers such as `Server` or `X-Powered-By` from the Squarespace dashboard or any template setting.
  3. If version disclosure is detected, contact Squarespace Support to flag it. No owner-side action is possible.
  4. If you use Squarespace with a custom CDN or reverse proxy in front (non-standard), suppress the header at that CDN/proxy layer instead.
Ssl expiryQuick win

Monitor your SSL/TLS certificate expiry date and set up auto-renewal so your store never goes offline or shows a security warning to shoppers.

On Squarespace

  1. Squarespace automatically provisions and renews a free SSL certificate for all custom domains connected to your site.
  2. To check status: Home Menu → Settings → Domains → click your domain → look for 'SSL' status (should show 'Active').
  3. If SSL shows as 'Pending' for more than 72 hours, confirm your domain's nameservers are pointed to Squarespace (if using Squarespace DNS) or that the required DNS records are correct at your registrar.
  4. Squarespace does not support uploading third-party certificates — all SSL is managed by the platform.

Generative Engine Optimization · 9 fixes

Ai crawler blockedQuick win

Your robots.txt explicitly blocks one or more AI assistants from crawling your store, so those engines can't discover, index, or cite your products when shoppers ask for recommendations.

On Squarespace

  1. Squarespace generates robots.txt automatically and does not allow direct editing.
  2. Make sure you have NOT enabled any setting that hides the site from search engines (Settings > Crawlers / 'Discourage search engines').
  3. Because per-bot robots rules aren't editable, lean on the other GEO levers (llms.txt, schema, sameAs) to maximise AI visibility.
Ai crawler not specifiedQuick win

Your robots.txt doesn't explicitly allow several AI crawlers. They aren't blocked, but a number of AI engines act on explicit permission, so naming them removes any ambiguity.

On Squarespace

  1. Squarespace generates robots.txt automatically and does not allow direct editing.
  2. Make sure you have NOT enabled any setting that hides the site from search engines (Settings > Crawlers / 'Discourage search engines').
  3. Because per-bot robots rules aren't editable, lean on the other GEO levers (llms.txt, schema, sameAs) to maximise AI visibility.
Geo brand name inconsistentModerate effort

Your brand name appears in multiple different formats across your site (schema, og:site_name, footer, logo). AI engines may treat the variants as separate entities.

On Squarespace

  1. Squarespace emits some commerce schema automatically; add or extend JSON-LD via Settings > Advanced > Code Injection (or per-page code injection) for Organization sameAs and any missing Product fields.
  2. Fill in Business Information (Settings) so name/logo/social links are available.
  3. Validate with Google's Rich Results Test.
Geo eeat trust signals weakModerate effort

Your store is missing trust signals (E-E-A-T) that AI engines and shoppers look for before recommending a store: clear policies, real contact details, and a credible business identity.

On Squarespace

  1. Squarespace emits some commerce schema automatically; add or extend JSON-LD via Settings > Advanced > Code Injection (or per-page code injection) for Organization sameAs and any missing Product fields.
  2. Fill in Business Information (Settings) so name/logo/social links are available.
  3. Validate with Google's Rich Results Test.
Geo faqpage missing productsModerate effort

Your product pages don't use FAQPage schema, so AI assistants can't pull direct answers to common buyer questions (sizing, materials, shipping) about your products.

On Squarespace

  1. Squarespace emits some commerce schema automatically; add or extend JSON-LD via Settings > Advanced > Code Injection (or per-page code injection) for Organization sameAs and any missing Product fields.
  2. Fill in Business Information (Settings) so name/logo/social links are available.
  3. Validate with Google's Rich Results Test.
Geo price not crawlableModerate effort

Your product prices appear to be rendered by JavaScript and may not be present in the static HTML, so AI crawlers (which often don't run JS) can't read or cite them.

On Squarespace

  1. Squarespace emits some commerce schema automatically; add or extend JSON-LD via Settings > Advanced > Code Injection (or per-page code injection) for Organization sameAs and any missing Product fields.
  2. Fill in Business Information (Settings) so name/logo/social links are available.
  3. Validate with Google's Rich Results Test.
Geo schema org missing sameasModerate effort

Your Organization schema has no sameAs links to your social profiles, Wikipedia, or other authoritative sources - so AI engines can't confidently connect the dots about your brand.

On Squarespace

  1. Squarespace emits some commerce schema automatically; add or extend JSON-LD via Settings > Advanced > Code Injection (or per-page code injection) for Organization sameAs and any missing Product fields.
  2. Fill in Business Information (Settings) so name/logo/social links are available.
  3. Validate with Google's Rich Results Test.
Geo schema product incompleteModerate effort

Your Product structured data is missing fields AI engines rely on to cite your products accurately (price, availability, currency, brand, ratings).

On Squarespace

  1. Squarespace emits some commerce schema automatically; add or extend JSON-LD via Settings > Advanced > Code Injection (or per-page code injection) for Organization sameAs and any missing Product fields.
  2. Fill in Business Information (Settings) so name/logo/social links are available.
  3. Validate with Google's Rich Results Test.
Llms txt missingQuick win

Your store has no llms.txt - the emerging standard (like robots.txt, but for AI) that tells language models which content to read and cite. SEOLZ has generated a ready-to-upload file from your own pages.

On Squarespace

  1. Squarespace doesn't allow arbitrary root files; use a URL redirect or a Code Block page and map /llms.txt where possible, or host the file on a subdomain/CDN you control.
  2. Verify the URL resolves to the generated content.