Pricing Overview
Stateway's pricing model is built around a single principle: you pay where value is delivered. Value is created at two distinct moments:
- Design-time: when a business rule is captured and versioned (process or decision definition)
- Run-time: when the engine executes or advances a process
Reads (queries) are always free because they strengthen the observability and audit loop — Stateway's core differentiator. Charging for reads would directly penalize compliance and audit use cases, which depend on frequent and unrestricted queries.
SOp: The Unit of Measure
Every billable operation consumes exactly 1 SOp (Stateway Operation). There are no fractions, no weights per operation type — any billable operation is precisely 1 SOp.
Real-time consumption granularity is available via the GET /tenant/usage endpoint:
{
"period": "2026-04",
"total_sops": 18420,
"breakdown": {
"definitions": 12,
"process_instances": 9800,
"task_completions": 6100,
"dmm_evaluations": 1450,
"events_sent": 1058
}
}
Billable Operations — 1 SOp Each
Design-time
| Operation | Endpoint |
|---|---|
| Create process definition (BPMN, JSON, or YAML) | POST /definitions |
| Create new version of process definition | PUT /definitions/:key |
| Create DMN definition | POST /decisions |
| Create new version of DMN definition | PUT /decisions/:key |
Run-time
| Operation | Endpoint |
|---|---|
| Instantiate process | POST /instances |
| Complete human task | POST /tasks/:id/complete |
| Delegate human task | POST /tasks/:id/delegate |
| Send event to instance (message or signal) | POST /instances/:id/events |
| Broadcast signal to all waiting instances | POST /events/signal/:signal_name |
| Correlate external message | POST /events/message/:message_name |
| Evaluate DMN decision directly (without process instance) | POST /decisions/:key/evaluate |
| Suspend instance | POST /instances/:id/suspend |
| Resume suspended instance | POST /instances/:id/resume |
| Terminate instance | POST /instances/:id/terminate |
| Update instance variables | POST /instances/:id/variables |
| Execute instance search | POST /instances/search |
Free Operations — Always
All Reads
Any GET operation on any endpoint is free and unrestricted, with no rate limit per plan. This includes querying instances, execution tokens, history, tasks, timers, webhooks, audit log, usage metrics, and health checks.
Setup and Infrastructure Operations
| Operation | Endpoint | Rationale |
|---|---|---|
| Claim human task | POST /tasks/:id/claim | Queue administration; no execution advance |
| Unclaim human task | POST /tasks/:id/unclaim | Queue administration; no execution advance |
| Create webhook subscription | POST /webhooks | Infrastructure configuration |
| Update webhook subscription | PUT /webhooks/:id | Infrastructure configuration |
| Send test webhook | POST /webhooks/:id/test | Setup validation |
| Create API Key | POST /auth/keys | Authentication operation |
| Timer fires (system-initiated) | — | Not directly controllable by the user; charging would create unpredictable billing |
| Webhook retries (system) | — | Stateway infrastructure cost, not tenant cost |
Why Timers Are Free
A process with timeCycle: R/PT5M (repeating every 5 minutes) would generate 8,640 fires per month without the user touching any endpoint. Charging for timer fires would create completely unpredictable billing for users who rely on timers at scale — for example, SLA processes with automatic escalation or business retry cycles. The cost is already captured in the POST /instances call that activated the process.