Why your Lovable site isn't showing up on Google
Your Lovable or Bolt site is live but invisible in search. Six checks that find the cause in ten minutes, and the fixes your AI can apply.
· 5 min read
You published the site, shared the link, maybe even bought a custom domain. Weeks later, searching for your product name on Google shows nothing, or only the lovable.app address, or a result with a generic title that does not describe your page.
This is common for sites built with Lovable, Bolt, v0 and similar tools, and it is usually not about content quality. It is about what search engines receive when they ask for your page. This guide walks through the checks that find the cause, roughly in order of how often each one is the culprit.
What search engines see on an AI-built site
Most AI app builders produce a single-page app: a React project built with Vite. When anyone requests a page, the server sends almost empty HTML, a <div id="root"></div> and a script tag. The browser then runs the JavaScript, which builds the actual page.
Google can run JavaScript, but rendering happens in a separate, later step, and Google's own JavaScript SEO guide recommends not relying on it for important content. Many other crawlers, link-preview bots and AI assistants do not run JavaScript at all. They see the empty shell and whatever is written into the static index.html.
On top of that, every route in a single-page app is served from the same index.html. Unless something updates the title and description per page, every page shares one title, and often that title is still the default the project was created with.
Check it yourself
1. Ask Google what it has
Search for:
site:yourdomain.com
No results means Google has not indexed anything yet, or is being told not to. Results with the wrong title or snippet point to the metadata problems below. If you see the lovable.app address instead of your domain, jump to step 6.
2. Read the raw HTML
This is what crawlers receive before any JavaScript runs:
curl -s https://yourdomain.com | head -40
Look for three things: a real <title>, a <meta name="description">, and some visible text. If the title says something generic and the body is only <div id="root"></div>, crawlers that do not render JavaScript see nothing about your product.
3. Look for a stray noindex
A noindex left over from a preview or staging setup tells search engines to drop the page. It can be in the HTML or in a response header:
curl -s https://yourdomain.com | grep -i 'name="robots"'
curl -sI https://yourdomain.com | grep -i 'x-robots-tag'
If either line contains noindex, that alone explains why the site is missing.
4. Open robots.txt
curl -s https://yourdomain.com/robots.txt
Disallow: / under User-agent: * blocks the whole site. A missing robots.txt is not a problem by itself, but this is also where you point crawlers at your sitemap with a Sitemap: line.
5. See the page as Google renders it
In Google Search Console, add your domain if you have not yet, then use URL Inspection on your home page and click Test live URL. "View tested page" shows the rendered HTML and a screenshot. If the screenshot is blank or shows an error, Google is struggling to render the app, and you will want the page content in the HTML itself (see the fixes below).
While you are there, open Sitemaps and submit https://yourdomain.com/sitemap.xml if you have one.
6. Check which address is the "real" one
If your site is reachable both at yourproject.lovable.app and at your custom domain, search engines may pick either. Add a canonical link pointing to your own domain on every page:
<link rel="canonical" href="https://yourdomain.com/" />
and make sure the custom domain is set as primary in your project's domain settings.
How to fix it
Most of these fixes are small, and your AI builder can make them if you are specific. Vague requests like "improve SEO" tend to produce keyword-stuffed text instead.
- Write a real title and description into
index.html. This is what every crawler sees first, even without JavaScript. - Give every route its own title and description. In React, a library such as
react-helmet-asyncsets them per page. - Remove any
noindexthat is not deliberate. - Add
public/robots.txtandpublic/sitemap.xmllisting your public pages, and reference the sitemap from robots.txt. - Add a canonical link to your own domain.
- Add Open Graph tags (
og:title,og:description,og:image) so links shared in chats and social posts show a proper preview. - For pages that must rank, consider prerendering them to static HTML at build time, so the content is in the HTML rather than built by JavaScript.
A prompt that covers the basics:
Make this site indexable by search engines:
1. In index.html, set a descriptive <title> and <meta name="description">
for the home page: [one sentence about the product].
2. Use react-helmet-async to give every route its own title, description
and canonical URL on https://yourdomain.com.
3. Remove any noindex meta tag or X-Robots-Tag header.
4. Add public/robots.txt allowing all crawlers, with
"Sitemap: https://yourdomain.com/sitemap.xml".
5. Add public/sitemap.xml listing these public routes: [list].
6. Add og:title, og:description and og:image tags for each route.
Do not change any visible text or layout.
After deploying, repeat steps 2 to 4 above against the live site and request indexing in Search Console for the home page. New sites can take days to weeks to appear, so give it time once the checks pass.
Keep it from breaking again
SEO problems on AI-built sites tend to come back quietly. A redesign replaces index.html, a preview setting gets copied to production, a new page ships without a title. Nothing looks wrong in the browser.
ScanYourSite runs these checks from the outside in its free check: a stray noindex, a robots.txt that blocks everything, missing title, description, canonical, language and sitemap, incomplete link previews, and whether AI crawlers are blocked. Each finding comes with a fix prompt for your AI. With monitoring on, it keeps checking and tells you when something regresses, so you find out before your traffic does.