Insights › Builder guides
Why your Lovable app isn't showing up on Google
A Lovable app renders in the browser, so it looks live — but Google and ChatGPT often see a blank page. Here's what they actually receive, how to check it in 30 seconds, and the five fixes in the order that matters.
Aug 8, 2026 · 7 min read
The short version
Your app works in a browser but not in Google because Googlebot and AI crawlers read the HTML your server sends *before* JavaScript runs — and a Lovable app sends an almost empty shell. Fix what the crawler receives, not what you see.
The page a crawler receives is empty
Lovable ships a React single-page app. The server returns one small HTML file with an empty root element, and the browser fills it in by running JavaScript. You see the finished page; a crawler often doesn't.
Google *can* render JavaScript, but it does so on a second pass that can lag days behind, and it skips pages it judges low-value. The AI crawlers behind ChatGPT, Perplexity and Google's AI answers don't run JavaScript at all. To all of them, your first response looks like this:
<!doctype html>
<html>
<head><title>Vite App</title></head>
<body>
<div id="root"></div>
<script src="/assets/index-a1b2c3.js"></script>
</body>
</html>No headline, no copy, no links. A default Vite App title. There is nothing on the page to index, so nothing ranks.
Check what Google actually sees in 30 seconds
Don't trust the rendered page in your browser — check the raw response. Two ways:
- 1
View source, not inspect
Open your live app, then use View Page Source (Cmd/Ctrl+U). This shows the HTML the server sent, before JavaScript. Inspect Element shows the rendered DOM, which hides the problem.
- 2
Fetch it like a crawler
Run
curl -s https://yourapp.com | head -40in a terminal. If you see an empty<div id="root">and little else, that's exactly what Googlebot's first pass and every AI crawler get.
Search Google for site:yourapp.com. Zero results (after the app has been live a week or two) confirms it: nothing has been indexed.
The five fixes, in the order that matters
Do these top to bottom. The first one is the difference between invisible and indexable; the rest compound on it.
1. Serve real HTML (pre-render or SSR)
The root fix is to send content in the first response. Put your marketing and content pages on static HTML or server-side rendering so the title, headings and copy are present before JavaScript runs. A logged-in app dashboard can stay client-rendered — it's the public, shareable pages that need to be crawlable.
2. Set a real title and meta description per page
Vite App is not a search result anyone clicks. Give every public page a specific <title> and <meta name="description">, and an Open Graph image so shared links don't unfurl blank.
<title>Split expenses with friends — Tabby</title>
<meta name="description" content="Track shared bills, settle up in a tap, no signup for guests.">
<meta property="og:image" content="https://yourapp.com/og.png">3. Generate a sitemap.xml
A sitemap lists your indexable URLs so Google doesn't have to discover them by luck. Generate one, list your public routes, and reference it from robots.txt. Without it, a JavaScript app with few inbound links can stay undiscovered indefinitely.
4. Set a canonical tag on every page
A canonical tag tells Google which URL is the real one when the same page is reachable at several addresses (with and without www, with tracking parameters, trailing slashes). Missing canonicals split your ranking signals across duplicates.
The rules are worth getting exactly right — see Canonical tags: the rules that actually matter.
5. Verify in Search Console and request indexing
Add the site to Google Search Console, submit the sitemap, and use URL Inspection to request indexing on your key pages. Search Console is also where you'll see whether Google rendered the page or gave up on the empty shell.
Symptom to cause to fix
| What you see | The cause | The fix |
|---|---|---|
site:yourapp.com returns nothing | Empty HTML shell, nothing to index | Pre-render / SSR (fix 1) |
| Ranks for your brand name only | Only the homepage got rendered and indexed | Sitemap + per-page HTML (fixes 1, 3) |
| Link previews are blank | No title, description or OG image | Per-page metadata (fix 2) |
| Duplicate URLs competing | No canonical tag | Canonical per page (fix 4) |
How long until it ranks
Once real HTML is served and the sitemap is submitted, indexing usually starts within days. Ranking for anything competitive takes longer and depends on links and content — but you can't rank at all while the page is blank, so serving crawlable HTML is the step that unblocks everything else.
Every fix above maps to a check Actuant runs against your deployed app. It loads the live URL in a real browser, reads the pre-JavaScript HTML, and returns each of these as pass or fail with the exact line to change.
Keep reading
Canonical tags: the rules that actually matter
A canonical tag tells Google which URL is the real one when a page is reachable at several addresses. Get it wrong and you split your ranking signals or deindex the wrong page. Here are the seven rules, and how generated apps break them.
llms.txt: how to get your app cited by ChatGPT and Perplexity
AI assistants recommend products in their answers. llms.txt is one of the levers that decides whether yours is one of them. Here's what the file is, what to put in it, and the other three things that matter more than most people admit.