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!
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!
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:
In the Wix Editor, select the section containing your FAQ app, go to Advanced Settings, and add the custom class section-faq.
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!