v0 gives you the best SEO foundation, then one line kills your metadata
v0 builds Next.js on Vercel, so server rendering and the Metadata API come free. That makes the traps that do still apply worth knowing precisely, because they are quiet ones.
Have Licheo make it findableIn the Next.js App Router the Metadata API only works in Server Components. If a page file exports metadata or generateMetadata and also has use client at the top, the metadata export silently stops working. There is no build error and no runtime warning. The fix is to keep the page a Server Component and move the interactive part into a child component that carries use client.
Does a v0 app need an SEO feature turned on?
v0 produces Next.js applications and deploys them on Vercel. That combination gives you server-side rendering as the default behaviour, which means the HTML sent in response to the very first request already contains your content.
There is no shell, no crawler-only rendering path, no pre-rendering feature to enable, no paid tier gating your visibility. A search engine asking for your page receives your page. It also gives you the Next.js Metadata API, a genuinely good system for per-page titles, descriptions, Open Graph tags and structured data, built in rather than bolted on.
So the rendering conversation that dominates every other article about vibe-coded apps simply does not apply to you.
Why is my Next.js page metadata missing?
This is the single most common way a v0 app ends up with no usable metadata, and the reason it catches everybody is that nothing tells you it happened.
In the Next.js App Router, the Metadata API only works in Server Components. If a file exports metadata or generateMetadata, and that same file has use client at the top, the metadata export stops working. There is no build error. There is no runtime warning. The page renders perfectly. Everything looks fine. The metadata is simply not there.
It happens so often because it is an entirely reasonable thing to do by accident. You have a page. You add a piece of interactivity, a modal, a form with state, a tab switcher. Something needs useState, so you add use client at the top of the page file, which fixes the interactivity immediately. The metadata quietly stops working at the same moment, and nothing connects the two events in your mind.
How do I keep metadata and useState on the same page?
Keep the page file a Server Component and push the interactive part into its own child component that carries use client. The page file exports metadata or generateMetadata and renders the interactive child. The child holds the state and the event handlers. Both work, because each is in the right kind of file.
If you are prompting v0 rather than writing this by hand, ask for exactly that: keep the page as a server component that exports metadata, and move the interactive parts into a separate client component.
To check whether it has already happened, search your project for use client and look at whether any of those files are page files that should be exporting metadata. Or, more conclusively, open a few deployed pages and view source, then compare the title tags. If several different pages share one title, you have found it.
Does v0 create a sitemap and robots.txt for me?
Next.js supports a sitemap well, through a sitemap.ts file in your app directory that exports a list of your URLs. But it is not created for you, so if you never asked for it, it does not exist. Visit /sitemap.xml on your deployed site and see.
If your pages come from a database or a content directory, generate the list from that source rather than typing it out, so it cannot fall out of date.
Robots.txt is the same arrangement: Next.js supports a robots.ts file and nothing creates it by default. Point it at your sitemap, then decide deliberately whether you allow the AI crawlers, because if you want assistants to cite you they have to be permitted to read you.
Why are my Open Graph preview images broken?
This is a small setting with an annoying failure mode. If you do not set metadataBase in your root layout, relative URLs in your Open Graph tags cannot be resolved into absolute ones, because the server does not know your domain.
The result is broken social preview images and, in some cases, broken canonical URLs. Set it once, in the root layout, to your production URL. It takes one line and it prevents a class of problems that are irritating to debug later.
Should I move off my vercel.app address?
Vercel gives you a working address on vercel.app and it is fine for development. Move to your own domain before you publish content, for the ordinary reasons.
Reputation accumulated on someone else’s domain is not portable. Visitors read a platform subdomain as unfinished, which costs you if you are asking somebody to sign up or pay. And moving later means redirects on every page you already published.
Why does my v0 app still get no traffic?
Here is the thing about starting from the best technical foundation: it removes every excuse. If your v0 app is server-rendered, has correct per-page metadata, a current sitemap, a sane robots.txt and your own domain, and still nobody is finding it, then the problem is not technical at all.
Search engines and assistants both do the same job. Somebody asks a question and they look for the clearest answer to that specific question. Your homepage explains what your product is, which is not a question anybody asks, because they have not heard of your product. People search for their problem in the words of somebody who has that problem and does not yet know what the solution is called.
Part of a larger guide
This page is one part of Why is nobody using the app you built?. The other parts:
Questions people ask
- Why is my Next.js metadata not working?
- Almost always because the page file has use client at the top. In the App Router the Metadata API only works in Server Components, so a metadata or generateMetadata export in a client file silently stops working. There is no build error and no runtime warning, which is why it goes unnoticed for weeks.
- How do I use metadata and useState on the same page?
- Keep the page file as a Server Component that exports metadata, and move the interactive part into its own child component carrying use client. The child holds the state and event handlers. Both work, because each piece is in the right kind of file.
- Does v0 need an SEO feature turned on?
- No. v0 produces Next.js on Vercel, which gives you server-side rendering by default. The first response already contains your content, so there is no shell, no crawler-only rendering path, no pre-rendering feature to enable and no paid tier gating your visibility.
- Does v0 create a sitemap automatically?
- No. Next.js supports a sitemap.ts file in your app directory, but nothing creates it for you. Visit /sitemap.xml on your deployed site to check. If your pages come from a database or content directory, generate the list from that source so it cannot drift out of date.
- What is metadataBase and do I need it?
- It tells Next.js your production domain so relative Open Graph URLs can be resolved into absolute ones. Without it your social preview images break and canonical URLs can break too. Set it once in the root layout to your production URL. It is one line and it prevents a class of problems that are hard to debug later.
- How do I know if the use client trap already hit my app?
- Open several deployed pages and view source, then compare the title tags. If several different pages share one title, the metadata exports are not running. You can also search the project for use client and check whether any of those files are page files that should be exporting metadata.
Keep reading
Want somebody to check the five
We will go through your v0 app and confirm whether your metadata is actually reaching search engines and assistants, then build the content pages that turn a good foundation into real traffic.
Have Licheo make it findable Read the full vibe coding guide