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

Netlify functions can't access env vars because they're not deployed to the functions context. Deploy with netlify.toml config pointing to correct build directory.

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

TL;DR

Cause: Environment variables are set in Netlify UI but functions runtime doesn't have access because functions aren't being bundled/deployed correctly or netlify.toml is misconfigured.

Fix: Add [functions] block to netlify.toml with correct directory, rebuild, and redeploy—env vars will auto-inject at runtime.

---

Real Console Error Messages

When you hit your function endpoint, you'll see one of these:

``` undefined is not a function at Runtime.handler (checking process.env returns undefined) ```

``` TypeError: Cannot read property 'API_KEY' of undefined at Object.<anonymous> (/var/task/index.js:12:15) ```

``` {"errorMessage":"2022-11-14T06:15:32.123Z undefined ERROR Invoke Error {\"errorMessage\":\"process.env.DATABASE_URL is undefined\"} ```

``` Error: ENOENT: no such file or directory, open '.env' at Object.openSync (fs.js:...) at Runtime.handler ```

``` 503 Service Unavailable - The Lambda function failed to execute Event: {"errorMessage":"Variable missing: MY_SECRET_VAR"} ```

---

Broken Code → Fixed Code

Problem Setup

Your netlify.toml (BROKEN): ```toml [build] command = "npm run build" publish = "dist"

Missing! Functions aren't being found

```

Your function (functions/api.js): ```javascript exports.handler = async (event, context) => { const apiKey = process.env.API_KEY; // Returns undefined const dbUrl = process.env.DATABASE_URL; // Returns undefined return { statusCode: 200, body: JSON.stringify({ apiKey, dbUrl }) }; }; ```

Solution

Your netlify.toml (FIXED): ```toml [build] command = "npm run build" publish = "dist"

[functions] directory = "netlify/functions" node_bundler = "esbuild" ```

Your function structure: ``` project/ ├── netlify/ │ └── functions/ │ └── api.js ├── netlify.toml └── package.json ```

Your function (netlify/functions/api.js) — FIXED: ```javascript exports.handler = async (event, context) => { // These now work because netlify.toml [functions] block is set const apiKey = process.env.API_KEY; const dbUrl = process.env.DATABASE_URL; // Optional: Add safety check if (!apiKey || !dbUrl) { return { statusCode: 500, body: JSON.stringify({ error: "Missing env vars" }) }; } return { statusCode: 200, body: JSON.stringify({ apiKey: apiKey.substring(0, 5) + "...", dbUrl }) }; }; ```

Env vars in Netlify UI (already set):

  • Site settings → Build & deploy → Environment → Add env vars
  • API_KEY = your-key-here
  • DATABASE_URL = postgres://...
  • ---

    Why This Happens

    1. Default functions location mismatch: Netlify defaults to netlify/functions/ but if your netlify.toml is missing the [functions] block or points elsewhere, functions aren't deployed. 2. Legacy function structure: Older projects used .netlify/functions/ or functions/ at root—modern Netlify prefers netlify/functions/. 3. Build output isolation: If functions live in dist/ after build, they're excluded from the function runtime context. 4. Version uncertainty: As of 2026, Netlify's function runtime behavior with build artifacts varies. Explicit netlify.toml config is always the safest approach.

    ---

    Still Broken? Check These Too

    1. Wrong build directory: If publish = "dist" but functions are in src/functions/, Netlify won't find them. Always mirror: if functions are at project root netlify/functions/, keep them OUT of the build publish directory. Netlify deploys them separately.

    2. Missing npm run build or build step: If your build command doesn't complete, functions don't get bundled. Check build logs: Site → Deploys → Click recent deploy → View deploy log. Look for Functions section showing "Bundled X functions."

    3. Function file syntax errors: If your .js has a typo (like missing closing brace), the bundler fails silently in older Netlify versions. Test locally: npm install -g netlify-cli then netlify functions:invoke api to test before pushing.

    ---

    Quick Checklist

  • [ ] netlify.toml has [functions] block with directory = "netlify/functions"
  • [ ] Functions live in netlify/functions/, NOT in src/ or build output
  • [ ] Env vars are set in Netlify UI (Site → Build & deploy → Environment)
  • [ ] Deploy log shows Bundled N functions under the Functions section
  • [ ] Clear browser cache and redeploy (don't just push code)
  • [ ] Test locally with netlify dev to simulate production env var injection
  • ---

    Related Guides

  • [Netlify build failures: debugging 502 errors](/?guide=netlify-502-errors)
  • [Environment variables in Next.js on Netlify](/?guide=nextjs-env-vars)
  • ---

    Official Resources

  • [Netlify Functions Environment Variables Documentation](https://docs.netlify.com/functions/overview/#environment-variables)
  • [Netlify.toml Configuration 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