Webflow Exporter logo
Webflow → Next.js

Migrate Webflow to Next.js

Most teams moving off Webflow end up on Next.js — it's the place where the marketing site, the app, and the docs can finally live in one repo. The hard part isn't the framework; it's getting your Webflow pages and CMS out of Webflow in a shape the App Router can read. That's what Webflow Export is for.
Export for Next.jsNo paid Webflow plan required

The migration in three pieces

A Webflow → Next.js move splits cleanly into three pieces:

  1. Static pages— Home, About, Pricing, etc. These are easy: rebuild as React components, or paste the exported HTML inside a Next.js page if you're in a hurry.
  2. CMS collections — Blog posts, case studies, docs. These are the awkward part, because Webflow stores them as records and Next.js wants files. The export bridges that.
  3. Assets and SEO plumbing — Images, sitemap.xml, robots.txt, redirects. Mostly mechanical.

From Webflow to a running Next.js site

  1. 1

    Export the site

    Paste your Webflow API token into Webflow Export, scan, then download. You'll get a ZIP with rendered HTML, every CMS collection as Markdown / MDX / JSON, and every asset.

  2. 2

    Spin up a Next.js project

    npx create-next-app@latest my-site, App Router, TypeScript, Tailwind. Doesn't matter what design system you use — what matters is the directory shape.

  3. 3

    Drop in the CMS content

    Move each collection folder from the export into src/content/. Move the assets/ folder into public/ so the relative paths still resolve. The exported Markdown is already shaped to be read by @next/mdx, Contentlayer, or your own loader.

  4. 4

    Wire MDX with the App Router

    Use @next/mdx with pageExtensions: ["ts", "tsx", "mdx"]. For collections, write a tiny loader:

    // src/lib/posts.ts
    import { readdirSync } from "node:fs";
    
    export function getPostSlugs() {
      return readdirSync("src/content/blog-posts")
        .filter((f) => f.endsWith(".mdx"))
        .map((f) => f.replace(/\.mdx$/, ""));
    }
    
    export async function getPost(slug: string) {
      const mod = await import(`@/content/blog-posts/${slug}.mdx`);
      return { ...mod.metadata, default: mod.default };
    }

    Then generateStaticParams over getPostSlugs() and you have a working blog with statically generated pages.

  5. 5

    Rebuild static pages as React

    Pages without CMS data are the fastest to rebuild. The exported HTML is a useful reference for layout, classes, and copy, but you'll usually rewrite them as React components so they participate in your component library and design tokens.

  6. 6

    Carry over the SEO plumbing

    Add a sitemap.ts that walks getPostSlugs(), a robots.ts, and a redirects block in next.config.ts for any URLs that changed shape during the move.

  7. 7

    Deploy to Vercel

    vercel --prod. With static content and ISR, the site is faster than the Webflow original and free on the Hobby tier (or Pro if you're commercial). See where to host an exported Webflow site for the alternatives.

What survives, what you rebuild

LayerFrom the exportEffort to integrate
Static pages (HTML)Rendered HTML per routeReference for rebuild; not the final shape
CMS collectionsFolder of .md + .mdx + .jsonDrop into src/content/
CMS rich textClean Markdown / MDXReads via @next/mdx
CMS reference fieldsSlug arrays in front-matterResolve at build time
AssetsAll images, fonts, filesMove to /public
Webflow interactions (JS)webflow.js bundled in static exportReplace with Framer Motion or CSS
Form handlersNot exportedServer action / API route
Sitemap & robotsExported, but for old domainRegenerate via sitemap.ts

Performance changes you’ll feel

Static Webflow pages serve fast, but the moment you have a real CMS — image-heavy blog posts, dynamic collection lists — you start paying for it: every page needs Webflow's renderer, and image transforms run through Webflow's CDN. The Next.js equivalent is the same content built into static HTML at deploy time, with next/image handling responsive variants against your own asset folder.

On the sites we've helped migrate, LCP improvements of 30–50% are common, mostly from removing Webflow's runtime CSS injection and from next/imagebeing more aggressive about modern formats and sizes than Webflow's CDN.

FAQ — Webflow to Next.js

Do I have to use MDX for the CMS content?

No. The export gives you JSON, Markdown, and MDX side-by-side. If you want to keep content out of MDX, read the JSON in a Server Component and render with plain HTML or a Markdown renderer.

How do I handle reference fields like 'Author' on blog posts?

Reference fields export as slugs. At build time, read the referenced collection into a Map keyed by slug and resolve. Typically a one-line lookup per post.

Can I keep Webflow as the editor and just rebuild the frontend?

Yes — many teams do this. Re-run the export on a schedule (or via webhook) and rebuild the Next.js site. You get a faster frontend without retraining the marketing team. We sometimes call this the “Webflow as headless CMS” pattern.

What about Webflow Interactions — animations, scroll triggers?

The export includes Webflow's JS bundle, but if you're rebuilding as React you'll usually rewrite interactions using Framer Motion, GSAP, or CSS — both because they integrate better and because you don't want a runtime dependency on Webflow's animation engine.

What's the fastest way to migrate just the blog?

Export the site, copy the blog-posts/ folder from the export into src/content/, set up a [slug]/page.tsx route with dynamic import of the MDX file, generateStaticParams over the slugs. About 30 minutes of setup.

Ready to try it?

Paste a Webflow API token, scan the site for free, and only pay when you download. Every page, asset, and CMS item is included.

Related

Last updated May 19, 2026