Vercel: 504 timeout on serverless functions [2026 fix]

Serverless function exceeds 10s timeout or cold start memory fails. Reduce function complexity, increase memory allocation, or implement request queuing.

Vercel: 504 timeout on serverless functions [2026 fix]

TL;DR

Cause: Your serverless function exceeded Vercel's 10-second execution timeout (or 900 seconds for Pro plans) due to slow database queries, missing indexes, or insufficient memory allocation. Fix: Increase function memory to 3008 MB, implement response caching, offload heavy work to background jobs, or add database query timeouts.

---

Real Console Error Messages

Error #1: Standard timeout

``` FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 504 Service Unavailable A Function took too long to execute, please check your Function logs in the Vercel dashboard. ```

Error #2: Cold start + slow import

``` [WARN] Unhandled error during request: TypeError: Cannot read properties of undefined (reading 'query') Error: connect ETIMEDOUT 10.0.0.1:5432 504 Gateway Timeout ```

Error #3: Database connection pool exhaustion

``` Error: too many connections at Connection.query (/var/task/node_modules/pg/lib/connection.js:219:14) 504 Service Unavailable - Vercel Function execution timeout ```

Error #4: Streaming response timeout

``` Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 504 GATEWAY_TIMEOUT Function was terminated after 10.0 seconds ```

Error #5: Module loading delay

``` Task timed out after 10.00 seconds ERROR in /var/task: node_modules size 487MB exceeds recommendations 504 ```

---

Code: Broken vs Fixed

❌ BROKEN: Unoptimized database query

```javascript // api/users.js - causes 504 export default async function handler(req, res) { const { Pool } = require('pg'); const pool = new Pool({ connectionString: process.env.DATABASE_URL, }); // NO TIMEOUT, NO INDEX, FETCHES ALL ROWS const result = await pool.query( 'SELECT * FROM users WHERE status = $1', ['active'] ); res.status(200).json(result.rows); } ```

✅ FIXED: Optimized with timeout + connection pooling

```javascript // api/users.js - works reliably import { Pool } from 'pg';

const pool = new Pool({ connectionString: process.env.DATABASE_URL, max: 2, // Vercel limit idleTimeoutMillis: 10000, connectionTimeoutMillis: 5000, });

export default async function handler(req, res) { const client = await pool.connect(); try { // QUERY TIMEOUT: 8 seconds (under 10s limit) const result = await Promise.race([ client.query( 'SELECT id, name FROM users WHERE status = $1 LIMIT 100', ['active'] ), new Promise((_, reject) => setTimeout(() => reject(new Error('Query timeout')), 8000) ) ]); // ADD CACHE HEADERS res.setHeader('Cache-Control', 'public, s-maxage=60, stale-while-revalidate=120'); res.status(200).json(result.rows); } catch (error) { console.error('Database error:', error); res.status(503).json({ error: 'Service temporarily unavailable' }); } finally { client.release(); } } ```

---

Configuration Fix: Increase Memory

Create or update vercel.json:

```json { "functions": { "api/**/*.js": { "memory": 3008, "maxDuration": 60 } } } ```

Note: Memory allocation up to 3008 MB is available on Pro/Enterprise plans. Free tier limited to 1024 MB.

---

Still broken? Check these too

1. N+1 Query Problem — Your function loops and queries the database inside loops. Use JOIN clauses or batch queries instead. [See related database optimization guide](/?guide=n-plus-one-queries).

2. Missing Database Indexes — Run CREATE INDEX idx_status ON users(status); on your production database. Unindexed queries on large tables consistently timeout.

3. Synchronous File Operations — Using fs.readFileSync() or large JSON parsing blocks the event loop. Switch to async: fs.readFile() or fs.promises.readFile(). [See file handling guide](/?guide=async-file-operations).

4. Oversized Node Modules — Install size >50MB triggers slow cold starts. Check: npm ls --depth=0. Remove unused dependencies with npm prune --production.

5. Unhandled Promise Rejections — If a promise never resolves, Vercel kills the function at 10 seconds. Always add .catch() or use async/await try-catch.

---

Version-Specific Notes

We're documenting behavior current as of January 2026. We are uncertain whether Vercel will extend the default 10-second timeout on free tier in future releases—check [official status page](https://status.vercel.com) before assuming limits. Pro plan's 900-second timeout is documented as stable.

---

Official Documentation

  • [Vercel Serverless Function Timeout Limits](https://vercel.com/docs/functions/serverless-functions)
  • [Vercel Environment Variables & Secrets](https://vercel.com/docs/concepts/projects/environment-variables)
  • [Postgres Connection Pooling Best Practices](https://vercel.com/docs/storage/postgres/limits-and-pricing)
  • ---

    Prevention Checklist

  • [ ] All database queries have explicit timeout (< 8 seconds)
  • [ ] vercel.json sets maxDuration to actual needs
  • [ ] Node modules total < 50MB (run npm size)
  • [ ] Database has indexes on WHERE clause columns
  • [ ] Using connection pooling library (pg-pool, pgbouncer)
  • [ ] Cache-Control headers set for repeated calls
  • [ ] No synchronous file I/O in functions
  • [ ] Monitoring enabled: check Vercel dashboard logs daily
  • ---

    Found a different variation? Drop it in the comments — if you hit 504s with a unique stack trace or scenario, share details and we'll add it to this guide.

    🔥 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