2026-03-11 | PreviewProof Team
Frontend Previews vs. Full-Stack Preview Environments: What Actually Gets Tested?
Vercel, Netlify, and Cloudflare Pages generate a preview URL for every branch you push. They build your frontend and serve it at a unique URL. For a large class of applications — marketing sites, documentation, single-page apps backed by a stable API — this is a genuine workflow improvement. But as applications grow to include backend services, databases, and background workers, these previews cover a shrinking percentage of what actually changed in a given branch. Full-stack preview environments take a different architectural approach, and the tradeoffs between the two are worth understanding concretely.
How Frontend Previews Work and Where They Stop
Vercel, Netlify, and Cloudflare Pages all follow the same pattern: connect a repository, define a build command, and the platform compiles your source and deploys the output. Vercel runs next build. Netlify runs whatever you put in netlify.toml. Cloudflare Pages runs your specified build command in their environment.
This model is tightly coupled to the platform. Your build runs on their infrastructure, in their build environment, with their installed runtimes. That creates three specific constraints:
Build environment parity. Your CI may build with Node 22 and a specific set of native dependencies. The preview builds with whatever the platform’s environment provides. When these diverge — especially with native modules like sharp or bcrypt — the preview artifact is not the same artifact your CI produced.
Duplicated secret management. Builds that pull from private registries or require build-time API keys need those credentials configured in both your CI system and the platform’s build settings. This is a second source of truth for the same configuration.
Frontend-only scope. If your branch includes a new API endpoint, a database migration, or a changed background job, the preview doesn’t include any of that. The frontend either talks to your production API, a shared staging environment, or nothing at all.
For teams where the frontend is the product — a static site, a docs site, a JAMstack app hitting third-party APIs — none of these constraints matter much. For teams where a feature spans frontend and backend, every one of them affects what the preview can tell you.
How Container-Based Preview Environments Work Differently
The alternative architecture separates the build from the preview entirely. Your CI pipeline builds container images the way it already does, and the preview platform runs those images. It never sees your source code. It never runs your build.
# Your existing CI builds and pushes images as usual.# A single step at the end hands them to the preview platform.- name: Deploy Preview uses: previewproof/deploy@v1 with: services: web: image: ghcr.io/${{ github.repository }}/web:${{ github.sha }} port: 3000 api: image: ghcr.io/${{ github.repository }}/api:${{ github.sha }} port: 8080 db: image: postgres:16 env: POSTGRES_DB: appThe preview environment runs the same images your CI produced. There’s no second build to maintain. The frontend talks to the API from the same branch, backed by a database with the correct schema. The preview represents the full state of the branch, not just the frontend slice.
The tradeoff is complexity. Frontend previews from Vercel or Netlify require almost zero configuration — connect a repo and you’re done. Container-based previews require your application to be containerized, your CI to build and push images, and a platform to orchestrate them. For teams already building Docker images in CI, the incremental cost is small. For teams that aren’t, it’s a meaningful infrastructure change.
What Each Approach Means for Build Pipelines
Frontend previews own your build. That’s a feature when it means zero configuration, and a constraint when your build doesn’t fit the platform’s model. Multi-stage builds, monorepo setups, and builds that depend on generated code from other services all require platform-specific workarounds — or they don’t get previewed.
Container-based previews don’t touch your build. Your Dockerfile is the interface. Whatever builds and runs in Docker builds and runs in the preview. This means your CI pipeline remains the single source of truth for how your software is compiled, and you don’t maintain a parallel build configuration in a hosting platform.
The practical question is where your build complexity lives. If your frontend builds with a single npm run build and has no backend dependencies, Vercel and Netlify previews are the simpler path. If your build involves private registries, Nix, multi-stage images, or generated types from other services, duplicating that in a hosting platform’s build system is work you’re doing twice.
Who the Preview Is For Determines Which Approach Matters
A frontend preview is primarily useful to the developer who made the change and the engineer reviewing the PR. They know what the backend is supposed to do and can mentally fill in the gaps.
A full-stack preview environment is useful to a wider group — the PM verifying the feature end-to-end, the designer checking behavior with real API responses, the QA engineer testing the complete flow. When the preview includes the backend, reviewers don’t need to simulate what the API will return once the migration runs. They click through the feature and it either works or it doesn’t.
This is where tools like PreviewProof add a layer on top of the running environment — structured testing checklists and approval workflows attached to each preview, so sign-off is tracked rather than assumed.
Neither approach is universally better. Frontend previews are faster to set up and sufficient for frontend-only applications. Full-stack preview environments cover more of what changed but require containerized infrastructure and seed data. The right choice depends on what your application looks like and who needs to test it before it ships.