Netlify: env vars not loading in functions [2026 fix]
Env vars undefined in Netlify functions? Deploy netlify.toml with [functions] context or use process.env after build step.
Netlify: env vars not loading in functions [2026 fix]
TL;DR
Cause: Environment variables aren't being passed to serverless functions because netlify.toml lacks a [functions] configuration block or variables aren't set in the correct Netlify UI context.
Fix: Add [functions] section to netlify.toml with node_bundler = "esbuild" and redeploy, OR ensure env vars are set in Netlify UI under Site settings > Build & deploy > Environment (not just local .env).
---
Exact Error Messages
You'll likely see one of these in your function logs:
``` TypeError: Cannot read property 'STRIPE_API_KEY' of undefined ```
``` ReferenceError: process is not defined ```
``` [Functions] Error: SUPABASE_URL is undefined when calling database ```
``` Error: process.env.DATABASE_PASSWORD returned null - connection failed ```
``` 2am alert: Function invoked but returned {error: "API_KEY not found"} ```
---
The Problem: Before vs After
❌ BROKEN CODE
netlify/functions/api.js
```javascript
exports.handler = async (event) => {
const apiKey = process.env.STRIPE_API_KEY;
const dbUrl = process.env.DATABASE_URL;
console.log('Keys:', apiKey, dbUrl); // logs: undefined, undefined
return {
statusCode: 500,
body: JSON.stringify({ error: 'Missing env vars' })
};
};
```
netlify.toml (missing config)
```toml
[build]
command = "npm run build"
publish = "dist"
```
✅ FIXED CODE
netlify.toml (COMPLETE)
```toml
[build]
command = "npm run build"
publish = "dist"
[functions] node_bundler = "esbuild" directory = "netlify/functions"
[[redirects]] from = "/api/*" to = "/.netlify/functions/:splat" status = 200 ```
netlify/functions/api.js (unchanged, but now works)
```javascript
exports.handler = async (event) => {
const apiKey = process.env.STRIPE_API_KEY;
const dbUrl = process.env.DATABASE_URL;
console.log('Keys loaded:', apiKey.substring(0, 8) + '...'); // works!
return {
statusCode: 200,
body: JSON.stringify({ success: true })
};
};
```
Then in Netlify UI:
1. Go to Site settings > Build & deploy > Environment
2. Click Add environment variables
3. Set STRIPE_API_KEY=sk_live_... and DATABASE_URL=postgres://...
4. Redeploy (git push or "Deploy site" button)
---
Why This Happens
Netlify doesn't automatically inject env vars into function bundles unless you:
1. Define the functions directory in [functions] block
2. Set env vars in Netlify UI (local .env files never reach production)
3. Trigger a redeploy after adding env vars
4. Use the correct bundler (esbuild is recommended for Node 18+)
Note on version specificity: We're assuming Netlify Functions Node 18.x (default as of 2025-2026). If using Node 16 or earlier, node_bundler defaults to esbuild but you should specify it anyway. We're uncertain if this behavior changes with Netlify's 2026 runtime updates—check their [official functions docs](https://docs.netlify.com/functions/overview/) for the latest.
---
Verification Checklist
netlify.toml contains [functions] sectiondirectory in [functions] matches your file structure (default: netlify/functions).env.local)netlify/functions/*.js.env file (confirms code logic)---
Still broken? Check these too
1. [Netlify build context mismatch](/?guide=netlify-contexts) — You set env vars for production but deployed to preview branch. Set vars for all contexts you use.
2. [ESBuild bundler stripping process.env](/?guide=esbuild-env-stripping) — If using dynamic env var access (process.env[key]), esbuild may tree-shake it. Use explicit strings: process.env.SPECIFIC_KEY.
3. Function cold starts + stale cache — Clear Netlify's deploy cache: Site settings > Danger zone > Clear site cache, then redeploy.
---
Testing in Production
After deploying, test immediately:
```bash curl https://your-site.netlify.app/.netlify/functions/api ```
Check Functions > Logs in Netlify UI for real output. Don't rely on local testing—env injection is Netlify-specific.
---
Official Resources
---
Found a different variation? Drop it in the comments—especially if you're hitting this on Netlify's Edge Functions or with specific frameworks like Next.js/Remix.