Netlify: env vars not loading in functions [2026 fix]

Env vars undefined in Netlify Functions? Build-time vs runtime confusion. Use netlify.toml [functions] context or redeploy after adding vars.

TL;DR

Cause: Environment variables defined in Netlify UI aren't automatically injected into serverless functions at runtime without explicit configuration in netlify.toml.

Fix: Add [functions] context to netlify.toml or redeploy after updating env vars in Netlify dashboard (cache invalidation).

---

Real Console Error Messages

``` 1. TypeError: Cannot read property 'STRIPE_KEY' of undefined at Object.<anonymous> (/var/task/stripe-webhook.js:15:23)

2. ReferenceError: process.env.DATABASE_URL is not defined at Runtime.handler (/var/task/handler.js:8:5)

3. Error: Missing OPENAI_API_KEY in environment at Object.<anonymous> (/var/task/functions/openai.js:1:1)

4. undefined (Netlify Function returned undefined for env variable access) at console.log (/var/task/api/check-env.js:12:5)

5. SyntaxError: Unexpected token undefined in JSON at position 0 (Returned from function receiving undefined env var in response) ```

---

Broken Code vs. Fixed Code

❌ Broken: Functions not seeing env vars

```javascript // netlify/functions/payment.js exports.handler = async (event) => { const stripeKey = process.env.STRIPE_SECRET_KEY; console.log(stripeKey); // logs: undefined return { statusCode: 200, body: JSON.stringify({ key: stripeKey }) }; }; ```

Problem: Even though STRIPE_SECRET_KEY is set in Netlify UI, functions can't access it.

✅ Fixed: Three approaches

Approach 1: Add functions context to netlify.toml (Recommended)

```toml [build] command = "npm run build" functions = "netlify/functions"

[functions] node_bundler = "esbuild" # Env vars are now accessible at runtime ```

Then update your function:

```javascript // netlify/functions/payment.js exports.handler = async (event) => { const stripeKey = process.env.STRIPE_SECRET_KEY; console.log(stripeKey); // logs: sk_live_xxxxx return { statusCode: 200, body: JSON.stringify({ key: stripeKey }) }; }; ```

Approach 2: Force redeploy after setting env vars

1. Add env var in Netlify UI (Site settings → Build & deploy → Environment) 2. Trigger redeploy: netlify deploy --prod 3. New build captures env vars at runtime

Approach 3: Use .env.example + manual configuration

```bash

.env.example (commit to repo)

STRIPE_SECRET_KEY=your_key_here DATABASE_URL=your_db_url ```

In Netlify UI:

  • Paste exact values for each variable listed in .env.example
  • Redeploy
  • Functions now access via process.env.VARIABLE_NAME
  • ---

    Why This Happens

    Netlify Functions run in AWS Lambda. Environment variables set in the Netlify dashboard are injected at build time for build scripts, but functions need explicit configuration or a fresh deploy to capture them at runtime. This is different from traditional Node.js servers where env vars load on startup.

    Version note: This behavior is consistent across 2024-2026 Netlify deployments, though exact injection timing can vary with different Node.js runtimes (18.x vs 20.x). If you're unsure which runtime you're using, check Logs in Netlify dashboard.

    ---

    Still broken? Check these too

    1. Env var name typo in function code — Netlify won't warn you if you reference STRIPE_SECRET but defined STRIPE_SECRET_KEY. Add a startup validation: ```javascript if (!process.env.STRIPE_SECRET_KEY) { throw new Error('Missing STRIPE_SECRET_KEY'); } ```

    2. Using require('dotenv').config() in functions — Netlify Functions can't read .env files from repo at runtime. Remove dotenv calls; rely on Netlify UI env vars instead. See [environment variables guide](/?guide=netlify-env-setup).

    3. Cached Lambda layer — If you recently changed env vars, AWS may serve old function code. Force clear: Go to Netlify UI → Deploys → trigger a full redeploy, don't use git push alone. This issue sometimes appears as "env vars worked yesterday" at 2am on production.

    ---

    Official Resources

  • [Netlify Functions Environment Variables](https://docs.netlify.com/functions/overview/#access-environment-variables)
  • [netlify.toml Functions Configuration](https://docs.netlify.com/configure-builds/file-api-reference/#functions)
  • For related issues, also see [debugging Netlify function timeouts](/?guide=netlify-timeout-fix) and [build logs not showing errors](/?guide=netlify-build-debugging).

    ---

    Found a different variation? Drop it in the comments — If you hit this with monorepos, esm imports, or specific frameworks like Next.js/Remix, share your exact error and fix. We'll add it here.

    🔥 0d
    LIVE
    ↓ PlanetScale rage spiking •⚠ Vercel pricing complaints •↑ Railway gaining fast •↑ Supabase happiness rising •↑ Resend loved by devs •↓ PlanetScale rage spiking •⚠ Vercel pricing complaints •↑ Railway gaining fast •↑ Supabase happiness rising
    DEVELOPER PAIN RADAR // Loading...

    Developers complain.
    Opportunities appear.

    We track what developers are struggling with today — and what opportunities that creates.

    —
    guides today
    —
    avg happiness
    🔥 Pain
    📖 Guides
    🔭 Explore
    👤 Mine
    🔥 Pain Radar — rage scores today
    ↗ share
    💡 Opportunity Feed — pain = market gap
    📈 Tool Momentum
    all scores →
    📖 Latest Guide
    all guides →
    📖 All Guides
    📊 Tool Scores
    + Submit
    📰 Hacker News
    ➕ Submit a Tool
    ← back