Vercel: 504 timeout on serverless functions [2026 fix]

Serverless function exceeds 10s timeout or cold starts delay response. Increase function timeout, optimize code execution, or switch to Vercel Functions with longer limits.

TL;DR

Cause: Your serverless function exceeded Vercel's 10-second timeout (Hobby) or 60-second timeout (Pro), or cold starts are blocking responses.

Fix: Increase function timeout in vercel.json, optimize database queries, or migrate long-running tasks to background jobs.

---

Real Console Error Messages

``` 504 Gateway Timeout Did not complete before the request timeout limit. ```

``` Error: Task timed out after 10.00 seconds at ChildProcess.<anonymous> (/var/task/handler.js:45:12) ```

``` FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory Serverless function timed out before memory error surfaced ```

``` [ERROR] RequestId: abc123xyz Failed to load response data for POST /api/process status code: 504 from Vercel edge network ```

``` vercel[api]: FunctionComputeError: The request failed to return a response before the timeout. Duration: 10000ms ```

---

Problem: Broken Code vs. Fixed Code

❌ BROKEN: Default timeout with slow query

```javascript // api/process.js - NO timeout config export default async function handler(req, res) { // This database query takes 15 seconds const results = await db.query( `SELECT * FROM users WHERE status = 'active' AND created_at > NOW() - INTERVAL '1 year' AND verified = true` ); // Never reaches here on Hobby plan (10s limit) res.status(200).json({ data: results }); } ```

✅ FIXED: Increase timeout + optimize query

```javascript // vercel.json { "functions": { "api/process.js": { "maxDuration": 30 } } } ```

```javascript // api/process.js - Optimized with timeout config export const config = { maxDuration: 30 };

export default async function handler(req, res) { // Add database indexes and use pagination const results = await db.query( `SELECT id, name, email FROM users WHERE status = 'active' AND created_at > NOW() - INTERVAL '1 year' LIMIT 100`, { timeout: 8000 } // Query-level timeout ); res.status(200).json({ data: results }); } ```

---

Root Causes & Solutions

1. Function Timeout Limit Exceeded

Vercel Hobby plan: 10-second limit Vercel Pro plan: 60-second limit Vercel Enterprise: Up to 3600 seconds

Solution: Add maxDuration to vercel.json or use the config export.

```javascript export const config = { maxDuration: 45 // Pro plan supports this }; ```

2. Cold Start Delays

First invocation loads dependencies (Node modules, connections), consuming 2-5 seconds before your code runs.

Solution:

  • Reuse database connections across invocations
  • Use connection pooling (PgBouncer, node-postgres with pools)
  • Keep dependencies minimal
  • ```javascript // ✅ Reuse connection let cachedClient;

    export default async function handler(req, res) { if (!cachedClient) { cachedClient = new Pool({ connectionString: process.env.DB_URL }); } const result = await cachedClient.query('SELECT NOW()'); res.json({ time: result.rows[0] }); } ```

    3. Synchronous Database Calls

    Blocking operations don't use Promise concurrency.

    Solution: Use Promise.all() for parallel queries.

    ```javascript // ✅ Parallel execution const [users, posts, comments] = await Promise.all([ db.query('SELECT * FROM users LIMIT 10'), db.query('SELECT * FROM posts LIMIT 10'), db.query('SELECT * FROM comments LIMIT 10') ]); ```

    4. Memory Exhaustion

    Large data processing hits memory limits (1024MB default).

    Solution: Stream data instead of loading entirely.

    ```javascript // ✅ Stream large datasets import { createReadStream } from 'fs';

    export default async function handler(req, res) { const stream = createReadStream('/tmp/large-file.json'); stream.pipe(res); } ```

    ---

    Still Broken? Check These Too

    1. [Vercel Environment Variables Not Loading](/?guide=vercel-env-vars) — Missing DB_URL causes connection retries (adds 5+ seconds)

    2. [Node.js Cold Start Optimization](/?guide=nodejs-cold-start) — Unused imports and heavy middleware increase startup time

    3. [Background Jobs with Vercel Cron](/?guide=vercel-background-jobs) — Move long operations off the request path entirely

    ---

    Verification Checklist

  • [ ] Confirm your Vercel plan supports maxDuration value
  • [ ] Check function execution time in Vercel Dashboard → Deployments → Function Logs
  • [ ] Add database query timeout (separate from function timeout)
  • [ ] Test with vercel dev locally first
  • [ ] Review dependencies—remove unused packages
  • [ ] Monitor cold starts vs. warm invocations in Vercel Analytics
  • ---

    Official Resources

  • [Vercel Serverless Function Configuration](https://vercel.com/docs/functions/serverless-functions/runtimes#maxduration)
  • [Vercel Function Limits](https://vercel.com/docs/functions/serverless-functions#execution-timeout)
  • [Node.js Connection Pooling Best Practices](https://node-postgres.com/features/pooling)
  • ---

    Found a different variation? Drop it in the comments

    If you hit a 504 with a different root cause—rate limiting, firewall blocks, CDN issues—share your error trace and solution below. Tag @vercel-help for faster responses.

    🔥 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