Every Yotpo fix we catalog

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

SEO · 7 fixes

Catalog coverageModerate effort

Audit your XML sitemap and internal linking so that every product and category page is discoverable and crawlable by Google — not hidden behind JavaScript, pagination, or missing links.

On Yotpo

  1. In your Yotpo admin, go to Reviews > On-Site Widgets and confirm that your star-rating widgets and review content are rendered server-side (via Yotpo's mTurbo / server-side rendering option) rather than loaded purely by client-side JavaScript. Server-side rendering ensures Google can crawl review-enriched product pages without executing JS.
  2. For every product page, verify that Yotpo's review widget is placed inside the main HTML document and not injected into a shadow DOM or iframe — navigate to a product page, View Source (not Inspect), and confirm the Yotpo widget markup appears in the raw HTML. If it does not, contact Yotpo support to enable server-side widget delivery for your plan.
  3. In Yotpo admin > Reviews > SEO Settings, enable 'Google Rich Snippets' (aggregate rating schema). This adds JSON-LD structured data directly to the page source, making product pages more crawlable and eligible for rich results — indirectly boosting catalog coverage by improving index quality.
  4. Check that Yotpo's pagination for reviews (page 2, 3… of reviews) does not generate duplicate or orphaned URLs that dilute crawl budget. In Yotpo admin > On-Site Widgets > Widget Customization, set review pagination to use AJAX/scroll rather than URL-parameter-based pagination, so Google does not index thin paginated review pages instead of your core product pages.
  5. Export your full product catalog from your ecommerce platform and cross-reference it against your XML sitemap. For any product or category page missing from the sitemap, ensure Yotpo widgets on those pages are not the cause of slow page loads or JS errors that prevented the sitemap plugin from indexing them — test each missing URL in Google Search Console's URL Inspection tool.
  6. After making changes, go to Google Search Console > Sitemaps, re-submit your XML sitemap, and use 'Request Indexing' on key product and category URLs to prompt Google to recrawl them with the updated, crawlable Yotpo widget markup in place.
Code · Generic HTML (html)
<!-- CORRECT: Standard crawlable link -->
<a href="/products/blue-running-shoes">Blue Running Shoes</a>

<!-- WRONG: JavaScript-only — Googlebot cannot follow this -->
<span onclick="navigate('/products/blue-running-shoes')">Blue Running Shoes</span>

Standard crawlable product link — use plain <a href> tags, never JavaScript-only click handlers, for navigation links that Google must follow.

Cwv clsModerate effort

Eliminate unexpected layout shifts by reserving space for every image, video, embed, and dynamically injected element so nothing jumps when the page loads.

On Yotpo

  1. Identify all Yotpo widgets on your storefront (Reviews Widget, Star Ratings, UGC/Visual Marketing gallery, Q&A widget) — these are the most common sources of CLS because they inject content after the initial page render.
  2. For each Yotpo Reviews or Star Rating widget container in your theme templates (e.g. product.liquid or product-template.liquid), add an explicit min-height CSS rule that matches the rendered widget height — for example: `.yotpo.yotpo-main-widget { min-height: 600px; }` and `.yotpo-bottomline { min-height: 28px; }` — so the browser reserves space before the Yotpo script loads.
  3. If you use the Yotpo Visual UGC / Shoppable Gallery widget, wrap its embed `<div>` in a fixed-aspect-ratio container (e.g. `aspect-ratio: 1/1` or a padding-top percentage trick) and set `overflow: hidden` so the gallery grid does not reflow when images lazy-load in.
  4. In the Yotpo Admin (yotpo.com → Account Settings → Widgets), check whether 'Lazy Load' or deferred widget initialisation is enabled; if the widget script is deferred, ensure the placeholder `<div>` in your theme already carries the reserved dimensions before the script executes.
  5. Load your product page in Chrome DevTools → Performance tab, record a page load, and confirm the Yotpo widget containers no longer cause layout shift events (LS rectangles) in the Experience section; adjust the min-height / aspect-ratio values if residual shifts remain.
  6. Deploy the CSS changes via your theme editor (Online Store → Themes → Edit Code → assets/theme.css or your custom CSS file) and re-run a Core Web Vitals test (e.g. PageSpeed Insights) to verify the CLS score has improved.
Code · Generic HTML (html)
<!-- CORRECT: explicit width and height prevent layout shift -->
<img
  src="/images/product-red-sneaker.jpg"
  alt="Red canvas sneaker, side view"
  width="800"
  height="800"
  loading="lazy"
>

Always declare width and height on every img element. The browser uses these to reserve space before the image file downloads.

Low performance scoreLarger project

Improve your Lighthouse/PageSpeed performance score by reducing page weight, eliminating render-blocking resources, optimising images, and addressing Core Web Vitals so Google ranks your store higher in search results.

On Yotpo

  1. Audit which Yotpo widgets are actively loaded on each page type: in your Yotpo Admin go to Settings → Widgets and disable any widget (e.g. Q&A, Visual UGC carousel, Loyalty panel) that is not displayed on that page — unused widget scripts still load by default and add unnecessary JavaScript payload.
  2. Enable Yotpo's asynchronous / deferred loading: in your theme's Yotpo snippet (usually snippets/yotpo.liquid or the Yotpo app embed block in the theme editor), confirm the <script> tag includes 'async' or 'defer' so it does not block first render. If using the legacy inline snippet, replace it with the async loader script found in Yotpo Admin → Account Settings → Store → Installation.
  3. Lazy-load the Reviews widget below the fold: in the Yotpo Admin go to Settings → Widgets → Reviews Widget → Widget Settings and enable 'Lazy Load' (or 'Load on scroll') so the reviews iframe/JS bundle is only fetched after the main content has rendered, improving LCP and TBT.
  4. Optimise Yotpo UGC / Star-rating images: in Yotpo Admin → Visual Marketing → Gallery, reduce the number of images shown in the initial load (set 'Initial items to display' to 4–6) and ensure 'Image quality' is set to 'Optimised' rather than 'Original' so Yotpo's CDN serves compressed, correctly-sized images instead of full-resolution uploads.
  5. Remove duplicate Yotpo script tags: search your theme code (Layout/theme.liquid, product.liquid, collection.liquid) for multiple yotpo.com/widget.js or staticw2.yotpo.com references — each extra copy doubles the network request. Keep exactly one initialisation call per page, ideally in theme.liquid just before </body>.
  6. Verify Yotpo is served via its CDN and HTTP/2: in Chrome DevTools → Network, filter by 'yotpo' and confirm all assets are served from staticw2.yotpo.com (their global CDN) with status 200 and protocol h2. If you see redirects (301/302) or assets served from your own domain, re-install the widget using the canonical snippet from Yotpo Admin → Account Settings → Store → Installation to restore CDN delivery.
Code · Generic HTML (html)
<!-- In <head>: preconnect to critical third-party origins to reduce connection latency -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

<!-- Preload your Largest Contentful Paint image (hero/banner) so it loads earlier -->
<link rel="preload" as="image" href="/images/hero.webp" fetchpriority="high">

<!-- Hero image: eager load, explicit dimensions to prevent CLS -->
<img
  src="/images/hero.webp"
  alt="Descriptive alt text for your hero image"
  width="1200"
  height="600"
  fetchpriority="high"
  decoding="async"
>

<!-- All other images: lazy load, explicit dimensions to prevent CLS -->
<img
  src="/images/product-shot.webp"
  alt="Descriptive product alt text"
  width="800"
  height="800"
  loading="lazy"
  decoding="async"
>

<!-- Defer non-critical third-party scripts (analytics, chat, pixels) -->
<script src="https://example-analytics.com/tracker.js" defer></script>

<!-- Load non-critical CSS asynchronously to unblock render -->
<link rel="preload" href="/css/non-critical.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/css/non-critical.css"></noscript>

Paste these patterns into your <head> and image markup to address the most common Lighthouse failures.

Non self canonicalQuick win

Audit every page whose canonical tag points to a different URL, then either correct it to self-reference or confirm the cross-reference is intentional and correct.

On Yotpo

  1. Identify which pages have non-self-canonical tags: these are most commonly product pages, review-filtered pages, or UGC gallery pages that Yotpo widgets are embedded on. Pull a crawl report (e.g. Screaming Frog or Google Search Console > Pages > Not Indexed > Duplicate without user-selected canonical) and filter for URLs under your store's domain that carry a canonical pointing elsewhere.
  2. For each affected product or collection page, check whether Yotpo's Reviews widget or Visual UGC gallery appends query parameters (e.g. ?yotpo_page=2, ?yotpo_sort=, #reviews). These parameterised variants must NOT introduce a new canonical; the canonical must always point to the clean base URL. In your Shopify/platform theme, open the canonical tag partial (e.g. theme.liquid or head.liquid) and confirm the canonical is built from the canonical URL variable — not the full request URL — so Yotpo query parameters are stripped automatically.
  3. In the Yotpo admin, go to Settings → General Settings → SEO and confirm that 'Canonical URL' handling is set to defer to the platform (i.e. Yotpo does not override the page canonical). If Yotpo's on-site widgets are injected via a dedicated Yotpo landing page (e.g. yourstore.com/yotpo/products/…), ensure those Yotpo-generated URLs carry a canonical pointing back to the original product URL — not a self-canonical on the Yotpo URL — or redirect them with a 301.
  4. If you use Yotpo's Reviews & Ratings with a dedicated 'All Reviews' or 'Questions & Answers' page widget, open the widget settings in Yotpo Admin → On-Site Widgets → select the widget → Advanced Settings, and verify the widget does not render its own <link rel='canonical'> in the widget iframe or injected HTML that conflicts with the page-level canonical.
  5. For any Yotpo-powered landing pages or syndicated review pages that should NOT be indexed, add a noindex meta tag to those pages instead of a cross-pointing canonical, then verify in Google Search Console that the correct self-canonical appears under the URL Inspection tool for your main product/collection pages.
  6. Re-crawl the affected URLs after changes are deployed. In Google Search Console, use the URL Inspection tool on a sample of previously affected pages and confirm 'Google-selected canonical' matches 'User-declared canonical', both pointing to the page's own clean URL.
Code · Generic HTML (html)
<link rel="canonical" href="https://www.example.com/your-page-url/">

Place this tag inside the <head> element of every page. The href must exactly match the page's own preferred URL.

Page speed warningModerate effort

Reduce your page load time to under 1.5 seconds by optimizing images, eliminating render-blocking resources, and enabling caching and compression.

On Yotpo

  1. In your Yotpo admin, go to Settings → General Settings, and ensure the 'Load Yotpo Asynchronously' option is enabled. This prevents Yotpo's JavaScript from blocking the main thread and rendering of your page.
  2. Navigate to Settings → Widgets in Yotpo and audit which widgets are active (Reviews, Star Ratings, Q&A, Visual UGC, etc.). Disable any widgets not actively displayed on your storefront — each active widget loads additional JS/CSS resources.
  3. For Star Rating widgets on collection/product listing pages, switch to Yotpo's 'Inline' or 'Bottomline' widget variant rather than the full Reviews widget. These are significantly lighter and reduce render-blocking payload on high-traffic pages.
  4. In your theme code, locate the Yotpo snippet (typically yotpo.liquid or a <script> tag referencing staticw2.yotpo.com). Ensure the script tag uses the 'defer' or 'async' attribute (e.g. <script async src='...'>) so it does not block HTML parsing.
  5. In Yotpo Settings → Display, disable any unused Yotpo features such as 'Yotpo Loyalty', 'SMS Bump', or 'Subscriptions' widgets if those products are not in use — each inactive-but-loaded integration adds unnecessary JavaScript weight.
  6. After making changes, test your page load time using Google PageSpeed Insights (pagespeed.web.dev) or WebPageTest.org to confirm Yotpo-related resources are loading asynchronously and are no longer flagged as render-blocking.
Slow pageModerate effort

Reduce your page load time to under 3 seconds by compressing images, eliminating render-blocking scripts and styles, and improving server response speed.

On Yotpo

  1. In your Yotpo account, go to Settings → General Settings and disable any Yotpo widgets (Reviews, UGC, Loyalty) that are not actively displayed on the page in question — unused widgets still load their JavaScript bundles.
  2. Navigate to Settings → Widgets and, for each active widget, enable the 'Lazy Load' option if available. This defers widget rendering until the user scrolls near it, removing it from the critical render path.
  3. Open your theme's code editor and locate the Yotpo script tag (typically `<script src="https://staticw2.yotpo.com/...app.js">` in theme.liquid). Add the `defer` or `async` attribute to it so the browser does not block HTML parsing while downloading the Yotpo bundle.
  4. In Yotpo's Visuals / UGC settings, reduce the number of images loaded in the initial gallery carousel (e.g. set the initial image count to 4–6 instead of 12+), and confirm that Yotpo is serving images through its own CDN with the smallest dimensions sufficient for the widget size.
  5. If you use Yotpo Loyalty & Referrals, go to its embed settings and ensure the Loyalty widget is only embedded on the Account or dedicated Loyalty page — not injected site-wide on every page load via the global snippet.
  6. After making changes, test page load time with Google PageSpeed Insights or WebPageTest to confirm the Yotpo scripts no longer appear as render-blocking resources and that Time to Interactive (TTI) has dropped below 3 seconds.
Code · Generic HTML (html)
<img
  src="product-image.webp"
  alt="Descriptive product alt text"
  width="800"
  height="600"
  loading="lazy"
  decoding="async"
>

Add these attributes to every image below the fold to enable native lazy loading and prevent layout shift.

Thin contentModerate effort

Add meaningful, original written content to pages that contain fewer than 300 words so Google has enough substance to rank and display them confidently.

On Yotpo

  1. Yotpo Reviews widgets inject customer review text directly onto product pages, which organically increases word count with unique, keyword-rich user-generated content — a highly effective complement to expanding your own descriptions.
  2. Yotpo Admin → Reviews → Widgets → ensure the Reviews Widget is published and set to display on product pages. Confirm 'Show Reviews' is toggled on for the relevant product types.
  3. Yotpo Admin → Reviews → Widgets → Widget Customization → enable 'Q&A' (Questions & Answers) if available on your plan — Q&A adds additional unique on-page text.
  4. Note: Yotpo reviews add meaningful words to the page but do not replace the need for your own written product or category descriptions — use both together for the best result.
Code · Generic HTML (html)
<section class="product-description">
  <h2>About This Product</h2>
  <p>
    The Merino Wool Crew-Neck Sweater is crafted from 100% ethically sourced
    Grade-A Merino wool, making it naturally temperature-regulating, moisture-
    wicking, and soft enough to wear directly against the skin. Perfect for
    layering in autumn and winter, or as a standalone piece during mild spring
    evenings.
  </p>

  <h3>Key Features</h3>
  <ul>
    <li>100% Merino wool — no synthetic blends</li>
    <li>Available in sizes XS–3XL with a relaxed, unisex fit</li>
    <li>12 colours, each piece individually yarn-dyed for depth</li>
    <li>Ribbed cuffs and hem for a tailored finish</li>
    <li>Machine washable on a gentle 30°C wool cycle</li>
    <li>Certified by the Responsible Wool Standard (RWS)</li>
  </ul>

  <h3>Sizing &amp; Fit</h3>
  <p>
    This sweater is cut with a relaxed, slightly oversized silhouette. If you
    prefer a closer fit, we recommend sizing down. See our full <a href="/size-guide">size guide</a>
    for chest, waist, and sleeve measurements.
  </p>

  <h3>Care Instructions</h3>
  <p>
    Machine wash cold on a gentle/wool cycle. Lay flat to dry — do not tumble
    dry, iron at high heat, or dry-clean. With proper care, Merino wool retains
    its shape and softness for years.
  </p>

  <h3>Frequently Asked Questions</h3>
  <dl>
    <dt>Is Merino wool itchy?</dt>
    <dd>
      No. Merino fibres are finer than standard wool (under 19.5 microns),
      which means they bend against the skin rather than prick it, making this
      sweater comfortable even for people who normally find wool irritating.
    </dd>
    <dt>How does Merino wool compare to cashmere?</dt>
    <dd>
      Merino is more durable and easier to care for than cashmere, while still
      offering exceptional softness. It's an ideal everyday choice for those
      who want luxury without high maintenance.
    </dd>
    <dt>Can I return or exchange this item?</dt>
    <dd>
      Yes. We accept returns and exchanges within 30 days of delivery, provided
      the item is unworn and in its original packaging. See our
      <a href="/returns">returns policy</a> for full details.
    </dd>
  </dl>
</section>

Example of a well-structured, content-rich product description section with FAQ — paste into any HTML page template.

Answer Engine Optimization · 3 fixes

Invalid rating valueModerate effort

Fix the AggregateRating.ratingValue in your structured data so it is a valid number between 1 and 5 (or your declared scale's minimum and maximum).

On Yotpo

  1. Yotpo injects its own AggregateRating and Review structured data directly via its widget scripts — the schema output reflects the ratings stored in your Yotpo account.
  2. Log in to Yotpo > Settings > Widgets. Confirm the 'Rich Snippets' or 'SEO' toggle is enabled so Yotpo outputs valid schema.
  3. An invalid ratingValue usually means a product has an averaged score that falls outside the expected range due to data import errors. Go to Reviews > All Reviews and check for any imported reviews with a rating of 0 — edit or remove them.
  4. If you bulk-imported reviews, re-import with corrected rating values (Yotpo supports 1–5 only) via the CSV import tool under Reviews > Import Reviews.
  5. After correcting reviews, purge Yotpo's cache (contact Yotpo support if no self-serve cache flush is available), then validate a product page with the Rich Results Test.
Low review countModerate effort

Collect at least 5 published reviews so Google will display star ratings in search results alongside your product listings.

On Yotpo

  1. Log in to Yotpo Admin → Reviews → Review Requests → Automatic Emails and verify that a post-purchase review request sequence is active and targeting your lowest-reviewed products.
  2. Under Reviews → Settings → On-Site Widgets, confirm the 'Star Rating' widget is enabled on product pages — Yotpo automatically injects aggregateRating JSON-LD with the live reviewCount.
  3. Use Yotpo's 'Smart Filters' or 'Manual Review Requests' (Reviews → Requests → Manual) to send a one-off ask to past purchasers of products stuck below 5 reviews.
  4. In Yotpo Admin → Reviews → Moderation, approve any pending reviews so they are published and counted in the structured data output.
  5. Once a product reaches 5 published reviews, Yotpo updates the aggregateRating reviewCount in real time — verify by running the product URL through the Rich Results Test.
Code · Generic HTML (html)
<!-- Product structured data with AggregateRating -->
<!-- Note: Google will only show review stars when reviewCount >= 5 -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Your Product Name",
  "image": [
    "https://example.com/images/product-front.jpg",
    "https://example.com/images/product-side.jpg"
  ],
  "description": "A clear, accurate description of your product.",
  "sku": "SKU-12345",
  "mpn": "MPN-12345",
  "brand": {
    "@type": "Brand",
    "name": "Your Brand"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.5",
    "reviewCount": "12",
    "bestRating": "5",
    "worstRating": "1"
  },
  "offers": {
    "@type": "Offer",
    "url": "https://example.com/products/your-product",
    "priceCurrency": "USD",
    "price": "49.99",
    "priceValidUntil": "2026-12-31",
    "itemCondition": "https://schema.org/NewCondition",
    "availability": "https://schema.org/InStock",
    "seller": {
      "@type": "Organization",
      "name": "Your Store Name"
    }
  }
}
</script>

Drop this complete block into the <head> section of any product page. Swap in your real values for name, image, SKU, price, ratingValue, and reviewCount.

Missing schema productModerate effort

Add Product schema markup (JSON-LD) to every product page so search engines can display rich results — including price, availability, and ratings — directly in search.

On Yotpo

  1. Yotpo injects aggregateRating and Review schema alongside its review widget — this complements (but does not replace) the core Product schema your platform must output.
  2. In your Yotpo admin: go to Settings → Integrations → and confirm your platform integration is active so Yotpo can append review/rating structured data to your existing Product schema.
  3. In Yotpo's Widget settings, ensure 'Rich Snippets' or 'Structured Data' is enabled (look under Settings → Widgets → Rich Snippets toggle) so that aggregateRating data is embedded in your product pages.
  4. After enabling, validate a product page with Google's Rich Results Test — you should see both the Product type and an aggregateRating object within it.
  5. Note: Yotpo handles the rating/review portion only — the base Product schema (name, price, availability) must be present from your platform's theme or a separate SEO plugin as described in the platform steps above.