Skip to main content
Every workflow block lives in its own folder under src/blocks/{block-id}/, where block-id is the id you pass to defineWorkflowBlock (see block definition). The filenames are fixed. The SDK and CLI resolve handlers by name, so the files must match exactly. Which files are required depends on the block’s type, which you set in block.ts.

Trigger block

A trigger block subscribes to external events and fires a workflow run for each one. It has a three-file lifecycle: activate runs when the workflow is enabled (set up the subscription), trigger runs for each incoming event, and deactivate runs when the workflow is disabled (tear down the subscription).

Step block

A step block runs inline each time a workflow reaches it. The only required handler is execute. Add finish.ts only when execute returns {type: "defer"} and the step needs to wait for an external signal before continuing.
Handler files are server-only and must use the .ts extension. The CLI rejects .tsx variants like execute.tsx or activate.tsx.