From the creators of Netflix Conductor

Stop paying per state transition.

Unmeshed replaces ASL JSON state machines with real code in Java, Go, Python, or TypeScript. Durable execution, retries, and observability all come built in, and pricing stays flat no matter how many transitions you run.

Start FreeContact UsFree tier, no credit card required.

What does per-transition billing cost at your volume?

Move the slider to your monthly state-transition volume and compare a metered bill with a flat one.

100K10M transitions / month1B

AWS Step Functions, Standard Workflows

$250/ month (est.)

Grows with every state transition your workflows make.

Unmeshed

Flat plan

The same at every volume, no per-transition metering. See pricing

Estimate based on AWS published Standard Workflows pricing; verify with the AWS calculator.

Three ways out of the state machine

Write code, not ASL JSON

Author workflows in Java, Go, Python, or TypeScript. Steps are ordinary functions, testable, reviewable, and versioned like the rest of your codebase.

Predictable bill

No per-transition metering. Your workflows can grow from thousands to billions of steps without the invoice growing with them. Pricing stays flat and predictable.

Cloud-agnostic

Run in the cloud or self-host on your own infrastructure. Unmeshed runs alongside your existing AWS services, so you keep calling Lambda, SQS, and everything else.

How each approaches orchestration

Both platforms run durable workflows. They differ in how workflows are written, billed, and where they can run.

AreaHow Step Functions approaches itHow Unmeshed approaches it
Authoring modelWorkflows are defined in Amazon States Language (ASL), a JSON-based state machine specification, or composed visually in Workflow Studio.Define workflows however your team prefers, drag-and-drop them in the UI, or write them in code with SDKs for Java, Go, Python, and TypeScript. Both produce the same JSON process definition: portable, reviewable, and version-controlled right alongside your application.
Billing modelStandard Workflows are billed per state transition; Express Workflows are billed by request count and duration.Flat, predictable pricing with no per-transition or per-action fees. Free tier available, no credit card required.
Cloud portabilityRuns as a managed service within AWS.Cloud-agnostic. Deploy in the cloud or self-host, alongside your existing AWS services.
Local development & testingState machines are JSON definitions; AWS provides tooling for testing them locally and in the console.Steps are ordinary functions in your language. Run, unit-test, and debug them locally like any other code.
Human-in-the-loopSupported through callback patterns where a task waits for an external signal to resume.Built-in human-in-the-loop steps for approvals and manual actions, visible in the same execution view.
SchedulingScheduled executions are typically configured through Amazon EventBridge rules.Standard 5-field cron scheduling, down to one-minute intervals, from recurring jobs to month-long durable runs, plus event triggers.
ObservabilityExecution history and monitoring through the AWS console and CloudWatch.Built-in execution visibility with search across workflows and steps, retries, and durable execution history.

Evaluating more than one option? See how Unmeshed compares to Temporal, Camunda, and others

Same logic. One is code.

state-machine.asl.json
{
  "StartAt": "ChargePayment",
  "States": {
    "ChargePayment": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:charge",
      "Retry": [
        {
          "ErrorEquals": ["States.TaskFailed"],
          "MaxAttempts": 3
        }
      ],
      "Next": "SendReceipt"
    },
    "SendReceipt": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:receipt",
      "End": true
    }
  }
}
workflow.ts
import { UnmeshedClient } from "@unmeshed/sdk";

const client = new UnmeshedClient({
  /* your credentials */
});

// Plain functions: unit-test, review, and
// version them like any other code.
const chargePayment = async (order: Order) =>
  payments.charge(order);

const sendReceipt = async (order: Order) =>
  receipts.send(order);

// Retries, durability, and observability are
// handled by the platform.
client.startPolling([
  { name: "charge-payment", namespace: "default", worker: chargePayment },
  { name: "send-receipt", namespace: "default", worker: sendReceipt },
]);

Frequently asked questions

Orchestrate in code. Pay a flat rate.

Free tier, no credit card. Keep your AWS services.