Vercel: environment variables not available in runtime

Hi Vercel team — I’m seeing environment variables not being injected into my server runtime.
Project: welpoint
Production URL: https://welpoint.vercel.app/
Framework: Next.js App Router
API route: app/api/env-ok/route.ts
Runtime: nodejs (not Edge)
Dynamic: force-dynamic
Symptom

  • In a diagnostic endpoint I print Object.keys(process.env) (names only).
  • Only these show up from my project envs: NEXT_PUBLIC_SUPABASE_ANON_KEY and NEXT_PUBLIC_SUPABASE_URL.
  • The following do NOT appear at runtime at all:
    • SUPABASE_SERVICE_ROLE_KEY (server secret)
    • SUPABASE_SERVICE_ROLE (alias I added to test)
    • NEXT_PUBLIC_GMAPS_KEY
    • SERVER_TEST_FLAG (simple test var I added)
    What I expect
  • All variables defined in Project → Settings → Environment Variables (scoped to the current environment) should be available in process.env for serverless functions.
    Repro steps
  1. Create an API route in the App Router with Node runtime:
    export const runtime = ‘nodejs’;
    export const dynamic = ‘force-dynamic’;
    export async function GET() {
    const allEnvNames = Object.keys(process.env).sort();
    const hasService =
    !!process.env.SUPABASE_SERVICE_ROLE_KEY || !!process.env.SUPABASE_SERVICE_ROLE;
    const hasUrl =
    !!process.env.NEXT_PUBLIC_SUPABASE_URL || !!process.env.SUPABASE_URL;
    return NextResponse.json({ hasService, hasUrl, allEnvNames });
    }
  2. Define env vars in Project Settings → Environment Variables with Environments = Production, Preview, Development.
  3. Make a fresh deploy (new commit each time).
  4. Open https://welpoint.vercel.app/api/env-ok
    Observed output (summary)
    {
    “hasService”: false,
    “hasUrl”: true,
    “allEnvNames”: [
    “NEXT_PUBLIC_SUPABASE_ANON_KEY”,
    “NEXT_PUBLIC_SUPABASE_URL”,
    …only system vars (VERCEL_, AWS_, etc.)
    ]
    }
    What I’ve already tried
  • Confirmed variables are set at Project level (not Team level).
  • Selected Production/Preview/Development for each var.
  • Fresh deploys (not just “Redeploy”) — new commit each time.
  • Forced Node runtime + force-dynamic on the route.
  • Renamed folders so the route is public (avoiding leading underscores).
  • Created alias variables (SUPABASE_SERVICE_ROLE) and a simple SERVER_TEST_FLAG — neither appears at runtime.
  • Still, the two NEXT_PUBLIC_SUPABASE_* do appear, so some envs are being injected.
    Questions
  • Is there any known issue or setting that would prevent new/updated env vars from being injected into serverless runtime for App Router API routes?
  • Could branch-level overrides or project configuration block specific keys from being available?
  • Is there any cache or setting we should clear to force env propagation to serverless functions?
    Happy to provide:
  • Screenshots of Project → Settings → Environment Variables
  • Latest deployment ID
  • The public diagnostic endpoint URL (above)
    Thanks in advance!

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.