Migrate from Camunda 7

This guide walks you through migrating an existing Camunda Platform 7 application to Priostack. Most migrations can be completed in a day for small projects, or a week for large enterprise deployments.

TL;DR: Export your BPMN files, replace Java delegates with service tasks + external workers, change one API URL. That's 90% of the migration.

Section 1: What's Compatible

Priostack supports BPMN 2.0, so your existing process diagrams transfer with minimal changes:

  • All standard BPMN 2.0 elements (tasks, gateways, events, subprocesses)
  • Sequence flow conditions using FEEL expressions
  • Timer events with ISO 8601 durations and cycle expressions
  • Message correlation (with updated correlation key syntax)
  • Signal events (broadcast and catch)
  • Error boundary events and escalation events
  • Compensation handlers
  • Multi-instance tasks (parallel and sequential)
  • DMN 1.3 decision tables

Section 2: What's Different

Camunda 7Priostack
Java Delegates (camunda:class) External service tasks with job workers. No Java required.
Embedded Spring/CDI injection Workers are standalone services that poll the API. Any language.
Groovy scripts in Script Tasks FEEL expressions (for simple transforms). Complex logic → Service Task + worker.
Java API (RuntimeService, TaskService) REST API. Zeebe-compatible protocol for job workers.
camunda:formKey for user tasks zeebe:userTask with form schema or external form URL
Cockpit UI for monitoring Priostack Console at priostack.com/console
REST Engine API (/engine-rest/) Priostack REST API (/api/v1/). Zeebe-compatible worker protocol.
History tables in relational DB Process history via REST API and Console
Self-hosted (on your infrastructure) Managed SaaS (we handle infra, scaling, backups)

Section 3: Migration Steps

Step 1: Export Your BPMN Files

From Camunda Modeler or Cockpit, export all your BPMN files as .bpmn XML files. Keep DMN files too.

Step 2: Remove Camunda-Specific Extensions

Open each BPMN file and replace Camunda 7 extension elements:

Camunda 7 — Remove This
<serviceTask id="validateOrder"
  camunda:class="com.example.ValidateOrderDelegate"
  camunda:asyncBefore="true" />
Priostack — Replace With
<serviceTask id="validateOrder"
             name="Validate Order">
  <extensionElements>
    <zeebe:taskDefinition
      type="validate-order"
      retries="3" />
  </extensionElements>
</serviceTask>
Camunda 7 — Remove This
<userTask id="review"
  camunda:assignee="${reviewer}"
  camunda:candidateGroups="managers" />
Priostack — Replace With
<userTask id="review" name="Review Order">
  <extensionElements>
    <zeebe:userTask>
      <zeebe:assignee>=reviewer</zeebe:assignee>
      <zeebe:candidateGroups>
        managers
      </zeebe:candidateGroups>
    </zeebe:userTask>
  </extensionElements>
</userTask>

Step 3: Rewrite Java Delegates as Workers

For each Java Delegate class, create an equivalent external worker in Go, Python, or JavaScript. See the Workers Guide.

Camunda 7 — Java Delegate
@Component
public class ValidateOrderDelegate
    implements JavaDelegate {

  @Autowired
  private OrderService orderService;

  @Override
  public void execute(DelegateExecution exec) {
    String orderId = (String) exec
        .getVariable("orderId");
    boolean valid = orderService.validate(orderId);
    exec.setVariable("orderValid", valid);
  }
}
Priostack — External Worker (Go)
func processJob(job Job) (map[string]interface{}, error) {
  orderId, _ := job.Variables["orderId"].(string)

  // Call your existing service
  valid, err := orderService.Validate(orderId)
  if err != nil {
    return nil, err
  }
  return map[string]interface{}{
    "orderValid": valid,
  }, nil
}

Step 4: Update API Calls

Camunda 7
POST /engine-rest/process-definition
     /key/order-processing/start
{
  "variables": {
    "orderId": { "value": "123", "type": "String" }
  }
}
Priostack
POST /api/v1/process-instances
X-API-Key: your_key
{
  "bpmnProcessId": "order-processing",
  "variables": {
    "orderId": "123"
  }
}

Step 5: Deploy and Test

# Deploy your updated BPMN
curl -X POST https://api.priostack.com/api/v1/process-definitions \
  -H "X-API-Key: your_key" \
  -H "Content-Type: application/xml" \
  --data-binary @order-processing.bpmn

# Start your workers
export PRIOSTACK_API_KEY=your_key
go run worker.go

# Start a test instance
curl -X POST https://api.priostack.com/api/v1/process-instances \
  -H "X-API-Key: your_key" \
  -d '{"bpmnProcessId":"order-processing","variables":{"orderId":"TEST-001"}}'

Section 4: Feature Mapping

Camunda 7 FeaturePriostack EquivalentNotes
RuntimeService.startProcessInstanceByKey()POST /api/v1/process-instancesDirect REST equivalent
TaskService.complete()POST /graphql { mutation completeTask }Tasklist GraphQL API
ExternalTaskServicePOST /api/v1/jobs/activate + /completeZeebe-style polling
DecisionService.evaluateDecision()BusinessRuleTask in BPMN + deployed DMNIntegrated in-process
HistoryService.createProcessInstanceQuery()GET /v1/process-instancesREST API
ManagementService (incidents)GET /v1/incidentsREST API
Cockpit web apppriostack.com/consoleHosted monitoring UI
Tasklist web apppriostack.com/tasklistHosted human task UI
camunda:formKeyzeebe:userTask with form schemaJSON schema-based forms
Message correlation (correlate())POST /api/v1/messages (planned)Coming in v1.1
Need help? Migration support is available for Enterprise customers. For community assistance, post in the Forum with your BPMN files and we'll provide specific guidance.