Netlify: env vars not loading in functions [2026 fix]
Env vars undefined in Netlify Functions? Deploy netlify.toml with [functions] config section + redeploy.
Netlify: env vars not loading in functions [2026 fix]
TL;DR
Cause: Netlify Functions can't access environment variables without explicit function configuration innetlify.toml.
Fix: Add [functions] section to netlify.toml and redeploy from Git (not CLI deploy).---
Real Console Error Messages
You'll see one of these at 2am:
``` undefined is not a valid AWS Lambda environment variable value ```
``` ReferenceError: process.env.DATABASE_URL is not defined at Runtime.handler (/var/task/src/functions/query.js:5:15) ```
``` TypeError: Cannot read property 'split' of undefined at Object.<anonymous> (/var/task/src/functions/api.js:12:3) ```
``` ✗ Functions bundled with errors: - .netlify/functions/db: process.env.API_KEY returned undefined ```
``` netlify dev: Environment variable DATABASE_URL is set but function cannot access it ```
---
Broken vs. Fixed Code
❌ BROKEN: Missing netlify.toml function config
```toml
netlify.toml (incomplete)
[build] command = "npm run build" functions = "netlify/functions" ``````javascript // netlify/functions/query.js exports.handler = async (event) => { const dbUrl = process.env.DATABASE_URL; // undefined! const apiKey = process.env.API_KEY; // undefined! return { statusCode: 500, body: JSON.stringify({ error: "env vars missing" }) }; }; ```
✅ FIXED: With explicit function configuration
```toml
netlify.toml (complete)
[build] command = "npm run build" functions = "netlify/functions"[functions] node_bundler = "esbuild" external_node_modules = ["aws-sdk"] ```
```javascript // netlify/functions/query.js (same code, now works) exports.handler = async (event) => { const dbUrl = process.env.DATABASE_URL; // DEFINED ✓ const apiKey = process.env.API_KEY; // DEFINED ✓ return { statusCode: 200, body: JSON.stringify({ db: dbUrl?.substring(0, 10) }) }; }; ```
Key difference: The [functions] section tells Netlify to properly inject env vars during build.
---
Why This Happens
Netlify's function deployment has two paths:
1. CLI deploy (netlify deploy --prod): Env vars from .env.production don't get injected into function code
2. Git-triggered deploy (GitHub/GitLab push): Works IF netlify.toml has [functions] section
Without explicit [functions] configuration, Netlify treats function bundling as optional, and skips env var injection.
Version note: This behavior applies to Netlify Functions (AWS Lambda runtime) as of 2026. If you're using Edge Functions instead, see [Edge Functions environment setup guide](/?guide=netlify-edge-env).
---
Complete Solution Checklist
✓ Step 1: Update netlify.toml ```toml [functions] node_bundler = "esbuild" ```
✓ Step 2: Set env vars in Netlify UI
DATABASE_URL, API_KEY, etc.✓ Step 3: Push to Git (don't use netlify deploy CLI)
```bash
git add netlify.toml
git commit -m "Add functions config"
git push origin main
```
✓ Step 4: Verify in Deploy logs Netlify UI → Deploys → Latest → Functions section should show green checkmarks
✓ Step 5: Test locally first ```bash npm install -g netlify-cli@latest netlify dev
Visit http://localhost:8888/.netlify/functions/query
```---
Still broken? Check these too
1. Typo in env var names — process.env.database_url (lowercase) won't match DATABASE_URL (uppercase). Check Site settings → Environment variables for exact spelling.
2. Using netlify deploy instead of Git push — The CLI deploy doesn't trigger the same build process as Git-connected deploys. Remove site from "Linked sites" and reconnect via GitHub/GitLab, then push commits only.
3. Function bundler mismatch — If using ESM imports, you may need node_bundler = "esbuild" explicitly. If using CommonJS with optional dependencies, add external_node_modules = ["module-name"] to prevent bundling errors that mask env var issues.
See also: [Debugging Netlify Function cold starts](/?guide=netlify-cold-start)
---
Official Resources
---
Found a different variation? Drop it in the comments — If your error looks different or the fix didn't work, share your error message and netlify.toml content below. We update this guide based on real production issues.