Vercel: 504 timeout on serverless functions [2026 fix]

Serverless functions exceed 10-second execution limit or cold start delays. Optimize function logic, increase timeout via vercel.json, or split into smaller functions.

TL;DR

Cause: Your serverless function exceeded Vercel's 10-second timeout limit or is experiencing cold start delays from heavy dependencies.

Fix: Reduce function execution time, set maxDuration in vercel.json (up to 60 seconds on Pro), or split heavy work into async background jobs.

---

Real Console Error Messages

Here are exact error patterns you'll see:

``` 504: GATEWAY_TIMEOUT The request took too long to complete. This indicates that a function took longer than the maximum duration and was terminated. ```

``` Error: Task timed out after 10 seconds. Attempt to call a function that took too long. ERR_FUNCTION_TIMEOUT ```

``` Fetch error: The function did not complete before the timeout of 10 seconds status: 504 ```

``` Error: connect ETIMEDOUT 127.0.0.1:3000 (Usually means cold start + slow initialization) ```

``` WARNING: Function took 12453ms to complete. This exceeds the 10000ms timeout for your plan. ```

---

Broken Code → Fixed Code

Problem 1: Database Query Without Timeout

BROKEN: ```javascript // api/fetch-users.js export default async function handler(req, res) { const db = require('pg'); const client = new db.Client(process.env.DATABASE_URL); await client.connect(); // No timeout set const result = await client.query('SELECT * FROM users'); // Slow query hangs await client.end(); return res.json(result.rows); } ```

FIXED: ```javascript // api/fetch-users.js export default async function handler(req, res) { const db = require('pg'); const client = new db.Client({ connectionString: process.env.DATABASE_URL, connectionTimeoutMillis: 5000, // 5 second timeout query_timeout: 8000, // 8 second query timeout }); try { await client.connect(); const result = await client.query('SELECT * FROM users LIMIT 100'); // Add LIMIT await client.end(); return res.json(result.rows); } catch (error) { await client.end(); return res.status(500).json({ error: 'Database timeout' }); } } ```

Problem 2: Heavy Synchronous Processing

BROKEN: ```javascript // api/process-image.js export default async function handler(req, res) { const sharp = require('sharp'); const image = req.body.imageData; // Synchronous image processing blocks everything const processed = await sharp(image) .resize(1920, 1080) .rotate(45) .blur(15) .greyscale() .normalize() .toBuffer(); // Can take 15+ seconds res.json({ success: true }); } ```

FIXED: ```javascript // api/process-image.js import { Queue } from '@vercel/functions';

export default async function handler(req, res) { const jobId = crypto.randomUUID(); // Queue async job instead of blocking await fetch(process.env.BACKGROUND_JOB_URL, { method: 'POST', body: JSON.stringify({ jobId, imageData: req.body.imageData }) }); // Return immediately res.json({ jobId, status: 'processing' }); }

// crons/process-images.js - separate long-running function export default async function handler(req, res) { const sharp = require('sharp'); const { imageData } = req.body; const processed = await sharp(imageData) .resize(1920, 1080) .rotate(45) .blur(15) .greyscale() .normalize() .toBuffer(); res.json({ success: true }); } ```

Problem 3: Missing vercel.json Timeout Config

BROKEN: ```json // vercel.json (no timeout set) { "buildCommand": "npm run build" } ```

FIXED: ```json // vercel.json { "buildCommand": "npm run build", "functions": { "api/**/*.js": { "maxDuration": 30, "memory": 1024 }, "api/heavy-processing.js": { "maxDuration": 60, "memory": 3008 } } } ```

Important caveat: I'm uncertain whether all plan tiers support maxDuration beyond 10 seconds in 2026—verify your Vercel plan. Pro and Enterprise typically allow 30-60 seconds. Hobby tier is locked to 10 seconds.

---

Still Broken? Check These Too

1. [Cold Start Delays](/?guide=vercel-cold-starts) - First request after deployment takes 3-5 seconds. Minimize dependencies, use @vercel/node utilities, avoid heavy imports at module level.

2. [Database Connection Pooling](/?guide=postgres-connection-limits) - Creating new DB connection per request exhausts connection limits. Use pg-boss or connection pooling middleware (PgBouncer on backend).

3. External API Timeouts - If your function calls third-party APIs, they might be slow. Implement timeout wrappers: Promise.race([apiCall(), timeout(5000)]).

---

Next Steps

1. Check current function duration in Vercel dashboard → Function logs 2. Add explicit timeout values to vercel.json 3. Profile code with console.time() to find slow sections 4. Move work to [background jobs or cron functions](https://vercel.com/docs/crons)

Official Reference: [Vercel Serverless Functions Documentation](https://vercel.com/docs/functions)

---

Found a different variation? Drop it in the comments—especially if you hit timeout issues with specific databases, frameworks, or 2026+ Vercel pricing tiers.

🔥 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