Vercel: 504 timeout on serverless functions [2026 fix]

Serverless function exceeds 10s timeout or cold starts fail; increase timeout + optimize code paths.

Vercel: 504 timeout on serverless functions [2026 fix]

TL;DR

Cause: Your serverless function is taking longer than Vercel's default 10-second timeout (Pro plan) or hitting memory limits during execution.

Fix: Increase function timeout in vercel.json and optimize cold start performance by reducing bundle size.

---

Real Console Error Messages

Here are exact error outputs you'll see:

``` Error 504: GATEWAY_TIMEOUT The request took too long to process and timed out. Duration: 10000 ms ```

``` Error: Task timed out after 10.01 seconds at Runtime.invokeAsync [as handler] (file:///var/task/api/route.js:1:1) ```

``` 504 Gateway Timeout Vercel: The lambda took too long to respond. X-Vercel-Id: sfo1::xyz123 ```

``` WARNING: Cold start duration exceeded 5000ms (5.2s) Function initialization: 3400ms User code execution: 1800ms ```

``` Errror: ECONNREFUSED when calling external API Timeout waiting for database connection after 10000ms ```

---

Broken Code vs. Fixed Code

Problem 1: Default Timeout Too Short

BROKEN: ```javascript // api/process-data.js - No timeout configuration export default async function handler(req, res) { const data = await fetchLargeDataset(); // Takes 12+ seconds const processed = await complexCalculation(data); // 5+ seconds res.status(200).json(processed); } ```

FIXED: ```json // vercel.json { "functions": { "api/process-data.js": { "maxDuration": 30 } } } ```

```javascript // api/process-data.js - Same handler, now with sufficient timeout via config export default async function handler(req, res) { const data = await fetchLargeDataset(); const processed = await complexCalculation(data); res.status(200).json(processed); } ```

Problem 2: Synchronous Operations Blocking Execution

BROKEN: ```javascript // api/webhook.js export default async function handler(req, res) { // Returns response immediately but continues processing res.status(200).json({ received: true }); // This runs AFTER response sent, eats timeout budget await processWebhookAsync(req.body); // 15 seconds await sendNotifications(); // 8 seconds } ```

FIXED: ```javascript // api/webhook.js import { scheduleTask } from '@vercel/functions';

export default async function handler(req, res) { // Queue background work immediately scheduleTask(async () => { await processWebhookAsync(req.body); await sendNotifications(); }); // Return response without waiting res.status(200).json({ received: true, queued: true }); } ```

Problem 3: Massive Bundle Size Causing Cold Starts

BROKEN: ```javascript // api/analyze.js import TensorFlow from 'tensorflow'; // 50MB import LargeLibrary from 'huge-lib'; // 40MB import * as AllUtils from './utils/everything.js'; // 15MB

export default async function handler(req, res) { const result = TensorFlow.analyze(req.body); res.json(result); } ```

FIXED: ```javascript // api/analyze.js // Dynamic imports - only load when needed let TensorFlow;

export default async function handler(req, res) { if (!TensorFlow) { TensorFlow = await import('tensorflow'); } const result = TensorFlow.analyze(req.body); res.json(result); } ```

```json // vercel.json - Also configure for Node.js 20+ faster runtime { "buildCommand": "npm run build", "functions": { "api/**/*.js": { "memory": 3008, "maxDuration": 25 } } } ```

---

Configuration Notes

Timeout Limits by Plan:

  • Hobby: 10 seconds (cannot increase)
  • Pro: 10 seconds default → max 60 seconds
  • Enterprise: up to 900 seconds
  • *We are uncertain whether maxDuration honors fractional seconds (e.g., 10.5) in all Vercel runtimes as of 2026—test before production if sub-second precision matters.*

    ---

    Still broken? Check these too

    1. Database Connection Pooling — Each new function invocation creates fresh connections. Implement connection pooling with serverless-compatible libraries like node-postgres with max: 1 per function.

    2. External API Rate Limiting — If calling third-party APIs, add exponential backoff + retry logic. A 504 often masks downstream timeouts. See [related: API rate limit strategies](/?guide=api-retry-patterns).

    3. Memory Exhaustion — Increase function memory in vercel.json from default 1024MB to 3008MB. Monitor actual usage in Vercel dashboard; memory contention causes CPU throttling. See [related: memory optimization](/?guide=serverless-memory).

    ---

    Official Documentation

    [Vercel Functions Timeout Limits](https://vercel.com/docs/functions/serverless-functions/runtimes#timeout)

    [Vercel maxDuration Configuration](https://vercel.com/docs/projects/project-configuration#functions)

    ---

    Found a different variation? Drop it in the comments below—especially if you encountered 504s from specific database drivers, image processing libraries, or regional latency issues.

    🔥 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