The Wix FAQ is not read by google (SEO)! why so much hatred...

#SEOPros @magnusgravenhorst @stevenjose
Hi everyone, my last post before the holidays :slight_smile:

By installing several FAQ WIX at the customers I realized that something was wrong…

As a specialist in SEO, I alert your group to tell you that the “WIX FAQ” is not read by google! I contacted the Wix support service and I’m told that this is the case:

"Nathalie answered about you:
Hello,
The service concerned came back to us and informs us that unfortunately Google can not scan the content of the app FAQ
If you want the content to be scanned you have to add it to your site as text "

I would really like the SEO group to be able to put information back to WIX developers that a FAQ is a gold mine for SEO, you know it better than anyone else!

could you do it ?
:slight_smile:

Checking into this for you.

I read a Neil Patel post recently about correct Schema Markup for FAQ pages, I know you can input custom schema markup code now into a lot of the pages in a semi-recent Wix update.

FAQpage Schema JSON-LD article (scroll down near the bottom for the code): Article

I haven’t tried it myself yet, but I plan to implement it in the next month or so… hope this helps.

Hi James, I would prefer that Wix update this application, rather than go into technical manipulations ! (especially that my customers who do not know anything, want a plug and play solution )
But thank you for this info! :slight_smile:

Top ! Thx Brett :slight_smile:

@bestofdenis Gotcha… believe me, I always prefer plug and play solutions too! :wink:

G2K!!!

If I’m not mistaken, all Wix apps (including third-party) are nested in iframes. So this is probably a more generalized problem than just FAQ fyi.

Wix Stores, Wix Bookings, Pro Gallery and Wix Events are no longer in iframes - hence the performance improvements & probably SEO improvements.

Blog, Forum, Restaurants, Instagram, etc - are still not done yet.

@roberthamilton Good to know, thanks.

Think it’s hidden text that is the issue here. It’s the same when you use Corvid to hide and show text blocks. Any text that is hidden on load or hidden behind another element won’t be crawled by Google.

Actually it’s more an endemic problem to iframes, which are in some ways considered a separate page within a page. But as @roberthamilton noted, the Wix team is in the process of transcribing them so they’re not in iframes anymore.

Obviously, years later, the native Wix FAQ app from the marketplace still doesn’t auto-generate dynamic JSON-LD schema natively, but there are reliable technical workarounds.

A hands-off solution for web designers and developers is to run a lightweight client-side JavaScript snippet on the page. You set it up once, and it will continuously auto-generate and update your FAQPage schema whenever the client or site owner adds, edits, or reorders questions in their Wix dashboard.

The trick is skipping Velo and bypassing Wix’s temporary React class hashes (like .sCf1ZHF). Instead, use a MutationObserver to watch for Wix’s immutable accessibility attributes ([data-hook="title"] and [data-id="content-viewer"]).

How to set it up:

  1. In the Wix Editor, select the section containing your FAQ app, go to Advanced Settings, and add the custom class section-faq.

  2. Go to Wix Dashboard > Settings > Custom Code, click Add Custom Code, paste the snippet below, set it to load on your target page(s), and place it in Body - End.

HTML

<script>
(function() {
    function buildDynamicFaqSchema() {
        // 1. Target your stable custom structural container class anchor
        var targetSection = document.querySelector('.section-faq');
        if (!targetSection) return;

        // 2. Select all question headers using the unchangeable framework data-hook
        var questionNodes = targetSection.querySelectorAll('[data-hook="title"]');
        if (questionNodes.length === 0) return;

        var schemaArray = [];

        questionNodes.forEach(function(qNode) {
            var qText = qNode.innerText || qNode.textContent;
            
            // 3. Natively cross-reference the answer block safely without layout class guessing
            var rowItemContainer = qNode.closest('[data-hook="accordion-one-column-wrapper"]') || qNode.closest('[role="region"]') || qNode.parentElement.closest('div');
            if (!rowItemContainer) return;

            // Target the answer block inside this specific row using its native platform data identifier
            var aNode = rowItemContainer.querySelector('[data-id="content-viewer"]') || rowItemContainer.querySelector('[data-hook="accordion-item-content"]');
            if (!aNode) return;

            var aText = aNode.innerText || aNode.textContent;

            if (qText && aText && qText.trim().length > 3 && aText.trim().length > 10) {
                var cleanQ = qText.trim();
                
                // Prevent duplicate records from trailing into the final metadata arrays
                if (!schemaArray.some(function(i) { return i.name === cleanQ; })) {
                    schemaArray.push({
                        "@type": "Question",
                        "name": cleanQ,
                        "acceptedAnswer": {
                            "@type": "Answer",
                            "text": aText.trim().replace(/\s+/g, ' ')
                        }
                    });
                }
            }
        });

        // 4. Inject finalized clean data packets directly into the head container file
        if (schemaArray.length > 0) {
            var oldScript = document.getElementById('dynamic-faq-jsonld');
            if (oldScript) oldScript.remove();

            var scriptContainer = document.createElement('script');
            scriptContainer.id = 'dynamic-faq-jsonld';
            scriptContainer.type = 'application/ld+json';
            scriptContainer.text = JSON.stringify({
                "@context": "https://schema.org",
                "@type": "FAQPage",
                "mainEntity": schemaArray
            });

            document.head.appendChild(scriptContainer);
            console.log("Success: Immutable FAQ Schema generated and appended safely to document head!");
        }
    }

    // 5. Watch for the exact frame Wix's data-attribute markers attach to the window tree
    var layoutObserver = new MutationObserver(function(mutations, observer) {
        var widgetCoreHydrated = document.querySelector('[data-id="content-viewer"]');
        if (widgetCoreHydrated) {
            buildDynamicFaqSchema();
            observer.disconnect(); // Terminate observer loop right away to maintain light performance
        }
    });

    if (document.body) {
        layoutObserver.observe(document.body, { childList: true, subtree: true });
    }
    
    // Safety fallback layer to process heavily cached user networks
    window.addEventListener('load', function() {
        setTimeout(buildDynamicFaqSchema, 2000);
    });
})();
</script>

This leaves the widget completely plug-and-play for the client while ensuring search engines automatically crawl valid schema. If anyone wants a full deep-dive into why class scraping fails on Wix’s React architecture and why CMS data streams omit FAQ tables, I wrote up a complete case study here. Hope this helps!