SEO for sites built with AI app builders: Lovable, Bolt, v0 and Replit
If your AI-built site is not on Google, the most likely reason is that it is new and nothing links to it, which no code change fixes. After that come client-side rendering, a missing sitemap or unverified Search Console, one title shared by every route, and a preview domain indexed instead of your real one. Each has a test that takes a minute; run them in order before you rebuild anything.
By Théophile Louvart, founder of Porteur · Updated 23 September 2026 · Markdown
The five usual causes, most common first
| Cause | How to tell | Fix |
|---|---|---|
| The site is new and nothing links to it | Search Console shows the home page as "discovered" or not at all, and no other site mentions yours | Get a few real links, submit the sitemap, request indexing on the main pages |
| Client-side rendering | curl on a page returns no text, only a root div and a script | Server-render or prerender the public pages |
| No sitemap, or Search Console not verified | /sitemap.xml returns a 404 or lists nothing; no property in Search Console | Generate the sitemap, verify the domain, submit it |
| Every route shares one title | curl three routes and see the same <title> three times | One title and description per route |
| A preview or staging host indexed instead of yours | A site: search for your brand shows the builder's subdomain | Noindex the preview host or redirect it, canonical to the production domain |
The first cause surprises people most. A site with no links pointing to it may be discovered slowly even with a sitemap. Google has no reason to hurry to a domain nobody mentions. The code can be perfect and the site still takes weeks to appear.
The other four are the builder's defaults meeting the way crawlers read. None of them is specific to one tool, and all of them are quick to check.
What your builder generated
Each builder produces a different stack, and the choice changes by project, by template and over time. What follows is the picture in 2026. Check your own project, because it changes.
| Builder | Usual output in 2026 | What it means for crawlers |
|---|---|---|
| Lovable | New projects (from 20 April 2026): TanStack Start with server rendering. Older ones: client-rendered React and Vite, prerendered for verified crawlers | New projects send full HTML; older ones are worth checking |
| v0 by Vercel | Next.js projects | Server or static HTML by default; check routes are not client-only |
| Bolt | Several stacks depending on the prompt and template, often a Vite React front end | Often client-rendered: test it |
| Replit | Several stacks depending on the prompt and template, often a Vite React front end | Often client-rendered: test it |
Two checks tell you what you have, whatever the tool said it would build.
# 1. What the project is built with (run in the project folder)
grep -E '"(next|vite|react-scripts|astro|@tanstack/[a-z-]+|@react-router/[a-z-]+)"' package.json
# 2. What a crawler that does not run JavaScript receives
curl -s https://yourproduct.com/ | grep -i '<title>'
curl -s https://yourproduct.com/ | grep -c 'a sentence from your home page'If you find vite without a server framework and the second curl prints 0, your pages are built in the browser. The guide on single page applications ranks the fixes; the Lovable guide covers its projects in detail.
Preview and staging hosts
Builders publish to their own subdomain before you connect a domain, and many keep serving it afterwards. If Google found the subdomain first, it may index that copy and treat your real domain as the duplicate.
Preview and staging hosts should be noindexed, or redirected to the production domain with a canonical to it. Do one of these, in order of preference:
Redirect the preview host
If the builder offers it, make the subdomain answer 301 to the same path on yourproduct.com. Google then merges the two.
Add a canonical on every page
Each page carries a canonical to its URL on your domain, whichever host served it.
Noindex a staging copy
A staging site that must stay reachable sends a noindex header or tag, and never appears in a sitemap.
<!-- On every page, served from any host -->
<link rel="canonical" href="https://yourproduct.com/pricing">
<!-- On a staging copy only -->
<meta name="robots" content="noindex">The 30-minute checklist
Run these on your production domain. Each row is a command or a click, and each result points to one fix.
| Minutes | Check | Pass |
|---|---|---|
| 0 to 5 | Verify the domain in Search Console as a domain property | The property shows data or "processing" |
| 5 to 10 | Open /sitemap.xml and /robots.txt | The sitemap lists your public pages; robots.txt blocks nothing public and names the sitemap |
| 10 to 15 | curl the home page and two others for text and <title> | Text present; three different titles |
| 15 to 20 | curl a made-up path for its status | 404, not 200 |
| 20 to 25 | Search your brand with site: and your domain; then site: and the builder's subdomain | Your domain appears; the subdomain does not |
| 25 to 30 | Submit the sitemap; run URL Inspection on the home page | Sitemap accepted; inspection shows the page can be indexed |
for path in / /pricing /about; do
printf '%-10s ' "$path"
curl -s "https://yourproduct.com$path" | grep -o '<title>[^<]*</title>'
done
curl -s -o /dev/null -w 'unknown path: %{http_code}\n' https://yourproduct.com/no-such-page
curl -s https://yourproduct.com/robots.txt
curl -s https://yourproduct.com/sitemap.xml | grep -c '<loc>'The first four weeks
Week 1: inspect and request indexing
Run URL Inspection on your home page and your three most important pages. Use the live test to check the rendered HTML holds your text, then click Request indexing. It asks Google to crawl one URL and has a daily limit, so keep it for pages that matter.
Week 2: three real links
Post on one launch site, list the product in one directory for your niche, and answer one community question with a link to a page that answers it. Links are how Google finds a new domain and decides it is worth crawling.
Week 3: fix what the Pages report says
In Search Console, open Pages. Read the reasons pages are not indexed. "Discovered, currently not indexed" is patience and links; "Crawled, currently not indexed" points at the page itself, often thin or close to another page; soft 404 is the status code problem.
Week 4: read the queries
Open the Performance report. The first impressions show which searches Google tried you on. Improve the page that matches the most of them before writing a new one.
An audit prompt for your builder or agent
Builders and coding agents fix what you describe precisely. Ask for a report first, then approve the changes one by one, so you know what moved.
Audit this project for search engines and report before changing anything.
For each public route, tell me:
- whether its main text is in the HTML the server sends (not added by JavaScript),
- its <title> and meta description, and whether any other route shares them,
- its canonical URL,
- whether links to other pages are <a href> elements.
Also tell me:
- what status an unknown path such as /no-such-page returns,
- whether /sitemap.xml and /robots.txt exist and what they contain,
- which domains the site is served on, and whether any of them should redirect.
Do not modify any file. Output a table, one row per route.Then run the curl commands above yourself. An agent's report says what the code intends; curl says what the server actually sends.
Questions
Most often because the site is new and has no links pointing to it, so Google finds it slowly. Check that the domain is verified in Search Console, that a sitemap is submitted, and that URL Inspection can index the home page. If all three are fine, the fix is links and time, not code.
No. The tools write whatever stack the template or the prompt asks for, and some of those stacks render in the browser by default. Check what your project produces with curl, then fix the rendering, titles and status codes if needed.
v0 generates Next.js projects, which render on the server or at build by default, so crawlers get full HTML. You still need a title and description per route, a sitemap and real links; the guide on Next.js covers the setup.
It depends on the stack each project was generated with, which varies by prompt and template. A Vite React front end is client-rendered, so test it with curl and prerender the public pages if the text is missing.
There is no fixed delay. A new domain with no links can wait weeks to be crawled; requesting indexing on the main pages and getting a few real links shortens it. Content that answers searches is what makes it rank once it is indexed.
Check my site, free
Paste the URL of the site your builder made into the free check: in about thirty seconds it reads it, the searches around it and the rivals on them, and shows three findings whole.
- Free check, no card
- Read-only, your own accounts
- Readable by your agent
Read next
- GuideLovable SEO: why older Lovable sites were not indexed, and what to check now
- GuideSingle page application SEO: rendering, routes and status codes that Google can read
- GuideReact SEO: making a React app readable by Google and by AI crawlers
- GuideNext.js SEO: what the framework does for you and what it does not
- GuideHow to use the URL Inspection tool in Search Console
- GuideGoogle is not indexing your site: find the reason in Search Console
- GuideHow to get your first ten backlinks
- GuideSEO for indie hackers: one person, one hour a week, real pages