Copy as Markdown[View as Markdown](/docs/sdk/classes/FlowBuilder.md)

***

# Class: FlowBuilder\<TMessageId>

Defined in: flow-builder.ts:220

Build EventCatalog flow resources using a fluent API.

`FlowBuilder` is useful when you want to define flows in code and then write the generated `Flow` resource with `writeFlow`. The builder outputs the normal EventCatalog `Flow` shape, so the persisted catalog remains standard markdown/frontmatter.

`nextSteps` is the authoring API. When `build()` is called, a single next step is normalized to `next_step` and multiple next steps are normalized to `next_steps`.

## Examples[​](#examples "Direct link to Examples")

```
import utils, { FlowBuilder } from '@eventcatalog/sdk';

const { writeFlow } = utils('/path/to/eventcatalog');

const flow = FlowBuilder.create({
  id: 'PaymentFlow',
  name: 'Payment Flow',
  version: '1.0.0',
  markdown: '# Payment Flow',
})
  .addStep({
    id: 'Customer places order',
    nextSteps: [{ id: 'PlaceOrder', label: 'places order' }],
  })
  .addMessageStep({
    id: 'PlaceOrder',
    message: { id: 'PlaceOrder' },
    nextSteps: [{ id: 'PaymentService', label: 'process payment' }],
  })
  .addServiceStep({
    id: 'PaymentService',
    service: { id: 'PaymentService' },
  })
  .build();

await writeFlow(flow);
```

```
import { FlowBuilder } from '@eventcatalog/sdk';

type PaymentMessageId = 'PlaceOrder' | 'PaymentProcessed';

const flow = FlowBuilder.create<PaymentMessageId>({
  id: 'TypedPaymentFlow',
  name: 'Typed Payment Flow',
  version: '1.0.0',
  markdown: '# Typed Payment Flow',
})
  .addMessageStep({
    id: 'PlaceOrder',
    nextSteps: [{ id: 'PaymentProcessed' }],
  })
  .addMessageStep({
    id: 'PaymentProcessed',
  })
  .build();
```

## Type Parameters[​](#type-parameters "Direct link to Type Parameters")

| Type Parameter                  |
| ------------------------------- |
| `TMessageId` *extends* `string` |

## Methods[​](#methods "Direct link to Methods")

### addActorStep()[​](#addactorstep "Direct link to addActorStep()")

> **addActorStep**(`step`): [`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

Defined in: flow-builder.ts:471

Add an actor step.

#### Parameters[​](#parameters "Direct link to Parameters")

| Parameter | Type                                                                 | Description             |
| --------- | -------------------------------------------------------------------- | ----------------------- |
| `step`    | [`FlowActorStepInput`](/docs/sdk/type-aliases/FlowActorStepInput.md) | The actor step payload. |

#### Returns[​](#returns "Direct link to Returns")

[`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

#### Example[​](#example "Direct link to Example")

```
FlowBuilder.create({
  id: 'OrderFlow',
  name: 'Order Flow',
  version: '1.0.0',
  markdown: '',
})
  .addActorStep({
    id: 'Customer',
    actor: { name: 'Customer' },
  });
```

***

### addContainerStep()[​](#addcontainerstep "Direct link to addContainerStep()")

> **addContainerStep**(`step`): [`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

Defined in: flow-builder.ts:408

Add a container step.

Alias for `addDataStoreStep`.

#### Parameters[​](#parameters-1 "Direct link to Parameters")

| Parameter | Type                                                                         |
| --------- | ---------------------------------------------------------------------------- |
| `step`    | [`FlowDataStoreStepInput`](/docs/sdk/type-aliases/FlowDataStoreStepInput.md) |

#### Returns[​](#returns-1 "Direct link to Returns")

[`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

***

### addCustomStep()[​](#addcustomstep "Direct link to addCustomStep()")

> **addCustomStep**(`step`): [`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

Defined in: flow-builder.ts:587

Add a custom flow step.

#### Parameters[​](#parameters-2 "Direct link to Parameters")

| Parameter | Type                                                                   | Description              |
| --------- | ---------------------------------------------------------------------- | ------------------------ |
| `step`    | [`FlowCustomStepInput`](/docs/sdk/type-aliases/FlowCustomStepInput.md) | The custom step payload. |

#### Returns[​](#returns-2 "Direct link to Returns")

[`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

#### Example[​](#example-1 "Direct link to Example")

```
FlowBuilder.create({
  id: 'PaymentFlow',
  name: 'Payment Flow',
  version: '1.0.0',
  markdown: '',
})
  .addCustomStep({
    id: 'ManualReview',
    custom: {
      title: 'Manual review',
      type: 'manual',
    },
  });
```

***

### addDataProductStep()[​](#adddataproductstep "Direct link to addDataProductStep()")

> **addDataProductStep**(`step`): [`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

Defined in: flow-builder.ts:434

Add a data product step.

If a version is not provided, EventCatalog resolves the latest matching data product version when rendering the flow.

#### Parameters[​](#parameters-3 "Direct link to Parameters")

| Parameter | Type                                                                             | Description                    |
| --------- | -------------------------------------------------------------------------------- | ------------------------------ |
| `step`    | [`FlowDataProductStepInput`](/docs/sdk/type-aliases/FlowDataProductStepInput.md) | The data product step payload. |

#### Returns[​](#returns-3 "Direct link to Returns")

[`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

#### Example[​](#example-2 "Direct link to Example")

```
FlowBuilder.create({
  id: 'OrderFlow',
  name: 'Order Flow',
  version: '1.0.0',
  markdown: '',
})
  .addDataProductStep({
    id: 'OrderAnalytics',
    dataProduct: { id: 'OrderAnalytics', version: '1.0.0' },
  });
```

***

### addDataStoreStep()[​](#adddatastorestep "Direct link to addDataStoreStep()")

> **addDataStoreStep**(`step`): [`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

Defined in: flow-builder.ts:385

Add a data store step.

Data store steps reference container resources in EventCatalog. If a version is not provided, EventCatalog resolves the latest matching container version when rendering the flow.

#### Parameters[​](#parameters-4 "Direct link to Parameters")

| Parameter | Type                                                                         | Description                  |
| --------- | ---------------------------------------------------------------------------- | ---------------------------- |
| `step`    | [`FlowDataStoreStepInput`](/docs/sdk/type-aliases/FlowDataStoreStepInput.md) | The data store step payload. |

#### Returns[​](#returns-4 "Direct link to Returns")

[`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

#### Example[​](#example-3 "Direct link to Example")

```
FlowBuilder.create({
  id: 'OrderFlow',
  name: 'Order Flow',
  version: '1.0.0',
  markdown: '',
})
  .addDataStoreStep({
    id: 'OrdersDB',
    container: { id: 'OrdersDB', version: '1.0.0' },
  });
```

***

### addExternalSystemStep()[​](#addexternalsystemstep "Direct link to addExternalSystemStep()")

> **addExternalSystemStep**(`step`): [`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

Defined in: flow-builder.ts:511

Add an external system step.

#### Parameters[​](#parameters-5 "Direct link to Parameters")

| Parameter | Type                                                                                   | Description                       |
| --------- | -------------------------------------------------------------------------------------- | --------------------------------- |
| `step`    | [`FlowExternalSystemStepInput`](/docs/sdk/type-aliases/FlowExternalSystemStepInput.md) | The external system step payload. |

#### Returns[​](#returns-5 "Direct link to Returns")

[`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

#### Example[​](#example-4 "Direct link to Example")

```
FlowBuilder.create({
  id: 'PaymentFlow',
  name: 'Payment Flow',
  version: '1.0.0',
  markdown: '',
})
  .addExternalSystemStep({
    id: 'Stripe',
    externalSystem: {
      name: 'Stripe',
      summary: 'Payment provider',
      url: 'https://stripe.com',
    },
  });
```

***

### addFlowStep()[​](#addflowstep "Direct link to addFlowStep()")

> **addFlowStep**(`step`): [`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

Defined in: flow-builder.ts:548

Add a sub-flow step.

#### Parameters[​](#parameters-6 "Direct link to Parameters")

| Parameter | Type                                                                     | Description                |
| --------- | ------------------------------------------------------------------------ | -------------------------- |
| `step`    | [`FlowSubFlowStepInput`](/docs/sdk/type-aliases/FlowSubFlowStepInput.md) | The sub-flow step payload. |

#### Returns[​](#returns-6 "Direct link to Returns")

[`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

#### Example[​](#example-5 "Direct link to Example")

```
FlowBuilder.create({
  id: 'OrderFlow',
  name: 'Order Flow',
  version: '1.0.0',
  markdown: '',
})
  .addFlowStep({
    id: 'PaymentFlow',
    flow: { id: 'PaymentFlow', version: '1.0.0' },
  });
```

***

### addMessageStep()[​](#addmessagestep "Direct link to addMessageStep()")

> **addMessageStep**(`step`): [`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

Defined in: flow-builder.ts:309

Add a message step.

Message steps can reference an event, command, or query id.

#### Parameters[​](#parameters-7 "Direct link to Parameters")

| Parameter | Type                                                                                   | Description               |
| --------- | -------------------------------------------------------------------------------------- | ------------------------- |
| `step`    | [`FlowMessageStepInput`](/docs/sdk/type-aliases/FlowMessageStepInput.md)<`TMessageId`> | The message step payload. |

#### Returns[​](#returns-7 "Direct link to Returns")

[`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

#### Example[​](#example-6 "Direct link to Example")

```
FlowBuilder.create({
  id: 'OrderFlow',
  name: 'Order Flow',
  version: '1.0.0',
  markdown: '',
})
  .addMessageStep({
    id: 'OrderConfirmed',
    title: 'Order confirmed',
    message: { id: 'OrderConfirmed', version: '1.0.0' },
  });
```

***

### addServiceStep()[​](#addservicestep "Direct link to addServiceStep()")

> **addServiceStep**(`step`): [`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

Defined in: flow-builder.ts:345

Add a service step.

#### Parameters[​](#parameters-8 "Direct link to Parameters")

| Parameter | Type                                                                     | Description               |
| --------- | ------------------------------------------------------------------------ | ------------------------- |
| `step`    | [`FlowServiceStepInput`](/docs/sdk/type-aliases/FlowServiceStepInput.md) | The service step payload. |

#### Returns[​](#returns-8 "Direct link to Returns")

[`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

#### Example[​](#example-7 "Direct link to Example")

```
FlowBuilder.create({
  id: 'OrderFlow',
  name: 'Order Flow',
  version: '1.0.0',
  markdown: '',
})
  .addServiceStep({
    id: 'OrderService',
    service: { id: 'OrderService', version: '1.0.0' },
  });
```

***

### addStep()[​](#addstep "Direct link to addStep()")

> **addStep**(`step`): [`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

Defined in: flow-builder.ts:276

Add a generic flow step.

Generic steps are useful for business process stages that do not map to another catalog resource.

#### Parameters[​](#parameters-9 "Direct link to Parameters")

| Parameter | Type                                                       | Description       |
| --------- | ---------------------------------------------------------- | ----------------- |
| `step`    | [`FlowStepInput`](/docs/sdk/type-aliases/FlowStepInput.md) | The step payload. |

#### Returns[​](#returns-9 "Direct link to Returns")

[`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

#### Example[​](#example-8 "Direct link to Example")

```
FlowBuilder.create({
  id: 'OrderFlow',
  name: 'Order Flow',
  version: '1.0.0',
  markdown: '',
})
  .addStep({
    id: 'Calculate',
    title: 'Calculate totals',
    nextSteps: [{ id: 'OrderConfirmed' }],
  });
```

***

### build()[​](#build "Direct link to build()")

> **build**(): `Flow`

Defined in: flow-builder.ts:616

Build the EventCatalog flow resource.

#### Returns[​](#returns-10 "Direct link to Returns")

`Flow`

A `Flow` resource that can be written with `writeFlow`.

***

### create()[​](#create "Direct link to create()")

> `static` **create**<`TMessageId`>(`flow`): [`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

Defined in: flow-builder.ts:249

Create a flow builder.

The created builder can add steps and then produce a normal `Flow` resource with `build()`.

#### Type Parameters[​](#type-parameters-1 "Direct link to Type Parameters")

| Type Parameter                  |
| ------------------------------- |
| `TMessageId` *extends* `string` |

#### Parameters[​](#parameters-10 "Direct link to Parameters")

| Parameter | Type                                                             |
| --------- | ---------------------------------------------------------------- |
| `flow`    | [`FlowBuilderInput`](/docs/sdk/type-aliases/FlowBuilderInput.md) |

#### Returns[​](#returns-11 "Direct link to Returns")

[`FlowBuilder`](/docs/sdk/classes/FlowBuilder.md)<`TMessageId`>

#### Example[​](#example-9 "Direct link to Example")

```
const flow = FlowBuilder.create({
  id: 'PaymentFlow',
  name: 'Payment Flow',
  version: '1.0.0',
  markdown: '# Payment Flow',
}).build();
```
