WorkflowForge vs Elsa Workflows: .NET Workflow Engine Comparison
I built WorkflowForge, so take this comparison with that bias. I’ve tried to be fair about where Elsa wins.
Two very different bets. WorkflowForge keeps the engine thin and fast: code-only, zero dependencies, compensation baked in. Elsa gives you a designer, built-in persistence, and a broader activity ecosystem. Which trade-off hurts less depends on your team.
All benchmark numbers come from BenchmarkDotNet, 50 iterations per scenario.
At a Glance
| Dimension | WorkflowForge | Elsa Workflows |
|---|---|---|
| Approach | Code-first, C# API | Visual designer + code |
| Core dependencies | Zero | Multiple (EF Core, MediatR, etc.) |
| Execution speed | Microseconds | Milliseconds |
| Memory baseline | 3.49 KB | 1,032 KB |
| Package count | 13 (modular extensions) | Monolithic + modules |
| License | MIT | MIT |
| Compensation/Saga | Built-in | Via custom activities |
| Visual designer | No | Yes (Elsa Studio) |
| Workflow persistence | Extension package | Built-in |
| Target user | .NET developers | Developers + business users |
| Current release | v2.1.1 (2026) | v3.6.0 (March 2026) |
Performance Benchmarks
All numbers from BenchmarkDotNet v0.15.8, .NET 8.0.23, Intel i7-1185G7, 50 iterations.
Execution Time
| Scenario | WorkflowForge | Elsa | Advantage |
|---|---|---|---|
| Sequential (10 ops) | 247 us | 17,617 us | 71x |
| Data Passing (10 ops) | 262 us | 18,222 us | 70x |
| Conditional (10 ops) | 266 us | 21,333 us | 80x |
| Loop (50 items) | 497 us | 64,171 us | 129x |
| Concurrent (8 workers) | 356 us | 94,018 us | 264x |
| Error Handling | 111 us | 7,150 us | 64x |
| Creation Overhead | 13 us | 2,107 us | 162x |
| State Machine (25 transitions) | 68 us | 36,695 us | 511x |
| Parallel (16 ops) | 55 us | 20,891 us | 380x |
Sequential stuff is 70x. State machines hit 511x. The more branching and internal bookkeeping a scenario demands, the wider the gap gets.
Memory Allocation
| Scenario | WorkflowForge | Elsa | Advantage |
|---|---|---|---|
| Sequential (10 ops) | 16.31 KB | 2,984 KB | 183x |
| State Machine (25) | 20.92 KB | 5,949 KB | 284x |
| Concurrent (8 workers) | 121 KB | 19,139 KB | 158x |
| Parallel (16 ops) | 8.1 KB | 4,647 KB | 573x |
| Minimal Baseline | 3.49 KB | 1,032 KB | 296x |
WorkflowForge stays in kilobytes. Elsa lands in megabytes. Parallel (16 ops) is the extreme case: 8.1 KB vs 4,647 KB.
Architecture Differences
WorkflowForge has zero core dependencies. The main NuGet package pulls in nothing. DI, Polly, Serilog, OpenTelemetry are separate extension packages you add when you need them. ILRepack internalizes anything that is bundled, so no version conflicts with your project. Compensation is built in: every operation can declare its own rollback.
Elsa is a heavier stack: EF Core, MediatR, UI packages. That weight buys you persistence (SQL, Mongo, etc.), versioning, and Elsa Studio, a visual designer where non-developers can build and edit workflows. The activity model is geared toward long-running, human-in-the-loop processes.
API Comparison
Defining a Workflow
WorkflowForge:
var workflow = WorkflowForge.CreateWorkflow("OrderProcess")
.AddOperations(
new ValidateOrder(),
new ChargePayment(),
new ShipOrder()
)
.Build();
using var smith = WorkflowForge.CreateSmith();
await smith.ForgeAsync(workflow);
Elsa:
public class OrderWorkflow : WorkflowBase
{
protected override void Build(IWorkflowBuilder builder)
{
builder
.StartWith<ValidateOrder>()
.Then<ChargePayment>()
.Then<ShipOrder>();
}
}
WorkflowForge builds inline, no class per workflow. Elsa needs a class that inherits WorkflowBase, which is how its designer and persistence wire things up.
When to Pick Which
WorkflowForge fits when latency and memory matter for real (containers, tight SLAs, high-throughput pipelines). Your team writes C# and nobody needs a drag-and-drop designer. You want compensation baked in rather than bolted on.
Elsa fits when non-developers need to change flows. Elsa Studio is the reason to pick it. Persistence and versioning ship in the box. Long-running, human-in-the-loop processes are the primary use case. The broader activity catalogue saves you writing custom code.
Resources
| Resource | WorkflowForge | Elsa |
|---|---|---|
| GitHub | animatlabs/workflow-forge | elsa-workflows/elsa-core |
| NuGet | WorkflowForge | Elsa |
| Docs | animatlabs.com/workflow-forge | v3.elsa-workflows.io |