Tips > Reliability & Performance

Profile Slow Workflows Using Node Execution Times

When a workflow is slow but you are not sure which node is the bottleneck, inspect individual node execution times in the execution detail view.

Profile a slow n8n workflow by reading each node's execution time in the execution detail view to find the bottleneck. For finer measurement, wrap a suspect section between two Code nodes that record start and end timestamps in $workflow.staticData and report the duration. Most slowdowns trace to a single node making sequential API calls.

Why profile node execution times?

When a workflow is slow but you are not sure which node is the bottleneck, inspect individual node execution times in the execution detail view. You can also add instrumentation with Code nodes to measure time programmatically.

Real-world example: A data sync workflow takes 45 minutes to complete. The execution log reveals that 40 minutes are spent in a single HTTP Request node making sequential API calls.

How do you view node execution times in n8n?

To view execution times in the UI:

1. Open the workflow
2. Click "Executions" in the left sidebar
3. Select a completed execution
4. Each node shows its execution time in the bottom-right corner
5. Click a node to see detailed timing including:
   - Start time
   - Execution duration
   - Number of items processed

How do you measure a workflow section programmatically?

For programmatic profiling, add instrumentation Code nodes:

// Code node: Start Timer (place before suspect section)
// Mode: Run Once for All Items
const startTime = Date.now();

// Store in static data so the end timer can read it
$workflow.staticData.profilingStart = startTime;

return $input.all();
// Code node: End Timer (place after suspect section)
// Mode: Run Once for All Items
const endTime = Date.now();
const startTime = $workflow.staticData.profilingStart || endTime;
const duration = endTime - startTime;

const items = $input.all();
items[0].json._profiling = {
  sectionName: 'API Calls',
  durationMs: duration,
  durationFormatted: `${Math.floor(duration / 60000)}m ${Math.floor((duration % 60000) / 1000)}s`,
  itemsProcessed: items.length,
  msPerItem: items.length > 0 ? (duration / items.length).toFixed(1) : 0,
};

return items;

What are common workflow bottlenecks and their fixes?

Bottleneck Pattern Typical Cause Solution
Single node takes 90%+ time Sequential API calls Batch requests, parallel execution
Many nodes each take a few seconds Large payload passed between nodes Reduce payload size, remove unused fields
Loop iterations are slow Rate limiting or large item payloads Increase batch size, add delays strategically
Total time high, no single bottleneck Too many nodes on canvas Consolidate logic into fewer Code nodes

Related: Flatten Deeply Nested API Responses · Use Docker Compose with Health Checks for n8n and PostgreSQL

Showcase builds

19 complete workflows from my own projects, each with its n8n workflow JSON to import. Showcase entries link the file at the end of the article.

See the showcase builds

Keep reading

190 entries grouped by topic, from first workflow to queue mode. Free, no signup.

Browse the encyclopedia

Need it built?

I design, build and run n8n systems for clients. Every engagement starts with a $1,500 diagnostic audit, credited toward the build.

Book an introductory call