Lovable SEO: Why Your Lovable Site Isn't on Google (and the Fix)
Lovable SEO explained: why client-side rendered Lovable sites struggle on Google, how to check yours, and when to move to Next.js.
- Published
- min read
- 6 min read
On this page
Lovable SEO problems usually come down to one thing: a Lovable project is a client-side rendered React app, so the HTML a search engine first receives is an almost empty shell, and all your text, titles and links only appear after JavaScript runs. Google can render JavaScript, but it does so in a slower, separate step, and other crawlers may not do it at all. The reliable fix is to serve real HTML for every page you want ranked, which for most growing products means pre-rendering or moving the public pages to a framework like Next.js.
This post explains why it happens, how to check your own site in five minutes, and which fix fits which situation.
Why isn't my Lovable site showing up on Google?
Lovable generates React projects built with Vite. You can see this in Lovable's own lovable-tagger package on npm, which is published from Lovable's repository and describes itself as a set of Vite plugins. A default Vite and React setup is a single-page application (SPA): the server sends one small HTML file, the browser downloads a JavaScript bundle, and React draws the page.
For a human visitor that works fine. For a search engine, the first response looks roughly like this:
<!doctype html>
<html lang="en">
<head>
<title>My App</title>
<script type="module" src="/assets/index-a1b2c3.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
There is no headline, no product copy, no internal links and no page-specific title in that file. Everything a ranking system cares about is locked inside the JavaScript.
The Next.js team's SEO course puts it plainly: with client-side rendering, the first load usually serves a single HTML file "with little to no content" until the JavaScript is fetched and run. Their guidance is that CSR is not recommended when you care about search, and is better suited to dashboards and account pages that don't need to be indexed.
Can Google crawl JavaScript sites at all?
Yes, but with caveats that matter for a new site. The same Next.js course describes how pages with client-side content can be pushed into a separate render queue. Rendering costs a search engine more resources than reading plain HTML, so only a smaller share of pages on the web gets rendered, and a URL can sit in the crawl queue anywhere from seconds to a few days before it's processed.
In practice that means:
- Slower discovery. Links that only exist after rendering are found later, so deep pages take longer to get crawled.
- Uneven indexing. Some routes get rendered and indexed, others stay as an empty shell in the index or don't appear at all.
- Other engines are weaker. The course also notes that some search engines may not have Google's rendering capacity.
- Link previews break. When someone shares your page on Slack, WhatsApp or LinkedIn, the preview bot reads the HTML head. In an SPA every route shares the same
index.html, so every shared link shows the same generic title and image.
None of this means a Lovable site can never rank. It means you are starting with a handicap, and for a site whose whole job is to win organic traffic, that handicap is usually the main reason it isn't on page one.
How to check if your site has a rendering problem
You don't need special tools for a first diagnosis. Run these checks on your homepage and one or two important inner pages.
- View the raw source. Open the page, then use your browser's "View page source" (not the inspector). If you can't find your main headline in the source, search engines don't see it on the first pass either.
- Fetch it from the terminal. This shows exactly what a non-rendering crawler receives:
curl -s https://your-site.com/pricing | grep -i "<h1"
No output means your h1 only exists after JavaScript runs.
- Compare page titles. Fetch two different routes and compare the
titletags. If they are identical, every page is competing with the same generic title in search results. - Check for a sitemap and robots file. Visit
/sitemap.xmland/robots.txt. Make sure the sitemap exists and lists every public page, not just the homepage. - Use Google Search Console. It tells you which of your pages Google has actually indexed. If you haven't verified your domain there yet, do that first.
If checks 1 to 3 come back empty, the problem is architectural. Better keywords or more blog posts won't fix it on their own.
Lovable SEO fixes, from quick wins to the real fix
There are three realistic paths. Which one fits depends on how much of your growth depends on search.
| Option | What it changes | Effort | Good for |
|---|---|---|---|
| Tidy the SPA | Per-route titles via a head manager, sitemap, robots.txt, clean URLs | Low | Apps where search is a minor channel |
| Pre-render public routes | Generates static HTML for marketing pages at build time | Medium | Mostly static landing pages with few routes |
| Move public pages to Next.js | Server-rendered or static HTML for every public page, built-in metadata, sitemap and robots support | Medium to high | Products where organic search is a main acquisition channel |
Option 1: tidy up the SPA
Add a unique title and meta description per route, generate a sitemap that lists every public URL, make sure robots.txt doesn't block your assets, and use real paths (/pricing) instead of hash URLs (/#/pricing). This helps Google once it renders the page, but the empty first response is still there.
Option 2: pre-render the public pages
Vite projects can be set up to output static HTML for selected routes at build time. For a site with a handful of mostly static marketing pages, this gets real content into the first response without changing frameworks. It gets awkward once you have many dynamic pages, such as blog posts, listings or product pages pulled from a database.
Option 3: move the public pages to Next.js
This is the fix I recommend most often when search is a primary channel. The Next.js SEO course calls static site generation probably the best rendering strategy for SEO, with server-side rendering as the other strong choice, because the content and metadata are in the HTML before any JavaScript runs.
You also get metadata tooling built in. In the App Router, a page can export a generateMetadata function that runs on the server, so each blog post or product page gets its own title and description in the initial HTML:
// app/guides/[slug]/page.tsx
import type { Metadata } from 'next'
import { getGuide } from '@/lib/guides'
type Props = { params: Promise<{ slug: string }> }
export async function generateMetadata({ params }: Props): Promise<Metadata> {
const { slug } = await params
const guide = await getGuide(slug)
return {
title: `${guide.title} | Acme`,
description: guide.summary,
openGraph: { images: [guide.coverUrl] },
}
}
export default async function GuidePage({ params }: Props) {
const { slug } = await params
const guide = await getGuide(slug)
return (
<article>
<h1>{guide.title}</h1>
<p>{guide.summary}</p>
</article>
)
}
Sitemaps and robots files are handled by special files in the app folder, so they stay in sync with your real routes:
// app/sitemap.ts
import type { MetadataRoute } from 'next'
import { listGuideSlugs } from '@/lib/guides'
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const slugs = await listGuideSlugs()
return [
{ url: 'https://acme.com', lastModified: new Date() },
...slugs.map((slug) => ({ url: `https://acme.com/guides/${slug}` })),
]
}
A common pattern is a partial migration: the logged-in app stays as it is (it doesn't need to be indexed), and only the marketing site, blog and public listing pages move to Next.js. That keeps the cost and risk down.
Does React itself hurt SEO?
Not exactly. React is a UI library and can render on the server just fine. The issue is the default setup. The React docs point out that common build tools like Vite start you off with a client-only SPA, which is easier to begin with but can have slower initial loads, and that adding server rendering or static generation yourself takes extra work. That is why the React team recommends starting new apps with a framework. Lovable chose the simpler SPA setup, which is a reasonable choice for prototypes and internal tools, and a weak one for content that needs to rank.
What this means for founders with a Lovable site
If your product is a logged-in tool and people find you through ads, referrals or sales, Lovable SEO limitations may not matter much. Fix titles and the sitemap and move on.
If your plan depends on people finding you on Google, the rendering model is the first thing to fix, before you invest in content or link building. A quick checklist:
- Confirm with
curlor View Source whether your key pages have real content in the HTML. - List the pages that need to rank and how many of them are database-driven.
- Decide between pre-rendering and a move to Next.js for those pages.
- Keep the logged-in app separate if it works; migrate the public pages first.
- Set up Search Console, submit the sitemap and watch indexing over the next few weeks.
If you're weighing a switch away from Lovable more broadly, my comparison of Lovable alternatives covers when custom code makes sense. And if you want the public side of your app rebuilt so Google can actually read it, that's exactly what my Next.js development service covers, usually as part of getting an AI-built app ready for production.
Sources
- Next.js Learn: SEO, Rendering Strategies (opens in a new tab)
- Next.js Learn: SEO, Webcrawlers (opens in a new tab)
- Next.js Learn: SEO, Metadata (opens in a new tab)
- Next.js Docs: Metadata and OG images (opens in a new tab)
- React Docs: Build a React app from scratch (opens in a new tab)
- lovable-tagger on npm (opens in a new tab)
- Cover photo: Agence Olloweb on Unsplash

About the author
Muhammad Moiz · Senior Full-Stack Engineer
I'm a senior full-stack engineer with 5+ years building production web apps in React, Next.js and Node.js. I build products end to end for founders and small businesses, and take over apps started with AI tools when they need to grow up.
More about me