Skip to main content
Version: v0.1.4-beta.2

Modeler

The Easy BPM Modeler is the workspace for designing BPMN 2.0 process definitions and reusable forms. It has a component palette, a canvas, a properties panel, validation feedback, BPMN import/export actions, and deployment to the configured Easy BPM backend.

Easy BPM Modeler light mode

Access and theme​

Open the modeler at the configured frontend URL, for example:

http://localhost:3000

Use an account with modeler permissions. In local QA environments the default account is usually:

username: admin
password: admin

The screenshots in this page use light mode. Use the sun/moon button in the top bar to switch themes.

  1. Create forms first when human tasks need form rendering.
  2. Add process components to the canvas.
  3. Give each runtime node a stable Element ID.
  4. Connect the nodes with sequence flows.
  5. Configure variables, forms, APIs, messages, timers, gateways, and boundary events.
  6. Resolve validation errors in the right panel.
  7. Export the BPMN XML or deploy the process to the backend.
  8. Start a test instance from the Task Portal, BPM Admin, or the process API.

Main areas​

AreaPurpose
Component paletteDrag participants, events, tasks, gateways, messages, and boundary events onto the canvas.
CanvasArrange nodes and create sequence flows between connection points.
Properties panelConfigure the selected process, node, or connection.
Validation summaryShows errors and warnings for missing flows, duplicate IDs, invalid forms, invalid timers, and boundary placement.
Import and ExportLoad or save BPMN 2.0 XML for process definitions. Export validates the model before creating the BPMN file.
DeploySends BPMN 2.0 XML to the backend as a new process definition version.

Modeler component palette

Modeler reference and build guides​

Use this page as a reference for the Modeler interface, component palette, and property fields. Use the Build Processes guides for end-to-end workflows, runtime behavior, API calls, and operational examples. Some configuration appears in both places so that each component remains understandable in the Modeler while the guides can explain how it behaves after deployment.

Common properties​

Most executable components share these properties.

PropertyUse
Element IDStable runtime ID used in exported JSON, task records, process history, and flow references. Use a readable ID such as manager_review.
LabelHuman-friendly text shown on the canvas.
DescriptionOptional documentation for the step.
Input variablesValues copied into the task or component context.
Output variablesValues copied from a task/component result into process variables.

The modeler validates duplicate node IDs and empty IDs. IDs should start with a letter and use letters, numbers, hyphens, or underscores where the UI validates a key-like value.

Process format​

For current releases, process definitions are imported, exported, and deployed as BPMN 2.0 XML. The examples in this page use short configuration snippets for readability, but the actual process artifact exchanged with the backend is BPMN XML.

Variables and mappings​

Process variables live in the process state panel. They can be reused by tasks, service steps, APIs, messages, call activities, and code tasks.

Mapping modeMeaning
From Global / variableReads a process variable.
Static Value / staticUses a literal value configured in the modeler.
Output targetWrites the result into a process variable.

Example task input:

{
"targetName": "amount",
"type": "number",
"source": "variable",
"value": "requestAmount"
}

Example task output:

{
"target": "variable",
"sourceName": "approved",
"type": "boolean",
"value": "approved"
}

Connections and conditions​

Click a sequence flow to edit its condition. Conditions are most often used after an exclusive gateway.

Example approved branch:

${approved} == true

Example rejected branch:

${approved} == false

Parallel gateway branches should normally be unconditional.

Diagram structure​

Participant​

Participant component

Use a participant/pool as a visual BPMN lane or container. It does not execute process logic and cannot receive sequence flows.

PropertyExampleNotes
Element IDpool_salesVisual identifier only.
LabelSalesDisplayed vertically on the pool.
DescriptionSales process participantOptional.
Width560Minimum is enforced by the UI.
Height190Minimum is enforced by the UI.

Flow events​

Use these components to define where a process starts, finishes, or pauses. See Create a Process for an end-to-end process example.

Start Event​

Start Event component

Use a start event to begin a process instance. A process must have at least one start event.

PropertyExampleNotes
Element IDstartStable start node ID.
LabelStartDisplay label.
DescriptionBegin request intakeOptional.

Validation rules:

RuleMeaning
No incoming flowA start node cannot be reached from another node.
At least one outgoing flowIt must route to the first real step.

End Event​

End Event component

Use an end event to complete the process instance.

PropertyExampleNotes
Element IDendStable end node ID.
LabelEndDisplay label.
DescriptionProcess completedOptional.

Validation rules:

RuleMeaning
At least one incoming flowThe process must be able to reach the end.
No outgoing flowEnd nodes finish the path.

Timer Event​

Timer Event component

Use a timer event when the process should wait before continuing to the next node.

PropertyExampleNotes
Element IDwait_30_secondsStable timer ID.
LabelWait 30 secondsDisplay label.
Timeout (seconds)30Required and must be greater than 0.

Example export:

{
"id": "wait_30_seconds",
"type": "TimerEvent",
"properties": {
"timeoutSeconds": 30
},
"next": ["after_wait"]
}

Task components​

Tasks represent work performed by people, external APIs, internal mappings, custom code, or AI. The Build Processes guides provide deeper runtime examples for User Tasks, API Tasks, and Code Tasks.

Human Task​

Human Task component

Use a human task when a user or group must complete work in the Task Portal.

PropertyExampleNotes
Element IDmanager_reviewUsed as the task nodeId.
LabelManager ReviewTask title shown to users.
Form Keyqa_manager_reviewAttach the deployed form key, not the numeric database ID.
Assignee(s)manager1, manager2Comma-separated users.
Candidate GroupsMANAGERS, FINANCEComma-separated group codes.
Task Inputsamount <- requestAmountValues copied from process variables or static values into task variables.
Task Outputsapproved -> approvedValues written back to process variables when the task is completed.

Example configuration:

{
"id": "manager_review",
"type": "HumanTask",
"config": {
"formId": "qa_manager_review",
"assignee": "manager1",
"candidateGroups": "MANAGERS",
"inputs": [
{
"targetName": "amount",
"type": "number",
"source": "variable",
"value": "requestAmount"
}
],
"outputs": [
{
"target": "variable",
"sourceName": "approved",
"type": "boolean",
"value": "approved"
}
]
}
}

Use required fields in the form schema when the task must validate data before completion.

API Task​

API Task component

Use an API task to call an external HTTP endpoint through the worker. API task failure can be caught by an Error Boundary. If no boundary handles the failure, the instance is marked FAILED and BPM Admin shows the recorded error. Worker requests that do not complete within 2 minutes follow the same failure path.

PropertyExampleNotes
URLhttps://api.example.com/checkEndpoint called by the worker.
MethodGET, POST, PUT, DELETEHTTP method.
Auth Typenone, bearer, basic, apikeyAuth strategy.
Auth RefEXT_API_AUTHEnvironment variable reference.
API Key Inheader or queryOnly for API key auth.
API Key NameX-API-KeyHeader or query parameter name.
Request Body (JSON){ "id": "${requestId}" }JSON body, mainly for POST and PUT.
API Output Mappingdata.status -> apiStatusJSON path from response to process variable.

Bearer auth example:

{
"id": "risk_check",
"type": "APITask",
"properties": {
"url": "https://api.example.com/risk",
"method": "POST",
"auth": {
"type": "bearer",
"ref": "RISK_API_TOKEN"
},
"body": {
"amount": "${amount}"
},
"outputs": [
{
"target": "variable",
"sourceName": "data.status",
"type": "string",
"value": "riskStatus"
}
]
}
}

API key auth example:

{
"auth": {
"type": "apikey",
"ref": "PARTNER_API_KEY",
"in": "header",
"key": "X-API-Key"
}
}

Service Task​

Service Task component

Use a service task for variable attribution and internal mappings. It is useful when the process needs to set or transform variables without waiting for a human task.

PropertyExampleNotes
Input MappingsrequestAmount <- amountReads process variables or static values.
Output Mappingspriority -> priorityWrites mapped values to process variables.

Example:

{
"id": "set_priority",
"type": "ServiceTask",
"config": {
"inputs": [
{
"targetName": "amount",
"type": "number",
"source": "variable",
"value": "requestAmount"
}
],
"outputs": [
{
"target": "variable",
"sourceName": "priority",
"type": "string",
"value": "priority"
}
]
}
}

Code Task​

Code Task component

Use a code task to execute Java code from uploaded JAR files. The modeler stores variable mappings; JAR upload, class discovery, and method binding are managed in the Code Task area of BPM Admin.

PropertyExampleNotes
Input Variable Mappingamount -> method parameterProcess values passed into the Java method.
Output Variable Mappingreturn.total -> totalJava result fields written to process variables.

Example modeler export:

{
"id": "calculate_score",
"type": "CodeTask",
"properties": {
"inputs": [
{
"targetName": "amount",
"type": "number",
"source": "variable",
"value": "requestAmount"
}
],
"outputs": [
{
"source": "variable",
"sourceValue": "score",
"type": "number",
"targetVariable": "riskScore"
}
]
}
}

AI Task (BETA)​

AI Task component

Use an AI task to send prompts to an AI provider and store the response in a process variable.

PropertyExampleNotes
ProvideropenaiProvider ID.
Modelgpt-4.1-miniProvider model name.
CredentialStored credential or environment refConfigured in backend/admin security.
System PromptYou classify requests.Optional system instruction.
User PromptClassify {{requestText}}Prompt can reference process variables.
Tuningtemperature, topP, maxTokensProvider-specific tuning values.
Output VariableaiDecisionProcess variable receiving the response.

Example:

{
"id": "classify_request",
"type": "AiTask",
"properties": {
"providerId": "openai",
"modelName": "gpt-4.1-mini",
"promptTemplate": "Classify this request: {{requestText}}",
"outputVariable": "aiClassification",
"tuningParams": {
"temperature": 0.2,
"maxTokens": 500
}
}
}

Agent Process (Feature Flag)​

Agent Process editor

Agent Process is the feature-flagged resource for agentic orchestration. Use it when a BPM process needs to call an AI-driven agent that can evaluate context, produce a structured decision, and write outputs back to process variables.

Enable it in the modeler before running or building the frontend:

$env:EASY_BPM_MODELER_AGENTIC_ORCHESTRATION="true"
npm run dev

When enabled, the modeler shows the Agent Process resource and an Agent Process BPM node. The Agent Process editor can import/export Agent Process JSON drafts and deploy reusable agent definitions to POST /agent-processes. A BPM process then calls one of those deployed agents with an AgentProcessCall node.

Agent Process component

Agent Process provider configuration:

PropertyExampleNotes
Providergemini or azure-openaiProvider ID used by the backend provider factory.
Modelgemini-3.5-flash or gpt-4o-miniModel name or Azure deployment name sent to the provider.
Endpointhttps://<resource>.openai.azure.com/openai/v1/responsesOptional for most providers. Required for azure-openai.
Credential Ref$GEMINI_API_KEY or $AZURE_OPENAI_API_KEYEnvironment variable references must start with $. Stored credential IDs do not use $.
GoalResolve customer complaintMain objective for the agent.
InstructionsInvestigate, classify, decide next actionOperational instructions included in the prompt context.
ConstraintsRefunds over 500 require approvalGuardrails and business policy reminders.

For local AI testing, providerId: "ollama" works without a credential reference and defaults to http://localhost:11434/api/generate with model llama3.2 when the endpoint is not overridden.

For Azure OpenAI, set providerId to azure-openai, use the Azure deployment name in modelName, and provide an Azure endpoint plus a credential reference such as $AZURE_OPENAI_API_KEY.

Agent Process definition example:

{
"resourceType": "AgentProcess",
"processKey": "customer-support-resolution",
"processName": "Customer Support Resolution",
"goal": "Resolve customer complaint and ensure customer satisfaction.",
"provider": {
"providerId": "gemini",
"modelName": "gemini-3.5-flash",
"credentialRef": "$GEMINI_API_KEY"
},
"steps": []
}

Configure the token in the backend runtime environment, not in the frontend:

$env:GEMINI_API_KEY="AIza..."

The deploy API requires a non-empty goal. If you include provider, it must include non-empty providerId and modelName. When processKey is omitted, the backend falls back to key, then to a slugified processName.

Agent Process templates​

The Agent Process editor includes starter templates for Customer Support Resolution, Invoice Exception Review, and Employee Onboarding Coordinator. Select a template, then review and adapt the process key, goal, instructions, constraints, provider, model, endpoint, and credential reference before deployment.

Templates are editable starting points only. They do not create or deploy an agent automatically, and provider credentials must remain configured in the backend runtime environment.

BPM invocation properties:

PropertyExampleNotes
Agent Process Keycustomer-support-resolutionMust match the deployed Agent Process processKey.
Goal OverrideResolve this complaintOptional runtime goal for this call.
Wait for CompletionenabledThe process waits for the agent decision before continuing.
Timeout Seconds120Optional timeout metadata for the call.
Input mappingscomplaintText <- complaintTextSends BPM variables into the agent context.
Output mappingsdecision -> agentDecisionWrites agent output fields back to BPM variables.

Agent Process call example:

{
"id": "resolve_with_agent",
"type": "AgentProcessCall",
"config": {
"agentProcessKey": "customer-support-resolution",
"goal": "Resolve the customer complaint from the current process variables.",
"waitForCompletion": true,
"timeoutSeconds": 120,
"inputs": [
{
"targetName": "complaintText",
"type": "string",
"source": "variable",
"value": "complaintText"
}
],
"outputs": [
{
"source": "variable",
"sourceValue": "decision",
"type": "string",
"targetVariable": "agentDecision"
}
]
}
}

Deploy order:

  1. Enable EASY_BPM_MODELER_AGENTIC_ORCHESTRATION=true and open the modeler.
  2. Create and deploy the Agent Process from the Agent Process resource.
  3. Add an Agent Process node to the BPM process and set Agent Process Key to the deployed agent key.
  4. Deploy the BPM process, start an instance, and inspect the process variables for the agent decision/output.

Documentation components​

Documentation Note​

Documentation Note component

Use a Documentation Note to add context, assumptions, business rules, or implementation notes directly on the process canvas. Add it from the Documentation section of the component palette, then set its title and note text in the properties panel.

Documentation Notes can be visually associated with other diagram elements. They are for readers of the model only: Easy BPM does not export them as executable BPMN nodes, and they do not affect process execution.

Subprocess components​

Use call activities to compose reusable processes. See Call Activities for runtime relationships, variable mapping, and error handling.

Call Activity​

Call Activity component

Use a call activity to start a child process and wait for it to complete.

PropertyExampleNotes
Target Process Keyfinance-reviewThe process key of the subprocess.
Propagate All VariablesenabledCopies all parent variables to the child. Explicit mappings are ignored when enabled.
Input Variable MappingparentOrderId -> orderIdSends parent variables into the child.
Output Variable MappingchildStatus -> financeStatusCopies child results back to the parent.

Example:

{
"id": "finance_subprocess",
"type": "CallActivity",
"config": {
"processKey": "finance-review",
"propagateAllVariables": false,
"inputs": [
{
"targetName": "orderId",
"type": "string",
"source": "variable",
"value": "orderId"
}
],
"outputs": [
{
"source": "variable",
"sourceValue": "approved",
"type": "boolean",
"targetVariable": "financeApproved"
}
]
}
}

Gateway components​

Exclusive Gateway​

Exclusive Gateway component

Use an exclusive gateway to route the process down one path based on conditions.

PropertyExampleNotes
Element IDapproval_decisionGateway ID.
Flow condition${approved} == trueConfigured on outgoing sequence flows, not on the gateway node itself.

Validation rules:

RuleMeaning
At least one incoming flowThe gateway must be reachable.
At least one outgoing flowThe gateway must route somewhere.
Warning for multiple outgoing flows without conditionsAdd conditions when there are multiple routes.

Typical routing:

Flow to finance_review: ${approved} == true
Flow to rejection_notice: ${approved} == false

Parallel Gateway​

Parallel Gateway component

Use a parallel gateway to fork into multiple branches or join multiple branches.

PatternShape
Fork1 incoming flow, 2 or more outgoing flows.
Join2 or more incoming flows, 1 outgoing flow.

Do not use branch conditions on parallel gateway outgoing flows unless you have a very specific runtime reason. The modeler warns when parallel outgoing flows have conditions.

Message event components​

Message events connect process execution to internal or external publishers. See Message Events for correlation, idempotency, and API examples.

Message Start​

Message Start component

Use a message start when a message should start or activate a message-based process entry.

PropertyExampleNotes
Message NameOrderReceivedMessage name expected by the process.
Timeout (seconds)60Optional. Empty means no timeout.
Message Payload to ProcessorderId -> orderIdWrites received payload into process variables.

Example:

{
"id": "message_start",
"type": "MessageStartEvent",
"message": {
"name": "OrderReceived",
"correlationKeys": [],
"timeoutSeconds": 60,
"payload": [
{
"source": "variable",
"sourceValue": "orderId",
"type": "string",
"targetVariable": "orderId"
}
]
}
}

Message Intermediate Catch​

Message Catch component

Use a catch event when a running process must wait for a message.

PropertyExampleNotes
Message NamePaymentReceivedMessage to wait for.
Timeout (seconds)300Optional timeout.
Correlation Keys (CSV)orderId, customerIdKeys used to match the message to the instance.
Message Payload to ProcesspaymentStatus -> paymentStatusWrites payload fields to variables.

Example:

{
"id": "wait_payment",
"type": "MessageIntermediateCatchEvent",
"message": {
"name": "PaymentReceived",
"correlationKeys": ["orderId"],
"timeoutSeconds": 300,
"payload": [
{
"source": "variable",
"sourceValue": "status",
"type": "string",
"targetVariable": "paymentStatus"
}
]
}
}

Message Intermediate Throw​

Message Throw component

Use a throw event when the process should publish/send a message.

PropertyExampleNotes
Message NameApprovalCompletedMessage emitted by the process.
Correlation Keys (CSV)orderIdKeys sent with the message.
Process to Message Payloadapproved -> approvedProcess variables copied into the message payload.

Example:

{
"id": "send_approval_result",
"type": "MessageIntermediateThrowEvent",
"message": {
"name": "ApprovalCompleted",
"correlationKeys": ["orderId"],
"payload": [
{
"targetName": "approved",
"type": "boolean",
"source": "variable",
"value": "approved"
}
]
}
}

Boundary event components​

Boundary events attach to active work and provide alternate paths for errors, messages, or timeouts.

Error Boundary​

Error Boundary component

Attach an error boundary to a task when failures should follow a recovery path instead of failing the whole instance.

PropertyExampleNotes
Error CodeERR_TIMEOUTOptional classification for the error path.
Exception VariableapiErrorMessageOptional process variable that receives the exception message.
Attached to parent taskshown in greenThe boundary must be attached to a valid task.

Validation rules:

RuleMeaning
Must be attached to a taskDrag it onto a task node.
No incoming flowIt is triggered by the attached task failure.
At least one outgoing flowIt must route to a recovery node.

Example recovery path:

{
"id": "api_error_boundary",
"type": "ErrorBoundaryEvent",
"attachedTo": "risk_check",
"config": {
"errorCode": "ERR_API",
"exceptionVariable": "riskCheckError"
},
"next": ["manual_recovery"]
}

When an API task fails and this boundary is attached, the instance follows the boundary path and is not marked FAILED. Without a boundary, the instance is marked FAILED, including worker timeouts after 2 minutes, and BPM Admin displays the error.

Message Boundary​

Message Boundary component

Attach a message boundary when an active task can be interrupted or recovered by an incoming message.

PropertyExampleNotes
Message NameCancelRequestedIncoming message to catch.
Correlation Keys (CSV)orderIdUsed to match the correct process instance.
Message Payload to Processreason -> cancelReasonWrites payload into process variables.
Attached to parent taskshown in greenMust be attached to a valid task.

Example:

{
"id": "cancel_boundary",
"type": "MessageBoundaryEvent",
"attachedTo": "manager_review",
"message": {
"name": "CancelRequested",
"correlationKeys": ["orderId"],
"payload": [
{
"source": "variable",
"sourceValue": "reason",
"type": "string",
"targetVariable": "cancelReason"
}
]
},
"next": ["cancelled_end"]
}

Timer Boundary​

Timer Boundary component

Attach a timer boundary to a task when the task has a timeout path.

PropertyExampleNotes
Timeout (seconds)3600Required and must be greater than 0.
InterruptingYesInterrupts the parent task when timeout fires.
Attached to parent taskshown in greenMust be attached to a valid task.

Example:

{
"id": "manager_sla_timeout",
"type": "TimerEvent",
"attachedTo": "manager_review",
"properties": {
"timeoutSeconds": 3600,
"interrupting": true
},
"next": ["escalate_request"]
}

Form modeler​

For the complete field-by-field interface reference, see Form Modeler. For deployment and API retrieval, see the Forms build guide.

The form modeler creates JSON-schema based forms that can be attached to human tasks by form key.

Form modeler

Field types:

Field typeUse
Short TextSingle-line string input.
Long TextMulti-line text input.
NumberNumeric input.
CheckboxBoolean value.
Radio GroupOne option from a visible option list.
DropdownOne option from a dropdown.
Date PickerDate value.
File UploadUpload document to the process/document store.
File DownloadRender a download action for an existing document.
PDF ViewerDisplay a PDF preview area.

Field properties:

PropertyExampleNotes
LabelManager approvalDisplay label.
Variable Name (ID)approvedKey used in task form data and mappings.
Field TypebooleanDetermines JSON schema type and UI control.
Read OnlyenabledPrevents editing. Read-only fields cannot be required.
Required FieldenabledTask Portal validates before completion.
OptionsApprove, RejectOnly for radio and dropdown fields.
Allowed Extensionspdf, docx, pngOnly for file upload fields.
Max File Size (MB)20Only for file upload fields.

Backend form shape:

{
"formId": "qa_manager_review",
"name": "Manager Review",
"schema": {
"title": "Manager Review",
"type": "object",
"required": ["approved"],
"properties": {
"approved": {
"title": "Approved",
"type": "boolean",
"readOnly": false
},
"comment": {
"title": "Comment",
"type": "string",
"readOnly": false
}
}
}
}

Attach the form to a human task with the same form key:

Human Task -> Form Key: qa_manager_review

Validation checklist​

Before exporting or deploying, resolve these common issues:

IssueFix
Process has no start eventAdd Start Event or Message Start.
Process has no end eventAdd End Event.
Start has no outgoing flowConnect it to the first step.
End has outgoing flowRemove outgoing flows from end nodes.
Task has no incoming/outgoing flowConnect it into the path.
Timer has no timeoutSet Timeout (seconds) to a positive number.
Exclusive gateway has multiple routes with no conditionsAdd flow conditions such as ${approved} == true.
Parallel gateway shape is invalidUse fork shape or join shape.
Boundary is not attachedDrag the boundary event onto a task.
Human task form key is invalidUse a key that starts with a letter and contains letters, numbers, hyphens, or underscores.

Runtime notes​

ComponentRuntime behavior
Human TaskCreates a pending task in the Task Portal. Completion maps task outputs back to process variables.
API TaskPublishes a worker request. Completion maps response JSON paths to process variables. Failure follows an error boundary when present, otherwise the instance becomes FAILED.
Service TaskApplies configured variable mappings and continues automatically.
Code TaskUses backend/admin code task configuration and modeler variable mappings.
Agent ProcessCalls a deployed Agent Process, records the execution, and maps the agent decision/output back to process variables.
Call ActivityStarts a child process and maps variables between parent and child.
Message Catch/BoundaryWaits for a correlated message. Timeout can route to boundary behavior or fail when unhandled.
Timer Event/BoundaryUses scheduled timeout processing.
GatewayChooses outgoing paths based on conditions or parallel fork/join semantics.

Environment​

Set the backend URL for the modeler with:

EASY_BPM_MODELER_API_BASE_URL=http://localhost:8080

Enable the Agent Process resource and Agent Process BPM node with:

EASY_BPM_MODELER_AGENTIC_ORCHESTRATION=true

For deployed environments, point EASY_BPM_MODELER_API_BASE_URL at the customer backend URL.