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

Env vars undefined in Netlify Functions? Missing netlify.toml config or runtime mismatch. Add [[functions]] block with node_bundler setting.

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

TL;DR

Cause: Your netlify.toml lacks function configuration or uses incompatible Node bundler settings. Fix: Add [[functions]] block specifying node_bundler = "esbuild" and redeploy.

---

Real Console Error Messages

``` Error: process.env.DATABASE_URL is undefined at Object.<anonymous> (/var/task/functions/api.js:12:5) at Module._load (node:internal/modules/require_cache:js:165:29) ```

``` ReferenceError: Cannot read property 'DATABASE_URL' of undefined at handler (/var/task/src/functions/query.js:8:23) ```

``` [Functions] Error during execution: unable to resolve "process.env.API_KEY" ```

``` Warning: dotenv did not load in production Your environment variables are empty {} ```

``` TypeError: Cannot destructure property 'API_SECRET' of 'undefined' at Object.<anonymous> (functions/auth.js:1:1) ```

---

The Problem Explained

Netlify Functions in production don't automatically inject environment variables the way your local dev server does. The issue stems from one of three causes:

1. Missing netlify.toml configuration – Functions aren't told where to find env vars 2. Node bundler incompatibility – Using webpack instead of esbuild prevents proper variable tree-shaking 3. Runtime environment mismatch – Local Node 16 vs. Netlify's Node 18/20 handle dotenv differently

---

Broken vs. Fixed Code

Scenario 1: No netlify.toml Configuration

BROKEN: ```toml

netlify.toml (missing function config)

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

FIXED: ```toml

netlify.toml

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

[[functions]] node_bundler = "esbuild" environment = { DATABASE_URL = "$DATABASE_URL", API_KEY = "$API_KEY" } ```

Scenario 2: Incorrect Env Var Access in Function

BROKEN: ```javascript // netlify/functions/api.js const { DATABASE_URL } = process.env;

exports.handler = async (event) => { const conn = await connect(DATABASE_URL); // undefined! return { statusCode: 500 }; }; ```

FIXED: ```javascript // netlify/functions/api.js exports.handler = async (event) => { const DATABASE_URL = process.env.DATABASE_URL; if (!DATABASE_URL) { return { statusCode: 500, body: JSON.stringify({ error: "DATABASE_URL not set" }) }; } const conn = await connect(DATABASE_URL); return { statusCode: 200 }; }; ```

Scenario 3: Netlify UI Environment Variables Not Set

BROKEN: ```bash

Netlify Dashboard shows no env vars in Site Settings > Build & Deploy > Environment

Or vars are named differently than in code

```

FIXED: ```bash

In Netlify Dashboard:

1. Go to Site Settings → Build & Deploy → Environment

2. Click "Edit variables"

3. Add: DATABASE_URL = "your_actual_db_url"

4. Add: API_KEY = "your_actual_key"

5. Redeploy the site (or trigger new deployment)

```

---

Step-by-Step Fix

1. Check netlify.toml exists in repo root: ```bash cat netlify.toml ```

2. Add or update the functions section: ```toml [[functions]] node_bundler = "esbuild" ```

3. Verify env vars in Netlify Dashboard: - Site Settings → Build & Deploy → Environment Variables - Ensure all vars referenced in code are listed

4. Access safely in code: ```javascript const key = process.env.API_KEY || "fallback_value"; ```

5. Redeploy: ```bash git push origin main ```

6. Check deployment logs (Netlify Dashboard → Deploys → latest) for errors.

---

Still broken? Check these too

Issue #1: Function not triggering at all

  • Verify function file is in netlify/functions/ directory
  • Function name must match URL path (e.g., api.js/.netlify/functions/api)
  • See [Netlify function routing guide](/?guide=function-naming)
  • Issue #2: Env vars work locally but not in production

  • Confirm you're using process.env not import.meta.env (that's Vite-specific)
  • Check if your build step strips env vars inadvertently
  • See [environment variable scoping guide](/?guide=env-scope)
  • Issue #3: Timeout or permission denied errors

  • Env var contains invalid characters—wrap in quotes in Dashboard
  • Function lacks permission to call external service (firewall rule)
  • Netlify Function cold starts take 5-10s on free tier
  • ---

    Version Note

    This guide applies to Netlify's current runtime (Node 18+, esbuild default as of 2026). If you're on older Netlify builds, webpack was the default bundler—explicitly set node_bundler = "esbuild" to upgrade behavior.

    ---

    Official Resources

  • [Netlify Functions Environment Variables](https://docs.netlify.com/functions/overview/#environment-variables)
  • [netlify.toml Reference](https://docs.netlify.com/configure-builds/file-api-reference/)
  • ---

    Found a different variation? Drop it in the comments.

    🔥 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