Vercel: 504 timeout on serverless functions [2026 fix]

Serverless function exceeds 10s timeout or memory limit. Increase function timeout, optimize code, or split into faster endpoints.

Vercel: 504 timeout on serverless functions [2026 fix]

TL;DR

Cause: Your Vercel serverless function is either taking longer than the 10-second default timeout or hitting memory constraints.

Fix: Increase the function timeout in vercel.json, optimize database queries with connection pooling, or offload heavy processing to background jobs.

---

Real Console Error Messages

Here are exact error outputs you'll see:

``` ERROR: FUNCTION_TIMEOUT The serverless function exceeded the maximum execution time of 10s. Request ID: xxx-xxx-xxx Duration: 10000ms ```

``` 504 Gateway Timeout vercel.com The request took too long to process and was terminated. ```

``` Error: connect ETIMEDOUT 192.168.x.x:5432 ERR_HTTP_REQUEST_TIMEOUT at TCPConnectWrap.afterConnect ```

``` FATAL ERROR: CALL_USAGE_EXCEEDED Function invoked too many times. Memory exhausted. Heap out of memory at 512MB (Pro plan limit) ```

``` WARNING: Cold start taking 8234ms Function initialization + execution = 10234ms TOTAL ```

---

The Problem: Code Side-by-Side

❌ BROKEN CODE

```javascript // api/process-data.js - DEFAULT 10s TIMEOUT export default async function handler(req, res) { // No timeout configuration const data = await fetch('https://slow-api.example.com/data'); const json = await data.json(); // Looping through 50k records synchronously let result = []; for (let i = 0; i < 50000; i++) { const processed = await database.query( SELECT * FROM users WHERE id = ${i} ); result.push(processed); } res.json(result); } ```

Problems:

  • Default 10-second timeout (Pro) or 60s (Enterprise)
  • Creating new database connection for EACH loop iteration
  • N+1 query problem
  • Synchronous processing of 50k items
  • ✅ FIXED CODE

    Step 1: Set timeout in vercel.json

    ```json { "functions": { "api/process-data.js": { "maxDuration": 30, "memory": 1024 } } } ```

    Step 2: Optimize the function itself

    ```javascript // api/process-data.js - OPTIMIZED import { pool } from '../lib/db';

    export default async function handler(req, res) { try { // Use connection pooling (reusable connections) const client = await pool.connect(); // Single query instead of 50k queries const { rows } = await client.query( 'SELECT * FROM users LIMIT 50000' ); client.release(); // Process in parallel batches, not sequentially const batchSize = 100; const results = []; for (let i = 0; i < rows.length; i += batchSize) { const batch = rows.slice(i, i + batchSize); const processed = await Promise.all( batch.map(row => processUserData(row)) ); results.push(...processed); } res.status(200).json({ count: results.length, data: results.slice(0, 100) // Paginate response }); } catch (error) { console.error('Function error:', error); res.status(500).json({ error: 'Processing failed' }); } }

    async function processUserData(user) { // Lightweight processing return { ...user, processed_at: new Date() }; } ```

    Step 3: For long operations, use queues

    If processing *must* take >30s, offload to [background jobs](/?guide=vercel-cron-jobs):

    ```javascript // api/queue-processing.js - RETURNS IMMEDIATELY export default async function handler(req, res) { const jobId = crypto.randomUUID(); // Queue the work asynchronously fetch(process.env.QUEUE_URL, { method: 'POST', body: JSON.stringify({ jobId, data: req.body }) }).catch(err => console.error(err)); // Return immediately (no timeout) res.json({ jobId, status: 'queued' }); } ```

    ---

    Configuration Details

    maxDuration limits by plan:

  • Free: 10 seconds (fixed)
  • Pro: 10 seconds (default, can increase to 60)
  • Enterprise: 60 seconds (default, can increase to 900)
  • I'm explicitly uncertain about: Vercel may have adjusted Pro tier limits between 2025-2026; verify in your account dashboard under "Function settings."

    ---

    Still broken? Check these too

    1. Cold starts + timeout combined: Initialization takes 3-5s, leaving only 5-7s for actual work. Solution: Use [Edge Functions](/?guide=vercel-edge-functions) for latency-sensitive code, or keep functions warm with scheduled pings.

    2. Database connection pooling missing: Every function spawn creates a new connection. Fix: Use connection pools (e.g., pg-pool) or serverless-compatible databases (Supabase, PlanetScale).

    3. Large response payloads: Returning 50MB of data causes timeout. Solution: Stream responses, paginate results, or compress with gzip middleware.

    ---

    Official Resources

  • [Vercel Serverless Function Limits](https://vercel.com/docs/serverless-functions/overview#limits)
  • [How to configure maxDuration](https://vercel.com/docs/serverless-functions/configuring-function-properties)
  • ---

    Found a different variation? Drop it in the comments—504 errors manifest differently across databases and runtimes.

    🔥 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