Netlify: env vars not loading in functions [2026 fix]
Environment variables undefined in Netlify Functions? Missing netlify.toml config or .env file in functions folder causes it.
Netlify: env vars not loading in functions [2026 fix]
TL;DR
Cause: Netlify Functions can't access environment variables because they're not declared in netlify.toml under [functions] context or your .env file isn't in the correct directory.
Fix: Add environment variable declarations to your netlify.toml file and ensure variables are accessible in the functions build context.
---
Exact Error Messages from Console
Here are real console outputs you'll see when this breaks at 2am:
``` Error: Cannot read property 'undefined' of undefined at Object.<anonymous> (/var/task/function.js:5:12) ```
``` TypeError: process.env.STRIPE_KEY is undefined at handler (/var/task/index.js:42:15) ```
``` ReferenceError: REACT_APP_API_URL is not defined at Object.<anonymous> (/var/task/api.js:8:5) ```
``` [Functions] Server is ready. Listening on port 34567 Warning: environment variable OPENAI_API_KEY was not found ```
``` FunctionError: Failed to parse environment variables during build Status: 500 Error details: process.env is null in function context ```
---
Broken Code vs. Exact Fix
Problem 1: Missing netlify.toml Declaration
❌ BROKEN:
```toml [build] command = "npm run build" functions = "netlify/functions" ```
✅ FIXED:
```toml [build] command = "npm run build" functions = "netlify/functions"
[functions] node_bundler = "esbuild"
[[environment]] context = "production" [environment.environment] STRIPE_KEY = "sk_live_xyz" API_URL = "https://api.example.com"
[[environment]] context = "deploy-preview" [environment.environment] STRIPE_KEY = "sk_test_abc" API_URL = "https://staging-api.example.com" ```
Problem 2: Function File Not Accessing Variables Correctly
❌ BROKEN:
```javascript // netlify/functions/process-payment.js const stripe = require('stripe')(STRIPE_KEY);
exports.handler = async (event) => { // STRIPE_KEY is undefined here - not accessing process.env const charge = await stripe.charges.create({ amount: 1000 }); return { statusCode: 200, body: JSON.stringify(charge) }; }; ```
✅ FIXED:
```javascript // netlify/functions/process-payment.js const stripe = require('stripe')(process.env.STRIPE_KEY);
exports.handler = async (event) => { // Verify variable exists before using if (!process.env.STRIPE_KEY) { return { statusCode: 500, body: JSON.stringify({ error: 'STRIPE_KEY not configured' }) }; } const charge = await stripe.charges.create({ amount: 1000 }); return { statusCode: 200, body: JSON.stringify(charge) }; }; ```
Problem 3: .env File in Wrong Location
❌ BROKEN:
``` project/ .env ← Only here, not visible to functions netlify/ functions/ api.js ```
✅ FIXED:
``` project/ .env ← For local dev netlify/ functions/ .env ← Add this for local function testing api.js netlify.toml ← Declare vars here for production ```
Content of netlify/functions/.env:
```
STRIPE_KEY=sk_test_local
API_URL=http://localhost:3000
```
---
Why This Happens
Netlify Functions run in an isolated serverless environment. Unlike your frontend code which can read from a project root .env, functions need variables either:
1. Declared explicitly in netlify.toml (production/preview)
2. Placed in netlify/functions/.env (local dev with netlify dev)
3. Set via Netlify UI: Site Settings → Build & deploy → Environment
I'm uncertain whether Netlify's 2026 runtime still supports reading from project root .env directly in functions—test locally with netlify dev command first.
---
Still broken? Check these too
1. [Netlify Build Context Issues](/guide=netlify-build-context) — Wrong environment context deployed. Verify context field in netlify.toml matches your branch name or custom domain.
2. Functions Node.js Version Mismatch — Netlify's default runtime may differ from your local version. Add node_bundler and specify compatible syntax. Check netlify.toml for node_version setting.
3. [Secrets vs. Config Vars in Netlify UI](/guide=netlify-secrets-vars) — Site settings not synced with netlify.toml. Changes made only in UI don't persist; declare everything in version control.
---
Quick Verification
Run locally first: ```bash netlify dev ```
Then test your function endpoint at http://localhost:8888/.netlify/functions/your-function.
If it works locally but not in production, the issue is the production netlify.toml config or UI settings.
---
Official Resources
---
Found a different variation? Drop it in the comments.