Your site looks fine in Chrome. But Google doesn't look at your site the way you do, and if you built it with React, Vite, Lovable, Bolt.new, or Replit, the gap can be huge. Before you change anything, look at what Google is actually getting. Here are four free ways to do it, from fastest to most thorough.
Googlebot processes a page in two steps. First it downloads the raw HTML. Later, when it has resources to spare, it renders the page with JavaScript, the way a browser would. A server-rendered site has its content in step one. A single-page app usually has only this:
<title>Vite + React</title>
<div id="root"></div>
<script type="module" src="/assets/index-abc123.js"></script>
Everything useful appears only after rendering. If rendering is delayed, fails, or times out, Google is left with a blank page and a default title. Many AI crawlers and link previewers never render at all.
This shows roughly what any crawler gets in step one:
curl -s -A "Googlebot" https://www.yourdomain.com/ | grep -i -E "<title>|<h1|<meta name=\"description\"|id=\"root\""
Good sign: you see your real title, <h1>, and meta description. Bad sign: you only see id="root" and a generic title like "Vite + React".
No terminal? In Chrome, open your page, press Ctrl+U (Cmd+Option+U on Mac) to view the source. That's the raw HTML, before JavaScript runs. If your headline isn't in it, crawlers that don't render can't see it either.
What Googlebot Sees puts the raw HTML a crawler downloads next to the fully rendered page, so you can see exactly what's missing. It's free and needs no signup. It's the quickest way to show a client or teammate why a page isn't ranking.
If you've verified your site in Google Search Console, paste a URL into the URL Inspection box at the top, then click Test live URL. When it finishes, View tested page shows the rendered HTML Google produced, a screenshot, and any resources that failed to load. This is the closest you can get to Google's own renderer.
Two things to watch for:
robots.txt isn't blocking /assets/ or your API.Also look at the Page indexing report. "Crawled – currently not indexed" on a single-page app often means Google found too little content worth keeping.
Google's Rich Results Test works on any public URL without verifying ownership. Run it, then click View tested page to see the rendered HTML and a screenshot. It uses the same rendering service as Googlebot, so it's a good stand-in until you set up Search Console.
Whichever tool you use, check that the HTML Google gets contains:
<title> and meta description for each page, not the same one everywhereog:title, og:description, og:image) for link previewsrobots.txt and sitemap.xml files, not your app's HTML served at those paths (a common SPA fallback bug)The free SEO checker checks all of these in one pass.
You have three main options:
Prerender for bots (no rewrite). A layer in front of your site gives crawlers fully rendered HTML while people keep getting your normal app. With CrawlFixer, you point your www CNAME at customers.crawlfixer.com and keep your current host. See Connecting your domain.
Build-time prerendering. Snapshot each route to static HTML during the build. Fine for a few marketing pages, harder when pages depend on live data.
Server-side rendering. Move to Next.js, Remix, or Astro. The most thorough fix and usually the most work. Lovable vs Next.js for SEO walks through when it's worth it.
Run What Googlebot Sees on your homepage. If the raw side is empty, start a free 7-day trial with no card. After that it's $12/month per site, or $49/month for up to 10 sites on the agency plan.
Related: Why ChatGPT can't read your JavaScript site · React SPA SEO without Next.js · Bolt.new site blank on Google · Lovable site not indexed by Google
CrawlFixer is not affiliated with Google.