I run a small study site for a US food-safety certification exam. The product is 580 multiple-choice questions. For the first three weeks the questions lived in a JavaScript file and were rendered into the DOM on load.
That is a normal, reasonable architecture. It is also the reason almost none of that content existed as far as search engines were concerned.
What client rendering actually costs you
Google does execute JavaScript. It just does it later, with a smaller crawl budget, and - this is the part people miss - the first pass over a new URL is HTML. For a domain with no authority yet, that first pass is frequently the only pass that matters.
So the situation was:
- 33 URLs, each with a real HTML shell and 600-1800 words of prose
- 580 questions that existed only after three script tags finished
- The richest text on the site was, structurally, invisible
We were not penalised. We were simply not seen.
The fix was not SSR
Rewriting the app as a server-rendered framework would have been the textbook answer, and it was the wrong one here, for a boring reason: the quiz UI is interactive, and rewriting it risked the one thing that already worked.
What we did instead was narrower. The questions already existed in a data file. We rendered a subset of them to static HTML inside pages we already had - the temperature chart, the flow-of-food guide, the question-answer pages - in a details/summary block per item.
Two properties made this work:
- It is real HTML in the initial response. No hydration, no client fetch.
- It is collapsed by default, so a human reading the page is not hit with 15 open answer blocks, but the text is still in the markup.
Ninety minutes of work. 80 questions now exist as static text across six pages we already ranked for.
The part that surprised me
The interactive quiz and the static blocks do not compete. The quiz answers "let me practise". The static blocks answer "what is the answer to this specific question". Those are different searches with different intent, and the second one is what a panicking candidate types at 11pm the night before the exam.
If your product's value is a large body of content that only exists after a fetch, the cheapest win is usually not a new page. It is making the content you already have survive being read as plain HTML. Pick an existing URL that is already indexed, put the material in it, and leave the interactive version alone.
Where the questions live now
The static set is spread across the free guides at https://foodsafeprep.com/ - the temperature chart and the flow-of-food page carry most of them, and https://foodsafeprep.com/servsafe-temperatures is the one that gets the most long-tail traffic.
The dataset itself is also open: 580 items, CC BY 4.0, at https://doi.org/10.5281/zenodo.23320230
Top comments (0)