Deploy a converted Framer site to Vercel, Netlify, Cloudflare or Fly.io

Deploy a Framer site converted to Next.js on Vercel, Netlify, Cloudflare Workers or Fly.io, set form webhooks and switch your domain safely.

Published
Reading time
5 min
Deframer cover: “Ship anywhere. Pick your host.” Beside it, a list of Vercel, Netlify, Cloudflare and Fly.io with Cloudflare selected
On this page8 sections

A Framer site converted with Deframer is a standard Next.js 16 App Router project in TypeScript, so you deploy it like any other Next.js app. On Vercel and Netlify, you connect a Git repository or use their CLIs; on Cloudflare Workers, you add the @opennextjs/cloudflare adapter; on Fly.io, you add a Dockerfile and run fly launch. Whichever host you choose, set the form webhook environment variables, update metadataBase to your production domain, and test before moving DNS.

Before you deploy anywhere

Do these once, locally, whatever host you pick.

  1. Use Node.js 20.9 or later. Next.js 16 requires it, and your host should run the same major version you test with.
  2. Install and build. A clean production build catches most problems before a host does.
sh
   npm install
   npm run build
   npm start
  1. Put the project in Git. npm install creates a package-lock.json; commit it so every host installs the same versions. The project's .gitignore already excludes node_modules, .next and .env*.local.
  2. Collect your environment variables. If the site has forms, .env.example lists FORMS_WEBHOOK_URL (receives every form's submissions) and one FORMS_<NAME>_WEBHOOK_URL per form. Without them, submissions are only logged by the server. Details are in forms after leaving Framer.

Deframer doesn't deploy for you or connect to your Git provider. You download the .zip, and from there the project is yours to host.

Vercel

Vercel builds Next.js projects without extra configuration.

From the dashboard

  1. Push the project to a Git repository.
  2. In Vercel, create a new project and import the repository. The framework is detected as Next.js.
  3. Add your FORMS_… variables under the project's environment variables.
  4. Deploy. Each push to a branch gets a preview deployment.

From the CLI

sh
npm i -g vercel
vercel            # creates a preview deployment
vercel env add FORMS_WEBHOOK_URL
vercel --prod     # deploys to production

Netlify

Netlify detects Next.js and applies its Next.js runtime automatically. You can add a netlify.toml to make the build explicit. This is a new file you add at the project root:

toml
[build]
  command = "npm run build"
  publish = ".next"

[build.environment]
  NODE_VERSION = "22"

Then either connect the repository in the Netlify dashboard or use the CLI:

sh
npm i -g netlify-cli
netlify init
netlify env:set FORMS_WEBHOOK_URL https://hooks.example.com/your-endpoint
netlify deploy --build --prod

Check Netlify's docs for the current Next.js support, including how it handles src/proxy.ts, which the project uses for URL forms and 404s.

Cloudflare Workers

Cloudflare runs Next.js through the OpenNext adapter, @opennextjs/cloudflare. Install it and Wrangler:

sh
npm install @opennextjs/cloudflare
npm install --save-dev wrangler

The adapter needs a Wrangler configuration file and an OpenNext config at the project root. These are new files you add; follow the adapter's getting-started guide for their current contents, including the Node.js compatibility flag. Then build and deploy:

sh
npx opennextjs-cloudflare build
npx opennextjs-cloudflare deploy

Set form webhooks as secrets:

sh
npx wrangler secret put FORMS_WEBHOOK_URL

Before relying on it in production, confirm in the adapter's docs that the version you install supports Next.js 16 and proxy.ts, and test every route, including unknown URLs that should return the 404 page.

Fly.io

Fly.io runs containers, so the project runs with next start exactly as it does locally. Add a Dockerfile at the project root (a new file):

dockerfile
FROM node:22-slim AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:22-slim
WORKDIR /app
ENV NODE_ENV=production
COPY --from=build /app ./
EXPOSE 3000
CMD ["npm", "start"]

Add a .dockerignore (also new) with node_modules, .next and .env*.local so local files don't end up in the image. Then:

sh
fly launch        # creates the app and a fly.toml; use port 3000
fly secrets set FORMS_WEBHOOK_URL=https://hooks.example.com/your-endpoint
fly deploy

The same Dockerfile works on any container host or your own server.

Forms on serverless hosts

Each form posts to its own route, src/app/api/forms/<name>/route.ts, which uses src/lib/forms.ts for validation, a honeypot spam filter and a per-IP rate limit. That rate limit is kept in memory. On a single long-running server, such as one Fly.io machine, it behaves as one counter. On serverless platforms, where requests may be served by several instances, each instance keeps its own count. If spam becomes a problem, you can replace it with a shared store or your host's own protection.

After deploying, submit each form once on the live URL and confirm the webhook receives the JSON.

Domain switch checklist

Moving your domain from Framer to the new host is the step that affects visitors and search engines. Work through this before and after the DNS change.

  1. Update metadataBase. The root layout, src/app/layout.tsx, sets it to the site's published URL. Change it to your production domain:
tsx
   export const metadata: Metadata = {
     metadataBase: new URL("https://www.example.com"),
     // …
   };

Canonical URLs and relative social images resolve against it. This matters even more if you included assets locally, because social images then become relative paths.

  1. Update public/robots.txt and public/sitemap.xml. They're copied as the site publishes them, so they still name the old domain if it changed.
  2. Check redirects. Redirects set in Framer's site settings are carried into next.config.ts with the same status codes, unless a notice says one wasn't carried over. Test a few.
  3. Deploy and test on the host's preview URL. Check every route in the README's routes table at desktop, tablet and phone widths.
  4. Add the domain on your new host and follow its DNS instructions. Then follow Framer's docs to disconnect the domain from your Framer project.
  5. Re-test on the real domain: HTTPS, forms, canonical tags and social previews.
  6. Resubmit your sitemap in Google Search Console. The SEO side of the move is covered in SEO when moving off Framer.

If you kept assets on Framer's CDN, images, fonts and videos still load from there after the move. To serve them from your own host instead, convert again with "Include assets locally" on; the trade-offs are in Framer fonts and assets, CDN vs. local.

FAQ

Which host is best for a converted Framer site?

Any host that runs Next.js 16 will work. Vercel and Netlify need the least setup, Cloudflare needs the OpenNext adapter, and Fly.io or your own server need a Dockerfile.

Do I need to change the code to deploy?

Usually not. You add host configuration files where a host needs them, set environment variables, and update metadataBase and the domain in robots.txt and sitemap.xml if the domain changes.

Can Deframer deploy the site for me?

No. Deframer gives you a .zip of the project, and you deploy it with the host of your choice. See the FAQ for what's included.

What happens to my Framer site after I deploy?

Nothing changes in your Framer account. Deframer only reads the published site, so your Framer project stays as it is until you decide what to do with it.

Keep reading

All posts
  • Deframer cover: “Your site. Your boundary.” Beside it, a list of Publish a tag, Verify ownership and Protection active with Protection active selected

    Security6 min read

    Protect a site with Deframer

    Activate Deframer protection for 10 credits once, install the inline deterrent, and configure Cloudflare with DNS proof and free coverage checks.

  • Deframer cover: “No export? Four ways out.” Beside it, four tiles, Rebuild, Snapshot, Converter and Reverse proxy, with Converter selected

    Export6 min read

    Can you export code from Framer?

    Framer has no code export. Here are the four real routes to your site's code (rebuild, HTML snapshot, converter, reverse proxy) and how to pick one.