- Hypothesis
- Adding valid FAQ, HowTo or Product structured data to pages that already rank in positions where rich results are shown will increase click-through rate at a stable position, compared with matched pages without markup. Average position itself will not change.
- Method
- Three independent sub-tests, one per schema type, each with a treated and a control group of pages matched on position and query type. CTR and position compared before and after.
- Measure
- CTR at constant position band (primary), rich result impressions in Search Console (eligibility check), average position (to confirm no ranking effect).
- Duration
- 6 weeks baseline, 8 weeks post-change, per sub-test.
Hypothesis
Structured data changes the result snippet, not the ranking. So the honest claim to test is a CTR claim: at the same position, a result with a visible rich enhancement gets a different share of clicks than a plain one. The direction is not obvious. FAQ dropdowns can answer the question on the results page and reduce clicks. Product snippets with price and rating usually invite them.
What would falsify it: if rich results appear and CTR in the treated group does not separate from the control group at matched positions, the markup is cosmetic on this site. If rich results do not appear at all, the test is inconclusive about CTR and becomes an eligibility finding instead.
Why I tested it
Schema is one of the first things recommended in most audits and one of the last things measured. Google also changes rich result eligibility over time; FAQ rich results in particular were restricted for most sites, so what used to be reliable may not be. I wanted current evidence from Indian search results, on mobile, where most of the traffic I work with lives, before continuing to recommend markup in my audit framework.
For ecommerce clients the Product question is the expensive one. Getting price, availability and review markup right across a catalogue is engineering work that belongs inside a wider technical SEO programme, and I would rather justify it with a measured CTR change than with a screenshot of a star rating.
Method
Pick candidate pages per schema type
FAQ: informational pages with genuine on-page Q&A. HowTo: step-based pages with real procedural content. Product: product detail pages with price, availability and reviews on the page. Markup only ever describes content that is already visible.
Match and split
Within each type, pages are paired on average position band and query intent, then one of each pair is randomly assigned to treatment. This keeps the position distribution similar in both groups, which matters because CTR is driven mostly by position.
Baseline
Query-level impressions, clicks and position from the Search Console API for the baseline window, for both groups, so that CTR can later be compared within position bands rather than as a raw average.
Deploy markup
JSON-LD added to treated pages only. Validated before deploy. No content, title or meta description changes on either group.
Confirm eligibility, then measure
Search Console's enhancement reports and the rich results search appearance filter confirm whether the markup is actually producing rich results. Only then does the CTR comparison mean anything.
Confounders: a core update, a change in Google's rich result policy mid-test, seasonality in product demand, and title rewrites by Google, which change snippets independently of markup. Because both groups are on the same site and in the same time window, these should move both lines. I also log any Search Console enhancement errors so that a "no effect" can be separated from "markup never rendered."
Implementation
Markup is injected as JSON-LD in the page head via the template, generated from the same fields that render the visible content, so the two cannot drift apart. For Product, offers reflect live price and stock. For FAQ, each question maps to a visible heading and answer block.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "{{ faq.question }}",
"acceptedAnswer": {"@type": "Answer", "text": "{{ faq.answer_plaintext }}"}
}]
}
</script>
Each sub-test runs on a different set of pages and can start on a different date, because eligibility windows differ by type. I do not combine FAQ, HowTo and Product markup on one page in this test; stacking types would make the CTR effect unattributable.
How to read the results
CTR must be compared within position bands, never as a raw average. A group that drifted from position 6 to position 4 will show higher CTR with no help from schema. So the primary chart is CTR by position band, treated versus control, before and after, with the eligibility share noted alongside.
The second check is average position itself. If it moves in the treated group but not the control, something other than snippet appearance is going on, and I will report it rather than fold it into the CTR story. A result counts only if rich results demonstrably appeared and the CTR gap at matched positions exceeds the baseline noise.
Data
Sub-test eligibility logs, search result appearances, and click-through rates are being recorded.
Result
Currently monitoring rich result appearance rates and CTR impact across treated URLs. Full comparative data will be published upon completion.
What I learned
Early indications show rich snippet eligibility requires strict alignment between visible body content and markup; full findings to follow.
Conclusion
Definitive recommendations on schema return-on-investment will be published once the test concludes.
In the meantime, the design is the recommendation: measure eligibility before CTR, and CTR within position bands. The technical SEO guide covers structured data in context, and if you run a catalogue, the ecommerce SEO page explains where Product markup sits in the wider system.