Skip to content
BuildThenTestedSee packages

Vercel security: defaults, what breaks, what to check

Vercel is a hosting platform for frontend frameworks with Git-based preview and production deployments, environment variables and a firewall. Below: what it configures by default according to its own documentation (verified 2026-09-21), the 15 patterns most associated with it, the security features the vendor offers and where they stop, and a checklist you can run without buying anything.

Default protection state comes from Vercel's own knowledge-base guide and the usage page, which links a changelog entry titled Deployment Protection is now enabled by default for new projects.

Vercel hosts frontend frameworks with Git-based preview and production deployments, encrypted environment variables scoped per environment, and deployment protection that is on for non-production deployments by default. Firewall rulesets for bots are off by default.

The Vercel-specific tests are about exposure. Which preview deployments are public. Which environment variables are prefixed for the browser. Whether the production branch deploys on every push without a check. What headers the production site sends.

Vercel defaults that matter for testing

Each row is taken from the vendor's documentation on the date shown. Defaults change; the date is the claim.

Defaults of Vercel as documented by the vendor
AreaDefaultSource
Env var encryptionEnvironment variables are encrypted at rest and visible to any user with access to the project; changes apply only to new deployments. Total size is limited to 64 KB per deployment.docs · verified 2026-09-21
Sensitive env varsVariables marked Sensitive cannot be read back after creation (preview and production only) and values of 32 characters or more are redacted from build logs; owners can enforce Sensitive for all new variables.docs · verified 2026-09-21
Preview deployments public by default?Per Vercel's guide, Vercel Authentication is enabled by default for all deployments except the most recent production deployment. Deployments that are not locked down and have no custom domain are public and indexable by search engines.docs · verified 2026-09-21
Deployment protectionProtection methods are Vercel Authentication (all plans), Password Protection (Pro, $20 per project per month; not on Hobby), Passport and Trusted IPs (Enterprise). Standard Protection covers everything except production domains.docs · verified 2026-09-21
HTTPSEvery deployment is served over HTTPS with automatically generated certificates.docs · verified 2026-09-21
Framework prefixFramework environment variables such as VERCEL_URL are exposed with the framework prefix, for example NEXT_PUBLIC_VERCEL_URL for Next.js.docs · verified 2026-09-21

Documentation home: vercel.com/docs

What breaks in Vercel projects

26 patterns in the catalogue name Vercel; the most severe are listed here across secrets and keys, login and permissions, payments, ai features, deploy and config. Attribution is descriptive: the default stack makes the pattern reachable, or a public incident names it.

  • NEXT_PUBLIC_ prefix on a secretSecrets and keys

    The build writes the secret's value into public JavaScript, so anyone who loads the site can read it, and a redeploy with the same variable name republishes it.

    Critical
  • Secrets committed to the code repositorySecrets and keys

    Everyone who can see the repository, now or later, holds working keys to the database, payment account and model provider, and the keys stay in history after the file is deleted.

    Critical
  • Service-role key shipped in the browser bundleSecrets and keys

    Anyone who opens the app can copy the key from the downloaded JavaScript and read, change or delete every row in every table.

    Critical
  • Admin routes without any login checkLogin and permissions

    A stranger who types /admin or /api/admin into the address bar can see or change everything the owner can.

    Critical
  • Authorization enforced only in the browserLogin and permissions

    Anyone who calls the API directly, or edits the page in developer tools, gets the data and actions the screen was hiding.

    Critical
  • Stripe webhook accepted without signature verificationPayments

    Anyone who finds the webhook URL can post a made-up payment-succeeded event and get an order fulfilled or a plan activated for a user of their choosing, without paying.

    Critical
  • LLM API key exposed to the clientAI features

    Anyone who views the page source can copy the key and run their own workloads on your account until the bill or the provider stops them.

    Critical
  • No output validation before actionsAI features

    Whoever can influence the model's input can delete tables, email your whole customer list, or trigger any other action the app has wired up.

    Critical
  • AI agent with production credentialsDeploy and config

    Anything the agent decides to run, or is tricked into running by text it reads, executes with the same power you have, including dropping tables or moving money.

    Critical
  • Third-party API key in the JavaScript bundleSecrets and keys

    Anyone who views the page source can take the key and run up charges, send messages or pull data on your account until the key is revoked.

    High
  • Secrets and internals in error messages and logsSecrets and keys

    Keys, session tokens and database connection strings end up in log files and in HTTP responses that anyone can trigger, which hands out credentials and a map of the system's internals.

    High
  • Password reset links that never expireLogin and permissions

    An old reset email found in a shared inbox, a forwarded thread or a breached mailbox lets someone take over the account months later.

    High
  • Sessions that survive logout and password changesLogin and permissions

    Someone who once had a user's token, on a shared computer or through a leak, keeps access after the user logs out or changes their password.

    High
  • Stripe test keys in productionPayments

    Customers can pay with Stripe's published test card numbers, the app fulfils the order, and no money ever reaches your account.

    High
  • No spend cap on model callsAI features

    A script can hit the route in a loop overnight and the bill lands on your card, or the provider pauses your account mid-day when its own cap trips and every user sees errors.

    High

Public incidents

Two days after announcing a SaaS built with Cursor and no hand-written code, its founder reported subscription bypasses, maxed-out API keys and unwanted database writes; he shut the app down three days later.

  • 2025-03-15 Launch announcement
  • 2025-03-17 Report of subscription bypass and API key abuse
  • 2025-03-20 Shutdown announcement

Mar 2025 · Leo (Enrichlead founder) · all sources

Lovable reported that from 3 February to 20 April 2026 a backend regression let any logged-in Lovable user read the chat history and source code of public projects; a fix shipped within two hours.

  • 2026-02-03 to 2026-04-20 Exposure window
  • 2026-02-22 First HackerOne report
  • about 2 hours Time from public report to fix

Apr 2026 · Lovable · all sources

On the Base44 app builder, undocumented registration and one-time-password endpoints accepted a non-secret app_id, so anyone could create a verified account on a private app; Wix fixed it within 24 hours.

  • 2025-07-09 Reported to Wix
  • 2025-07-10 Fix verified
  • under 24 hours Time to fix
  • 2025-07-29 Public disclosure

Jul 2025 · Wiz Research · all sources

In July 2025 a Replit agent deleted data from a production database during a user-declared code freeze; Replit's CEO confirmed it, said backups allowed a restore, and announced automatic dev and production database separation.

  • 2025-07-18 User's report on X
  • 2025-07-20 Replit CEO confirmation on X

Jul 2025 · Jason Lemkin (SaaStr) · all sources

Each entry links to its primary source in the evidence list. What to do about it is the self-check below.

Vercel's own security features, and where they stop

Stated from the vendor's documentation. The limits are the vendor's scope statements, not judgements.

  • Deployment Protection

    Vercel Authentication, Standard Protection and All Deployments scopes are included on Hobby, Pro and Enterprise; access requests, shareable links and protection bypass for automation are documented.

    Where it stops: Disabling Vercel Authentication unprotects all existing deployments; shareable links and the automation bypass header skip the check; Password Protection is not available on Hobby.

    vendor docs · verified 2026-09-21

  • Platform-wide firewall (DDoS mitigation)

    Automated DDoS mitigation for all deployments on every plan, with no configuration required.

    Where it stops: Application-level rules need the WAF; the platform layer blocks abnormal traffic volumes rather than logic flaws in your app.

    vendor docs · verified 2026-09-21

  • Vercel WAF

    Custom rules, IP blocking, Attack Mode and managed rulesets (OWASP Core Ruleset, Bot Protection, AI Bots) configured per project.

    Where it stops: Bot Protection and AI Bots rulesets are inactive by default; OWASP rules must be enabled and can run in Log mode first.

    vendor docs · verified 2026-09-21

  • Sensitive environment variables

    Non-readable values after creation, build log redaction and a team policy to make new variables sensitive.

    Where it stops: Not available for the Development environment; redaction applies to values of 32 characters or longer.

    vendor docs · verified 2026-09-21

Check it yourself, in this order

The critical patterns first. Each uses the dashboard and your browser.

NEXT_PUBLIC_ prefix on a secret

  1. In your hosting dashboard (Vercel: Project, Settings, Environment Variables) or your .env files, list every variable whose name starts with NEXT_PUBLIC_.
  2. For each one, ask whether the provider calls that value secret, private, server or admin. Stripe secret keys, model provider keys, database passwords and Supabase service_role keys all fall in that group.
  3. Open the live site in Chrome, right-click, choose Inspect, open the Sources tab and press Ctrl+Shift+F. Search for the first few characters of each suspect value.
  4. A bad result is a NEXT_PUBLIC_ variable holding a server-only key, or a search hit for that key's value in a loaded script.

Secrets committed to the code repository

  1. Open your project on GitHub (or the code view in your builder) and look at the file list for .env, .env.local, .env.production, serviceAccountKey.json or firebase-adminsdk files.
  2. Use the repository search box and search for sk_live, sk-, service_role, BEGIN PRIVATE KEY and password=.
  3. If you have the code on your computer, run one command in the project folder: git log --all -p -S sk_live -- . | head. Any output means a live key has been committed at some point.
  4. On GitHub, open Settings, then Code security, and check whether Secret scanning shows alerts.
  5. A bad result is any env or key file in the file list, any search hit that shows a real key, or an open secret scanning alert.

Service-role key shipped in the browser bundle

  1. Open your live app in Chrome, right-click anywhere and choose Inspect, then open the Sources tab.
  2. Press Ctrl+Shift+F (Cmd+Option+F on a Mac) to search every loaded file. Search for service_role and then for sb_secret_.
  3. Open the Network tab, reload the page, click any request whose address contains supabase.co, and read the apikey header under Request Headers.
  4. In the Supabase dashboard, open Project Settings, then API Keys, and compare that header value with your keys.
  5. A bad result is any search hit, or a header value that matches the service_role or secret key rather than the anon or publishable key.

Vercel pre-launch checklist

26 checks, in the order we run them. Usable without buying anything.

Self-check tool

Answer questions about your setup and get the patterns that apply, ordered by severity. Runs in your browser; nothing is sent.

Run the self-check

Packages for Vercel projects

Pre-launch check

Start here

For founders about to let real users in.

$490

Report in 48 hours
  • Keys and secrets in the browser or repo
  • Who can read and change whose data
  • Login, roles and admin routes
  • Errors, retries and rate limits
  • Debug mode, headers, deploy path

What you receive

Security sweep

For anyone who wants the three riskiest areas checked fast.

$290

Report in 24 hours
  • API keys and secrets in the bundle
  • Row-level rules on every table
  • Cross-user data reads
  • Admin and hidden routes
  • Client-only permission checks

What you receive

All packages and prices. Every report includes a re-check after your fixes.

Questions about Vercel

vercel deployment security

Check deployment protection for previews, environment variable scoping (Development, Preview, Production), the production branch's checks before deploy, and response headers. Vercel's Firewall and WAF rules are available; bot protection is off until enabled.

vercel env variables exposed

Only variables your framework exposes to the browser (NEXT_PUBLIC_ for Next.js, VITE_ for Vite, EXPO_PUBLIC_ for Expo) reach the bundle. Open the deployed JavaScript and search for the values of your secrets; nothing should match.

are vercel preview deployments public

Vercel's guide states that Vercel Authentication is on for all deployments except the latest production one by default, so previews require a Vercel login. Confirm the setting in Project Settings and test a preview URL from a private window.