---
updatedAt: 2026-09-24T12:16:19.000Z
agentTools:
  projectIndex: https://docs.sumsub.com/llms.txt
---

# Get started with Workflow Builder

Use Workflow Builder to set up verification steps no-code.

Build custom verification logic with no-code and integrate with Sumsub easily:

1. Navigate to [Workflow Builder](https://cockpit.sumsub.com/checkus#/sdkIntegrations/applicant-workflows/flow) and [set the canvas type](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#define-flow-type).
2. [Add level steps](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#add-level-step), [build conditions](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#build-conditions), [set up review steps](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#set-up-review-steps), and [configure actions](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#configure-actions) according to your needs.
3. [Create multiple versions](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#create-multiple-versions-of-your-workflow) of your flow and test them.
4. [Publish your flow](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#publish-your-flow-and-go-live) to make it available in production.
5. Set up [WebSDK](https://docs.sumsub.com/sumsub/docs/web-sdk) or [MobileSDK](https://docs.sumsub.com/sumsub/docs/mobile-sdk) integration that will handle the whole verification process.
6. [Review verification results](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#review-verification-results).

# Define flow type

With Workflow Builder, you can create flows based on two types of [verification levels](https://docs.sumsub.com/sumsub/docs/configure-verification-levels#configure-verification-steps): **Standard** and **Applicant actions**. Depending on your choice, you'll need to set up your verification flows in the corresponding tabs.

To start building a verification flow:

1. Go to [Workflow Builder](https://cockpit.sumsub.com/checkus#/sdkIntegrations/applicant-workflows/flow) and select **Active workflow**.
2. Navigate to either the **Standard** or **Additional check (Action)** tab, depending on the type of your initial step.
3. Go to the **Draft** view.
4. Proceed to [add the level step](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#add-level-step).

# Add level step

A level node always goes first and is always required to start your workflow, as it will be responsible for initiating a process of collecting information about your applicants. Without this node, the verification flow will not run.

You can map a level node to any **Standard** verification level that obtains necessary information about your applicants, such as, for example:

* Country/State
* Age
* Gender
* IP address
* Data from applicant documents
* Data from Questionnaire
* Metadata
* Other details: high-risk applicants, large transactions
* Internal fraud score results
* External databases results
* Company type

You can also start your verification flow with an **Applicant action** verification level that requires additional verification:

* [Liveness check](https://docs.sumsub.com/sumsub/docs/liveness)
* [Questionnaire](https://docs.sumsub.com/sumsub/docs/questionnaire)
* [Payment method check](https://docs.sumsub.com/sumsub/docs/payment-method-check-advanced)

To add a level node:

1. Set up a [verification level](https://docs.sumsub.com/sumsub/docs/verification-levels).
2. In Workflow Builder, navigate to either the **Standard** or **Additional check (Action)&#x20;**&#x74;ab, depending on the type of your initial step. The first type fits for general applicant verification; the second type is usually used to <Anchor target="_blank" href="doc:applicant-actions">initiate additional checks </Anchor>based on suspicious applicant actions.
3. Right-click anywhere on the canvas and select **Level step**.
4. Specify the name of the node and select a level that you have configured at step 1.
5. Click **Choose next level** to continue building your flow by adding such nodes as [Level step](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#add-level-step), [Condition](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#build-conditions), [Action](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#configure-actions), and [Terminal step](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#assign-terminal-steps).

<Callout icon="🚧" theme="warn">
  ### Important

  - While setting up an applicant workflow, you cannot use the same verification level more than once within a single workflow. If a level is already used, it becomes unavailable for selection. To avoid conflicts in your verification logic, structure your workflow using conditional nodes and separate branches.
  - If two levels are configured in the workflow one after another, the system will transfer both approved and rejected applicants to the next level, resetting the verification state. At the second level, rejected applicants may become approved if they meet this level’s requirements. To prevent this, you can add a [conditional node](<doc: get-started-with-workflow-builder#build-conditions>) between the levels that checks the applicant’s status and allows only approved applicants to pass through.
  - All verification levels must use the same [WebSDK version](https://docs.sumsub.com/sumsub/docs/web-sdk).
</Callout>

# Build conditions

A conditional node is an optional node directing applicants further down the flow, depending on the specified criteria.

For example, you may want to ask applicants from the USA and Canada to go through identity verification, and by that check, you obtain information about their age, country, and so on. Then you decide to decline applicants whose age is less than 16, and for the rest cases, you need to additionally direct applicants to different checks, depending on their country.

To set up a conditional node:

1. Select whether to approve or reject applicants.
2. Set up a logical condition `IF`, ` IF NOT`, `OR`, `OR NOT`, `IS IN`, and `EQUALS` and add necessary values in accordance with your scenario. For example, you can use [blocklists](https://docs.sumsub.com/sumsub/docs/workflow-builder-best-practises#auto-reject-fraudsters) to form a list of suspicious applicants and auto-reject each of them by defining a condition.
3. Add a new conditional branch for another group of applicants, depending on the obtained information.
4. For every branch, proceed with the next step, which can be: [Level step](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#add-level-step), [Action](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#configure-actions), [Terminal step](https://docs.sumsub.com/sumsub/docs/get-started-with-workflow-builder#assign-terminal-steps).

## Condition data types

When you set a condition, you can start typing in the value field to search for applicant data or functions, or enter a value manually. An icon next to each item shows its data type:

<HTMLBlock>{`
<style>
  .dt-list { list-style: none; padding-left: 0; }
  .dt-list li { margin-bottom: 6px; }
  .dt-icon {
    display: inline-block; min-width: 26px; padding: 1px 6px; margin-right: 4px;
    text-align: center; vertical-align: middle;
    border: 1px solid; border-radius: 6px;
    font: 600 13px monospace;
  }
  .dt-record     { background: #f3e8ff; border-color: #d8b4fe; color: #7e22ce; }
  .dt-collection { background: #ffedd5; border-color: #fdba74; color: #c2410c; }
  .dt-map        { background: #fee2d5; border-color: #fca5a5; color: #b91c1c; }
  .dt-boolean    { background: #dbeafe; border-color: #93c5fd; color: #1d4ed8; }
  .dt-function   { background: #fef9c3; border-color: #fde047; color: #a16207; font: italic 600 14px serif; }
  .dt-number     { background: #fce7f3; border-color: #f9a8d4; color: #be185d; font-size: 11px; }
  .dt-text       { background: #cffafe; border-color: #67e8f9; color: #0e7490; }
</style>

<ul class="dt-list">
  <li><span class="dt-icon dt-record">{ }</span> <strong>Record</strong>: a group of related fields, such as an address.</li>
  <li><span class="dt-icon dt-collection">[ ]</span> <strong>Collection</strong>: a list of items, such as all documents an applicant uploaded.</li>
  <li><span class="dt-icon dt-map">{…}</span> <strong>Map</strong>: pairs of keys and values, such as <code>currency: USD</code>.</li>
  <li><span class="dt-icon dt-boolean">●○</span> <strong>Boolean</strong>: either <code>true</code> or <code>false</code>.</li>
  <li><span class="dt-icon dt-function">ƒ</span> <strong>Function</strong>: a value the system calculates using a predefined rule.</li>
  <li><span class="dt-icon dt-number">123</span> <strong>Number</strong>: a numeric value, such as age or amount.</li>
  <li><span class="dt-icon dt-text">ab</span> <strong>Text</strong>: a string of characters, such as a name or country code.</li>
</ul>
`}</HTMLBlock>

## Condition specifics

These are implementation details and behaviors to be aware of when configuring Workflow builder conditions.

<HTMLBlock>{`
<style>
    .rm-Guides #content-head h1 {
        font-size: 32px;
        font-weight: 700;
        line-height: 40px;
        margin-top: 32px;
        margin-bottom: 12px;
    }

    .rm-Guides .markdown-body .heading.heading-2 {
        font-weight: 700;
        font-size: 18px;
        line-height: 24px;
    }

    .rm-Guides .details-list {
        margin-bottom: 44px;
        border-radius: 12px;
        border: 1px solid #e1e5ea;
        overflow: hidden;
    }

    .rm-Guides .details-list details:not(:last-child) {
        border-bottom: 1px solid #e1e5ea;
    }

    .rm-Guides .details-list details {
        padding: 16px;
        font-size: 14px;
        line-height: 24px;
    }

    .rm-Guides .details-list details *:last-child {
        margin-bottom: 0px !important;
    }

    .rm-Guides .details-list summary {
        padding-right: 32px;
        font-size: 16px;
        font-weight: 500;
        line-height: 24px;
    }

    .rm-Guides .details-list summary:after {
        top: 0px;
    }

    .rm-Guides .details-list details[open] summary {
        margin-bottom: 16px;
    }

    .rm-Guides .details-list details[open] {
        background: #f6f7f9;
    }

    .rm-Guides .details-list details[open] code {
        border-radius: 3px;
        background: #e1e5ea;
        font-weight: 600;
    }

    .table-text {
        margin: 24px 0;
        border: 1px solid #e5e5e5;
        border-radius: 8px;
        overflow: hidden;
    }

    .wide-column {
        min-width: 200px;
    }

    table {
        border-collapse: collapse;
        width: 100%;
    }

    th {
        background-color: #f6f7f9;
        border: 1px solid #e5e5e5;
        padding: 8px;
        font-weight: bold;
        text-align: left;
    }

    @media (prefers-color-scheme: dark) {
        [data-color-mode="auto"] th {
            background-color: #303b42;
            border: 1px solid #e5e5e5;
        }
    }

    [data-color-mode="dark"] th {
        background-color: #303b42;
        border: 1px solid #e5e5e5;
    }

    .tiers-table td:nth-child(1),
    .tiers-table td:nth-child(2) {
        vertical-align: middle;
    }

    td {
        border: 1px solid #e5e5e5;
        padding: 8px;
        text-align: left;
        min-width: 200px;
    }

    .tiers-table tbody tr {
        background-color: #fff;
    }

    .tiers-table tbody td {
        background-color: #fff;
    }

    .table-text h2 {
        font-size: 14px;
        margin: 0px;
        color: #384248;
    }

    @media (prefers-color-scheme: dark) {
        [data-color-mode="auto"] .table-text h2 {
            color: #ffff;
        }
    }

    [data-color-mode="dark"] .table-text h2 {
        color: #ffff;
    }

    .table-text p {
        font-size: 14px;
        margin: 0;
        color: #414552;
    }

    @media (prefers-color-scheme: dark) {
        [data-color-mode="auto"] .table-text p {
            color: #ffff;
        }
    }

    [data-color-mode="dark"] .table-text p {
        color: #ffff;
    }

    .table-text a {
        color: #377cf7;
        text-decoration: underline;
    }

    @media (prefers-color-scheme: dark) {
        [data-color-mode="auto"] .table-text a {
            color: #ffff;
        }
    }

    [data-color-mode="dark"] .table-text a {
        color: #ffff;
    }

    .table-text tr:first-child {
        margin-bottom: 20px;
    }

    .tag-green {
        display: inline-block;
        flex-direction: row;
        align-items: center;
        padding: 1px 4px;
        gap: 0px;
        background: #d0f1e8;
        border-radius: 4px;
        font-weight: 500;
        font-size: 12px;
        line-height: 16px;
        color: #115242;
        margin-top: 4px;
    }
    .tag-red {
        display: inline-block;
        flex-direction: row;
        align-items: center;
        padding: 1px 4px;
        gap: 0px;
        background: #ffd2ce;
        border-radius: 4px;
        font-weight: 500;
        font-size: 12px;
        line-height: 16px;
        color: #5e0214;
        margin-top: 4px;
    }
    .tag-purple {
        display: inline-block;
        flex-direction: row;
        align-items: center;
        padding: 1px 4px;
        gap: 0px;
        background: #eedbff;
        border-radius: 4px;
        font-weight: 500;
        font-size: 12px;
        line-height: 16px;
        color: #250960;
        margin-top: 4px;
    }
    .tag-grey {
        display: inline-block;
        flex-direction: row;
        align-items: center;
        padding: 1px 4px;
        gap: 0px;
        background: #edeff2;
        border-radius: 4px;
        font-weight: 500;
        font-size: 12px;
        line-height: 16px;
        color: #393f4e;
        margin-top: 4px;
    }
    .tag-yellow {
        display: inline-block;
        flex-direction: row;
        align-items: center;
        padding: 1px 4px;
        gap: 0px;
        background: #fff4c6;
        border-radius: 4px;
        font-weight: 500;
        font-size: 12px;
        line-height: 16px;
        color: #613400;
        margin-top: 4px;
    }
</style>

<div class="details-list">
    <details>
        <summary>Expand to view additional details on logical conditions, variables, and regular expressions.</summary>
        <div class="rdmd-table">
            <div class="rdmd-table-inner">
                <table class="tiers-table">
                    <thead>
                        <tr>
                            <th>
                                <p>Affected feature</p>
                            </th>
                            <th>
                                <p>Behavior</p>
                            </th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>
                                <p>General expressions</p>
                            </td>
                            <td>
                                <p>
                                    You can use regular expressions to check if a field matches certain conditions.
                                    There are some of the expressions that might be useful:
                                </p>
                                <ul>
                                    <li>
                                        <code>.*[0-9].*</code> and <code>.*\d.*</code> allow you to define whether a
                                        field contains a single digit number, e.g. <code>5</code>.
                                    </li>
                                    <li>
                                        <code>.*\d+.*</code> should be used to check if a field contains only
                                        digits—<code>123456</code>, but not <code>12345a</code>.
                                    </li>
                                </ul>
                                <p>When using expressions, ensure the following conditions:</p>
                                <ul>
                                    <li>
                                        Use the expressions for matching fields (the <b>contains</b> logic) in the
                                        <code>.*\example.*</code> format. The <code>\example</code> expression does not
                                        cover the entire field.
                                    </li>
                                    <li>Code the <code>\</code> symbol as <code>\\</code>.</li>
                                </ul>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <p><code>IS IN</code> , <code>EQUALS</code> logical conditions</p>
                            </td>
                            <td>
                                <p>These conditions are both used for comparison:</p>
                                <ul>
                                    <li><code>IS IN</code> is used for comparing entities, such as client lists.</li>
                                    <li><code>EQUALS</code> is used for comparing specific values.</li>
                                </ul>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <p><code>poi.validUntil.ageInYears</code> variable</p>
                            </td>
                            <td>
                                <p>
                                    Uses negative values for future expiry dates because the value represents the
                                    difference between the current date and the expiry date.
                                </p>
                                <p>
                                    For example, if the current year is 2026, a document expiring in 2056 has a value of
                                    approximately <code>-30</code>. Therefore, use the
                                    <code>less than or equal</code> condition with the value <code>-30</code> to match
                                    documents with 30+ years of validity remaining.
                                </p>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </details>
</div>
`}</HTMLBlock>

## Condition logic

The same applicant can trigger only one condition branch at a time and will follow that scenario. Therefore, when adding a conditional node, keep the following logic in mind:

* **If you create two branches with similar condition settings but different subsequent steps, only the first branch will execute**. Instead of duplicating similar condition branches, add multiple subsequent steps to the same branch.

<Image src="https://files.readme.io/11d9dabaa83684fc6f998b8900c8fb4552f8db87e54f35365ba305dec703cfe8-Conditions_logic_1.png" align="center" framed={true} />

* **If you check multiple different conditions at the same time using separate branches, only one branch will be triggered and its scenario will run**. To evaluate multiple conditions at once, use `AND/OR` operators to create a combined condition within a single branch. Alternatively, for more complex cases, you can use additional conditional nodes to evaluate information step by step and define the next steps accordingly.

<Image src="https://files.readme.io/3aae5961046b76c145580c4a70fe5f5079ec0cbd772d07de7174eb38983f94bd-Conditions_logic_2.png" align="center" framed={true} />

# Set up review steps

You can use the review step node to send applicants for manual review or block them automatically—for example, due to non-compliant personal data—with the final rejection decision. Applicants who got a final rejection will not be allowed to even upload documents.

To set up a review step node:

1. Select the type of node, which can be **Final reject** or **Manual review**.
2. Specify the corresponding assignment:
   * For the final review, choose from the list of [rejection labels](https://docs.sumsub.com/sumsub/docs/receive-and-interpret-results-via-api#final-rejection-labels) as necessary.
   * In case of manual review, applicants are automatically assigned the **Requires action** status and queued for manual processing by compliance officers.  You can also use this functionality to [create Queues](https://docs.sumsub.com/sumsub/docs/case-management#review-queues). Then you will also need to specify the tag you want to add to the applicant when configuring the action.

# Configure actions

An action node adds certain information to applicant profiles for further filtering.

To set up an action node:

1. Add an action type that you want to be performed. You can set the following:
   * [Tag](https://docs.sumsub.com/sumsub/docs/review-results-in-applicant-profile#assign-tags) —  to assign a tag (or several tags) to the applicant.
   * [Note](https://docs.sumsub.com/sumsub/docs/review-results-in-applicant-profile#manage-notes) — to leave a note in the applicant profile.
   * [Source key](https://docs.sumsub.com/sumsub/docs/source-keys) — to add or delete the applicant source key and change their level accordingly.
   * [Case](https://docs.sumsub.com/sumsub/docs/review-cases#create-cases-via-workflow-builder) — to create a case for investigation based on a specific criteria.
2. Proceed with the next step if necessary, or leave as it is for defining the end of the flow.

# Transfer Action workflow into Standard workflow

You can use the **Transfer node** to move applicants from an **Action&#x20;**&#x77;orkflow to a **Standard&#x20;**&#x77;orkflow and continue verification on a selected level.

To configure the transfer:

1. In the Dashboard, open [Integrations](https://cockpit.sumsub.com/checkus/sdkIntegrations/levels/individual?limit=100) → **Workflow builder**, and open the **Action Workflow** tab.
2. Right-click anywhere on the canvas and select Transfer node.
3. In the node settings, select the verification level that applicants should be transferred to.
4. Publish the workflow.

<Callout icon="📘" theme="info">
  ### Note

  - The **Transfer node** cannot be used as a starting point in a workflow. It must be placed after another node and is used to redirect applicants to a **Standard&#x20;**&#x77;orkflow. The node is terminal, meaning no additional nodes can be added after it.
  - The transfer is one-way. Applicants cannot return to the previous workflow after the transfer.
  - Documents submitted for the reset steps become inactive and must be provided again.
</Callout>

# Manage Workflow nodes

Some convenient management options are available for Workflow Builder nodes:

* **Select, copy, and paste**: Choose any nodes and transfer their copies into another Workflow builder canvas. For example, you can reuse the required nodes across multiple keys or copy [workflow examples](https://cockpit.sumsub.com/checkus/sdkIntegrations/workflows/examples) to your own canvas.
* **Organize**: Select nodes and place them in a structured, straightforward order with a single click.

The following table shows how you can manage nodes using shortcuts and canvas buttons:

| Action   | Instructions                                                                                                                                                                         |
| :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Select   | <ul><li>Hold th&#x65;**&#x20;Shift** key and drag over the required nodes to select multiple items.</li><li>Press **Cmd / Ctrl** **+ click** to select an individual node.</li></ul> |
| Copy     | <ul><li>Press **Cmd / Ctrl + C**.</li><li>Click the **Copy** button that appears above the selected node(s).</li></ul>                                                               |
| Paste    | <ul><li>Press **Cmd / Ctrl + V**.</li><li>Right-click anywhere on the canvas and select **Paste** here.</li></ul>                                                                    |
| Organize | Select the required sequence of nodes and click **Organize** above the selected area.                                                                                                |

<Callout icon="📘" theme="info">
  ### Note

  After pasting, some nodes may require additional configuration. For example, if you move nodes to another key, you might need to update the verification levels and tags used.
</Callout>

<Callout icon="👍" theme="success">
  ### Tip

  If you are a [Reusable KYC](https://docs.sumsub.com/sumsub/docs/reusable-kyc) partner, you can copy nodes, save them to a `.txt` file, and share it with other partners so they can paste the nodes directly into their Workflow builder canvas.
</Callout>

# Review flow history

Every time you make changes to your flow and publish it, the previous state is saved as an archived version, allowing you to revert to any of the available versions at any time.

To see the available versions, in the top-right corner, open the menu and select **Version history**.

# Create multiple versions of your workflow

Before putting your flow into operation, you may want to improve it or create one or several alternatives.

To copy your flow and experiment with changing different steps:

1. Click **Copy to Test Workflow**.
2. Switch to the [Test Workflow](https://cockpit.sumsub.com/checkus#/sdkIntegrations/applicant-workflows/test-flow) tab.
3. Change your flow as needed.
4. Click **Run flow**.
5. Click **Generate** to get the permalink to your flow.
6. Pass verification by checking every step.
7. Click **Copy to Active Workflow** to replace your previous flow.
8. Return to the [Active Workflow](https://cockpit.sumsub.com/checkus#/sdkIntegrations/applicant-workflows/flow) tab and proceed with publishing your flow.

# Publish your flow and go live

When the whole logic is built and tested, do not forget to save and publish your draft. The created flow will then be shown in the **Published** view.

To initiate your flow from the Dashboard, click **Run** and [generate a permalink](https://docs.sumsub.com/sumsub/docs/verification-links) for passing verification in the SDK.

# Review verification results

Once the check is performed, you will receive the [applicantReviewed](https://docs.sumsub.com/sumsub/docs/user-verification-webhooks#applicantreviewed) webhook with the verification status. This webhook is triggered in the following cases:

* Applicant completes the flow (either receives a final approval or a final rejection at any stage)
* Applicant receives the [Resubmission requested](https://docs.sumsub.com/sumsub/docs/applicant-statuses) status while completing the flow

To review results via applicant profiles, go to the [Applicants](https://cockpit.sumsub.com/checkus#/applicants/individual?limit=10\&page=0) page, select an applicant, and check on **Summary**, which is a comprehensive report that includes the applicant data, check results, and uploaded documents.

<HTMLBlock>{`
<div id="video-player-data" data-videoid="WxGxlAiPUBk"></div>
`}</HTMLBlock>