Features · BPMN

BPMN in BESSER.

BESSER turns BPMN into an explicit low-code model. Use BPMN 2.0.2 to describe workflows, collaborations, and orchestrations with pools, lanes, events, gateways, and message flows.

Model BPMN 2.0.2 processes with the full notation.

BESSER gives you the BPMN 2.0.2 notation for modeling real business processes. You can express workflows, collaborations, and orchestrations with pools and lanes, connect participants with message flows, and capture the events, tasks, and gateways that drive the process.

  • Model workflows, collaborations, and orchestration scenarios
  • Use pools and lanes to organize participants
  • Capture events, tasks, gateways, and message flows explicitly
Read the docs
editor.besser-pearl.org — Pizza Delivery
BPMN pizza delivery workflow shown in the BESSER editor

Import and export BPMN XML while preserving the model.

BESSER can import BPMN XML, preserve the structure in the metamodel, and export it again when you need to share the process with other BPMN tools. The code frame shows the XML generated from the diagram above.

  • Bring external BPMN definitions into BESSER
  • Inspect and evolve the process in the editor
  • Export XML back to the BPMN ecosystem
pizza-delivery.bpmn
generated/bpmn/pizza-delivery.bpmn
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
             xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
             xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
             id="Definitions_pizza_order"
             targetNamespace="https://besser-pearl.org/bpmn/pizza">
  <message id="Message_pizza_delivered" name="Pizza delivered" />

  <process id="Process_pizza_order" name="Pizza order" isExecutable="false">
    <startEvent id="StartEvent_hungry" name="Hungry" />
    <task id="Task_order_pizza" name="Order Pizza" />
    <eventBasedGateway id="Gateway_wait_for_pizza" name="Wait for pizza" />

    <intermediateCatchEvent id="Event_pizza_arrives_first" name="Pizza arrives">
      <messageEventDefinition id="MessageEvent_pizza_arrives_first" messageRef="Message_pizza_delivered" />
    </intermediateCatchEvent>

    <intermediateCatchEvent id="Event_first_timeout" name="60 minutes">
      <timerEventDefinition id="TimerEvent_first_timeout">
        <timeDuration>PT60M</timeDuration>
      </timerEventDefinition>
    </intermediateCatchEvent>

    <task id="Task_complain" name="Complain to Delivery Service" />
    <eventBasedGateway id="Gateway_wait_after_complaint" name="Wait again" />

    <intermediateCatchEvent id="Event_pizza_arrives_after_complaint" name="Pizza arrives">
      <messageEventDefinition id="MessageEvent_pizza_arrives_after_complaint" messageRef="Message_pizza_delivered" />
    </intermediateCatchEvent>

    <intermediateCatchEvent id="Event_second_timeout" name="60 minutes">
      <timerEventDefinition id="TimerEvent_second_timeout">
        <timeDuration>PT60M</timeDuration>
      </timerEventDefinition>
    </intermediateCatchEvent>

    <task id="Task_eat_pizza" name="Eat Pizza" />
    <task id="Task_cancel_order" name="Cancel Order" />
    <endEvent id="EndEvent_pizza_eaten" name="Done" />
    <endEvent id="EndEvent_order_cancelled" name="Cancelled" />

    <sequenceFlow id="Flow_1" sourceRef="StartEvent_hungry" targetRef="Task_order_pizza" />
    <sequenceFlow id="Flow_2" sourceRef="Task_order_pizza" targetRef="Gateway_wait_for_pizza" />
    <sequenceFlow id="Flow_3" sourceRef="Gateway_wait_for_pizza" targetRef="Event_pizza_arrives_first" />
    <sequenceFlow id="Flow_4" sourceRef="Event_pizza_arrives_first" targetRef="Task_eat_pizza" />
    <sequenceFlow id="Flow_5" sourceRef="Gateway_wait_for_pizza" targetRef="Event_first_timeout" />
    <sequenceFlow id="Flow_6" sourceRef="Event_first_timeout" targetRef="Task_complain" />
    <sequenceFlow id="Flow_7" sourceRef="Task_complain" targetRef="Gateway_wait_after_complaint" />
    <sequenceFlow id="Flow_8" sourceRef="Gateway_wait_after_complaint" targetRef="Event_pizza_arrives_after_complaint" />
    <sequenceFlow id="Flow_9" sourceRef="Event_pizza_arrives_after_complaint" targetRef="Task_eat_pizza" />
    <sequenceFlow id="Flow_10" sourceRef="Gateway_wait_after_complaint" targetRef="Event_second_timeout" />
    <sequenceFlow id="Flow_11" sourceRef="Event_second_timeout" targetRef="Task_cancel_order" />
    <sequenceFlow id="Flow_12" sourceRef="Task_eat_pizza" targetRef="EndEvent_pizza_eaten" />
    <sequenceFlow id="Flow_13" sourceRef="Task_cancel_order" targetRef="EndEvent_order_cancelled" />
  </process>

  <bpmndi:BPMNDiagram id="Diagram_pizza_order">
    <bpmndi:BPMNPlane id="Plane_pizza_order" bpmnElement="Process_pizza_order">
      <bpmndi:BPMNShape id="StartEvent_hungry_di" bpmnElement="StartEvent_hungry">
        <dc:Bounds x="24" y="118" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_order_pizza_di" bpmnElement="Task_order_pizza">
        <dc:Bounds x="95" y="96" width="110" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Gateway_wait_for_pizza_di" bpmnElement="Gateway_wait_for_pizza">
        <dc:Bounds x="270" y="111" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_pizza_arrives_first_di" bpmnElement="Event_pizza_arrives_first">
        <dc:Bounds x="370" y="118" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_first_timeout_di" bpmnElement="Event_first_timeout">
        <dc:Bounds x="370" y="220" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_complain_di" bpmnElement="Task_complain">
        <dc:Bounds x="455" y="198" width="120" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Gateway_wait_after_complaint_di" bpmnElement="Gateway_wait_after_complaint">
        <dc:Bounds x="640" y="213" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_pizza_arrives_after_complaint_di" bpmnElement="Event_pizza_arrives_after_complaint">
        <dc:Bounds x="735" y="220" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_second_timeout_di" bpmnElement="Event_second_timeout">
        <dc:Bounds x="735" y="322" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_eat_pizza_di" bpmnElement="Task_eat_pizza">
        <dc:Bounds x="820" y="96" width="110" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Task_cancel_order_di" bpmnElement="Task_cancel_order">
        <dc:Bounds x="820" y="300" width="110" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="EndEvent_pizza_eaten_di" bpmnElement="EndEvent_pizza_eaten">
        <dc:Bounds x="975" y="118" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="EndEvent_order_cancelled_di" bpmnElement="EndEvent_order_cancelled">
        <dc:Bounds x="975" y="322" width="36" height="36" />
      </bpmndi:BPMNShape>

      <bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1"><di:waypoint x="60" y="136" /><di:waypoint x="95" y="136" /></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2"><di:waypoint x="205" y="136" /><di:waypoint x="270" y="136" /></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_3_di" bpmnElement="Flow_3"><di:waypoint x="320" y="136" /><di:waypoint x="370" y="136" /></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_4_di" bpmnElement="Flow_4"><di:waypoint x="406" y="136" /><di:waypoint x="820" y="136" /></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_5_di" bpmnElement="Flow_5"><di:waypoint x="295" y="161" /><di:waypoint x="295" y="238" /><di:waypoint x="370" y="238" /></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_6_di" bpmnElement="Flow_6"><di:waypoint x="406" y="238" /><di:waypoint x="455" y="238" /></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_7_di" bpmnElement="Flow_7"><di:waypoint x="575" y="238" /><di:waypoint x="640" y="238" /></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_8_di" bpmnElement="Flow_8"><di:waypoint x="690" y="238" /><di:waypoint x="735" y="238" /></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_9_di" bpmnElement="Flow_9"><di:waypoint x="771" y="238" /><di:waypoint x="875" y="238" /><di:waypoint x="875" y="176" /></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_10_di" bpmnElement="Flow_10"><di:waypoint x="665" y="263" /><di:waypoint x="665" y="340" /><di:waypoint x="735" y="340" /></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_11_di" bpmnElement="Flow_11"><di:waypoint x="771" y="340" /><di:waypoint x="820" y="340" /></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_12_di" bpmnElement="Flow_12"><di:waypoint x="930" y="136" /><di:waypoint x="975" y="136" /></bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_13_di" bpmnElement="Flow_13"><di:waypoint x="930" y="340" /><di:waypoint x="975" y="340" /></bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>
More capabilities

What makes the BPMN extension useful in BESSER.

The extension defines BPMN as a language in B-UML and provides XML interchange with DI, alongside validation that keeps models structurally sound.

Walkthrough

See BPMN editing in action.

This walkthrough shows the BPMN editor in BESSER: model the process, inspect the layout, and keep the diagram ready for BPMN XML export.

BESSER BPMN editor walkthrough

BPMN metamodel in B-UML

BESSER defines BPMN in B-UML, so the notation is not just a drawing surface — it is a metamodel. That makes the language explicit, reusable, and ready to be extended inside the BESSER ecosystem.

  • Defined as a B-UML metamodel
  • Built to support BPMN extensions
  • Keeps the language explicit and model-driven
Read the docs

BPMN XML

BESSER supports BPMN XML together with DI, so the exported file can preserve the positions and layout of elements. That keeps the visual diagram stable when you move models in and out of the editor.

  • Import existing BPMN XML into BESSER
  • Export XML with diagram interchange data
  • Preserve element positions and layout
Read the docs

Model validation

The BPMN metamodel includes validation rules that help you catch structural issues early. That gives you a cleaner model before you hand it off to other tools or generate XML.

  • Check flow and container consistency
  • Validate participants, lanes, and message flows
  • Catch model issues before export
Read the docs