Netlify Scheduled Functions Debugging 2026
Master debugging Netlify scheduled functions with real error patterns, production code, and console troubleshooting techniques.
TL;DR
Netlify scheduled functions (cron jobs) fail silently by default. Debug using CloudWatch-style logs, explicit error handling, and local testing with netlify functions:invoke. Check execution history in the Netlify dashboard, verify timezone settings (UTC only), and use structured logging to catch timezone/scheduling mismatches.
---
Why Netlify Scheduled Functions Are Hard to Debug
Unlike traditional cron jobs with system logs, Netlify scheduled functions run in a serverless context. Your function executes, but if it fails, you might not know for hours. The dashboard shows execution history, but console logs disappear after function execution completes.
Key difference from local development: Your console.log() statements exist only during execution—they're captured in invocation logs, not persisted to your terminal.
---
Real Error Messages You'll Encounter
Error 1: Timezone Mismatch
``` Error: Function scheduled for 2026-01-15T09:00:00Z but executed at 2026-01-15T14:30:22Z Schedule expression invalid or timezone offset applied ```Why it happens: Netlify scheduled functions run in UTC only. If your cron expression uses local time, it will never trigger at expected moments.
Error 2: Execution Timeout
``` FunctionError: RequestId: abc123 Process exited before completing request. Duration: 10000.23 ms Max duration: 10000 ms ```Why it happens: Default timeout is 10 seconds. Database queries or API calls that exceed this silently fail.
Error 3: Missing Environment Variables
``` TypeError: Cannot read property 'DB_URL' of undefined at Object.<anonymous> (/var/task/scheduled-function.js:8:15) ```Why it happens: Environment variables defined in .env locally aren't automatically available in Netlify Functions. You must set them in Site Settings → Build & Deploy → Environment.
---
Production-Ready Debugging Pattern
Step 1: Structured Logging
Replace basic console.log() with structured logging that persists in Netlify's invocation history:
```javascript // netlify/functions/scheduled-cleanup.js export const handler = async (event, context) => { const executionId = context.invocationId; const startTime = Date.now();
// Structured logger for Netlify dashboard visibility const log = (level, message, data = {}) => { console.log( JSON.stringify({ timestamp: new Date().toISOString(), executionId, level, message, ...data, }) ); };
try { log('INFO', 'Scheduled function started', { scheduledTime: event.scheduledTime, cron: event.cron, });
// Verify environment if (!process.env.DB_URL) { throw new Error('DB_URL environment variable not set'); }
// Your async work const result = await performCleanup();
const duration = Date.now() - startTime; log('SUCCESS', 'Cleanup completed', { duration, recordsAffected: result.count, });
return { statusCode: 200, body: JSON.stringify({ message: 'Scheduled function executed successfully', duration, }), }; } catch (error) { const duration = Date.now() - startTime; log('ERROR', 'Function failed', { error: error.message, stack: error.stack, duration, });
// Still return 200 so Netlify doesn't retry return { statusCode: 500, body: JSON.stringify({ error: error.message, executionId, }), }; } };
async function performCleanup() { // Implement with proper error handling return { count: 0 }; } ```
Step 2: Local Testing with Netlify CLI
Test scheduled functions locally before deploying:
```bash
Install Netlify CLI v17.0.0+ (verify in official docs)
npm install -g netlify-cliTest invocation
netlify functions:invoke scheduled-cleanup --payload '{"scheduledTime":"2026-01-15T09:00:00Z"}' ```This triggers your function with mock event and context objects, showing console output immediately.
Step 3: netlify.toml Configuration
Define your scheduled function with explicit timezone and timeout settings:
```toml [[functions]] name = "scheduled-cleanup" schedule = "0 9 * * *" timeout = 30 # seconds (max 900)
[functions.environment] DB_URL = "your-db-url" TIMEZONE = "UTC" # Netlify always uses UTC; this is for your app logic ```
Note: The schedule field uses cron syntax. 0 9 * * * = 9:00 AM UTC every day. Verify in [official Netlify docs](https://docs.netlify.com/functions/overview/#schedule-function-execution).
Step 4: Monitoring Execution History
1. Go to Netlify Dashboard → Your Site 2. Navigate to Functions tab 3. Click your scheduled function → Invocations 4. View execution logs, timestamps, and durations 5. Look for patterns: all failures at specific times suggest timezone issues
---
Common Debugging Scenarios
Scenario: Function Never Executes
1. Check cron syntax: Use [crontab.guru](https://crontab.guru) to verify. 0 0 * * * runs daily at midnight UTC.
2. Verify site is deployed: Scheduled functions don't run on preview branches.
3. Check site status: Functions won't execute if your site is paused/suspended.
4. Review execution history: If Invocations tab is empty, the function hasn't been triggered.
Scenario: Function Executes But Produces No Results
1. Add explicit logging at each step (see structured logging above)
2. Check environment variables: Log process.env keys to confirm they exist
3. Verify timeout isn't exceeded: Default 10s is tight for database operations
4. Test database connection separately: Create a test endpoint to verify credentials
Scenario: Timezone-Related Bugs
Netlify runs everything in UTC. If you need to trigger at 9 AM EST:
```javascript // Wrong: This assumes EST timezone schedule = "0 9 * * *" // Runs 9 UTC, not 9 EST
// Right: 9 EST = 14 UTC (EST is UTC-5) schedule = "0 14 * * *"
// For daylight savings, use 13 UTC (EDT is UTC-4) // Consider triggering more frequently and handling time logic in code ```
---
Debugging Checklist
context.invocationId for tracing.envnetlify functions:invoke---
Related Guides
---
What am I missing?
Have you debugged Netlify scheduled functions? Share your toughest issues, successful strategies, or error patterns I should cover in the comments. Did you solve timezone bugs differently? Found undocumented behaviors? All corrections and additions welcome—this guide improves with your experience.