Vercel: 504 timeout on serverless functions [2026 fix]
Serverless functions exceed 10s timeout or memory limits. Increase function timeout, optimize code, or split into async workers.
TL;DR
Cause: Your Vercel serverless function exceeded the 10-second timeout limit or hit memory constraints during execution.
Fix: Increase function timeout in vercel.json, optimize database queries, or offload long tasks to background jobs.
---
Real Console Error Messages
``` 504 Gateway Timeout Failed to get a response from the function within the timeout period. ```
``` ERROR: Task timed out after 10.00 seconds Function execution took 12843ms to complete ```
``` FaaSError: Function crashed or timed out Status: 504 Gateway Timeout - Vercel Functions ```
``` Node.js process exited with code 137 Out of memory: Kill process (memory usage: 1024MB) ```
``` WARNING: Execution timeout will occur at 10000ms Function still running after 9800ms ```
---
The Problem: Broken Code Example
❌ Broken: Unoptimized Database Query
```javascript // api/users.js - Vercel Serverless Function export default async function handler(req, res) { const db = require('pg'); const client = new db.Client({ connectionString: process.env.DATABASE_URL, }); await client.connect(); // Fetching ALL users without pagination - causes 504 const result = await client.query('SELECT * FROM users;'); // Additional slow operations const enriched = result.rows.map(user => { // Synchronous processing blocks execution return complexCalculation(user); }); await client.end(); res.status(200).json(enriched); } ```
✅ Fixed: Optimized with Timeout & Pagination
```javascript // api/users.js - Production Ready import { Pool } from 'pg';
const pool = new Pool({ connectionString: process.env.DATABASE_URL, max: 5, // Connection pooling idleTimeoutMillis: 30000, });
export default async function handler(req, res) { const page = parseInt(req.query.page || '1'); const limit = 20; const offset = (page - 1) * limit; try { // Paginated query with specific columns const result = await Promise.race([ pool.query( 'SELECT id, name, email FROM users LIMIT $1 OFFSET $2;', [limit, offset] ), new Promise((_, reject) => setTimeout(() => reject(new Error('DB query timeout')), 8000) ) ]); res.status(200).json({ data: result.rows, page, limit, }); } catch (error) { console.error('Database error:', error); res.status(503).json({ error: 'Service temporarily unavailable' }); } } ```
---
Solution 1: Increase Function Timeout
Create or update vercel.json at your project root:
```json { "functions": { "api/heavy-computation.js": { "maxDuration": 30 } } } ```
Important Note: Maximum timeout varies by Vercel plan. We're uncertain if this still applies to 2026 Pro tier pricing—check the official docs link below for your current plan limits.
---
Solution 2: Offload to Background Jobs
Instead of waiting for long operations:
```javascript // api/process-batch.js import { sendToQueue } from '@vercel/functions';
export default async function handler(req, res) { try { // Queue job instead of processing inline await sendToQueue({ name: 'process-large-dataset', payload: req.body, delay: 0, }); res.status(202).json({ message: 'Processing queued' }); } catch (error) { res.status(500).json({ error: error.message }); } } ```
---
Solution 3: Optimize Memory Usage
---
Still broken? Check these too
1. [Cold Start Issues](/guide=vercel-cold-start-performance) – Functions timeout after inactivity due to initialization delays. Solution: Use Vercel's Warm Invocations or implement keep-alive pings.
2. Environment Variable Loading – Missing DATABASE_URL or API credentials cause silent hangs. Verify all env vars are set: vercel env list and check .env.local.
3. [External API Timeouts](/guide=external-api-failures) – Your function calls a slow third-party service. Add request timeouts and implement retry logic with exponential backoff.
4. Memory Leaks – Global variables accumulating data across invocations. Initialize variables inside handlers, not at module level.
5. Large Dependency Bundles – Dependencies bloat function size, increasing cold start time. Run vercel analytics to audit bundle size.
---
Debugging Checklist
vercel logs commandconsole.time() to profile slow sectionsvercel dev before deploying---
Official Documentation
📖 [Vercel Functions Documentation](https://vercel.com/docs/functions/serverless-functions) 📖 [Vercel Timeout Configuration](https://vercel.com/docs/functions/serverless-functions/max-duration)
---
Found a different variation? Drop it in the comments below. Share your 504 error scenario and solution to help future developers at 2am.