Vercel: 504 timeout on serverless functions [2026 fix]

Serverless function exceeds 10s timeout or cold starts spike memory. Increase function timeout, optimize bundle size, or enable concurrency.

Vercel: 504 timeout on serverless functions [2026 fix]

TL;DR

Cause: Your serverless function exceeded Vercel's 10-second execution timeout (or 60s for Pro/Enterprise) or cold starts are consuming your memory allocation.

Fix: Increase maxDuration in vercel.json, optimize dependencies, or split logic into background jobs.

---

Real Console Error Messages

Here are exact error patterns you'll see:

``` Error: Function execution took 12050ms, exceeding the 10000ms timeout. 504 Gateway Timeout ```

``` {"errorMessage":"Task timed out after 10.00 seconds","errorType":"TimeoutError"} ```

``` Duration: 10001.23 ms Billed Duration: 10001 ms Memory Size: 1024 MB Max Memory Used: 1087 MB ```

``` ERR_FUNCTION_TIMEOUT: Your serverless function exceeded the maximum execution time. Increasing maxDuration may help. Contact support for limits on your plan. ```

``` Fetch failed: upstream timeout at https://your-domain.vercel.app/api/endpoint (10s elapsed) ```

---

Broken Code → Fixed Code

Problem 1: Missing maxDuration Config

Broken: ```json { "buildCommand": "npm run build", "outputDirectory": "out" } ```

Fixed: ```json { "buildCommand": "npm run build", "outputDirectory": "out", "functions": { "api/**/*.js": { "maxDuration": 30 } } ``` Note: maxDuration is in seconds. Hobby plan: max 10s. Pro: max 60s. Enterprise: up to 900s. We're uncertain if Vercel's limits changed in late 2025; check the [official Vercel docs](https://vercel.com/docs/functions/serverless-functions/runtimes#timeout-limits) for your current plan tier.

Problem 2: Synchronous Database Calls in Hot Loop

Broken: ```javascript export default async function handler(req, res) { const users = []; for (let i = 0; i < 1000; i++) { const user = await db.query(SELECT * FROM users WHERE id = ${i}); users.push(user); } res.status(200).json(users); } ```

Fixed: ```javascript export default async function handler(req, res) { const users = await db.query( SELECT * FROM users WHERE id IN (?, ?, ?, ...), Array.from({length: 1000}, (_, i) => i) ); res.status(200).json(users); } ```

Problem 3: Large Dependencies Not Tree-Shaken

Broken: ```javascript import moment from 'moment'; // 67KB minified

export default function handler(req, res) { const date = moment().format('YYYY-MM-DD'); res.json({date}); } ```

Fixed: ```javascript // Use date-fns (12KB) or native Date API instead const date = new Date().toISOString().split('T')[0];

export default function handler(req, res) { res.json({date}); } ```

For Node.js 18+, the native Intl API is optimized.

---

Still broken? Check these too

1. Cold Start Overhead: First invocation after deploy takes 2-5s. If your baseline is already 8s, cold starts push you over. Use [Concurrency](/?guide=vercel-concurrency) settings or Reserved Instances on Pro/Enterprise to pre-warm functions.

2. External API Cascades: Your function waits for 3+ sequential HTTP calls (e.g., auth → database → cache). Add aggressive timeouts to upstream calls (2-3s each) and implement circuit breakers. Don't wait forever for slow services.

3. Memory Pressure & Garbage Collection: If your function uses 90%+ of allocated memory, GC pauses spike during execution. Increase memory allocation in vercel.json: ```json "functions": { "api/**/*.js": { "memory": 3008 } } ``` Higher memory = faster CPU + faster execution. See [related memory tuning guide](/?guide=vercel-memory-optimization).

---

Verification Steps

1. Check Vercel Logs: ```bash vercel logs --follow ``` Filter by Duration and Max Memory Used to spot patterns.

2. Test Locally with vercel dev: ```bash vercel dev curl http://localhost:3000/api/endpoint ``` If it completes in <10s locally, the issue is production-specific (cold starts, regional latency, or load).

3. Add Timing Telemetry: ```javascript const start = Date.now(); // ... your logic ... console.log(Execution: ${Date.now() - start}ms); ```

---

Long-Term Prevention

  • Offload to Background Jobs: Use Vercel Cron, Inngest, or Bull Queue for tasks >5s.
  • Enable Response Streaming: For large responses, stream data instead of buffering.
  • Monitor with Observability: Integrate Sentry, LogRocket, or Datadog to catch slow functions before they hit production.
  • Review Build Output: vercel build should complete in <5 minutes. If not, you have unused dependencies.
  • ---

    Official Resources

  • [Vercel Serverless Functions Timeout Limits](https://vercel.com/docs/functions/serverless-functions/runtimes#timeout-limits)
  • [Vercel maxDuration Configuration](https://vercel.com/docs/functions/serverless-functions/api#maxduration)
  • [Vercel Observability & Monitoring](https://vercel.com/docs/observability)
  • ---

    Found a different variation? Drop it in the comments. If you're hitting 504s with a different root cause (e.g., Postgres connection pooling, middleware overhead), let us know the exact error and your setup.

    🔥 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