Back to Blog
Tutorial9 min read2026-07-05

How to Migrate from Netlify to PandaStack

Move your Netlify static sites, redirects, environment variables, and serverless functions to PandaStack — with a clear mapping of Netlify features to their PandaStack equivalents and the gotchas to watch for.

Ajay Kumar
Ajay Kumar
Founder & DevOps, PandaStack

Netlify nailed the static-site developer experience: connect a repo, get atomic deploys and a global CDN. If you're migrating, it's usually because you also need first-class backend containers, managed databases, and unified pricing in one platform. This guide maps Netlify concepts to PandaStack and walks the cutover.

Feature mapping

NetlifyPandaStackNotes
Static site deploysStatic siteAuto-detected framework + build
netlify.toml build configBuild settings (UI + auto-detect)Manual translation
Redirects (_redirects)Routing / SPA fallbackRe-express rules
Environment variablesEnv varsSet per service
Netlify FunctionsEdge functions / container appDepends on the function
Forms / Identity / large mediaBring your ownNo 1:1 mapping
Custom domains + SSLCustom domains + automatic SSLAuto-issued

The static-site and env-var parts are quick. Functions and Netlify-specific add-ons (Forms, Identity) need a plan.

Step 1: Connect the repo and deploy the static site

PandaStack auto-detects most frameworks — React/Vite, Next (export), Astro, Gatsby, Eleventy, VitePress, Hugo, plain HTML — and runs the build in a pandastack.ai microVM.

  1. 1Connect your Git repo in the dashboard.
  2. 2Verify the detected build command and publish directory.
  3. 3If you used a non-default package manager, set the install command (npm/yarn/pnpm/bun are supported).

Translate your netlify.toml build block by hand. For example:

# netlify.toml
[build]
  command = "npm run build"
  publish = "dist"

becomes a build command of npm run build and an output directory of dist in the PandaStack settings.

Step 2: Re-express redirects

Netlify's _redirects / [[redirects]] rules are platform-specific. The most common one is the SPA catch-all:

# Netlify _redirects
/*  /index.html  200

On PandaStack, enable single-page-app fallback so unknown routes serve index.html. For genuine HTTP redirects (301/302) and proxy rewrites, re-express them in your routing configuration. Audit every rule — proxy rewrites to external APIs especially, since those change how requests flow.

Step 3: Migrate environment variables

Export your Netlify env vars (Site settings → Environment) and recreate them in PandaStack per service. Two reminders:

  • Build-time vs runtime. Static-site env vars are usually inlined at build time (e.g. VITE_*, NEXT_PUBLIC_*). Setting them only at runtime won't help a static build — they must be present when the build runs.
  • Don't commit secrets. Keep them in the dashboard, not the repo.

Step 4: Handle Netlify Functions

Triage each function:

  • Lightweight HTTP handlers → PandaStack edge functions (Node.js, Python, Go).
  • Anything stateful, long-running, or framework-based → a container app.

Netlify Functions have a specific handler signature (exports.handler = async (event, context) => {...}). You'll adapt that to your target runtime's request/response shape. If you have many small functions, consider consolidating them into a single small container running a minimal HTTP framework — fewer moving parts, easier local development.

Step 5: Add a database (if you didn't have one)

A frequent reason to leave a static-first host is needing a real backend. On PandaStack you can provision a managed PostgreSQL, MySQL, MongoDB, or Redis, and when you attach it to a container app the DATABASE_URL is injected automatically. Your frontend keeps deploying as a static site; your new backend container talks to the database.

Step 6: Features without a 1:1 mapping

Be upfront about these:

  • Netlify Forms — replace with a small form-handler edge function or container endpoint writing to your database.
  • Netlify Identity — replace with your own auth (container app or third-party integration).
  • Large Media / image CDN — use object storage plus your own transform step.

These are the items that turn a half-day migration into a two-day one. Scope them explicitly.

Step 7: Cutover

  1. 1Deploy on a PandaStack staging domain and click through the site.
  2. 2Verify redirects, 404 handling, and any function endpoints.
  3. 3Confirm build-time env vars produced the right output (check the rendered HTML/JS).
  4. 4Switch DNS; automatic SSL provisions for your custom domain.
  5. 5Keep the Netlify deploy live briefly as a fallback.

What you keep, what you gain

You keep git-push deploys, atomic-style deployments with rollbacks and deploy history, a CDN-backed static experience, custom domains, and automatic SSL. You gain the ability to run real backend containers, managed databases auto-wired into your app, cronjobs, server-side metrics and analytics (no client SDK), and one bill for the whole stack.

Netlify remains excellent at what it does — particularly its build plugin ecosystem and preview deploys. If your app is purely static and you rely heavily on Netlify-specific add-ons, weigh the move carefully. If you're growing into a backend, consolidation is the win.

References

  • [Netlify redirects and rewrites](https://docs.netlify.com/routing/redirects/)
  • [Netlify build configuration (netlify.toml)](https://docs.netlify.com/configure-builds/file-based-configuration/)
  • [Netlify Functions](https://docs.netlify.com/functions/overview/)
  • [Vite env variables](https://vitejs.dev/guide/env-and-mode.html)
  • [Let's Encrypt (automatic SSL)](https://letsencrypt.org/how-it-works/)

---

PandaStack's free tier includes 5 static sites, 5 web services, a database, and edge functions — enough to migrate and validate before you flip DNS. Connect your repo at [dashboard.pandastack.io](https://dashboard.pandastack.io).

Ready to deploy?

Start free on PandaStack.

Start free on PandaStack

More in Tutorial

Browse all Tutorial articles →

See also