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 7 | Priostack |
|---|---|
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 Feature | Priostack Equivalent | Notes |
|---|---|---|
| RuntimeService.startProcessInstanceByKey() | POST /api/v1/process-instances | Direct REST equivalent |
| TaskService.complete() | POST /graphql { mutation completeTask } | Tasklist GraphQL API |
| ExternalTaskService | POST /api/v1/jobs/activate + /complete | Zeebe-style polling |
| DecisionService.evaluateDecision() | BusinessRuleTask in BPMN + deployed DMN | Integrated in-process |
| HistoryService.createProcessInstanceQuery() | GET /v1/process-instances | REST API |
| ManagementService (incidents) | GET /v1/incidents | REST API |
| Cockpit web app | priostack.com/console | Hosted monitoring UI |
| Tasklist web app | priostack.com/tasklist | Hosted human task UI |
| camunda:formKey | zeebe:userTask with form schema | JSON 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.