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 fallbacks. One-line fix inside.
Netlify: env vars not loading in functions [2026 fix]
TL;DR
Cause: Yournetlify.toml missing [functions] build context or environment variables not deployed to the Functions runtime environment.
Fix: Add explicit environment variable declaration in netlify.toml under [functions] section and redeploy.---
Real Console Error Messages
``` 1. TypeError: Cannot read property 'API_KEY' of undefined at Object.<anonymous> (/var/task/functions/api.js:5:23)
2. ReferenceError: process is not defined at eval (webpack:///./functions/handler.js?:12:15)
3. Error: STRIPE_SECRET_KEY is not defined in function context at Handler (/var/task/functions/payment.js:8:4)
4. undefined === process.env.DATABASE_URL at runtime Function executed successfully. Returned: null
5. [Functions] No environment variables found. Check Netlify UI configuration. Deployment succeeded but runtime shows empty env object. ```
---
Broken Code vs. Fixed Code
Problem #1: Missing netlify.toml Function Context
BROKEN: ```toml
netlify.toml (incomplete)
[build] command = "npm run build" functions = "functions"Environment vars set in UI only - NOT passed to functions!
```FIXED: ```toml
netlify.toml (correct)
[build] command = "npm run build" functions = "functions"Explicitly declare env vars for function runtime
[functions] node_bundler = "esbuild"Pass environment variables to functions
[[env.production.context.function_context]] API_KEY = "your-key" DATABASE_URL = "postgres://..."OR use environment variable references:
[env.production] API_KEY = "$API_KEY" DATABASE_URL = "$DATABASE_URL" ```Problem #2: Using process.env in Browser Context
BROKEN: ```javascript // functions/api.js exports.handler = async (event) => { const apiKey = process.env.API_KEY; // undefined - env vars not available return { statusCode: 200, body: JSON.stringify({ key: apiKey }) }; }; ```
FIXED: ```javascript // functions/api.js exports.handler = async (event) => { // Explicitly destructure with fallback const apiKey = process.env.API_KEY || ''; if (!apiKey) { return { statusCode: 500, body: JSON.stringify({ error: 'API_KEY not configured' }) }; } return { statusCode: 200, body: JSON.stringify({ key: apiKey }) }; }; ```
Problem #3: Missing Environment Variables in Netlify UI
BROKEN: ``` // netlify.toml has references but Netlify UI has no values set api_key = "$API_KEY" // $API_KEY not defined in Site settings ```
FIXED: ``` 1. Go to Netlify Dashboard → Site → Build & Deploy → Environment 2. Add each variable: - Key: "API_KEY" - Value: "your-actual-key" 3. Click "Save" (triggers automatic redeploy) 4. Redeploy explicitly to ensure functions receive new vars ```
---
Version Note
⚠️ This behavior is consistent in Netlify 2024-2026. However, Netlify occasionally updates their environment variable handling between major platform versions. If you're on a beta or experimental feature, behavior may differ. Check [Netlify Functions Documentation](https://docs.netlify.com/functions/overview/?utm_source=stillnotathing) for your deployment date.
---
Verification Steps
1. Check deployed function logs: ```bash netlify functions:invoke myfunction --querystring "debug=true" ```
2. Add debug logging to your function: ```javascript console.log('Available env vars:', Object.keys(process.env).filter(k => k.includes('API'))); ```
3. Verify netlify.toml is committed: ```bash git log --oneline netlify.toml | head -5 ```
4. Redeploy explicitly: ```bash netlify deploy --prod --functions=functions/ ```
---
Still broken? Check these too
1. Function Cold Start Timing Sometimes env vars load asynchronously. Wrap in a promise: ```javascript await new Promise(r => setTimeout(r, 100)); // Brief delay const key = process.env.API_KEY; ```
2. Netlify Functions vs. Edge Functions
Edge Functions use Netlify.env.get() instead of process.env. See [Edge Functions env vars guide](/?guide=netlify-edge-env).
3. Build-time vs. Runtime Variables Variables for build (Gatsby, Next.js) ≠ function runtime variables. You need separate configuration. Reference: [build vs. function env](/?guide=build-vs-function-env).
---
Found a different variation? Drop it in the comments
If you hit a different error path or discovered an undocumented edge case, reply below with:
We'll add it to this guide.
---