Hosted workflow engine

Background jobs that keep going.

Clevix Flow runs background jobs and multi-step workflows for your app. Write functions in your own code. We run each step reliably.

Events, schedules and API calls can start a run.

Runs

See every workflow run and step.

Live
NameStatusLast run
process-orderSuccess2m ago
send-notificationSuccess12m ago
generate-reportWaiting18m ago
cleanup-tempSuccess34m ago

Built for durable work

What a workflow needs to keep going.

Start work in different ways. Save progress. Retry safely. See what happened when a run needs attention.

SDK sync

Keep workflow functions in your own code and sync them to Clevix Flow.

Events, cron and API

Start runs from events, schedules or direct API calls.

Saved steps

Each step is saved so a run can survive failures and deploys.

Step retries

Retry one failed step without starting the whole run again.

Long sleeps

Sleep for minutes or days without keeping a worker busy.

Wait for events

Pause a run until the event it needs arrives.

Call functions

Call another function and keep the full run connected.

Concurrency

Control how many runs can execute at the same time.

Debounce

Combine rapid events before they start unnecessary work.

Batching

Group events and process them together.

Runs and alerts

See every run, step, event and error with metrics and alerts.

Workspaces and roles

Separate production from testing and share access with your team.

Run history Success

Workflow run

IDrun_01H7K9Q2E3T6
Started26 Oct 2026, 12:43
Duration6m 02s
WorkspaceDevelopment
load-userStep 1
wait-a-daySleep · 1 day
send-emailStep 2

TypeScript SDK

Write functions in your app.

Use the SDK in your own code. Sync the function to Clevix Flow. Its steps can run, sleep and continue later.

TS workflow.ts
import { Flow } from "@clevix/flow";

const flow = new Flow({ id: "shop" });

export const sendWelcome = flow.createFunction(
  { id: "send-welcome", retries: 5 },
  { event: "user/signed-up" },
  async ({ event, step }) => {
    const user = await step.run("load-user", () => db.users.find(event.data.userId));
    await step.sleep("wait-a-day", "1d");
    await step.run("send-email", () => email.send(user.email, "Welcome!"));
  },
);

How it works

From your code to a running workflow.

Keep the logic in your app. Clevix Flow handles the run state around it.

  1. 1

    Write

    Define a function and its steps in your own code.

  2. 2

    Sync

    Sync the function to your Clevix Flow app.

  3. 3

    Start

    Use an event, a schedule or an API call.

  4. 4

    Inspect

    Follow every run, step and error in the dashboard.