Netlify: env vars not loading in functions [2026 fix]
Env vars undefined in Netlify Functions? Deploy without rebuilding or use wrong .env file syntax—rebuild with NETLIFY_INTERNAL_FUNCTIONS_REDEPLOYMENT flag.
Netlify Functions: Env Vars Not Loading at 2am
TL;DR
Cause: Environment variables set in Netlify UI aren't injected into function runtime because functions were deployed *before* env vars were added, or build cache is serving stale function bundle.Fix: Trigger a complete function redeploy by rebuilding (even with no code changes) or explicitly set NETLIFY_INTERNAL_FUNCTIONS_REDEPLOYMENT=true in your deploy context.
---
Real Console Error Messages
``` 1. TypeError: Cannot read property 'api_key' of undefined at Object.<anonymous> (/var/task/functions/auth.js:12:5)
2. ReferenceError: process.env.STRIPE_SECRET_KEY is not defined at handler (/var/task/functions/payment.js:45:18)
3. Error: Missing required environment variable DATABASE_URL at connectDB (/var/task/functions/db-utils.js:8:3)
4. undefined - env vars were set AFTER function deployment Check Netlify UI Site settings > Environment variables timestamp
5. 502 Bad Gateway - function fails silently because process.env.API_TOKEN === undefined ```
---
Broken Code vs. Exact Fix
❌ Broken: Setting vars after deploy
```javascript // functions/send-email.js const nodemailer = require('nodemailer');
exports.handler = async (event) => { const transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.EMAIL_USER, // undefined! pass: process.env.EMAIL_PASSWORD // undefined! } }); // ... rest of code }; ```
What happened: 1. Function deployed at 1:47am 2. You added EMAIL_USER + EMAIL_PASSWORD to Netlify UI at 1:52am 3. Function still has old bundle—env vars not included
✅ Fixed: Redeploy to inject vars
Option A: Trigger rebuild (fastest at 2am) ```bash
In your repo root
git commit --allow-empty -m "Rebuild to load env vars" git push origin mainNetlify auto-deploys, functions get fresh env var injection
```Option B: Use Netlify CLI locally ```bash npm install -g netlify-cli netlify env:set EMAIL_USER "alerts@company.com" netlify env:set EMAIL_PASSWORD "your-password" netlify deploy --prod --functions
The --functions flag forces function rebuild
```Option C: Manual Site Settings redeploy 1. Go to Netlify UI → Site settings → Build & deploy → Deploys 2. Click "Trigger deploy" → "Deploy site" (not "Clear cache and deploy"—that's different) 3. Wait 2-3 minutes for function bundle to regenerate with fresh env vars
Option D: Add to netlify.toml (prevents future issues) ```toml [build] command = "npm run build" functions = "netlify/functions"
[env.production] # Force function redeploy on environment variable changes environment = { NODE_ENV = "production" } ```
---
The Root Cause Explained
Netlify Functions are bundled at build time. Environment variables must exist *before* the build completes, or they won't be baked into the function's runtime context. Adding them afterward doesn't automatically re-bundle functions.
This is different from traditional serverless platforms like AWS Lambda, where env vars are injected at invocation time.
---
Still Broken? Check These Too
1. Wrong .env syntax in local development
- ❌ STRIPE_KEY = sk_live_xyz (spaces around = break parsing)
- ✅ STRIPE_KEY=sk_live_xyz (no spaces)
- Local .env won't affect Netlify UI vars—you must set both places
2. Build cache hiding fresh function bundle - Even after setting env vars, Netlify might serve cached function from 15 minutes ago - Fix: Netlify UI → Deploys → Click latest deploy → "Clear cache and retry" - *Uncertain: behavior may differ in 2026 if Netlify changes cache TTL*
3. netlify.toml overrides UI environment variables
- If netlify.toml defines [env] section, it takes precedence over UI settings
- Check if your [env.production] section is missing a key or has typos
- Syntax error in TOML = env vars silently drop (no error message)
---
Verify It Worked
```javascript // Test function: get-env-debug.js exports.handler = async () => { return { statusCode: 200, body: JSON.stringify({ env_loaded: !!process.env.EMAIL_USER, timestamp: new Date().toISOString() }) }; }; ```
Deploy this, call /.netlify/functions/get-env-debug, and verify env_loaded: true.
---
Related Guides
Official Docs: [Netlify Functions environment variables](https://docs.netlify.com/functions/overview/?fn-language=js#environment-variables)
---
Found a different variation? Drop it in the comments—are you using monorepo structure, ESM imports, or a custom build plugin? Every setup can trigger this differently.