Vercel: 504 timeout on serverless functions [2026 fix]
Serverless function exceeds 10s timeout or cold starts delay response. Increase function timeout, optimize cold starts, or switch to Edge Functions.
Vercel: 504 timeout on serverless functions [2026 fix]
TL;DR
Cause: Your serverless function runs longer than Vercel's default 10-second timeout (Pro plan) or hits cold start delays on first execution. Fix: Increase function timeout invercel.json, optimize database queries, or migrate long-running tasks to background jobs.---
Exact Error Messages from Console Output
Here are real 504 errors you'll see in Vercel logs:
``` ERROR: FUNCTION_INVOCATION_TIMEOUT status: 504 message: "Gateway Timeout" timestamp: "2026-01-15T02:34:21.847Z" ```
``` LambdaTimeout: 10005ms exceeded Function duration: 10012ms Max duration allowed: 10000ms ```
``` Cold start duration: 3421ms Function execution: 7234ms Total: 10655ms (exceeds 10s limit) ```
``` {"errorCode":"FUNCTION_TIMEOUT","statusCode":504,"error":"The request timed out"} ```
``` vercel/[id].js - DEADLINE_EXCEEDED Function did not complete before the deadline Elapsed: 10034ms ```
---
Broken Code → Fixed Code
Problem 1: Database Query Without Timeout
BROKEN: ```javascript // api/users.js - Times out on slow queries export default async function handler(req, res) { const users = await db.query( 'SELECT * FROM users WHERE status = ? LIMIT 10000' ); res.status(200).json(users); } ```
FIXED: ```javascript // api/users.js - Add query timeout + pagination export default async function handler(req, res) { const limit = 100; const offset = (req.query.page || 0) * limit; const users = await db.query( 'SELECT * FROM users WHERE status = ? LIMIT ? OFFSET ?', [true, limit, offset], { timeout: 5000 } // 5s timeout on query ); res.status(200).json(users); } ```
Problem 2: Missing vercel.json Timeout Configuration
BROKEN: ```json // vercel.json - No timeout specified, uses default 10s { "buildCommand": "npm run build", "outputDirectory": "out" } ```
FIXED: ```json // vercel.json - Increase timeout to 30s on Pro plan { "buildCommand": "npm run build", "outputDirectory": "out", "functions": { "api/**/*.js": { "maxDuration": 30 } } } ```
Note: maxDuration caps at 10s (Free), 60s (Pro), 900s (Enterprise). If uncertain about your plan's limits, check your Vercel dashboard → Settings → Usage.
Problem 3: Cold Start + Slow Initialization
BROKEN: ```javascript // api/process.js - Heavy imports on every call const tf = require('@tensorflow/tfjs'); // 8MB, loads every time const redis = require('redis'); // Creates connection on each request
export default async function handler(req, res) { const client = redis.createClient(); // NEW connection = slow const result = await tf.predict(req.body.data); res.json(result); } ```
FIXED: ```javascript // api/process.js - Reuse connections, lazy load let cachedRedis = null;
function getRedisClient() { if (!cachedRedis) { cachedRedis = require('redis').createClient(); } return cachedRedis; }
export default async function handler(req, res) { const client = getRedisClient(); // Reused connection // Move heavy work to background job if (req.body.data.size > 1000) { return res.status(202).json({ taskId: await queueTask(req.body.data) }); } res.json({ status: 'completed' }); } ```
---
Configuration: All Timeout Options Explained
```json { "functions": { "api/long-running.js": { "maxDuration": 60, "memory": 3008 } } } ```
---
Still broken? Check these too
1. [Environment Variables Not Loaded](/?guide=env-vars-timeout) — Secrets taking 2-3s to load? Move DB credentials to connection pool manager.
2. [Edge Functions vs Serverless](/?guide=edge-functions-guide) — For <50ms responses (auth, redirects), use Vercel Edge Functions (unlimited duration).
3. [Streaming Responses for Long Operations](/?guide=vercel-streaming) — Use res.write() chunking instead of buffering entire response.
---
Quick Verification
1. Check actual function duration:
```bash
vercel logs --follow
```
Look for "duration" field — if it's close to 10000ms, you've found it.
2. Test timeout locally: ```bash vercel dev # Hit the endpoint 5 times — first call (cold start) will be slowest ```
3. Monitor after deploy: - Vercel Dashboard → Analytics → Serverless Functions - Check "Duration" graph for spikes
---
Official Resources
Found a different variation? Drop it in the comments. (504 on file uploads? Streaming issues? Custom domains? Let's fix it together.)