What does Google say about SEO? /
Quick SEO Quiz

Test your SEO knowledge in 5 questions

Less than a minute. Find out how much you really know about Google search.

🕒 ~1 min 🎯 5 questions

Official statement

In a React single-page application that always returns 200 OK, using a pre-rendering service to serve a true 404 to Googlebot (while the user sees a 200 error page) is generally not considered cloaking, unless there is suspicious behavior. If the 200 page clearly indicates an error, Google will detect it as a soft 404. Dynamic rendering with appropriate status codes is safe.
10:06
🎥 Source video

Extracted from a Google Search Central video

⏱ 51:17 💬 EN 📅 12/05/2020 ✂ 37 statements
Watch on YouTube (10:06) →
Other statements from this video 36
  1. 1:02 Should you overlook the Lighthouse score to optimize your SEO?
  2. 1:02 Is page speed really a Google ranking factor?
  3. 1:42 Do Lighthouse and PageSpeed Insights really have no impact on rankings?
  4. 2:38 Do Google's Web Vitals really model user experience?
  5. 3:40 Is it true that page speed is as crucial a ranking factor as claimed?
  6. 7:07 Is it really a good idea to inject the canonical tag through JavaScript?
  7. 7:27 Can you really inject the canonical tag via JavaScript without risking your SEO?
  8. 8:28 Does Google Tag Manager really slow down your site, and should you abandon it?
  9. 8:31 Is GTM really sabotaging your loading time?
  10. 9:35 Is serving a 404 to Googlebot while showing a 200 to visitors really cloaking?
  11. 16:16 Are 301, 302, and JavaScript redirects really equivalent for SEO?
  12. 16:58 Are JavaScript redirects truly equivalent to 301 redirects for Google?
  13. 17:18 Is server-side rendering truly essential for Google SEO?
  14. 17:58 Should you really invest in server-side rendering for SEO?
  15. 19:22 Does serialized JSON in your JavaScript apps count as duplicate content?
  16. 20:02 Does the JSON application state in the DOM create duplicate content?
  17. 20:24 Is Cloudflare Rocket Loader passing Googlebot's SEO test?
  18. 20:44 Should you test Cloudflare Rocket Loader and third-party tools before activating them for SEO?
  19. 21:58 Should you worry about 'Other Error' messages in Search Console and Mobile Friendly Test?
  20. 23:18 Should you really be concerned about the 'Other Error' status in Google's testing tools?
  21. 27:58 Should you choose one JavaScript framework over another for your SEO?
  22. 31:27 Does JavaScript really consume crawl budget?
  23. 31:32 Does JavaScript rendering really consume crawl budget?
  24. 33:07 Should you ditch dynamic rendering for better SEO results?
  25. 33:17 Is it really time to move on from dynamic rendering for SEO?
  26. 34:01 Should you really abandon client-side JavaScript for indexing product links?
  27. 34:21 Does asynchronous JavaScript post-load really hinder Google indexing?
  28. 36:05 Is it really necessary to switch to a dedicated server to improve your SEO?
  29. 36:25 Shared or Dedicated Server: Does Google really make a difference?
  30. 40:06 Is client-side hydration really a SEO concern?
  31. 40:06 Is SSR + client hydration really safe for Google SEO?
  32. 42:12 Should you stop monitoring the overall Lighthouse score to focus on the Core Web Vitals metrics that matter for your site?
  33. 42:47 Is striving for 100 on Lighthouse really worth your time?
  34. 45:24 Is it true that 5G will accelerate your site, or is it just a mirage?
  35. 49:09 Does Googlebot really ignore your WebP images served through Service Workers?
  36. 49:09 Is it true that Googlebot overlooks your WebP images served by Service Worker?
📅
Official statement from (6 years ago)
TL;DR

Google states that serving a 404 code via dynamic rendering to Googlebot while users receive a 200 is not considered cloaking, unless there is suspicious behavior. If the 200 page clearly displays an error, Google will detect it as a soft 404 anyway. Dynamic rendering with appropriate HTTP codes remains a safe practice for JavaScript applications.

What you need to understand

Why is this question being raised for React SPAs?

Modern single-page applications consistently return a 200 OK code, even when the content does not exist. The logic for displaying the 404 error is handled client-side in JavaScript after the initial load.

This behavior creates an obvious problem: Googlebot receives a 200 for a page that should technically return a 404. Pre-rendering services like Prerender.io or Rendertron specifically address this gap by serving the correct HTTP code to the crawler.

Does dynamic rendering really change the game?

Yes, because it allows you to serve a pre-rendered version to Googlebot with the correct HTTP status codes while keeping the SPA intact for real users. Google has always validated this approach as a temporary solution.

Martin Splitt clarifies here that returning a 404 to the bot while the user sees the same error page in 200 is not considered cloaking, since the displayed content remains identical. Only the HTTP code changes — and that’s exactly what we aim to correct.

What happens if we leave the 200 for everyone?

Google will detect a soft 404 if the content of the page clearly indicates an error (like a "page not found" message, little content, etc.). Soft 404s are treated like real 404s regarding indexing, but with a detection delay.

The problem is that this detection is not instantaneous and can lead to wasted crawl budget, especially on sites with thousands of dynamically generated pages. Serving a real 404 via dynamic rendering speeds up the process.

  • Dynamic rendering with correct HTTP codes: a practice validated by Google, no risk of cloaking
  • Soft 404: automatically detected by Google, but with a variable delay based on the sites
  • Identical content: only the HTTP code changes between bot and user, which is precisely the goal of dynamic rendering
  • Suspicious behavior: if the content differs significantly or if patterns of manipulation are detected, the risk of penalty exists

SEO Expert opinion

Is this statement consistent with observed field practices?

Absolutely. I've seen dozens of React/Vue/Angular sites using dynamic rendering with differentiated status codes without ever receiving a penalty. As long as the visible content remains the same, Google does not consider it cloaking.

What matters to Google is the intention to manipulate. If you serve a 404 page to the bot and commercial content to the user, then you cross the line. But correcting an HTTP code while displaying the same error page? That's exactly what dynamic rendering is supposed to do.

What nuances should be added to this statement?

The wording "unless there is suspicious behavior" remains deliberately vague. Google never details precisely what triggers a cloaking flag in these cases. [To be verified]: we lack data on tolerance thresholds — how many pages can differ in HTTP codes before a suspicious pattern is detected?

Another point: Splitt mentions that soft 404s will be detected anyway, but he does not provide a timeline. On sites with limited crawl budget, this can take weeks. Serving a real 404 remains objectively more effective, even if Google eventually figures it out on its own.

In which cases does this rule not apply?

If your dynamic rendering service introduces additional content visible only to Googlebot — enhanced metadata, hidden texts, additional links — you dip into pure cloaking territory, even if the HTTP codes are correct.

Also be cautious of unintentional discrepancies: if your pre-renderer injects third-party scripts, different consent banners, or significantly alters the HTML structure, Google might see it as an attempt at manipulation. Always check that the pre-rendered version matches pixel for pixel what the user sees.

If you are using a third-party dynamic rendering service, regularly audit the differences between the bot version and the user version. A change in service configuration might introduce unwanted discrepancies that trigger a cloaking flag without you knowing.

Practical impact and recommendations

What should you concretely do to remain compliant?

First, configure your dynamic rendering service (Prerender.io, Rendertron, or a custom solution) to return the correct HTTP codes based on the content. If your SPA displays a 404, the bot must receive a 404. If it's a 301, likewise.

Next, systematically test using the URL inspection tool in Search Console. Compare the version rendered by Google with what a real user sees. Zero difference in visible content — that's the golden rule.

What mistakes should you absolutely avoid?

Never serve rich content solely to Googlebot just because you're using dynamic rendering. Adding hidden text, hyper-boosted Schema.org tags, or additional internal links only in the pre-rendered version is classic cloaking.

Avoid also unintentional HTTP code discrepancies. If your SPA returns a client-side 301 redirect but your pre-renderer serves a 200, Google will get confused. Clearly document the mapping rules between JavaScript states and HTTP codes.

How can I check that my implementation is solid?

Set up an automated monitoring system that regularly compares the bot version and the user version across a sample of pages (existing, 404, redirects). Tools like Screaming Frog or Sitebulb can do this in comparison mode.

Check in Search Console for the presence of detected soft 404s. If Google detects them despite your dynamic rendering, it means your service is not returning the correct codes or the content is not clearly signaling the error.

  • Configure dynamic rendering to serve correct HTTP codes (404, 301, 410, etc.)
  • Test every type of page (existing, error, redirect) with Google's URL inspection tool
  • Compare pixel by pixel the bot and user versions — no visible content difference
  • Monitor soft 404s in Search Console to catch configuration discrepancies
  • Document mapping rules between JavaScript states and HTTP codes for the whole team
  • Regularly audit third-party pre-rendering services to avoid uncontrolled changes
Dynamic rendering with appropriate HTTP codes is a Google-validated solution for managing SPAs. As long as the visible content remains identical between bot and user, serving a 404 to Googlebot while a 200 is shown to the browser is not cloaking. Stay vigilant about unintentional differences and document your implementation choices. These technical optimizations can prove complex to implement and maintain over time — if you lack internal resources or visibility on the real impacts, a specialized SEO agency dealing with JavaScript architectures can help secure your setup and avoid pitfalls.

❓ Frequently Asked Questions

Puis-je utiliser du dynamic rendering uniquement pour corriger les codes HTTP sans toucher au contenu ?
Oui, c'est exactement l'usage validé par Google. Tant que le contenu visible reste identique entre bot et utilisateur, modifier uniquement les codes HTTP ne pose aucun problème.
Mon site React renvoie toujours 200 — dois-je absolument mettre en place du dynamic rendering ?
Non, ce n'est pas obligatoire. Google détectera les soft 404 automatiquement si le contenu indique clairement une erreur. Mais ça prend du temps et consomme du crawl budget inutilement.
Quelle différence entre un soft 404 et un vrai 404 côté indexation ?
Aucune à terme — les deux excluent la page de l'index. Mais le soft 404 nécessite que Google analyse le contenu pour détecter l'erreur, ce qui ralentit le processus et gaspille du crawl budget.
Comment Google détecte-t-il qu'une page en 200 est en réalité une erreur 404 ?
Il analyse le contenu visible : peu de texte, message « page introuvable », absence de liens internes significatifs. Les signaux sont multiples mais jamais détaillés publiquement par Google.
Existe-t-il un risque si mon service de dynamic rendering tombe en panne ?
Oui, Googlebot recevra alors la version JavaScript brute avec des codes 200 partout. Ce n'est pas une pénalité, mais ça dégrade temporairement la qualité du crawl et peut générer des soft 404 détectées plus tard.
🏷 Related Topics
Domain Age & History Crawl & Indexing AI & SEO JavaScript & Technical SEO Penalties & Spam

🎥 From the same video 36

Other SEO insights extracted from this same Google Search Central video · duration 51 min · published on 12/05/2020

🎥 Watch the full video on YouTube →

Related statements

💬 Comments (0)

Be the first to comment.

2000 characters remaining
🔔

Get real-time analysis of the latest Google SEO declarations

Be the first to know every time a new official Google statement drops — with full expert analysis.

No spam. Unsubscribe in one click.