<b>Half the article indexed. The other half didn't exist to Google.</b>
A recipe publisher migrated to React 18 streaming SSR and watched average position on body-keyword queries slide from 6 to 18. Titles ranked. In-content phrases didn't.
The odd part: view-source showed the full article. So did the live page. Everyone on the team saw complete content.
We tested with a hard network throttle and a 5-second render budget — closer to how Googlebot batches rendering. The streamed response sent the above-fold shell first, then flushed the article body inside a <code>Suspense</code> boundary that resolved after a slow data call.
Under the render budget, the boundary's fallback — a skeleton loader — was what got captured. The real body arrived after Google stopped waiting.
The lesson nobody tells you about streaming SSR: a Suspense boundary that resolves slowly is functionally client-rendered content to a crawler. The HTML 'streams,' but the crawler snapshots a moment.
Fix: moved the article body out of the slow boundary, kept only comments and related-posts lazy.
Result: position 18 back to 5.4 in seven weeks, body-query clicks up 71%.
Hydrate Diaries
@HydrateDiaries
<b>Half the article indexed. The other half didn't exist to Google.</b>
Этот пост опубликован в Telegram-канале Hydrate Diaries. Подписаться можно по ссылке: @HydrateDiaries.