Every Wix Studio fix we catalog
SEOLZ catalogs 83 fixes for Wix Studio across 5 areas — SEO, answer-engine readiness, accessibility, security and site-health. Each lists the exact steps for Wix Studio, with a link to the official docs.
SEO · 16 fixes
Images missing altModerate effort
Add descriptive alt text to every product and content image so search engines and screen readers can understand what the image shows.
On Wix Studio
- In Wix Studio editor, click the image element → open the Settings panel (gear icon) → find the 'Alt Text' field → enter your description → Done.
- For Wix Stores products inside Wix Studio: Dashboard → Store Products → [select product] → click the product image → edit alt text in the image settings → Save.
<!-- BEFORE (missing alt — bad) -->
<img src="/images/red-leather-bag.jpg">
<!-- AFTER (descriptive alt — correct) -->
<img src="/images/red-leather-bag.jpg" alt="Red leather crossbody bag with gold buckle clasp">
<!-- Decorative image (intentionally empty alt — correct) -->
<img src="/images/divider-line.png" alt="">Place this wherever an <img> tag appears in your HTML. Replace the placeholder text with your real description.
Images missing alt bulkModerate effort
Add descriptive alt text to every product and content image at the template level so search engines and screen readers can understand all images on the page.
On Wix Studio
- In Wix Studio, click an image element → open the Properties panel on the right → enter alt text in the 'Alt Text' field.
- For Wix Studio ecommerce product images, follow the same Dashboard → Store Products CSV workflow described for Wix above.
- If using Wix Studio's CMS (dynamic pages), edit the connected dataset and add/populate an 'Image Alt Text' field, then bind it to the image element's alt text property in the editor.
<!-- Informative product image — describe what the image shows -->
<img src="/images/red-running-shoes-side-view.jpg"
alt="Red canvas running shoes, side view, white rubber sole"
width="800" height="800">
<!-- Decorative image — empty alt tells screen readers to skip it -->
<img src="/images/divider-wave.svg"
alt=""
role="presentation"
width="1200" height="40">Correct alt text pattern for informative images vs. decorative images.
Meta description too longQuick win
Shorten your meta description to 150–160 characters so Google displays it in full instead of cutting it off with "…" in search results.
On Wix Studio
- In Wix Studio, open the Pages panel, hover over the target page, click the three-dot menu → 'SEO'.
- Edit the 'Meta description' field in the SEO settings panel, staying under 160 characters.
- For dynamic product/collection pages, update the description pattern in the SEO Settings of the relevant CMS collection.
- Click Apply / Publish.
<meta name="description" content="Award-winning Bang & Olufsen headphones, speakers and TVs. Visit our Malaysia showroom at The Gardens Mall, Level 2. Free shipping on orders over RM500.">Place this inside the <head> element of every page. Replace the content value with your page-specific description (max 160 characters).
Meta description too shortModerate effort
Expand your meta description to 120–160 characters so Google displays a compelling, complete snippet in search results that drives more clicks to your store.
On Wix Studio
- In Wix Studio, select the page in the Pages panel → click the Settings icon (⚙) next to the page name → open the 'SEO' tab.
- Update the 'Description' field to 120–160 characters → Save.
- For ecommerce product pages, manage meta descriptions via the Wix eCommerce product editor under the 'SEO' section of each product.
<meta name="description" content="Shop the official Nike national team jerseys — advanced Dri-FIT heat tech meets bold heritage design. Free shipping on orders over $75. Explore the full collection now.">Place this inside the <head> element of your HTML page. Replace the content value with your 120–160 character description.
Missing canonicalModerate effort
Add a self-referencing canonical tag to every page so Google knows which URL is the definitive version of that content.
On Wix Studio
- Wix Studio (advanced editor) also outputs canonical tags automatically for all pages.
- To set a custom canonical: open the page in Wix Studio editor → click the page settings (gear icon) → SEO tab → scroll to 'Additional Tags' → add `<link rel='canonical' href='YOUR_PREFERRED_URL' />`.
- For programmatic pages (e.g., dynamic collection pages built with Wix Velo/CMS), use Velo's `wixSeo.setLinks()` API in the page's code to set the canonical dynamically: `import wixSeo from 'wix-seo'; $w.onReady(() => { wixSeo.setLinks([{ rel: 'canonical', href: 'https://www.yourstore.com/preferred-url' }]); });`
- Verify via Google Search Console URL Inspection.
<link rel="canonical" href="https://www.yourstore.com/your-page/" />Paste this inside the <head> element of every page. Replace the href value with the full, absolute preferred URL of that specific page.
Missing h1Quick win
Add a single, descriptive H1 tag to every page that currently lacks one, clearly stating the page's main topic.
On Wix Studio
- Open the Wix Studio editor and select the page needing an H1.
- Click the main heading text element (or add one via the '+' Add panel → Text → Heading 1).
- With the element selected, open the text style dropdown in the toolbar and choose *'Heading 1'* to ensure it is tagged as `<h1>`.
- For Wix Stores product pages managed through Studio, the product title widget automatically outputs an H1 — ensure the product name is descriptive under Wix Stores → Products.
- Publish and verify using browser Dev Tools or a headings inspector extension.
<h1>Women's Running Shoes</h1>Place exactly one of these per page, as the first heading in the main content area.
Missing meta descriptionModerate effort
Write and add a unique meta description (120–160 characters) to every page that is missing one, so Google can display an accurate, compelling snippet in search results.
On Wix Studio
- In Wix Studio, open the site → Pages & Menu panel → hover over the page → click the SEO icon (magnifying glass) → fill in the 'Meta Description' field.
- For collection/dynamic pages, open the dynamic page template → SEO panel → use the field-connection feature to bind the description to a CMS dataset field.
- For Wix Stores products inside Studio: Dashboard → Store Products → click the product → SEO section → 'Meta Description'.
<head>
<meta charset="UTF-8">
<meta name="description" content="Shop our full range of handmade leather wallets. Free shipping on orders over $50. Slim, durable & personalised — order yours today.">
<title>Handmade Leather Wallets | YourStoreName</title>
</head>Place this tag inside the <head> element of every HTML page. Keep the content between 120–160 characters.
Missing og descriptionModerate effort
Add an og:description meta tag to every page so that social media platforms display a compelling, accurate preview when your pages are shared.
On Wix Studio
- In Wix Studio, select a page in the left panel and open its SEO settings via the page menu.
- Under 'Social Share', enter a custom description — this becomes the og:description.
- For dynamic collection pages, use the dataset binding or Velo code (wixSeo.setMetaTags) to set og:description dynamically from item fields.
- Publish and test with Facebook's Sharing Debugger.
<head>
<!-- Open Graph / Social Sharing -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.example.com/page-url/" />
<meta property="og:title" content="Page Title – Brand Name" />
<meta property="og:description" content="A concise, compelling summary of this page in 100–160 characters that encourages clicks." />
<meta property="og:image" content="https://www.example.com/images/social-preview.jpg" />
</head>Place all Open Graph tags inside the <head> element of every page.
Missing og imageModerate effort
Add an og:image meta tag to every page so that social media platforms and messaging apps display a rich, branded image preview whenever someone shares your store's link.
On Wix Studio
- In Wix Studio, open the Pages panel → hover over the page → click the three-dot menu → 'SEO & Social'.
- In the Social Sharing section, upload a 1200×630 px image for that specific page.
- For dynamic pages (e.g. product or blog templates), use the dynamic SEO settings panel to bind the og:image to a dataset field so each item gets its own image automatically.
- Set a site-wide fallback image in the Dashboard → SEO → Social Share → Social Sharing Image.
- Publish and validate using Facebook's Sharing Debugger.
Missing og titleQuick win
Add an og:title meta tag to every page so your store's title appears correctly when shared on social media platforms like Facebook, LinkedIn, and Pinterest.
On Wix Studio
- In Wix Studio, open the site editor and select the page you want to fix from the Pages & Menus panel.
- Click the page settings (gear icon) → SEO tab → set the 'Page Title' field. Wix Studio maps this to the og:title tag automatically.
- For dynamic pages powered by a CMS dataset (e.g. a Products collection), click the dynamic page settings → SEO tab → use the dynamic field connector to bind 'Page Title' to the relevant collection field (e.g. 'Title' or 'Name').
- For full custom control, use the Wix Studio 'Custom Meta Tags' section (in the SEO tab of page settings) to manually add: property: og:title | content: [your title or dynamic field].
- Publish the site and validate with the Facebook Sharing Debugger.
<head>
<!-- Other head tags -->
<meta property="og:title" content="Amazing Product Name | Your Store Name" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.yourstore.com/page-url" />
<meta property="og:description" content="Short description of this page for social sharing." />
<!-- Other head tags -->
</head>Place inside the <head> section of every HTML page. Replace the content value with your actual page title.
Missing titleQuick win
Add a unique, descriptive title tag (30–60 characters) to every page that is missing one.
On Wix Studio
- In Wix Studio, open the Pages panel → hover over the page → click the settings (gear) icon.
- Select 'SEO' from the panel that appears → edit the 'Page title' field.
- For store products: access the site Dashboard → Store Products → select the product → SEO section → 'Page title'.
- Publish the site for changes to go live.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Slim Bifold Leather Wallet | BrandName</title>
</head>
<body>
<!-- page content -->
</body>
</html>Place this inside the <head> element of every HTML page. Keep the text between 30–60 characters.
Multiple h1Moderate effort
Remove all but one H1 tag from each page so every page has exactly one clear, descriptive primary heading.
On Wix Studio
- Open the page in Wix Studio Editor. Click any text element and check the text role/style in the Design panel on the right — set only one element to H1.
- For CMS (dynamic) pages such as product or blog templates, open the page template and ensure the connected dataset title field renders as H1 while all other headings render as H2 or lower.
- Publish and verify with browser DevTools.
<!-- CORRECT: One H1 per page -->
<h1>Blue Running Shoes – Men's Lightweight Trainers</h1>
<!-- Major sections use H2 -->
<h2>Product Details</h2>
<p>Breathable mesh upper, responsive foam midsole...</p>
<h2>Customer Reviews</h2>
<!-- Sub-sections within a major section use H3 -->
<h3>Top Review: 5 Stars</h3>
<p>Best shoes I've ever bought!</p>
<!-- WRONG: Multiple H1 tags — do NOT do this -->
<!--
<h1>Blue Running Shoes</h1>
<h1>Product Details</h1>
<h1>Customer Reviews</h1>
-->Correct semantic heading structure for an ecommerce page — one H1, everything else H2 or lower.
Noindex detectedQuick win
Remove or replace the noindex directive on any page you want to appear in Google search results.
On Wix Studio
- In Wix Studio, open the Pages panel → hover over the page → click the three-dot menu → SEO Settings → confirm 'Index this page' is enabled.
- For Advanced SEO tags: Pages panel → SEO Settings → Advanced → check the 'Additional meta tags' field for any `noindex` robots tag and delete it.
- Global SEO settings: Dashboard → Marketing & SEO → SEO Settings → review any site-level robot directives.
<meta name="robots" content="index,follow">Place inside <head>. This is the CORRECT tag that allows indexing and link-following.
Seo category description missingModerate effort
Write a 100–200 word description for every category page explaining what products it contains and who they are for, so Google can rank it for category-level keywords.
On Wix Studio
- In Wix Studio, go to the CMS panel and open the dataset connected to your category/collection pages.
- Add a rich-text or long-text field named 'Category Description' if one does not exist.
- Fill in the description for each category row in the CMS dataset.
- On your dynamic category page template in the Studio editor, add a Text element, click 'Connect to Data', and bind it to the 'Category Description' field.
- Position the text element above the product grid in the page layout.
- Publish the site.
<section class="category-description">
<h1>Women's Waterproof Hiking Boots</h1>
<p>
Our women's waterproof hiking boots are built for trail runners, weekend
trekkers, and serious mountaineers who refuse to let wet weather slow them
down. Every pair in this collection features a fully sealed waterproof
membrane, aggressive rubber outsoles for grip on loose or muddy terrain,
and reinforced ankle support to protect against sprains on uneven ground.
Whether you're day-hiking a local forest trail or taking on a multi-day
alpine route, you'll find boots here rated for every conditions and
experience level. Lightweight options keep pack weight low on fast-and-light
adventures, while insulated models keep feet warm below freezing. Browse the
full range below to find your perfect fit.
</p>
</section>Place this block near the top of your category page, above the product grid.
Seo category description thinModerate effort
Expand your category page description to at least 100 words of genuinely helpful, keyword-rich content that explains what shoppers will find in that category.
On Wix Studio
- Open your project in Wix Studio and go to the category dynamic page (typically set up under CMS > Collections).
- Select the text element bound to the category description field, or add a new Rich Text element and connect it to the Description field in your CMS collection.
- Edit the CMS collection entry for each category to include 100+ words of description text.
- Use the Wix Studio responsive editor to ensure the text block displays correctly on mobile and desktop.
- Publish when complete.
<section class="category-description">
<h2>Shop Our Women's Running Shoes</h2>
<p>
Discover our curated collection of women's running shoes, designed for every
type of runner — from casual joggers to marathon enthusiasts. Whether you
need extra cushioning for long-distance road running, a lightweight racer
for speed training, or a grippy trail shoe for off-road adventures, you'll
find the perfect fit here.
</p>
<p>
We stock top brands including Brooks, ASICS, New Balance, and Hoka, all
rigorously tested for comfort, durability, and performance. Each pair is
available in a wide range of widths and sizes, so you never have to
compromise on fit. Browse by surface type, cushion level, or pronation
support to narrow down your ideal shoe in seconds.
</p>
<p>
Not sure where to start? Check out our
<a href="/guides/running-shoe-guide">Running Shoe Buying Guide</a> or
explore our <a href="/collections/running-accessories">Running Accessories</a>
collection to complete your kit.
</p>
</section>Paste this pattern into any category page template. Replace placeholder text with your real content.
Seo product no spec tableModerate effort
Add a structured specifications table or list to every product page so shoppers, search engines, and AI tools can instantly find and use key product details.
On Wix Studio
- In Wix Studio, open the product page via the Pages & Menus panel.
- Use the drag-and-drop canvas to add a Grid or Table component below the product description block.
- Bind the table columns to CMS collection fields if you manage specs through the Wix CMS, or enter values manually per product using the Additional Info section in the Wix Stores product editor (same path as standard Wix).
- Use Velo (Wix's JavaScript API) if you need to pull spec data programmatically and render it into the table element.
- Publish and verify on both breakpoints.
Answer Engine Optimization · 8 fixes
Article missing authorQuick win
Add a structured-data author field (schema.org Person) to every article or blog post so AI engines and Google can identify and trust who wrote the content.
On Wix Studio
- In Wix Studio, open the project and navigate to the Blog Post page template.
- Use the SEO panel (accessible per-page or via the global site settings) to add custom JSON-LD structured data for the Article/BlogPosting type including the author.
- Fill in the contributor/author profile details (display name, bio, social links) in the Members/Contributors settings so Wix can reference them.
- For full control, use Velo (Wix's developer platform): in the page's .js file, dynamically inject a <script type='application/ld+json'> tag using $w.onReady and the wix-data API to fetch author metafields.
- Validate with the Rich Results Test.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "How to Choose the Best Running Shoes",
"datePublished": "2024-03-10T09:00:00+00:00",
"dateModified": "2024-06-20T14:00:00+00:00",
"author": {
"@type": "Person",
"name": "Alex Johnson",
"url": "https://www.yourstore.com/about/alex-johnson",
"sameAs": [
"https://www.linkedin.com/in/alexjohnson",
"https://twitter.com/alexjohnson"
]
},
"publisher": {
"@type": "Organization",
"name": "Your Store Name",
"logo": {
"@type": "ImageObject",
"url": "https://www.yourstore.com/assets/logo.png",
"width": 300,
"height": 60
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://www.yourstore.com/blog/how-to-choose-running-shoes"
}
}
</script>For any static site or custom CMS: paste inside the <head> of each article page and fill in real values.
Low answer first scoreModerate effort
Restructure page content to lead with a direct, concise answer, use question-format headings, and add FAQ structured data so search engines and AI assistants can surface your answers prominently.
On Wix Studio
- Open the page in Wix Studio editor; click the first text/content element and rewrite it as a 160-character answer summary.
- Rewrite H2/H3 text elements as questions using the text style selector in the toolbar.
- For FAQ schema: click the page background → Page Settings → Advanced → Custom Code → add the FAQPage JSON-LD before the </body> tag.
- Alternatively use the native FAQ / Accordion widget from the Add Elements panel; Wix Studio outputs FAQPage schema for this widget automatically.
- Publish and test with Google's Rich Results Test.
<!-- Answer-first page structure template -->
<!-- 1. Direct-answer summary (≤160 characters) -->
<p class="answer-summary">
[Product Name] does [core benefit] by [key mechanism] — ideal for [target customer].
</p>
<!-- 2. Question-format H2 subheading -->
<h2>What does [Product Name] do?</h2>
<p>Direct 1–2 sentence answer here. Then expand with supporting detail below.</p>
<!-- 3. Another question-format heading -->
<h2>Who is [Product Name] designed for?</h2>
<p>Direct answer. Then elaborate.</p>
<!-- 4. FAQ section (visible on page — required for FAQPage schema) -->
<section id="faq">
<h2>Frequently Asked Questions</h2>
<h3>How long does shipping take?</h3>
<p>Standard shipping takes 3–5 business days. Express options are available at checkout.</p>
<h3>What is your return policy?</h3>
<p>We accept returns within 30 days of delivery on unused items in original packaging.</p>
<h3>Is [Product Name] compatible with [common concern]?</h3>
<p>Yes. [One-sentence direct answer with any important caveats.]</p>
</section>
<!-- 5. FAQPage JSON-LD (copy the JSON-LD snippet above and paste here or in <head>) -->Page content structure template — place this as the opening content block on any product, category, or landing page.
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 Wix Studio
- Open Wix Studio and navigate to the relevant page.
- Click on the SEO panel (top toolbar) and then 'Advanced SEO Tags' to access the structured data input field.
- Paste the complete JSON-LD BreadcrumbList block; use Wix Studio's dynamic data binding or Velo code panels to pull page-specific values (page title, URL) into the schema dynamically.
- Apply the pattern to all relevant page templates (Product Page, Category Page, Blog Post) via the template editor so it rolls out site-wide.
- Validate using Google's Rich Results Test.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.example.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Women's Clothing",
"item": "https://www.example.com/womens-clothing/"
},
{
"@type": "ListItem",
"position": 3,
"name": "Dresses",
"item": "https://www.example.com/womens-clothing/dresses/"
},
{
"@type": "ListItem",
"position": 4,
"name": "Blue Wrap Dress",
"item": "https://www.example.com/womens-clothing/dresses/blue-wrap-dress/"
}
]
}
</script>Place this <script> block inside <head> or anywhere in <body> on any page with a breadcrumb trail. Extend itemListElement with one ListItem per level.
Missing schema faqpageQuick win
Add FAQPage schema markup to any page that contains a Frequently Asked Questions section so Google can display your answers as rich results directly in search.
On Wix Studio
- In Wix Studio, open your site's dashboard and navigate to Settings → Custom Code.
- Click '+ Add Custom Code', paste your JSON-LD <script> block, name it 'FAQPage Schema', select the specific page(s) it applies to, set placement to 'Head', and click Apply.
- Publish the site and validate the live URL in Google's Rich Results Test.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Frequently Asked Questions | Your Store</title>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is your return policy?",
"acceptedAnswer": {
"@type": "Answer",
"text": "We accept returns within 30 days of purchase. Items must be unused and in their original packaging."
}
},
{
"@type": "Question",
"name": "How long does shipping take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Standard shipping takes 5–7 business days. Expedited options are available at checkout."
}
}
]
}
</script>
</head>
<body>
<h1>Frequently Asked Questions</h1>
<h2>What is your return policy?</h2>
<p>We accept returns within 30 days of purchase. Items must be unused and in their original packaging.</p>
<h2>How long does shipping take?</h2>
<p>Standard shipping takes 5–7 business days. Expedited options are available at checkout.</p>
</body>
</html>Full HTML page example showing exactly where to place the FAQPage script block inside the <head>.
Missing schema howtoModerate effort
Add HowTo structured data (JSON-LD) to any page that walks customers through a multi-step process, so Google can display your instructions as rich results in search.
On Wix Studio
- Open Wix Studio and navigate to the target page.
- Click the page name in the layers/pages panel > Page SEO Settings > Advanced SEO tab.
- Paste your complete JSON-LD HowTo block into the 'Structured Data Markup' or custom head code area.
- Publish and validate with Google's Rich Results Test.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>How to Complete Your Task | Your Store</title>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to Complete Your Task",
"description": "Follow these steps to complete your task easily.",
"totalTime": "PT10M",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Prepare your materials",
"text": "Gather everything you need before you start: list materials here."
},
{
"@type": "HowToStep",
"position": 2,
"name": "Complete the main action",
"text": "Describe exactly what the user should do in this core step."
},
{
"@type": "HowToStep",
"position": 3,
"name": "Verify the result",
"text": "Explain how the user confirms the task was completed successfully."
}
]
}
</script>
</head>
<body>
<!-- Your how-to page content -->
</body>
</html>Place this block inside the <head> element of any static HTML page that contains step-by-step instructions.
Missing schema localbusinessQuick win
Add LocalBusiness JSON-LD structured data to your store so search engines and AI answer engines can surface your business name, address, phone number, and hours in rich results and direct answers.
On Wix Studio
- In Wix Studio, open the site editor and select the page you want to add schema to (start with the homepage).
- Click the page settings icon → SEO → Advanced SEO.
- Locate the 'Structured Data Markup' text area and paste your complete JSON-LD object.
- Save and republish the site.
- Validate with Google's Rich Results Test.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Your Store</title>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Store",
"name": "Your Business Name",
"url": "https://www.yourdomain.com",
"logo": "https://www.yourdomain.com/logo.png",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Main Street",
"addressLocality": "Springfield",
"addressRegion": "IL",
"postalCode": "62701",
"addressCountry": "US"
},
"telephone": "+1-217-555-0100",
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "09:00",
"closes": "18:00"
}
]
}
</script>
</head>
<body>
<!-- page content -->
</body>
</html>Paste this block anywhere inside the <head> element of your HTML page. Replace all placeholder values before deploying.
Missing schema organizationQuick win
Add an Organization schema markup block to your store's homepage (and/or sitewide template) so search engines and AI assistants can definitively identify your brand.
On Wix Studio
- In Wix Studio, click the site name in the top bar → Site Settings.
- Go to 'Advanced' → 'Custom Code', then click '+ Add Custom Code'.
- Paste your complete <script type='application/ld+json'>…</script> Organization block, set placement to 'Head', scope to 'All pages'.
- Click Apply and publish.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Acme Store",
"url": "https://www.acmestore.com",
"logo": {
"@type": "ImageObject",
"url": "https://www.acmestore.com/images/logo.png",
"width": 250,
"height": 250
},
"sameAs": [
"https://www.facebook.com/acmestore",
"https://www.instagram.com/acmestore",
"https://twitter.com/acmestore",
"https://www.linkedin.com/company/acmestore",
"https://www.youtube.com/c/acmestore"
],
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer service",
"email": "hello@acmestore.com"
}
}
</script>Drop this complete block inside your <head>…</head> section on every page. Replace all placeholder values.
Org missing sameasQuick win
Add a `sameAs` array to your Organization schema, linking to your verified social profiles, Wikipedia page, LinkedIn, and other authoritative sources so search engines can confidently identify your brand as a known entity.
On Wix Studio
- In Wix Studio, open the site dashboard → Settings → Custom Code.
- Add a new custom code snippet in the '<head>' section, paste the Organization JSON-LD (with `sameAs`), set it to 'All pages'.
- Publish the site and verify with Google's Rich Results Test.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Your Brand Name",
"url": "https://www.yourdomain.com",
"logo": "https://www.yourdomain.com/images/logo.png",
"sameAs": [
"https://www.linkedin.com/company/your-company",
"https://www.facebook.com/yourpage",
"https://twitter.com/yourhandle",
"https://www.instagram.com/yourhandle",
"https://www.youtube.com/@yourchannel",
"https://en.wikipedia.org/wiki/Your_Brand",
"https://www.wikidata.org/wiki/QXXXXXXX"
]
}
</script>Paste this directly before the closing </head> tag in your HTML template. Remove any sameAs entries for platforms your brand does not have a presence on.
Accessibility (WCAG) · 40 fixes
Aria allowed roleQuick win
Remove or replace any ARIA `role` attribute that is not permitted on the HTML element it is applied to — in particular, do not add `role="textbox"` (or other interactive roles) to elements that already have a native semantic role which conflicts with it.
On Wix Studio
- Open Wix Studio and navigate to the relevant page.
- Select the element. If it is a custom component or HTML embed, click Edit Code to access its markup.
- Remove or replace the invalid `role` attribute, or swap the element for the appropriate native HTML tag.
- Save and republish; re-audit with axe DevTools.
<!-- ❌ WRONG: role="textbox" is not permitted on <select> -->
<select role="textbox" name="country">
<option value="us">United States</option>
</select>
<!-- ✅ FIX A: Remove the invalid role — <select> already has the correct native semantics -->
<select name="country">
<option value="us">United States</option>
</select>
<!-- ❌ WRONG: role="textbox" on a <div> with no keyboard/input handling -->
<div role="textbox" class="fake-input">Enter your name</div>
<!-- ✅ FIX B: Replace with a real <input> element -->
<label for="name">Your name</label>
<input type="text" id="name" name="name" placeholder="Enter your name">
<!-- ❌ WRONG: role="textbox" on a <p> element -->
<p role="textbox">Some editable text</p>
<!-- ✅ FIX C: If you need an editable region, use contenteditable + the permitted role -->
<!-- role="textbox" IS permitted on elements with contenteditable, like a <div> -->
<div role="textbox"
contenteditable="true"
aria-multiline="false"
aria-label="Your name">
</div>Common patterns: wrong role on the left, correct fix on the right (as comments).
Aria dialog nameModerate effort
Add a visible or programmatic accessible name to every dialog element so screen readers can announce what the dialog is about when it opens.
On Wix Studio
- In Wix Studio, enable Dev Mode from the top toolbar.
- Select the panel, popup, or lightbox component that acts as a dialog.
- In the Properties & Events panel, check whether an aria-label field is available directly on the component (Wix Studio is expanding native ARIA support — check the latest release notes).
- If no native field exists, use the page's JavaScript code panel to target the rendered dialog element after it opens and set aria-label or aria-labelledby programmatically, similar to the Velo approach for standard Wix.
- Test using axe DevTools in your browser while previewing the published or staged site.
<!-- Preferred: point to the dialog's own heading -->
<div role="dialog" aria-modal="true" aria-labelledby="cart-dialog-title">
<h2 id="cart-dialog-title">Shopping Cart</h2>
<p>You have 3 items in your cart.</p>
<button type="button">Close</button>
</div>
<!-- Alternative: use aria-label when there is no visible heading -->
<div role="dialog" aria-modal="true" aria-label="Shopping Cart">
<p>You have 3 items in your cart.</p>
<button type="button">Close</button>
</div>Preferred method: aria-labelledby points to the dialog's own heading. Use this whenever a visible title exists inside the dialog.
Aria hidden focusModerate effort
Remove `aria-hidden="true"` from any element that contains focusable children (links, buttons, inputs), or remove those focusable children from the keyboard tab order so they cannot receive focus while hidden from assistive technology.
On Wix Studio
- Open Wix Studio editor and navigate to the page with the issue.
- Use the Velo IDE (Dev Mode) to access the page's JavaScript. Add an onReady handler that finds the hidden container and sets tabindex='-1' on its focusable children when it is in the aria-hidden state.
- For custom-coded panels or menus built with Wix Studio's layout tools, locate the component's show/hide logic and update it to toggle both aria-hidden and tabindex='-1' together.
- Publish the site and verify with axe DevTools in Chrome.
Aria input field nameModerate effort
Add a descriptive accessible name (aria-label, aria-labelledby, or a visible <label>) to every ARIA input field so assistive technologies can identify it.
On Wix Studio
- Open Wix Studio and select the page containing the unlabeled input.
- Click the input element, then open the Properties & Events panel on the right. Look for the 'Accessibility' section and fill in the 'ARIA label' field with a descriptive name.
- For Wix Studio's native form widgets, ensure the 'Label' field is populated in the component settings — Studio auto-generates the accessible name from the visible label text.
- For custom-coded components using Velo, add $w('#elementId').accessibility.ariaLabel = 'Your label'; in the relevant page or site code.
- Publish and verify with axe DevTools.
<label for="customer-email">Email address</label>
<input type="email" id="customer-email" name="email" autocomplete="email">Option 1 (preferred): Visible label associated via 'for' + 'id'. Use this whenever a visible label fits the design.
Aria meter nameQuick win
Add a descriptive accessible name (via aria-label, aria-labelledby, or a visible <label>) to every element with role="meter" so screen readers can announce what the meter represents.
On Wix Studio
- Open the project in Wix Studio and select the meter component.
- In the Properties panel, look for the Accessibility section and set the Aria Label field to a descriptive string (e.g., 'Average customer rating').
- If editing via code (Velo), open the element's properties in the Code panel and set element.accessibility.ariaLabel = 'Average customer rating';
- For custom HTML widgets, embed a <meter> element with full ARIA attributes via the HTML Component and set aria-label there.
- Use the built-in Preview mode and the axe DevTools browser extension to confirm the label is announced correctly.
<!-- Option A: aria-label directly on the element -->
<meter
role="meter"
aria-label="Average customer rating"
aria-valuenow="3.8"
aria-valuemin="0"
aria-valuemax="5"
value="3.8"
min="0"
max="5">
3.8 out of 5
</meter>
<!-- Option B: aria-labelledby pointing to an existing visible element -->
<h3 id="rating-heading">Average customer rating</h3>
<meter
role="meter"
aria-labelledby="rating-heading"
aria-valuenow="3.8"
aria-valuemin="0"
aria-valuemax="5"
value="3.8"
min="0"
max="5">
3.8 out of 5
</meter>
<!-- Option C: visually hidden label for div-based meters -->
<span id="stock-label" class="visually-hidden">Items remaining in stock</span>
<div
role="meter"
aria-labelledby="stock-label"
aria-valuenow="4"
aria-valuemin="0"
aria-valuemax="20">
</div>
<!-- CSS for visually-hidden helper class -->
<style>
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
</style>Place this markup wherever a meter widget is rendered. Replace attribute values with real content.
Aria required childrenModerate effort
Add the required child ARIA roles (e.g. `role="option"` inside `role="listbox"`, or `role="group"`/`role="option"` inside `role="combobox"`) so every composite ARIA widget contains the child roles the ARIA specification demands.
On Wix Studio
- In Wix Studio, open the page containing the broken widget in the editor.
- If the widget is a custom component, open the Components panel, select the component, and use the Dev Mode panel to add or correct ARIA attributes via JavaScript (same Velo API as standard Wix).
- For Studio-native 'blocks' that output incorrect ARIA, use the Settings → Accessibility panel (where available) or file a bug with Wix Studio support.
- For full control, insert a Custom Embed block containing hand-authored HTML with the correct role hierarchy.
- Verify with axe DevTools after publishing.
Aria required parentModerate effort
Wrap every ARIA role that requires a parent container (e.g. `menuitem`, `option`, `listitem`) inside the correct parent element carrying the matching ARIA role (e.g. `menu`/`menubar`, `listbox`, `list`).
On Wix Studio
- In Wix Studio, select the affected component on the canvas.
- Open the Properties & Events panel and look for ARIA/Accessibility attribute fields to set the parent role directly.
- If no direct ARIA attribute field is available, open the Custom Code editor (Site → Settings → Custom Code) and add a JavaScript snippet that wraps the orphaned child elements in a correctly-roled parent element after DOM load.
- Use the HTML Embed or Custom Element feature to rebuild the component with fully correct ARIA structure if the issue is in a custom-built widget.
- Publish and verify with the axe browser extension.
<!-- INCORRECT: menuitem with no required parent -->
<nav>
<a href="/shop" role="menuitem">Shop</a>
<a href="/about" role="menuitem">About</a>
<a href="/contact" role="menuitem">Contact</a>
</nav>
<!-- CORRECT: menuitem children wrapped in role="menubar" -->
<nav>
<ul role="menubar">
<li role="none"><a href="/shop" role="menuitem">Shop</a></li>
<li role="none"><a href="/about" role="menuitem">About</a></li>
<li role="none"><a href="/contact" role="menuitem">Contact</a></li>
</ul>
</nav>
<!-- CORRECT: option children wrapped in role="listbox" -->
<div role="listbox" aria-label="Select a size">
<div role="option" aria-selected="false">Small</div>
<div role="option" aria-selected="true">Medium</div>
<div role="option" aria-selected="false">Large</div>
</div>
<!-- CORRECT: tab children wrapped in role="tablist" -->
<div role="tablist" aria-label="Product details">
<button role="tab" aria-selected="true" aria-controls="panel-desc">Description</button>
<button role="tab" aria-selected="false" aria-controls="panel-reviews">Reviews</button>
</div>
<div id="panel-desc" role="tabpanel">Description content here.</div>
<div id="panel-reviews" role="tabpanel" hidden>Reviews content here.</div>Correct pattern: child roles (menuitem) wrapped in the required parent role (menu/menubar). Apply the same principle to other role pairs.
Aria valid attr valueModerate effort
Audit every ARIA attribute on your pages and correct any that have invalid or mismatched values so assistive technologies can interpret them correctly.
On Wix Studio
- Open Wix Studio and navigate to the page with the failing element.
- Select the element on the canvas, then open its Accessibility Settings panel to review and correct any label or description values that map to ARIA attributes.
- For custom code using Velo, open the Code panel for the page or site, find the relevant $w() call where the ARIA attribute is set, and correct the value.
- Publish and verify with the axe browser extension.
<!-- WRONG: aria-expanded with a number instead of boolean string -->
<button aria-expanded="1">Menu</button>
<!-- CORRECT: must be exactly the string "true" or "false" -->
<button aria-expanded="false">Menu</button>
<!-- WRONG: aria-describedby pointing to an ID that doesn't exist -->
<input type="email" aria-describedby="email-hint" />
<!-- (no element with id="email-hint" on the page) -->
<!-- CORRECT: the referenced element must exist in the DOM -->
<input type="email" aria-describedby="email-hint" />
<p id="email-hint">We'll never share your email with anyone.</p>
<!-- WRONG: aria-checked with a non-standard value -->
<div role="checkbox" aria-checked="yes">Subscribe</div>
<!-- CORRECT: aria-checked accepts "true", "false", or "mixed" -->
<div role="checkbox" aria-checked="false">Subscribe</div>
<!-- WRONG: aria-hidden with an invalid value -->
<span aria-hidden="hidden">decorative icon</span>
<!-- CORRECT: aria-hidden accepts only "true" or "false" -->
<span aria-hidden="true">decorative icon</span>Correct examples for the most commonly mis-valued ARIA attributes. Copy the pattern that matches your flagged element.
Autocomplete validModerate effort
Add valid `autocomplete` attribute values to every form field that collects personal information, using the exact tokens specified by the HTML standard.
On Wix Studio
- Open Wix Studio Editor for your site and enable Dev Mode (toggle in the top bar).
- Select the input element in the canvas or locate it in the Layers panel.
- In the Properties & Events panel on the right, switch to the Code tab; you can set element attributes programmatically using $w('#inputId').setAttribute('autocomplete', 'given-name') in the page's code file.
- Alternatively, open the relevant page's code file (Page Code panel at the bottom) and add $w.onReady(function(){ $w('#firstNameInput').setAttribute('autocomplete','given-name'); }); for each field.
- Preview the page and test autofill in the browser.
<!-- Name fields -->
<input type="text" name="fname" autocomplete="given-name" />
<input type="text" name="lname" autocomplete="family-name" />
<input type="text" name="fullname" autocomplete="name" />
<!-- Contact fields -->
<input type="email" name="email" autocomplete="email" />
<input type="tel" name="phone" autocomplete="tel" />
<!-- Address fields (shipping) -->
<input type="text" name="address1" autocomplete="shipping address-line1" />
<input type="text" name="address2" autocomplete="shipping address-line2" />
<input type="text" name="city" autocomplete="shipping address-level2" />
<input type="text" name="state" autocomplete="shipping address-level1" />
<input type="text" name="zip" autocomplete="shipping postal-code" />
<select name="country" autocomplete="shipping country"></select>
<!-- Address fields (billing) -->
<input type="text" name="billing_address1" autocomplete="billing address-line1" />
<input type="text" name="billing_zip" autocomplete="billing postal-code" />
<!-- Payment fields -->
<input type="text" name="ccname" autocomplete="cc-name" />
<input type="text" name="ccnumber" autocomplete="cc-number" />
<input type="text" name="ccexp" autocomplete="cc-exp" />
<input type="text" name="cvc" autocomplete="cc-csc" />
<!-- Account fields -->
<input type="email" name="login_email" autocomplete="email" />
<input type="password" name="current_pass" autocomplete="current-password" />
<input type="password" name="new_pass" autocomplete="new-password" />
<input type="text" name="otp" autocomplete="one-time-code" />Apply these autocomplete tokens to the matching input fields in any HTML form.
Button nameModerate effort
Add a descriptive, screen-reader-accessible name to every button on your site so assistive technology users know what each button does.
On Wix Studio
- Open your project in Wix Studio. Select the button component on the canvas.
- In the Properties panel on the right, look for the 'Accessibility' section and enter a descriptive label in the 'ARIA Label' field.
- If editing a custom-coded section, open the code panel and add aria-label="Descriptive name" directly in the JSX or HTML of the component.
- Use Velo (the Wix dev environment) for dynamic buttons: e.g. $w('#myButton').setAttribute('aria-label', 'Open cart');
- Publish and validate with the axe browser extension.
<!-- PATTERN 1: Icon-only button — add aria-label directly on the button -->
<button type="button" aria-label="Open search">
<svg aria-hidden="true" focusable="false" width="24" height="24" viewBox="0 0 24 24">
<path d="M21 21l-4.35-4.35M17 11A6 6 0 1 1 5 11a6 6 0 0 1 12 0z"
stroke="currentColor" stroke-width="2" fill="none"/>
</svg>
</button>
<!-- PATTERN 2: Button with an <img> icon — give the img a descriptive alt -->
<button type="button">
<img src="/icons/cart.svg" alt="View shopping cart" width="24" height="24">
</button>
<!-- PATTERN 3: Button labelled by visible text elsewhere on the page -->
<h2 id="newsletter-heading">Subscribe to our newsletter</h2>
<!-- ... form fields ... -->
<button type="submit" aria-labelledby="newsletter-heading">Subscribe</button>
<!-- PATTERN 4: Visible text button — just ensure the text is real HTML text -->
<button type="button">Add to Cart</button>
<!-- PATTERN 5: Quantity stepper buttons -->
<button type="button" aria-label="Decrease quantity">−</button>
<input type="number" value="1" aria-label="Product quantity">
<button type="button" aria-label="Increase quantity">+</button>Use one of these patterns depending on your button's content. Apply the correct pattern to every icon-only or ambiguous button on your site.
Color contrastQuick win
Increase the contrast ratio between your text color and its background color to meet the WCAG 4.5:1 minimum, so all users — including those with low vision — can read your content clearly.
On Wix Studio
- In Wix Studio editor, click the text element → Text Settings → change the color using the hex picker to an accessible value.
- To change globally, open the Design panel → Color Palette and update the relevant palette swatch to a darker accessible color — this updates all text using that swatch site-wide.
- Publish the site.
/* BEFORE (fails WCAG 1.4.3 — ratio 4.47:1 on white) */
.secondary-text {
color: #777777;
}
/* AFTER (passes WCAG 1.4.3 — ratio ~7.0:1 on white) */
.secondary-text {
color: #595959;
}Replace the failing color with one that achieves 4.5:1+ contrast on white (#ffffff). #595959 achieves ~7.0:1 on white.
Definition listModerate effort
Ensure every `<dl>` (definition list) element contains only properly nested `<dt>` and `<dd>` children, with no stray text, divs, or other elements placed directly inside it.
On Wix Studio
- Open Wix Studio and enable Dev Mode (toggle in the top bar).
- In the Pages & Panels sidebar, locate the page or section containing the malformed `<dl>` and open its code.
- Correct the HTML/JSX structure in the custom code block, ensuring only `<dt>`, `<dd>`, or wrapping `<div>` elements are direct children of `<dl>`.
- Publish the site and verify with the axe browser extension.
<!-- ✅ CORRECT: only <dt> and <dd> as direct children -->
<dl>
<dt>Material</dt>
<dd>100% Organic Cotton</dd>
<dt>Weight</dt>
<dd>180 GSM</dd>
<dt>Care Instructions</dt>
<dd>Machine wash cold</dd>
<dd>Tumble dry low</dd>
</dl>
<!-- ✅ ALSO CORRECT: <div> wrappers for layout/styling -->
<dl>
<div>
<dt>Material</dt>
<dd>100% Organic Cotton</dd>
</div>
<div>
<dt>Weight</dt>
<dd>180 GSM</dd>
</div>
</dl>
<!-- ❌ WRONG: stray <p>, <span>, or plain text directly inside <dl> -->
<!-- <dl>
<p>Product Details</p>
<dt>Material</dt>
<dd>Cotton</dd>
</dl> -->Correct `<dl>` structure — use this pattern for all product specs, FAQs, and paired term/value content.
Document titleQuick win
Add a descriptive, non-empty `<title>` element to every page so browsers, screen readers, and search engines can identify it.
On Wix Studio
- In Wix Studio, open the site and select a page from the Pages & Menus panel.
- Click the SEO icon (or Page Settings → SEO tab).
- Enter a descriptive title in the 'Title tag' field.
- For CMS/collection pages, switch to the 'Dynamic' tab and use field variables (e.g. `{Title} | My Store`) to auto-populate titles.
- Publish the site and verify the title appears in the browser tab.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Women's Running Shoes – Acme Sports</title>
</head>
<body>
<!-- page content -->
</body>
</html>Place this inside the <head> section of every HTML page. Replace the text with the actual page and store name.
Empty headingQuick win
Find every empty heading tag on your store and add visible, descriptive text (or remove the tag entirely) so screen readers and search engines can interpret your page structure.
On Wix Studio
- In Wix Studio, open the relevant page and open the Layers panel from the left toolbar to see every element, including hidden ones.
- Identify any Text elements set to Heading style (H1–H6) that contain no text. Click each and either add descriptive text or delete the element.
- For component/section templates reused across pages, edit the base component and fix the heading there so the fix propagates everywhere it is used.
- Use the built-in Accessibility Wizard (Site → Accessibility Wizard) to surface and step through remaining issues, then republish.
<!-- ❌ WRONG: empty heading — announced as 'heading' with no label -->
<h2></h2>
<!-- ✅ CORRECT option 1: add visible, descriptive text -->
<h2>Featured Products</h2>
<!-- ✅ CORRECT option 2: visually-hidden text (visible to screen readers, hidden on screen) -->
<!-- Add this CSS once in your stylesheet: -->
<!--
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
-->
<h2><span class="sr-only">Featured Products</span></h2>
<!-- ✅ CORRECT option 3: aria-label when removing the tag is not possible -->
<h2 aria-label="Featured Products"></h2>
<!-- ✅ CORRECT option 4: not a heading at all — use a div instead -->
<div class="decorative-divider"></div>The wrong pattern and the two correct alternatives — visible text, or visually-hidden text for screen readers only.
Empty table headerQuick win
Add visible or screen-reader-accessible text to every empty `<th>` table header cell so assistive technology users can understand what each column or row represents.
On Wix Studio
- In Wix Studio, select the Table or Data Grid component on the canvas.
- Click the component settings (gear icon) and locate each column's 'Header Label' or 'Title' field — fill in any that are blank.
- For custom-coded sections using Velo (Wix Dev Mode), open the relevant page or component .jsx file in the Velo IDE and add `aria-label` or text content to any empty `<th>` elements in the JSX.
- Publish and test with axe DevTools.
<!-- OPTION 1: Add visible text (best for most cases) -->
<table>
<thead>
<tr>
<th>Feature</th>
<th>Basic Plan</th>
<th>Pro Plan</th>
</tr>
</thead>
<tbody>
<tr>
<td>Storage</td>
<td>5 GB</td>
<td>50 GB</td>
</tr>
</tbody>
</table>
<!-- OPTION 2: Visually hidden text (for top-left corner cells) -->
<style>
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
</style>
<table>
<thead>
<tr>
<th><span class="sr-only">Feature name</span></th>
<th>Basic Plan</th>
<th>Pro Plan</th>
</tr>
</thead>
</table>
<!-- OPTION 3: aria-label directly on the th element -->
<table>
<thead>
<tr>
<th aria-label="Feature name"></th>
<th>Basic Plan</th>
<th>Pro Plan</th>
</tr>
</thead>
</table>Option 1 — visible text in the header cell (preferred). Option 2 — visually hidden text via a span. Option 3 — aria-label on the th element.
Heading orderModerate effort
Restructure your page headings so they follow a logical, sequential order (H1 → H2 → H3) with no levels skipped.
On Wix Studio
- Open Wix Studio and select the page to edit from the Pages & Menus panel.
- Click each text element used as a heading; in the text-formatting toolbar, open the text-style dropdown and select the correct heading level (Heading 1 through Heading 6) based on the element's role in the content hierarchy.
- For section or widget components, double-click into the component to edit it and update the heading level on any title text elements inside.
- Publish the site and verify with the axe DevTools browser extension.
<!-- ONE H1 per page: the primary page title -->
<h1>Women's Running Shoes</h1>
<!-- H2 for major page sections -->
<h2>Filter by Category</h2>
<!-- H3 for sub-sections within an H2 -->
<h3>Shoe Type</h3>
<h3>Brand</h3>
<h2>Featured Products</h2>
<!-- H3 for individual product titles within the H2 section -->
<h3>UltraRun Pro 5</h3>
<h3>TrailBlaze X2</h3>
<h2>Customer Reviews</h2>
<h3>Top Rated This Month</h3>
<!-- H4 for sub-items within an H3 — only go deeper when content genuinely nests -->
<h4>Review by Sarah M.</h4>
<h4>Review by James T.</h4>Correct heading hierarchy pattern for a typical ecommerce product or category page.
Html has langQuick win
Add a valid `lang` attribute to the `<html>` element so browsers, screen readers, and search engines know what language your page is written in.
On Wix Studio
- In Wix Studio, navigate to the site's Settings panel and set the primary language under Language & Region.
- Wix Studio injects the `lang` attribute automatically based on this setting.
- For multilingual sites, use the built-in Multilingual tool to ensure each locale gets the correct `lang` value.
- Verify with View Source after publishing.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Your Page Title</title>
</head>
<body>
<!-- page content -->
</body>
</html>Add the lang attribute to the opening <html> tag of every HTML page. Use a valid BCP 47 language tag.
Html lang validQuick win
Add a valid BCP 47 language code to the `lang` attribute on your site's `<html>` element so browsers and assistive technologies know what language your content is written in.
On Wix Studio
- In Wix Studio, the `lang` attribute is controlled by the site's language settings, not directly editable in the canvas.
- Open your site in Wix Studio → click the Site Settings (gear icon) → Language & Region, and confirm the primary language is set correctly.
- For multilingual sites, use the Wix Multilingual panel to ensure each language has a valid locale assigned.
- Publish the site and verify via page source. If the attribute is still invalid, escalate to Wix Studio support.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Page Title</title>
</head>
<body>
<!-- page content -->
</body>
</html>Place this as the very first tag in your HTML document. Replace 'en' with your actual BCP 47 language code.
Image altModerate effort
Add descriptive alt text to every meaningful image, and mark purely decorative images with an empty alt attribute or role="presentation".
On Wix Studio
- Click an image on the canvas → click the 'Settings' icon in the floating toolbar → locate the 'Alt Text' field → enter a descriptive value → click Done.
- For images inside repeaters or CMS-connected galleries, connect the alt text field to a CMS text field: click the image → Connect to Data → map the 'Alt Text' property to the appropriate CMS field.
- Use Wix Studio's built-in SEO panel (Site → SEO → SEO Settings) to review pages with missing image alt attributes.
<!-- Meaningful image: describe the content -->
<img src="red-leather-bag.jpg" alt="Red leather crossbody bag with gold clasp" width="600" height="400">
<!-- Image used as a link: describe the destination/action -->
<a href="/sale">
<img src="summer-sale-banner.jpg" alt="Shop our summer sale — up to 40% off">
</a>
<!-- Decorative image: empty alt, screen readers skip it -->
<img src="decorative-swoosh.svg" alt="" role="presentation">
<!-- WRONG — never omit alt entirely on an <img> -->
<!-- <img src="product.jpg"> -->
<!-- WRONG — never use filename or generic words -->
<!-- <img src="IMG_4821.jpg" alt="image"> -->Correct patterns for meaningful, linked, and decorative images.
Image redundant altQuick win
Remove or clear the alt text on images whose description is already provided by visible text immediately surrounding them, so screen readers don't read the same information twice.
On Wix Studio
- In Wix Studio, click the image element on the canvas → open the Properties panel on the right → find 'Alt Text' and clear the field if surrounding text duplicates it.
- For images inside CMS-connected repeaters or collections: go to the Content Manager → select the relevant collection → find the image field's associated alt-text field and clear redundant entries.
- Publish the site and re-test with axe DevTools browser extension to confirm the fix.
<!-- CORRECT: image inside a link that also has visible text -->
<a href="/products/red-sneakers">
<img src="red-sneakers.jpg" alt="" width="300" height="300">
<span>Red Sneakers</span>
</a>
<!-- INCORRECT: alt repeats the visible link text -->
<a href="/products/red-sneakers">
<img src="red-sneakers.jpg" alt="Red Sneakers" width="300" height="300">
<span>Red Sneakers</span>
</a>
<!-- INCORRECT: alt attribute missing entirely (screen reader reads filename) -->
<a href="/products/red-sneakers">
<img src="red-sneakers.jpg" width="300" height="300">
<span>Red Sneakers</span>
</a>Use alt="" (empty string) when the image is inside or adjacent to visible text that already describes it. Never omit the alt attribute entirely.
LabelQuick win
Add a visible or programmatic label to every form input so assistive technologies can identify it for users.
On Wix Studio
- In Wix Studio, click on the form or input component on the canvas.
- Open the Properties panel on the right. Under 'Label', type a descriptive label for the field. Wix Studio outputs this as a proper `<label>` element.
- For inputs intentionally displayed without a visible label (e.g. search bar in a header), switch to Dev Mode and add an `aria-label` attribute in the element properties or via Velo code: `$w('#searchInput').setAttribute('aria-label', 'Search products')`.
- Publish and verify with axe DevTools.
<!-- Method 1: Explicit label (recommended) -->
<label for="user-email">Email address</label>
<input type="email" id="user-email" name="email" autocomplete="email">
<!-- Method 2: Implicit (wrapped) label -->
<label>
Email address
<input type="email" name="email" autocomplete="email">
</label>
<!-- Method 3: aria-label (use when no visible label is desired, e.g. icon-only search) -->
<input type="search" name="q" aria-label="Search products">
<!-- Method 4: aria-labelledby (point to existing visible text on the page) -->
<h2 id="newsletter-heading">Subscribe to our newsletter</h2>
<input type="email" name="subscribe" aria-labelledby="newsletter-heading">
<!-- Visually hidden label (visible to screen readers, hidden on screen) -->
<style>
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
</style>
<label for="search-input" class="visually-hidden">Search products</label>
<input type="search" id="search-input" name="q" placeholder="Search...">Preferred method: explicit label linked by for/id. Place immediately before the input.
Landmark banner is top levelModerate effort
Move your site's `<header>` element (or `role="banner"` landmark) so it is a direct child of `<body>`, not nested inside another landmark region.
On Wix Studio
- In Wix Studio, open the Editor and select your Header section.
- In the panel on the right, verify the semantic tag is set to 'Header' (not duplicated inside a Section or Article element).
- Ensure no parent container of the header has a conflicting ARIA landmark role applied via the Element Settings panel.
- Publish and test the live site with axe DevTools.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My Store</title>
</head>
<body>
<!-- CORRECT: <header> is a direct child of <body> -->
<header>
<a href="/"><img src="/logo.svg" alt="My Store home"></a>
<nav aria-label="Primary">
<ul>
<li><a href="/shop">Shop</a></li>
<li><a href="/about">About</a></li>
</ul>
</nav>
</header>
<main id="main-content">
<!-- page content here -->
</main>
<footer>
<!-- footer content here -->
</footer>
</body>
</html>Correct top-level structure: <header> is a direct child of <body>, not nested in any landmark.
Landmark contentinfo is top levelQuick win
Move your site's footer element (or role="contentinfo") so it is a direct child of the page body, not nested inside another landmark region.
On Wix Studio
- In Wix Studio, open your site and navigate to the page layout.
- Ensure the Footer section is placed in the designated Footer slot of the layout (not embedded inside a Main Content or Section block).
- If you have custom HTML components or Velo-injected markup with role="contentinfo", open the code editor and verify that markup is rendered as a sibling of <main>, not a descendant.
- Publish your site, then run axe DevTools on the live URL to confirm the landmark is top-level.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Store Page</title>
</head>
<body>
<header>
<!-- Site logo, main navigation -->
</header>
<nav aria-label="Main navigation">
<!-- Primary nav links -->
</nav>
<main>
<!-- All primary page content goes here -->
<h1>Page Title</h1>
<p>Page content...</p>
</main>
<!-- CORRECT: <footer> is a direct child of <body>, after </main> -->
<footer>
<p>© 2024 My Store. All rights reserved.</p>
<nav aria-label="Footer navigation">
<a href="/privacy">Privacy Policy</a>
<a href="/contact">Contact</a>
</nav>
</footer>
</body>
</html>Correct top-level landmark structure — <footer> is a direct child of <body>, not nested inside <main> or any other landmark.
Landmark main is top levelQuick win
Move the `<main>` element (or `role="main"`) so it is a direct child of `<body>`, not nested inside any other landmark element such as `<header>`, `<nav>`, `<aside>`, or `<footer>`.
On Wix Studio
- Wix Studio also generates its landmark HTML automatically. Open the Studio Editor and verify that content sections are correctly categorized as body content (not placed inside the Header or Footer panels).
- Use the built-in Accessibility panel (available under the site settings / SEO & Accessibility tab) to review landmark warnings.
- For custom-coded widgets or sections using Velo, ensure you do not apply `role='banner'`, `role='navigation'`, or other landmark roles to containers that wrap your main content block.
- Escalate persistent issues to Wix Studio support referencing the specific WCAG landmark nesting requirement.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My Store</title>
</head>
<body>
<header>
<nav aria-label="Primary navigation">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/shop">Shop</a></li>
</ul>
</nav>
</header>
<!-- CORRECT: <main> is a direct child of <body>, NOT inside <header> or any other landmark -->
<main id="main-content">
<h1>Welcome to My Store</h1>
<p>Browse our latest products below.</p>
</main>
<footer>
<p>© 2024 My Store</p>
</footer>
</body>
</html>Correct top-level landmark structure — <main> is a direct child of <body>, sibling to <header> and <footer>.
Landmark no duplicate bannerModerate effort
Ensure your page has only one banner landmark (one `<header>` or `role="banner"` element that is not nested inside another landmark), so screen reader users can navigate your site reliably.
On Wix Studio
- Open your site in Wix Studio Editor.
- In the Layers panel (left sidebar), expand the page structure and identify the official 'Header' section at the top.
- Select each other section/container → open its Settings panel → check the 'Accessibility' or 'ARIA role' field. If any non-header section has role='banner', clear that field.
- Ensure announcement bars or promotional strips use role='region' with an aria-label, or no landmark role at all.
- Publish and validate with the axe DevTools browser extension.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Store Page</title>
</head>
<body>
<!-- CORRECT: Single top-level <header> = one banner landmark -->
<header>
<a href="/"><img src="logo.svg" alt="Acme Store"></a>
<nav aria-label="Main navigation">
<ul>
<li><a href="/shop">Shop</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
</header>
<main>
<article>
<!-- CORRECT: <header> nested inside <article> is NOT a banner landmark -->
<header>
<h1>Product Name</h1>
<p>Posted: <time datetime="2024-01-01">January 1, 2024</time></p>
</header>
<p>Product description goes here.</p>
</article>
<!-- CORRECT: promotional strip uses <div>, not <header> -->
<div class="promo-bar" role="region" aria-label="Promotional offer">
<p>Free shipping on orders over $50!</p>
</div>
</main>
<footer>
<p>© 2024 Acme Store</p>
</footer>
</body>
</html>Correct page structure: one top-level <header> as the banner, inner content sections use <div> or are wrapped in a sectioning element.
Landmark no duplicate mainQuick win
Find and remove every duplicate `<main>` element or `role="main"` attribute so that exactly one main landmark exists on each page.
On Wix Studio
- Open Wix Studio Editor and navigate to the page in question.
- Select any custom-coded components or HTML embed elements and inspect their markup for '<main>' or 'role="main"'; replace with '<div>' or '<section>'.
- In the panel for any Velo/custom code blocks, search for 'role="main"' and remove duplicates.
- Publish the site and validate with the axe browser extension.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Page Title</title>
</head>
<body>
<header>
<nav aria-label="Primary navigation">
<!-- site-wide navigation -->
</nav>
</header>
<!-- ✅ Only ONE <main> element per page -->
<main id="main-content">
<h1>Page Heading</h1>
<!-- primary page content goes here -->
</main>
<footer>
<!-- footer content -->
</footer>
</body>
</html>Correct page structure: exactly one <main> element wrapping the primary content, with header and footer outside it.
Landmark one mainQuick win
Add a single `<main>` landmark element (or `role="main"`) to every page so assistive technologies can identify and navigate directly to the primary content.
On Wix Studio
- In Wix Studio's editor, select the main content section of your page in the layers panel.
- In the right-hand Properties / Settings panel, look for the 'Element Tag' or 'HTML Tag' dropdown and select `<main>`.
- Alternatively, use the Accessibility panel (the person icon in the left toolbar) to run an audit and apply the landmark fix through the guided wizard.
- Publish the site and re-test with axe DevTools.
<!-- Skip link at the very top of <body> -->
<a href="#main-content" class="skip-link">Skip to main content</a>
<header><!-- site header / nav here --></header>
<main id="main-content">
<!-- ALL primary page content goes here:
product details, blog post, category grid, etc. -->
</main>
<footer><!-- site footer here --></footer>Place this landmark element around all unique page content, after the <header> and <nav> and before the <footer>. Use exactly one per page.
Landmark uniqueModerate effort
Add a unique aria-label (or aria-labelledby) to every repeated landmark role on the page so screen-reader users can tell them apart.
On Wix Studio
- Open your site in Wix Studio.
- Select the repeated navigation or section element on the canvas.
- In the right-side Properties panel, locate the 'Accessibility' section and expand it.
- Type a unique descriptive label in the 'ARIA Label' field (e.g. 'Primary navigation', 'Category navigation', 'Footer navigation').
- Repeat for each duplicate landmark element across the page.
- Publish and validate using the axe DevTools browser extension on the live URL.
<!-- BEFORE: two <nav> elements with no label — screen readers can't tell them apart -->
<nav>
<ul><!-- main menu items --></ul>
</nav>
<nav>
<ul><!-- footer links --></ul>
</nav>
<!-- AFTER: each <nav> has a unique aria-label -->
<nav aria-label="Main navigation">
<ul><!-- main menu items --></ul>
</nav>
<nav aria-label="Footer navigation">
<ul><!-- footer links --></ul>
</nav>
<!-- Alternative: use aria-labelledby when a visible heading already exists -->
<section aria-labelledby="filters-heading">
<h2 id="filters-heading">Product Filters</h2>
<!-- filter controls -->
</section>
<section aria-labelledby="recommendations-heading">
<h2 id="recommendations-heading">You May Also Like</h2>
<!-- recommended products -->
</section>Apply unique aria-label attributes to every repeated landmark element. Use aria-labelledby when a visible heading already labels the region.
Link in text blockQuick win
Increase the color contrast between inline links and their surrounding body text to at least 3:1, or add a non-color visual distinction (such as underline) so links are identifiable without relying on color alone.
On Wix Studio
- In Wix Studio editor, select any text block containing a link.
- Open the Text Settings panel → click the link color swatch and update to a compliant hex value.
- For global control, go to Design System (left panel) → Colors, update your designated link color token to a compliant value — this propagates site-wide.
- Use the Custom CSS panel (site-level or panel-level) to add: a { text-decoration: underline; } as a fallback non-color cue.
/* Option A: Change link color to one with ≥3:1 contrast against body text
AND ≥4.5:1 contrast against the page background.
Example: body text #3f3f3f on white background — #0057d8 passes both thresholds. */
a {
color: #0057d8;
}
/* Option B: Keep your existing link color but add a non-color visual cue.
An underline satisfies WCAG 1.4.1 without requiring the 3:1 color contrast. */
a {
text-decoration: underline;
}
/* Best practice: combine both for maximum clarity */
a {
color: #0057d8;
text-decoration: underline;
}
/* If you want to scope this to body/content areas only: */
.content a,
.entry-content a,
article a,
p a {
color: #0057d8;
text-decoration: underline;
}Add to your global stylesheet. Option A changes link color; Option B restores underline. Use both for strongest compliance.
Link nameQuick win
Add a descriptive, screen-reader-accessible text label to every link on your store so assistive technology can announce its purpose.
On Wix Studio
- In Wix Studio, click any link element (icon, image, button) on the canvas to select it.
- Open the right-hand Inspector panel and scroll to the 'Accessibility' section.
- Enter a meaningful description in the 'ARIA Label' field (e.g. 'Go to product page for Blue Running Shoes').
- For elements embedded in repeaters (e.g. product grids), set the label dynamically using the dataset/content binding — e.g. bind aria-label to the product name field so every card gets a unique, accurate label.
- Publish and verify with axe DevTools or WAVE.
Meta refreshQuick win
Remove or disable the `<meta http-equiv="refresh">` tag that forces an automatic page reload, or replace any redirect use-case with a server-side redirect instead.
On Wix Studio
- Open Wix Studio Editor → select the page → open the Velo panel (enable Dev Mode if not already on).
- In the page's `<head>` code block or `masterPage.js`, search for `http-equiv` or `refresh` and remove the tag or script.
- For site-wide head injection, go to Site → Settings → Custom Code and inspect any head code snippets.
- Use the URL Redirect Manager (Marketing & SEO → SEO Tools → URL Redirect Manager) for any needed redirects.
- Publish and verify via browser View Source.
<!-- REMOVE — self-refresh every 30 seconds (WCAG fail) -->
<!-- <meta http-equiv="refresh" content="30"> -->
<!-- REMOVE — redirect to another URL after 5 seconds (WCAG fail) -->
<!-- <meta http-equiv="refresh" content="5; url=https://example.com/new-page"> -->
<!-- ALLOWED — 0-second instant redirect (no time limit imposed on user) -->
<!-- Only use this as a fallback alongside a server-side redirect -->
<meta http-equiv="refresh" content="0; url=https://example.com/new-page">REMOVE this tag from your page's <head>. Both forms below are problematic (self-refresh and timed redirect).
Meta viewportQuick win
Remove `user-scalable=no` (and any `maximum-scale` below 5) from your site's `<meta name="viewport">` tag so visitors can pinch-to-zoom on mobile devices.
On Wix Studio
- In Wix Studio, open your site dashboard and navigate to Settings → Custom Code.
- Check any code injected into the <head> section for a viewport meta tag with `user-scalable=no` — delete that parameter.
- If the problematic tag is coming from Wix's own generated markup (not your custom code), contact Wix Support, as platform-level HTML cannot be overridden by studio users.
<meta name="viewport" content="width=device-width, initial-scale=1">Place this in the <head> of every HTML page. This is the correct, accessibility-compliant viewport tag.
Meta viewport largeQuick win
Remove or raise the `maximum-scale` value in your meta viewport tag so users can pinch-zoom on mobile devices.
On Wix Studio
- In Wix Studio, open your project and navigate to Settings → Custom Code.
- Add a code snippet to the <head> section sitewide that overrides the viewport tag with a zoom-permissive version (see code snippet below).
- Publish the site for the change to take effect.
<meta name="viewport" content="width=device-width, initial-scale=1">In Wix Studio Settings → Custom Code → Head section (sitewide), paste this snippet to override a restrictive viewport tag.
Nested interactiveModerate effort
Remove or restructure nested interactive elements so that no focusable control (button, link, input, etc.) is placed inside another interactive control, and never rely on tabindex="-1" or aria-hidden="true" to hide an inner interactive element from assistive technologies.
On Wix Studio
- In Wix Studio, select the affected element on the canvas and open its Settings / Interactions panel.
- If a container (card, section) has an on-click action AND contains a Button element, remove the redundant interaction from whichever wrapper is not the primary CTA.
- For custom-coded components in Wix Studio's Dev Mode, open the component's JSX/HTML and restructure to place only one interactive element per action.
- Test with the Studio Preview and keyboard Tab navigation before publishing.
<!-- ❌ WRONG: button nested inside a link (invalid HTML, unpredictable in screen readers) -->
<a href="/products/widget">
<button type="button">View Product</button>
</a>
<!-- ✅ CORRECT: single interactive element styled as a button -->
<a href="/products/widget" class="btn btn-primary">View Product</a>
<!-- ❌ WRONG: link nested inside a button -->
<button type="button">
<a href="/cart">Add to Cart</a>
</button>
<!-- ✅ CORRECT: use only the element that matches the action -->
<!-- If it navigates → use <a>; if it performs an action on the page → use <button> -->
<a href="/cart" class="btn btn-primary">Add to Cart</a>
<!-- ❌ WRONG: relying on tabindex or aria-hidden to suppress inner element -->
<a href="/products/widget">
<button type="button" tabindex="-1" aria-hidden="true">View Product</button>
</a>
<!-- ✅ CORRECT: icons and decorative content inside interactive elements must be non-interactive -->
<button type="button">
<svg aria-hidden="true" focusable="false" width="20" height="20">
<use href="#icon-cart"></use>
</svg>
<span>Add to Cart</span>
</button>The WRONG pattern and the correct fix side by side.
Page has heading oneQuick win
Add a single, descriptive `<h1>` heading to every page so assistive technologies and search engines can identify the page's main topic.
On Wix Studio
- Open Wix Studio Editor and go to the page you need to fix.
- Click the text element acting as the primary page title.
- In the floating text toolbar, open the style dropdown and select 'Heading 1'.
- If no H1 text element exists, click '+' → 'Text' → 'Heading 1', place it prominently, and enter the page's main topic as the text.
- Use the Layers panel to confirm only one element on the page has the H1 tag.
- Publish and verify with the axe DevTools extension.
<main>
<h1>Women's Running Shoes</h1>
<!-- rest of page content -->
</main>Place this after your site navigation, as the first element inside <main>. Style it with CSS as needed — the visual size is independent of the semantic tag.
RegionModerate effort
Wrap all visible page content inside HTML landmark regions (e.g. `<header>`, `<main>`, `<nav>`, `<footer>`) so screen-reader users can navigate the page by section.
On Wix Studio
- In Wix Studio, each canvas Section is mapped to a landmark. Open the Studio Editor and ensure all visible content blocks (text, images, buttons) are placed inside a Section rather than outside all sections at the body level.
- Select any Section → open the Inspector panel → give the section a descriptive 'Aria Label' so it is announced correctly by screen readers.
- Use the Accessibility panel (Help → Accessibility Checker) to detect any remaining orphaned content.
- For custom-coded panels or components (using Velo/Dev Mode), manually add `role` and `aria-label` attributes in your JavaScript or HTML component code.
Role img altModerate effort
Add a meaningful aria-label (or aria-labelledby) to every element with role="img" so screen readers can announce what the image represents.
On Wix Studio
- In Wix Studio, select the flagged element on the canvas.
- Open the Settings panel on the right → scroll to the 'Accessibility' section.
- Enter a descriptive label in the 'ARIA Label' field.
- For custom components or HTML embeds, edit the embed code directly and add aria-label="[description]" to the role="img" element.
- Use the Velo IDE (Dev Mode) for programmatic access: $w('#myIcon').setAttribute('aria-label', 'Description');
- Publish and validate with axe DevTools.
<!-- Pattern 1: Inline element (icon font, emoji, span) -->
<span role="img" aria-label="Free shipping available">🚚</span>
<!-- Pattern 2: SVG element — use <title> + aria-labelledby (most robust) -->
<svg role="img" aria-labelledby="icon-free-shipping" width="24" height="24" xmlns="http://www.w3.org/2000/svg">
<title id="icon-free-shipping">Free shipping available</title>
<use href="#icon-truck"></use>
</svg>
<!-- Pattern 3: SVG with aria-label only (simpler, slightly less support) -->
<svg role="img" aria-label="4.5 out of 5 stars" width="120" height="24" xmlns="http://www.w3.org/2000/svg">
<!-- star paths here -->
</svg>
<!-- Pattern 4: div/section used as a decorative image — HIDE from screen readers -->
<div role="presentation" aria-hidden="true" class="decorative-banner"></div>
<!-- Pattern 5: referencing an existing visible caption -->
<figure>
<div role="img" aria-labelledby="badge-caption" class="trust-badge"></div>
<figcaption id="badge-caption">Verified Secure Checkout</figcaption>
</figure>Apply to any HTML element using role="img" — choose the pattern that matches your element type.
Select nameQuick win
Add a visible or programmatic label to every `<select>` dropdown so assistive technologies can announce its purpose to users.
On Wix Studio
- Open Wix Studio and navigate to the page with the dropdown. Click the dropdown component.
- In the right-hand Properties panel, ensure the 'Label' field is populated with descriptive text. Toggle label visibility on if it is currently hidden.
- For custom widgets or code components, open the Velo code editor and use: $w('#dropdownId').setAttribute('aria-label', 'Descriptive label text here');
- Publish and verify with the axe DevTools browser extension.
<!-- Method 1: Visible label (preferred) -->
<label for="sort-order">Sort by</label>
<select id="sort-order" name="sort">
<option value="price-asc">Price: Low to High</option>
<option value="price-desc">Price: High to Low</option>
<option value="newest">Newest</option>
</select>
<!-- Method 2: Visually hidden label (when visible label breaks design) -->
<style>
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
</style>
<label for="sort-order" class="visually-hidden">Sort by</label>
<select id="sort-order" name="sort">
<option value="price-asc">Price: Low to High</option>
<option value="price-desc">Price: High to Low</option>
<option value="newest">Newest</option>
</select>
<!-- Method 3: aria-label (last resort, no visible label possible) -->
<select aria-label="Sort by" name="sort">
<option value="price-asc">Price: Low to High</option>
<option value="price-desc">Price: High to Low</option>
<option value="newest">Newest</option>
</select>
<!-- Method 4: Wrapping label (implicit association — no for/id needed) -->
<label>
Sort by
<select name="sort">
<option value="price-asc">Price: Low to High</option>
<option value="price-desc">Price: High to Low</option>
<option value="newest">Newest</option>
</select>
</label>The gold-standard approach: a visible <label> linked to the <select> via matching for/id attributes.
Skip linkQuick win
Add a valid, focusable target element (with a matching `id`) for every "Skip to main content" link so keyboard and assistive-technology users can bypass repeated navigation.
On Wix Studio
- In Wix Studio, open the Master Page in the editor.
- Add a text/button element as the absolute first item in the page structure (Layer panel), label it 'Skip to main content', and set its link to a Page Section anchor named `#main-content`.
- Name the main content section's anchor `main-content` via the section settings panel.
- Use the Design panel to position the skip link off-screen by default (e.g., top: -9999px) and add a Focus state that brings it back on screen.
- Test on the published URL using the Tab key.
TabindexModerate effort
Remove or replace all positive tabindex values (tabindex="1" or higher) on your page elements, using tabindex="0" for focusable elements and tabindex="-1" only when programmatic focus is needed.
On Wix Studio
- Open Wix Studio editor and navigate to the page or component with the issue.
- If the element is inside a Custom Element or HTML Component, click it → 'Edit Code' and remove positive tabindex attributes from the markup.
- For Velo/Studio code panels, search your page and masterpage code for 'tabindex' and remove any value above 0.
- If using a Studio block, select the block → 'Edit Block' → inspect the inner HTML widgets for embedded tabindex values.
- Publish and verify with keyboard-only navigation.
<!-- ❌ WRONG: positive tabindex breaks natural tab order -->
<button tabindex="3">Submit</button>
<a href="/shop" tabindex="1">Shop Now</a>
<div tabindex="2">Custom widget</div>
<!-- ✅ CORRECT: native elements use no tabindex (natural order) -->
<button>Submit</button>
<a href="/shop">Shop Now</a>
<!-- ✅ CORRECT: non-native element made focusable in natural order -->
<div tabindex="0" role="button" aria-label="Custom widget">Custom widget</div>
<!-- ✅ CORRECT: element only focused by JavaScript (e.g., modal), not in tab flow -->
<div tabindex="-1" id="modal-container" role="dialog" aria-modal="true">...</div>Replace any positive tabindex value with 0 (or remove the attribute). Use -1 only for programmatic focus.
Security (OWASP) · 12 fixes
Dmarc policy noneModerate effort
Strengthen your DMARC policy from p=none (monitor-only) to p=quarantine, then p=reject, so that emails fraudulently sent from your domain are blocked rather than silently allowed through.
On Wix Studio
- Same DNS steps as Wix — Wix Studio sites share the same domain and DNS management interface.
- Go to the site's Dashboard → Settings → Domains → Manage DNS, locate the _dmarc TXT record, and update p=none to p=quarantine.
- Verify all client-site sending sources (email marketing integrations, transactional tools) have DKIM and SPF aligned before advancing to p=reject.
v=DMARC1; p=quarantine; sp=quarantine; pct=100; rua=mailto:dmarc-reports@yourdomain.com; ruf=mailto:dmarc-failures@yourdomain.com; ri=86400; aspf=r; adkim=r; fo=1;This is the DNS TXT record value for _dmarc.yourdomain.com — paste this as the record content at your DNS provider. Replace the rua/ruf addresses with your own reporting inbox or DMARC reporting service address.
Hsts disabledQuick win
Set a valid HTTP Strict-Transport-Security (HSTS) header with a max-age of at least 31536000 (one year) and includeSubDomains to force browsers to always use HTTPS for your store.
On Wix Studio
- Like standard Wix, Wix Studio manages HTTPS and HSTS at the infrastructure level — no manual header configuration is available in the Studio editor.
- Confirm HTTPS is forced: Site Settings → SSL → Force HTTPS should be enabled.
- For custom HTTP logic in Wix Studio, use the Velo backend (http-functions.js) to add headers to API/serverless responses if needed.
- Use DevTools to verify the Strict-Transport-Security header is present on your live domain.
Strict-Transport-Security: max-age=31536000; includeSubDomainsThis is an HTTP response header — it cannot be set in HTML meta tags. It must be set by your server, CDN, or platform. Shown here for reference only.
Hsts max age too shortQuick win
Increase your HSTS max-age directive to at least 31536000 seconds (1 year) so browsers enforce HTTPS connections for a meaningful period.
On Wix Studio
- Same infrastructure as Wix — HSTS is set by Wix's CDN and cannot be modified from the Studio editor.
- Ensure HTTPS redirect is active: Wix Studio Dashboard → Settings → Domains → Redirect all traffic to HTTPS.
- For custom-code sites or Wix Headless projects built in Wix Studio, handle the header in your own server/hosting environment.
- Contact Wix Support to report and request an update to the platform-level HSTS max-age value.
Strict-Transport-Security: max-age=31536000; includeSubDomainsThis is an HTTP response header — it must be sent by your server, NOT as an HTML meta tag. The meta tag is not supported for HSTS.
Info disclosure x powered byQuick win
Remove or suppress the X-Powered-By HTTP response header so your server stops advertising which technology stack, hosting platform, or software version powers your store.
On Wix Studio
- Same as Wix above — Wix Studio is hosted infrastructure with no direct server-header control for standard sites.
- For Wix Studio sites using custom backend code (Velo/backend modules), you cannot set or remove transport-layer headers from within Velo — this is a platform-level concern.
- Contact Wix support if you believe the platform itself is leaking X-Powered-By.
<!-- X-Powered-By is an HTTP response header set by the server, not in HTML markup.
Use the server-side code snippets below for your specific platform. -->There is no HTML tag for this — it is a server-side HTTP response header. Use the server/framework snippets below.
Missing content security policyModerate effort
Add a Content-Security-Policy (CSP) HTTP response header to every page to block unauthorized scripts, styles, and resources from loading in your visitors' browsers.
On Wix Studio
- Wix Studio has the same HTTP header limitations as standard Wix.
- Use the Head Custom Code area (site Settings → Custom Code → Head) to add a <meta http-equiv='Content-Security-Policy'> tag as a partial measure.
- Route traffic through Cloudflare to set the real HTTP header at the CDN layer.
Missing dmarcQuick win
Add a DMARC DNS TXT record at _dmarc.yourdomain.com to tell receiving mail servers how to handle emails that fail authentication checks for your domain.
On Wix Studio
- In Wix Studio, open the site project and go to the Site Dashboard → Settings → Domains.
- Follow the same DNS steps as Wix above — either manage the TXT record in Wix's DNS panel (if the domain is Wix-managed) or log in to your external DNS provider.
- Add a TXT record: Host = '_dmarc', Value = v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com
- Ensure any transactional email (Wix automations, contact forms) is authenticated with SPF/DKIM via Wix's email settings before escalating to p=quarantine.
_dmarc.yourdomain.com. 3600 IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com; ruf=mailto:dmarc-forensic@yourdomain.com; sp=none; adkim=r; aspf=r"Add this as a DNS TXT record at your domain registrar or DNS provider. Replace yourdomain.com and the rua address with your actual domain.
Missing permissions policyQuick win
Add a Permissions-Policy HTTP response header to your store to explicitly restrict which browser features (camera, microphone, geolocation, etc.) pages and embedded third-party scripts are allowed to access.
On Wix Studio
- Wix Studio currently shares the same infrastructure constraints as standard Wix — custom HTTP response headers are not configurable from the platform admin.
- Use Cloudflare as a proxy: Rules → Transform Rules → Modify Response Header, add 'Permissions-Policy' with value 'camera=(), microphone=(), geolocation=(), payment=(), usb=(), interest-cohort=()'.
- Verify in browser DevTools → Network tab → Response Headers.
<!-- NOT recommended — use a real HTTP header instead. Shown for reference only. -->
<meta http-equiv="Permissions-Policy" content="camera=(), microphone=(), geolocation=(), payment=(), usb=(), interest-cohort=()">Meta tag delivery is not recommended — use HTTP headers instead. Included for reference only; browser support is partial.
Missing strict transport securityQuick win
Add the Strict-Transport-Security (HSTS) response header to every HTTPS page so browsers always use an encrypted connection to your store.
On Wix Studio
- Wix Studio sites run on the same Wix infrastructure, so HSTS is managed server-side by Wix — it is not configurable from the Studio editor.
- Check for the header in browser DevTools → Network → Response Headers on your published site.
- If absent, contact Wix Support. Alternatively, if a Cloudflare proxy sits in front of your domain, configure HSTS in Cloudflare → SSL/TLS → Edge Certificates → HSTS section.
<!-- HSTS cannot be set via an HTML meta tag. It MUST be sent as an HTTP response header. Use the server-level examples below. -->
<!-- Correct header value -->
<!-- Strict-Transport-Security: max-age=31536000; includeSubDomains -->Meta tags cannot set HSTS — it must be a real HTTP response header. This is a reminder of the correct header value to use at the server level.
Missing x content type optionsQuick win
Add the `X-Content-Type-Options: nosniff` HTTP response header to every page and asset your store serves.
On Wix Studio
- Same as Wix above. Wix Studio does not add direct server-header control; use Cloudflare Transform Rules in front of your custom domain for full coverage.
X-Content-Type-Options: nosniffThis is an HTTP response header — it is sent by the server, not placed in HTML markup. The examples below show where and how to set it.
Missing x frame optionsQuick win
Add the X-Frame-Options HTTP response header set to DENY or SAMEORIGIN to prevent your store's pages from being embedded in iframes on other sites.
On Wix Studio
- Wix Studio (formerly Editor X) also does not expose raw HTTP response header controls in the admin UI.
- Route your Wix Studio domain through Cloudflare: update your domain's nameservers to Cloudflare → in Cloudflare, go to Rules → Transform Rules → Response Header Modification → add X-Frame-Options: SAMEORIGIN for all requests.
- Alternatively, use Velo (Wix Code) in Wix Studio to add server-side logic where supported.
- Verify via browser DevTools after Cloudflare rule is active.
X-Frame-Options: SAMEORIGINThis is an HTTP response header — it must be sent by the server, not a meta tag. It should appear in the HTTP response headers for every page.
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 Wix Studio
- SSL management in Wix Studio is identical to standard Wix — certificates are auto-provisioned per connected domain.
- Check domain SSL status under Settings → Domains in the Wix Studio dashboard.
- If SSL is inactive, re-check DNS configuration and click 'Enable SSL'; allow up to 24 hours.
<!-- Place this in your maintenance/holding page only if HTTPS is temporarily unavailable -->
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">Meta-refresh redirect for maintenance: not applicable to SSL renewal. Instead, use this HTML to display a temporary notice if your cert has lapsed and you need to redirect HTTP traffic while fixing HTTPS.
X frame options weakQuick win
Replace the weak X-Frame-Options header value with DENY or SAMEORIGIN to prevent clickjacking attacks on your store.
On Wix Studio
- Same infrastructure constraints as standard Wix — response headers for the core storefront are managed by Wix and cannot be overridden from the Studio editor.
- For custom backends built with Wix Studio's HTTP functions, you can set headers within those function responses in your http-functions.js file.
- Contact Wix Studio support for any header corrections needed on primary page responses.
<!-- X-Frame-Options MUST be sent as an HTTP response header, not a meta tag. -->
<!-- Use the server-side or platform snippets below instead. -->
<!-- The modern equivalent you CAN set via meta tag (limited support): -->
<meta http-equiv="Content-Security-Policy" content="frame-ancestors 'none';">If you cannot set server-level headers, use this meta-equivalent only as a last resort — note that X-Frame-Options via meta tag is NOT supported by browsers (it must be an HTTP header). This snippet is shown for illustration only; use server-side headers.
Site Lifecycle · 7 fixes
Cms versionModerate effort
Update your CMS and ecommerce platform to the latest stable version immediately to close known security vulnerabilities and maintain vendor support.
On Wix Studio
- Wix Studio (the successor to the Wix Editor for professional sites) is SaaS — core platform updates are handled automatically.
- Manage installed widgets and blocks: in the Studio editor open the Apps panel and check for updates to installed marketplace apps.
- For custom npm packages used in Velo/Studio code: open the IDE panel > Packages & Apps > npm, review installed packages, and update version numbers to the latest stable release.
<!-- REMOVE or suppress this tag from your <head> — it advertises your CMS version to attackers -->
<!-- <meta name="generator" content="WordPress 5.8.1" /> -->
<!-- In WordPress, add this to your theme's functions.php to remove it: -->
<!-- remove_action('wp_head', 'wp_generator'); -->If your site injects a generator meta tag exposing your CMS version publicly, remove it to reduce information exposure to attackers. This does not replace upgrading — it is a secondary hardening step.
Domain expiryQuick win
Log in to your domain registrar, confirm your domain's expiry date, and enable auto-renew so your store never goes offline due to an expired domain.
On Wix Studio
- Same domain management location as Wix: account avatar → Domains for Wix-registered domains.
- For client sites managed in Wix Studio, check each site's domain settings individually under the site dashboard → Domain.
<!-- No HTML change required. Domain renewal is managed at your domain registrar's dashboard (e.g. GoDaddy, Namecheap, Cloudflare Registrar). Log in, find the domain, enable auto-renew, and confirm a valid payment method is on file. -->No code change is needed on your website — this fix is completed entirely in your registrar's dashboard. There is no markup or configuration file involved.
Html langQuick win
Add a lang attribute to your site's <html> tag that matches the primary language of your store's content.
On Wix Studio
- Wix Studio also manages the <html lang> attribute automatically based on your project's configured language.
- In the Wix Studio dashboard, go to Settings → Language & Region and confirm the primary language is correct.
- For multilingual projects, use the Wix Multilingual app; each language route will receive the appropriate lang attribute automatically.
- Direct HTML tag editing is not available — the platform injects it based on your language settings.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Your Store</title>
</head>
<body>
<!-- page content -->
</body>
</html>Place this as the very first tag in your HTML document, before <head>.
Mixed contentModerate effort
Ensure every resource (images, scripts, stylesheets, fonts, iframes) on your store is loaded over HTTPS, never HTTP, so browsers never block or warn about mixed content.
On Wix Studio
- In Wix Studio, open the relevant page or section containing the HTTP resource.
- Select any HTML/Embed components and update all 'http://' URLs in their code to 'https://'.
- Open the Velo IDE (Dev panel) and search site code and page code for 'http://' — replace with 'https://'.
- Publish the site and verify with browser DevTools Console.
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">Add this meta tag inside <head> to instruct browsers to automatically upgrade HTTP sub-requests to HTTPS. This is a safety net — fix the root URLs too.
Mobile viewportQuick win
Add a responsive viewport meta tag to every page so mobile browsers render your site at the correct width and scale.
On Wix Studio
- Wix Studio also injects the viewport meta tag automatically for all published sites.
- Ensure Responsive Design is enabled for your site (Studio sites are responsive by default; check under Site → Settings if in doubt).
- If custom HTML widgets or embedded iframes are used, check those embeds do not override or suppress the viewport tag in their own `<head>`.
- Publish and verify with Google's Mobile-Friendly Test.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Page Title</title>
</head>
<body>
<!-- page content -->
</body>
</html>Place the viewport meta tag as early as possible in <head>, before any CSS or other meta tags.
Server versionQuick win
Remove or suppress HTTP response headers that advertise your server software name and version to the public internet.
On Wix Studio
- Same approach as Wix above — server headers are infrastructure-managed and not directly editable in the Studio editor.
- Use Wix Studio's Velo backend ('http-functions.js') for any custom API responses, setting headers explicitly there.
- Add Cloudflare as a proxy layer and use Transform Rules (Rules → Transform Rules → Modify Response Header → Remove) to strip 'X-Powered-By' and replace 'Server'.
<!-- HTTP response headers cannot be set via HTML meta tags.
Use the server-side or CDN configuration snippets below. -->Meta tags cannot suppress HTTP response headers — this must be done at the server/CDN layer. The snippets below cover the most common server/framework approaches.
Ssl expiryQuick win
Renew your TLS/SSL certificate before it expires and enable automatic renewal so your store never goes offline or shows security warnings.
On Wix Studio
- SSL management is identical to standard Wix: auto-provisioned and auto-renewed on all premium plans.
- Verify status under Dashboard → Settings → Domains for each connected domain.
- Re-trigger issuance by disconnecting and reconnecting a domain if the certificate shows as expired or inactive.
<!-- SERVER-SIDE redirect is strongly preferred. Example nginx config snippet below. -->
<!-- nginx: force HTTPS -->
<!-- server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
} -->Verify your HTTPS redirect is in place at the server/app level. This meta-refresh is a last-resort fallback only — implement a proper server-side 301 redirect instead.