The short answer
Framer handles a lot of technical SEO on its own: every page is served as pre-rendered HTML, the sitemap, robots.txt, canonical tags and hreflang are generated for you, and each page also has a Markdown copy for AI agents. What you add is the content layer: page and CMS titles, descriptions, social images, alt text, JSON-LD and, on the Pro plan, redirects.
Its limits are about control, not visibility. You can't set a per-page canonical, edit hreflang, add lastmod dates to the sitemap or exclude single CMS items, and anything inside an overlay is invisible to search engines. If your site needs those, Webflow or a coded site is the better fit.
What Framer does by default, and what you set
From Framer's help center and pricing page on 21 October 2026. Prices are per site per month, billed yearly: Basic USD 10, Pro USD 30. A dash means Framer's docs name no plan requirement.
| Feature | Out of the box | What you set | Plan |
|---|---|---|---|
| HTML rendering | Pages pre-rendered on the server | Nothing | — |
| XML sitemap | Generated on publish, one per locale | Noindex pages you don't want | — |
| robots.txt | Allows everything, lists the sitemap | Upload your own file | Pro |
| Canonical tags | From the connected domain | Custom canonical URL behind a proxy | Advanced Hosting add-on |
| Titles and descriptions | Site-wide default | Per page; CMS variables | — |
| Social images | Site-wide default | Per page; CMS image field | — |
| Redirects | Trailing slash removed with a 308 | Rules, wildcards, bulk import | Pro |
| Structured data | None | JSON-LD in custom code | — |
hreflang and lang | Automatic per locale | Nothing (not editable) | Locale add-on |
| Markdown for AI agents | Automatic | llms.txt upload | llms.txt: Pro |
Rendering: what Google actually sees
Framer is built on React, which worries people who remember JavaScript sites that crawlers saw as blank. Framer's help center says every page is pre-rendered to HTML on its servers, and that matches what we found: Framer's own blog, fetched on 21 October 2026 without running JavaScript, returned 1,325 words of text, 434 links and one H1 in the raw HTML.
Four details to know:
- Traffic-aware pre-rendering. Framer's hosting guide says it renders the most-visited pages at publish time and the rest on first request, then caches them. Its dynamic optimization notes add that fewer than 1% of visits usually hit an unoptimized page, and that crawlers which don't run JavaScript get the latest optimized version. After publishing a new page, open it once yourself so it's rendered before Googlebot arrives.
- Overlays aren't in the HTML. Content inside an overlay isn't rendered on first load, and Framer's overlay article says "there is currently no way to make overlay content crawlable". A navigation menu that only exists in an overlay hides every page it links to.
- Infinite scroll has a ceiling. Googlebot renders a viewport about 12,000 px tall, and Framer loads as many CMS items as fit in it (infinite scrolling and SEO). Items further down need another link path: previous/next links on CMS pages, category pages, or an HTML sitemap.
- Duplicate headings are normal. Framer duplicates elements per breakpoint and hides them with CSS, so audit tools report several H1s. Framer's explanation is that Google renders the page and ignores the hidden copies; we'd still keep one visible H1 per breakpoint.
Markdown copies for AI agents
Framer now serves a Markdown version of every optimized page at the same URL, either when a request sends Accept: text/markdown or when you add ?md (example.com/pricing?md), with a ## Navigation section of links at the end. Of 21 Framer-built sites from Framer's gallery we tested on 21 October 2026, 20 returned Markdown; the exception runs behind a proxy. Webflow, by comparison, hosts an llms.txt file but says it doesn't produce per-page Markdown. Whether AI tools rank you better for it is unproven; it does make your pages cheap for agents to read. More in our guide to appearing in AI answers.
Sitemap and robots.txt
Framer generates /sitemap.xml on every publish with no settings to touch. On a site with locales, it becomes a sitemap index with one file per locale (sitemap_en.xml, sitemap_nl.xml), and the hreflang lives in each page's <head> instead.
One thing the help article says that we couldn't confirm: it describes a sitemap listing when each page was last updated, but none of the 20 gallery sitemaps we read had a <lastmod> tag, nor did the per-locale files of the localized sites. Google says it uses lastmod when it's verifiably accurate, so on a large, often-updated blog you lose a recrawl hint you'd get from Webflow or a coded site. For a 20-page site it hardly matters.
To keep a page out of search, turn off Search engines in its Page Settings; Framer adds <meta name="robots" content="noindex"> rather than a robots.txt rule (Framer docs), which is the method Google recommends. On a CMS page, that setting belongs to the template, so it applies to every item; we found no per-item switch in Framer's help center.
The default robots.txt on the 20 sites was the same: allow everything, plus the sitemap line. To change it, upload your own robots.txt as a static file on Pro or Enterprise (50 files on Pro, 500 with Advanced Hosting); it replaces the generated one. The same route hosts llms.txt, IndexNow keys and .well-known files. Before blocking AI crawlers, read the trade-off in our guide to blocking AI crawlers.
Canonical URLs and domains
Framer writes a canonical tag for every page from the domain you connect. Query strings are dropped (/blog?x=1 declares /blog), and a trailing slash redirects to the version without one.
What you can't do is point one page's canonical somewhere else. Framer documents a single site-wide custom canonical URL for sites served through a reverse proxy, and it comes with the Advanced Hosting add-on (USD 200 a month, billed yearly). Without it, a proxied site's tags may default to the project's .framer.website address, which is exactly what one of the 21 gallery sites we checked was doing. Adding a second canonical through custom code leaves two conflicting tags, which Google tells you not to do.
Three domains to keep apart:
- Your custom domain: the one that should rank.
.framer.app: the base domain every project gets. Framer says these aren't indexed by search engines..framer.website: the free domains you can claim. These are indexable; the template previews we checked allowed crawling and declared themselves canonical. If you build on one before connecting your domain, redirect it or noindex it when you move.
Redirects
Redirects are a Pro feature: Basic has none, which matters for any site replacing an older one. You add them in Site Settings › Hosting › Redirects (Framer docs):
*matches any path segment:/blog/*catches/blog/hello-worldand/blog/2022/07/18/hello-world.:1,:2reuse the matched parts:/blog/*/post/*→/article/:1/entry/:2.:slug-style names match exactly one segment:/blog/:year/:month/:day→/article/:year-:month-:day.- Rules run in the order you drag them into.
- Rules don't follow your edits: if you change a path that a rule uses, update the rule yourself.
- You can only redirect paths on the current domain. Moving to a new domain means a redirect at the old domain's host.
The redirects Framer serves are 308s, which Google treats like 301s as permanent redirects. For bulk work, the Redirect Sync plugin exports and imports CSV files with from and to columns (plus an optional expandToAllLocales). Unlike Webflow's importer, which replaces every rule, Framer's updates the rules whose from matches; the docs don't describe it deleting the others. Our redirect map generator drafts the list from your old and new sitemaps.
Titles, descriptions and social images
Framer starts from a site-wide title and description and lets each page override them (metadata guide). A default is convenient and also a trap: every page you forget shares the site-wide description, so search results show the same snippet for all of them. Give each page its own.
On CMS pages, use variables: {{Title}} – Blog in the title, {{Description}} in the description, and an image field for the social preview, which Framer sizes at 1200 × 630. Add dedicated plain-text "SEO title" and "SEO description" fields to each collection rather than reusing the visible headline.
Framer also lets you mark layers as Google Bot: Skip, which applies data-nosnippet. It stops Google from quoting that text in a snippet, which can keep your meta description in place, but the same text then can't appear in rich snippets either. Use it sparingly.
Structured data
There's no schema editor. You add JSON-LD in custom code, scoped to the pages it belongs to, and on CMS pages you can fill it with fields (Framer's JSON-LD guide). The | json filter escapes values safely, and {{Created}} and {{Updated}} exist on every CMS item:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": {{Title | json}},
"description": {{Excerpt | json}},
"image": {{Cover_Image | json}},
"datePublished": {{Created | json}},
"dateModified": {{Updated | json}},
"author": { "@type": "Person", "name": {{Author_Name | json}} }
}
</script>Unlike Webflow's schema field, this works with fields pulled from a referenced collection, as Framer's own example does for the author. You can also store a complete JSON-LD block in a CMS text field and print it with | unsafeRaw, which doesn't escape anything, so one malformed entry breaks that page's markup. Test the published page with Google's Rich Results Test.
Localization: locales, hreflang and translated paths
Each locale costs USD 20 a month (billed yearly), with up to 20 on Basic and Pro, per the pricing page. Adding locales and typing translations is free; AI translation spends your plan's credits (adding a locale). For SEO:
- hreflang and
langare automatic and not editable (language attribute). On the three localized Framer sites we checked, each page listed every locale plus anx-defaultpointing at the default locale. - Paths translate. Turn on Translate Page Paths and give each locale its own path (
/careersin English,/empleosin Spanish); CMS slugs translate too (localized page paths). On Webflow that takes the more expensive Localize Advanced plan. - Missing translations fall back. A locale can show its fallback language where text isn't translated, which publishes near-duplicates under hreflang. Translate before you publish a locale.
- Hiding pages has limits. Framer's docs say that, as of November 2025, pages can be hidden only in newly added locales and never in the base locale; a hidden page returns a 404 (excluding items).
- Automatic locale runs in the browser. It uses the browser's languages (and, for English only, a London time zone to pick a UK locale), never geolocation, and only redirects visitors who land on the default locale (how it works). When we requested Framer's home page with a Japanese
Accept-Language, the server still answered 200: the redirect happens in the visitor's browser, not on the server.
The URL and hreflang choices behind all this are in our multilingual SEO guide.
Speed: how Framer sites do with real users
The HTTP Archive's technology report, built on the Chrome UX Report, gives the share of origins passing all three Core Web Vitals on mobile in September 2026, by the visitors' country:
| Visitors in | Framer | Webflow | All sites | Framer origins measured |
|---|---|---|---|---|
| Worldwide | 70.8% | 71.3% | 52.8% | 11,319 |
| United States | 81.7% | 80.2% | 63.3% | 1,966 |
| Canada | 82.0% | 80.8% | 67.4% | 405 |
| Spain | 67.6% | 59.7% | 53.1% | 417 |
| Brazil | 56.5% | 45.4% | 33.7% | 1,019 |
| Mexico | 54.7% | 50.1% | 40.5% | 338 |
| Colombia | 36.2% | 43.6% | 32.4% | 152 |
Framer and Webflow are close worldwide and both well above the web as a whole; Framer's worldwide rate rose from 64.0% in September 2025. Framer's weak metric is responsiveness: 80.3% of Framer sites have a good Interaction to Next Paint on mobile worldwide, against 88.0% for Webflow, and only 37.9% for visitors in Colombia (a small sample of 152 origins, so treat that row with care). The HTTP Archive's page-weight data puts the median Framer home page at 3.1 MB on mobile with 816 KB of JavaScript, against 2.6 MB and 732 KB for all sites; heavy scroll animations and embeds on slower phones are the likely cause.
What helps, from Framer's own optimization advice: use Appear effects rather than scroll animations above the fold, keep blur below 10, host video on YouTube or Vimeo (Framer serves video at its original resolution), and load third-party scripts with defer. Our INP guide shows how to find the slow interaction, and the platform speed report compares platforms in any country.
Framer's limits next to Webflow and a coded site
| Framer | Webflow | Coded site (e.g. Astro) | |
|---|---|---|---|
| Per-page canonical | Not offered | Static pages | Any page |
lastmod in sitemap | Not in the 20 we read | Yes | If you add it |
| Exclude one CMS item | No per-item switch | Yes (Premium) | Yes |
| Redirects | Pro; import merges | Paid plans; import replaces | Host config file |
| robots.txt | Upload a file (Pro) | Editor (paid) | File in the repo |
| Schema with referenced fields | Yes, in custom code | No | Yes |
| hreflang | Automatic, fixed | Automatic, can be switched off | Written by you |
| Translated slugs | Included with locales | Localize Advanced | Yes |
| RSS feed | Not built in | Premium | If you build it |
| Markdown copy per page | Automatic | No | If you build it |
"Coded site" means you or your developer build each of these, which is more control and more upkeep. dardo.studio, for example, is an Astro site that publishes llms.txt and a Markdown copy of every page because we built them. A Framer guide notes it doesn't generate RSS feeds natively, which matters if a newsletter or podcast tool reads your blog feed. For a full cost and workflow comparison, see Webflow vs Framer.
The common problems, and how to fix them
- Navigation in an overlay. Pages linked only from an overlay menu are orphans to Google. Repeat the links in the footer or in visible page content.
- A proxied site with the wrong canonical. View the source of any page; if the canonical says
.framer.website, set the custom canonical URL (Advanced Hosting) or serve the site on a connected domain. - An old
.framer.websitecopy still indexed. Searchsite:yourname.framer.website; noindex it or point it at the new domain. - No redirects on Basic. A site replacing an older one needs Pro for at least the first year of redirects.
- Renamed slugs. After renaming a page or CMS slug, check that the old path redirects; existing rules aren't updated for you.
- Deep CMS lists. Infinite scroll and long lists leave items with no crawlable link; add category pages and previous/next links.
- Untranslated locales. Fallback text under a published locale is duplicate content with hreflang attached.
Framer SEO checklist
- Custom domain connected; no live duplicate on
.framer.website. - Behind a proxy: custom canonical URL set and checked in the page source.
- Every page has its own title and description; nothing relies on the site default.
- CMS pages use
{{SEO title}}and{{SEO description}}fields and a 1200 × 630 image field. - Alt text on every meaningful image, written per locale.
- One visible H1 per breakpoint.
- No content or links that exist only in overlays.
- Utility, thank-you and duplicate pages set to noindex.
- JSON-LD in custom code, scoped to the right pages, using
| json. - Pro plan if you have old URLs; redirects tested and exported with Redirect Sync.
- Sitemap submitted in Search Console; per-locale files present on localized sites.
- robots.txt replaced only if you need it, and only with a decision on AI crawlers.
- Locales fully translated, paths translated, before they go live.
- New pages opened once after publishing so they're pre-rendered.
- Mobile INP checked in Search Console after a month; heavy effects trimmed.
What to do next
Check your site against the list, then compare Framer with other platforms for your visitors' country in the platform speed report; the Framer pricing guide has the plan and add-on costs. If you want Dardo to build or audit a Framer site, see our Framer development and technical SEO services.
Common questions
Is Framer good for SEO?
For most marketing sites, yes. Framer serves pre-rendered HTML and generates the sitemap, canonical tags, robots.txt and hreflang, and its sites pass Core Web Vitals about as often as Webflow's. It falls short when you need fine control: per-page canonicals, editable hreflang, sitemap lastmod dates or excluding single CMS items.
Can Google index a Framer site built with React?
Yes. Framer pre-renders every page to HTML on its servers, so the text and links are in the HTML before any JavaScript runs. The exception is content inside overlays, which isn't rendered on first load and which Framer says can't be made crawlable.
Does Framer have 301 redirects?
Yes, on the Pro plan and above, in Site Settings › Hosting › Redirects, with wildcards and capture groups. Framer answers with 308 status codes, which Google treats as permanent like a 301. The Basic plan has no redirects, and you can't redirect a whole domain from inside Framer.
How do I add schema markup in Framer?
Add a JSON-LD script in custom code and assign it to the pages it describes. On CMS pages, insert fields with the {{Field | json}} syntax so each item gets its own values; built-in {{Created}} and {{Updated}} dates are available. Validate the published page with Google's Rich Results Test.
Can I edit hreflang tags in Framer?
No. Framer generates the lang attribute and hreflang tags for every locale, including an x-default for the default locale, and they can't be edited in the interface. You control which locales exist, their translated paths and which pages are hidden in a locale.
Does Framer serve a Markdown version of pages for AI tools?
Yes. Framer returns Markdown when a request sends Accept: text/markdown or when ?md is added to the URL, for every optimized page. Of 21 Framer sites we tested on 21 October 2026, 20 returned Markdown; the exception was served through a proxy.
Sources & further reading
Sources behind this page, with further detail from the original publishers.
- Framer: Pricingframer.com
- Framer Help: Make your site readable by AI agentsframer.com
- Framer Help: Guide to Framer's hosting infrastructureframer.com
- Framer Help: What is Traffic-aware Pre-Rendering (TPR)?framer.com
- Framer Help: Fixing uncrawlable overlay contentframer.com
- Framer Help: Infinite scrolling and SEOframer.com
- Framer Help: Are multiple H1 tags in Framer a problem?framer.com
- Framer: Gallery (the sites we sampled on 21 October 2026)framer.com
- Webflow Help: Upload an llms.txt file to your sitehelp.webflow.com
- Framer Help: How to access your sitemapframer.com
- Google Search Central: Build and submit a sitemapdevelopers.google.com
- Framer Help: Prevent pages from being indexed by search enginesframer.com
- Framer Help: Static filesframer.com
- Framer Help: Set up a custom canonical URLframer.com
- Google Search Central: How to specify a canonical URLdevelopers.google.com
- Framer Help: How to self host using a reverse proxyframer.com
- Framer Help: How to set up redirects to maintain SEO rankingframer.com
- Google Search Central: Redirects and Google Searchdevelopers.google.com
- Framer Help: Bulk exporting and importing redirectsframer.com
- Framer Help: How to update page titles, descriptions, and social imagesframer.com
- Framer Help: Structured data through JSON-LDframer.com
- Framer Help: Adding a new localeframer.com
- Framer Help: Language attributeframer.com
- Framer Help: Localized page pathsframer.com
- Framer Help: How to exclude items from localesframer.com
- Framer Help: How does Automatic Locale workframer.com
- HTTP Archive: Technology report API, Core Web Vitals for Framer and Webflow (September 2026)cdn.httparchive.org
- HTTP Archive: Technology report API, page weight (September 2026)cdn.httparchive.org
- Framer Help: Optimizing your site for speed and performanceframer.com
- Framer Guides: Reduce SEO risk during a WordPress to Framer migrationframer.com
