Skip to content

Operating the workspace ​

This page documents the five Administration screens used to observe and run a tenant day to day: Monitoring, Logging (the audit log), Backup, Jobs and My tasks. For the overview of the branch and the permission summary see Administration and DevOps overview.

Monitoring ​

Monitoring is a single-screen health summary for the tenant. It reads the numbers that the Jobs engine, the Integration Flow engine, the Communication engine, the webhook dispatcher and the platform itself already keep, and reduces each area to one of three states. Tenant administrators and operators use it as the first stop when something looks wrong. For the troubleshooting workflow around it see Monitoring and troubleshooting.

Where to find it: Workspace > Administration > Monitoring. Page key monitoring.

Key concepts ​

TermMeaning
AreaOne panel: Background jobs, Integration flows, Messages, Webhooks, Platform.
HealthyThe area loaded and its attention rule is not triggered. Green chip "Healthy".
Needs attentionThe area loaded and its attention rule is triggered. Amber chip "Needs attention".
Not available to youThe area failed to load for this user, typically because the role lacks the view permission. Grey chip "Not available to you". One failing area does not affect the others.
OutboxThe tenant's transactional event queue (outbox_event). Events are pending or dispatching while waiting, failed after exhausting delivery.

Fields and options ​

The screen has no editable fields. Header controls: Back and Refresh. The data is loaded once on open and again on each Refresh; there is no automatic polling.

Summary chips shown above the panels:

ChipShown whenText
OverallAlways"Everything you can see is healthy", or "N area(s) need attention"
UnavailableAt least one area is unavailable"N not available to you" (outlined)
TimestampAlways"Updated" followed by the local time of the last load

When any area is unavailable an information banner reads "Some areas are hidden because your role cannot view them."

Panels, their content and the rule that turns them to "Needs attention":

PanelContentAttention ruleSource endpointPermission
Background jobsStacked bar of Succeeded, Failed, Dead; "N jobs, N running, N queued, N retrying"; "Failure rate x%, average N ms"Failed + Dead is greater than 0GET /api/v1/jobs/monitoringnone checked
Integration flowsStacked bar of Succeeded, Failed, Dead; "N flows, N running, N queued"; failure rate and average durationFailed + Dead is greater than 0GET /api/v1/integration/flows/monitoringintegration.flow / view
MessagesStacked bar of Delivered, Sent, Pending, Failed; "N messages today"Failed is greater than 0GET /api/v1/communications/messages/monitoringcommunication / view
WebhooksStacked bar of Delivered, Waiting or retrying, Failed for good (last 24 hours); "N of M webhooks switched on"Failed for good (24 hours) is greater than 0GET /api/v1/integration/webhooksintegration.webhook / view
PlatformEvents waiting to be delivered (and failed, and age of the oldest in minutes when above 1 minute); people signed in; audit events in 24 hours (and failed); database size in MBFailed outbox events greater than 0, or oldest pending outbox event older than 600 secondsGET /api/v1/admin/monitoring/platformadmin.monitoring / view

A bar with no data shows "Nothing has run yet." Failure rate and average duration display "-" until at least one execution has completed. Failure rate is (failed + dead) / (success + failed + dead) for flows and (failed + timeout + dead) / completed for jobs.

The Platform numbers are independent. A number is left out (not shown, not an error) when its source table is not present for the tenant:

KeyComputed as
outboxPendingrows of outbox_event for the tenant with status pending or dispatching
outboxFailedrows with status failed
outboxOldestPendingSecondsage in seconds of the oldest pending or dispatching row
activeSessionsrows of session_token not revoked and not expired
auditEvents24h, auditFailures24hrows of audit_event in the last 24 hours, and those with success = false
databaseSizeBytespg_database_size of the tenant database

Actions ​

ActionEffectAPI
RefreshReloads all five areas in parallel; each failure is isolatedThe five endpoints above
BackReturns to the Studio homenone

Procedures ​

  1. Open Workspace > Administration > Monitoring.
  2. Read the overall chip. If it reads "2 areas need attention", find the amber panels.
  3. For Background jobs with Failed 3 and Dead 1, open Jobs, open the job with failures and retry the DEAD execution.
  4. For Platform reading "12 events waiting to be delivered, 2 failed (oldest 14 min)", the outbox dispatcher is behind; check the audit log for category outbox and the server log with erp logs tail.

Permissions ​

Each panel enforces its own permission on the server, listed in the table above. A tenant administrator holding TENANT_ADMIN passes the privileged gate for admin.monitoring. Without it, the Platform panel shows "Not available to you" and the HTTP response is 403 with the message actor "<name>" lacks admin.monitoring.view permission.

API and CLI ​

bash
erp api get /api/v1/admin/monitoring/platform
erp api get /api/v1/jobs/monitoring
erp api get /api/v1/integration/flows/monitoring
erp api get /api/v1/communications/messages/monitoring
erp api get /api/v1/integration/webhooks

Example Platform response:

json
{
  "outboxPending": 12,
  "outboxFailed": 2,
  "outboxOldestPendingSeconds": 840,
  "activeSessions": 7,
  "auditEvents24h": 1932,
  "auditFailures24h": 4,
  "databaseSizeBytes": 48234496
}

Limits and behavior ​

  • All numbers are scoped to the current tenant. databaseSizeBytes is the size of the whole tenant database.
  • There are no thresholds to configure and no alert delivery. "Needs attention" is derived on each load from the rules above.

Errors and troubleshooting ​

Message or symptomCauseFix
Panel shows "Not available to you"The API call failed for that area (403, or the engine is not installed)Grant the view permission named in the table, or ignore if the module is not used
actor "x" lacks admin.monitoring.view permissionActor is neither a privileged role holder nor explicitly grantedAssign TENANT_ADMIN or grant admin.monitoring / view
Platform panel shows no database sizeThe numbers are optional; the query failed for this tenantNone; other numbers still show

Logging ​

Logging is the viewer for the tenant's centralised audit log. Every audited action in the platform (sign-ins, record changes, configuration changes, workflow actions, permission changes, plugin lifecycle, job operations) is recorded as an audit event. This screen shows today's counters, filters and pages through events, and lets an administrator switch audit categories on or off and choose how events are written. Compliance officers and administrators use it to answer who changed what and when.

Where to find it: Workspace > Administration > Logging. Page key audit-log; the screen title reads "Audit Log".

Key concepts ​

TermMeaning
Audit eventOne row of audit_event: category, action, entity, actor, module, IP address, result, source, correlation ID and timestamps.
CategoryThe class of event. The database accepts login, logout, crud, configuration, workflow, permission, plugin, job, orchestration, communication, finance, integration, outbox, agent, provisioning, other. The screen offers eight for switching and filtering: login, logout, crud, configuration, workflow, permission, plugin, other.
Correlation IDAn identifier that ties together everything produced by one request or business event. Selecting the Trace chip filters the list to that ID.
Processing modesync writes the event in the caller's request before it returns (default, safest). async returns immediately and writes on a background pool.
SourceThe component that recorded the event, for example backup, job; defaults to core.

Fields and options ​

KPI chips (counts for the current UTC day for this tenant):

ChipCounts
Total todayAll events
LoginsCategory login
Failed loginsCategory login with result failure; red when above 0
Config changesCategory configuration
Permission changesCategory permission
Workflow eventsCategory workflow
Record updatesCategory crud
Plugin eventsCategory plugin
API calls, AI requests, Security alertsAlways 0 in this release. The tooltips read "No API-call interceptor exists yet - always 0 until one does", "No AI-request tagging exists yet - always 0 until one does", "No security-alert rule exists yet - always 0 until one does".

Below the chips, three lists show the top five of the day: Top active users, Most modified entities, Most accessed modules (each as "name (count)"). A list is hidden when empty. Most accessed modules only counts events where a module value was supplied.

Category settings panel ("Category settings - enable/disable, and sync/async per category"):

FieldType or valuesDefaultDescription
One switch per categoryBooleanOnTurning a category off stops recording new events of that category for this tenant. The check happens before each write, so the change applies to the next event. Existing events are kept.
Processing modeSelect: "Sync (safest, blocks briefly)" (sync), "Async (lower latency)" (async)syncTenant-wide. Async uses a bounded background pool (2 core threads, up to 8, queue of 1000) and a failed async write is logged on the server and not retried.

Filter bar:

FieldType or valuesDefaultRequiredDescription
All categoriesSelect of categoriesAllNoExact category match
ActionTextemptyNoExact match on the action name, for example backup.started
Entity typeTextemptyNoExact match, for example job
ActorTextemptyNoExact match on the user or system actor
ModuleTextemptyNoExact match
Correlation IDTextemptyNoExact match; whitespace is trimmed
IP addressTextemptyNoExact match
Success/FailureSelect: any, "Success only", "Failure only"anyNoFilters on the result flag
SearchText (grid toolbar)emptyNoCase-insensitive contains over action, entity type, entity key and the detail JSON ("Search action, entity or detail")

The API also accepts from and to (ISO-8601 instants) for a date range on the occurred time. The screen does not expose them.

Event grid columns: Occurred, Category, Action (with entity type and entity key below), Actor, Module, IP, Result (green OK or red FAIL, "-" when not recorded), Source, Trace (first 8 characters of the correlation ID). Several columns are hidden on narrow screens. Page size is 25 per page; events are returned newest first.

Actions ​

ActionEffectAPI
Change a filterReloads page 1 with the filterGET /api/v1/authoring/audit/events
Trace chipSets the Correlation ID filter to that event's IDsame
Category switchEnables or disables recording of that categoryPUT /api/v1/authoring/audit/settings/{category} with {"enabled": false}
Processing mode selectSets sync or asyncPUT /api/v1/authoring/audit/settings/processing-mode with {"processingMode": "async"}

Procedures ​

Trace one change end to end:

  1. Open Logging and enter Action job.disabled and Entity type job.
  2. Select the Trace chip of the event of interest to see every event sharing its correlation ID.
  3. Read the Actor, IP and Result columns to establish who did it and from where.

Reduce audit write cost for a tenant that performs very large imports:

  1. In Category settings, leave configuration, permission and login on.
  2. Switch Processing mode to Async (lower latency).
  3. The change applies to the next event. Switch back to Sync if durability of the very last event matters more than latency.

Statuses and lifecycle ​

Audit events are append-only and have no status. Category switches and the processing mode are tenant settings stored per tenant (default mode sync).

Permissions ​

Reading the audit log and its summary needs the privileged action gate on audit.read, and changing or reading the category and processing-mode settings needs it on audit.manage: the actor must hold STUDIO_STAFF, TENANT_OWNER or TENANT_ADMIN, or have the permission granted explicitly, and no rule may deny it. Otherwise the response is HTTP 403 with actor "x" lacks audit.read permission (or audit.manage). The Explorer entry still shows for anyone who can open the Administration branch; the screen then loads empty with the error.

API and CLI ​

Method and pathPurpose
GET /api/v1/authoring/audit/eventsQuery events: category, action, entityType, actor, module, ipAddress, success, correlationId, search, from, to, pageIndex, pageSize
GET /api/v1/authoring/audit/kpisToday's counters and top-five lists
GET /api/v1/authoring/audit/settingsCategory switches (eight rows)
PUT /api/v1/authoring/audit/settings/{category}Body {"enabled": true|false}
GET and PUT /api/v1/authoring/audit/settings/processing-modeBody {"processingMode": "sync"|"async"}
bash
erp api get "/api/v1/authoring/audit/events?category=configuration&success=false&pageSize=50"
erp api put /api/v1/authoring/audit/settings/processing-mode --body '{"processingMode":"async"}'

For server-side request logs (stack traces), join the response header X-Correlation-Id of a failing call against the log: erp logs tail --grep <correlationId>. See Diagnostics.

Limits and behavior ​

  • pageSize is clamped to 1..500; default 25.
  • Events have a regionCode (the node region that processed the event) and a residency-violation flag, used by the multi-region data-residency checks. They are not shown in the grid.
  • Sensitive details are carried in the detail JSON and are searchable through the Search box.
  • The retention period is not configurable in this release; events are not purged by the platform.

Errors and troubleshooting ​

Message or symptomCauseFix
"No audit events match these filters."Filters too narrow, or the category is switched offClear filters; check the category switch
Events for a category stop appearingThe category switch is offTurn the category on again; events during the gap are not recorded
A just-performed action is missing in async modeThe background write has not completed, or failed (logged server-side)Refresh; if absent, switch to sync and check the server log
Category in the list that is not in the filterCategories such as job, outbox, agent exist in the database but are not offered by the screenUse Search or the API with category=job

Backup ​

Backup lists the tenant's database backups, takes a backup on demand and proves that a backup can be restored. It never restores over live data. Tenant administrators use it to confirm that backups run and that they are usable.

Where to find it: Workspace > Administration > Backup. Page key backups; the screen title reads "Backups".

Key concepts ​

TermMeaning
BackupA database dump restricted to the tenant's own data, written to the server's backup storage. Backup type is recorded as schema.
Restore checkA test restore of the dump into a temporary database on the same server, followed by a row-count comparison against the counts captured immediately after the dump. The temporary database is dropped afterwards.
Backup regionWhere the dump file is stored: the tenant's configured backup region when set and allowed by the tenant's data-residency declaration, otherwise the home region.
Scheduled backupA job backup.run ("Backup: Tenant Data Dump") with cron 0 15 2 * * * (02:15 server time daily), concurrency SINGLE, timeout 180 seconds, one attempt.

Fields and options ​

Summary chips:

ChipContent
Last backupCompletion time of the newest successful backup, or "none yet" (warning color)
Last restore checkTime of the newest passed restore check, or "never" (warning color)
Backups keptNumber of successful backups among the last 50 rows
Total sizeSum of their sizes (KB below 1 MB, MB otherwise)

Grid columns:

ColumnDescription
StartedStart time with the backup type below it
StatusRunning, Completed (stored success), Failed
SizeFile size; "-" when unknown
Restore check"Passed" with the time, or "Not checked"
ProblemThe error message of a failed backup; "-" otherwise

The grid shows the 50 most recent records and has search ("Search backups"), a status filter and sortable columns. An empty tenant shows "No backups yet. Use Back up now to take the first one."

Actions ​

ActionEffectAPI
Back up nowRuns a backup synchronously and refreshes the grid. Notice "Backup finished."POST /api/v1/admin/backups
Verify restore (row action, completed backups only)Runs the restore check. Notice Restore check passed. restore verified OK: N table(s), all row counts matched, at TIME. or Restore check found differences. restore verification FAILED: ...POST /api/v1/admin/backups/{id}/verify

Both actions disable the buttons while running. Restoring live data from a backup is not offered; the footer note states "To restore your live data from a backup, ask your platform operator."

Procedures ​

Take and verify a backup:

  1. Open Backup and select Back up now. A row appears with status Completed and a size, for example 18.4 MB.
  2. On that row select Verify restore. The Restore check column changes to "Passed" with the time.
  3. The chips now read a recent Last backup and Last restore check.

Statuses and lifecycle ​

StatusMeaningNext
runningThe dump is in progresssuccess or failed
successDump written; checksum (SHA-256), size and per-table row counts storedRestore check can be run any number of times; the latest result is stored
failederrorMessage holds the reason, for example backup for tenant 7 failed: ... or ... timed out after 120sNone

Permissions ​

OperationPermission
List backupsadmin.backup / view
Back up now, Verify restoreadmin.backup / manage

Both pass the privileged action gate: the actor must hold STUDIO_STAFF, TENANT_OWNER or TENANT_ADMIN, or have the permission granted explicitly, and no rule may deny it. Otherwise HTTP 403 with actor "x" lacks admin.backup.manage permission. Backups and verifications are audited as category configuration, actions backup.started and backup.verified, entity type backup, source backup. The server path and checksum of the dump are not returned to tenants.

API and CLI ​

bash
erp api get "/api/v1/admin/backups?limit=20"
erp api post /api/v1/admin/backups
erp api post /api/v1/admin/backups/42/verify

limit defaults to 20 and is clamped to 1..100. The verify response:

json
{
  "matched": true,
  "summary": "restore verified OK: 143 table(s), all row counts matched, at 2026-10-05T02:31:07Z.",
  "mismatches": []
}

Limits and behavior ​

  • Only one backup may run per tenant at a time: a second request returns 409 A backup is already running for this tenant.
  • Backup scope is the tenant's common data. Application data kept in separate application schemas of the tenant database is outside this backup.
  • The backup process times out after 120 seconds by default; the operator can change that. Backups are laid out as region/tenant-<id>/backup-yyyyMMdd-HHmmss.dump.
  • A restore check compares row counts only. Tables with vector columns cannot be recreated by the backup database role; they are listed in the summary as left out of the check. The check fails when the stored baseline is empty.
  • The row-count baseline is the one captured at backup time, so later changes to live data do not cause false failures.
  • No retention or pruning is performed by the backup engine.

Errors and troubleshooting ​

Message or symptomCauseFix
A backup is already running for this tenant.A row with status running existsWait; a stuck row indicates a crashed process, contact the operator
No backup N for this tenant.The ID belongs to another tenant or does not existUse an ID from the grid
Status Failed with a backup-tool errorBackup tools missing or unreachable databaseOperator checks the backup tools and database access
Restore check "found differences"One or more tables differ in row count after restoreRead the mismatch list in the notice; contact the operator, do not rely on that backup
Verify restore button missingThe row is not CompletedOnly completed backups can be verified

Jobs ​

Jobs is the operations console for the tenant's background jobs: each scheduled, manual or event-driven job registered by a module or plugin, its recent executions, and its reliability settings. Administrators use it to see whether jobs run, to run one now, to switch it off, to retry a dead execution and to tune retry behavior. This screen cannot create a new job; jobs are declared by the plugin that owns them or by the generic sweep jobs described in Job and Scheduler Designer and the guides reminder, cadence, compliance and aggregation.

Where to find it: Workspace > Administration > Jobs. Page key jobs.

Key concepts ​

TermMeaning
JobA registered unit of background work with a code, owning plugin, type, optional cron schedule and reliability settings.
ExecutionOne attempt record . A retry creates a new execution with the next attempt number.
Job typeSCHEDULED, EVENT, MANUAL, API, WORKFLOW, RECURRING, ONE_TIME. Only SCHEDULED jobs with a cron expression and status ENABLED are dispatched by the scheduler.
ScopeTENANT (default) or SYSTEM.
Concurrency policyWhether overlapping executions are allowed (see the table below).
TriggerWhat created an execution: SCHEDULE, MANUAL, API, EVENT, WORKFLOW, RETRY.
DeadAn execution that failed on its last allowed attempt, or whose job definition no longer exists.

Fields and options ​

Monitoring chips above the grid: Total jobs, Running, Queued, Retrying, Successful, Failed, Dead, Avg duration (ms), Failure rate (%). Avg duration and Failure rate show "-" with the tooltip "No completed executions yet" until an execution has completed.

Job grid:

ColumnDescriptionVisible by default
JobName with the job code belowYes
PluginOwning plugin ID; select filterYes (hidden on narrow screens)
TypeJob type tag; select filterYes
ScheduleCron expression in monospace, or "-"Yes (hidden on narrow screens)
PriorityCRITICAL, HIGH, NORMAL, LOWNo
ConcurrencyConcurrency policyNo
StatusREGISTERED, ENABLED, DISABLED; select filterYes

Search placeholder: "Search jobs by name, code or plugin". Selecting a row opens the history drawer.

Execution history drawer (right side, 20 per page): columns Started, Trigger, Attempt, Status (tooltip shows the error text), Duration (ms). The header shows the job name and description ("No description." when empty).

Job Settings dialog (title Job Settings - followed by the job name, note "Reliability and priority only - the job's trigger/schedule and business logic are declared by the owning plugin and aren't editable here."):

FieldType or allowed valuesDefault for a new jobDescription
PriorityCRITICAL, HIGH, NORMAL, LOWNORMALLabel stored with the job
Timeout (seconds)Integer300Maximum run time of one attempt; on expiry the attempt is recorded as TIMEOUT
ConcurrencyALLOW_PARALLEL, SINGLE, PER_TENANT, PER_PARAMETERSINGLESee below
Max attemptsInteger1Total attempts including the first. When the attempt number reaches this value, a failure becomes DEAD
BackoffNONE, FIXED, LINEAR, EXPONENTIALNONEDelay strategy between attempts
Retry initial delay (seconds)Integer30Base delay
Retry max delay (seconds)Integer3600Upper bound for LINEAR and EXPONENTIAL

The screen sends all seven values on Save and does no range validation; the server does not validate them either, so enter sensible positive values. Defaults shown are those of a job declared without overrides; a plugin may declare others.

Concurrency policies:

PolicyBehavior
ALLOW_PARALLELNew executions are always queued and run without a lock
SINGLENo new execution is queued while one is queued or running. A worker also takes a database advisory lock keyed by the job code, so jobs do not overlap even across several server instances
PER_TENANTAdvisory lock keyed by job code and tenant; queueing is skipped while one is in flight
PER_PARAMETERTreated like PER_TENANT in this release; executions are not distinguished by parameters

Retry delay formula for attempt number n (the next attempt): FIXED = initial delay; LINEAR = min(initial x n, max); EXPONENTIAL = min(initial x 2 to the power (n-1), max); NONE = 0 (the retry is queued immediately).

Actions ​

ActionWhereEffectAPI
Execute now (play icon)RowQueues a MANUAL execution. Enabled only when the job status is ENABLED. Writes audit job.executed.manualPOST /api/v1/jobs/{jobCode}/execute (optional JSON body is passed to the handler as parameters)
Job settings (gear icon)RowOpens the dialog; Save writes audit job.configuration.changedPATCH /api/v1/jobs/{jobCode}/settings
Enable / DisableRowSets status ENABLED or DISABLED (audit job.enabled, job.disabled). A disabled job is not scheduled and cannot be run manuallyPOST /api/v1/jobs/{jobCode}/enable and /disable
Row clickRowOpens the execution history drawerGET /api/v1/jobs/{jobCode}/executions?pageIndex=&pageSize=
Retry (replay icon)Execution with status FAILED or DEADQueues a new RETRY execution with attempt 1 and the same parameters (audit job.retried)POST /api/v1/job-executions/{id}/retry
Cancel (x icon)Execution with status QUEUEDMarks it CANCELLED (audit job.cancelled)POST /api/v1/job-executions/{id}/cancel

Procedures ​

Re-run a failed nightly job with a longer timeout:

  1. Open Jobs, search payroll, and select the row "Payroll sweep" (hcm-payroll.sweep). The drawer shows the last executions; the newest is TIMEOUT then DEAD.
  2. Close the drawer and select the gear icon. Set Timeout (seconds) to 900, Max attempts to 3, Backoff to Exponential, Retry initial delay to 60 and Save.
  3. Reopen the drawer and select the replay icon on the DEAD execution. A new row with Trigger RETRY, Attempt 1 and Status QUEUED appears, then RUNNING and SUCCESS.

Statuses and lifecycle ​

Job status:

StatusMeaning
REGISTEREDKnown to the registry, not switched on
ENABLEDScheduled (if cron) and runnable
DISABLEDSwitched off by an administrator

Execution status and transitions:

StatusMeaningTransitions
QUEUEDWaiting for a worker; becomes eligible at availableAtRUNNING; CANCELLED by Cancel
RUNNINGClaimed by a workerSUCCESS; on failure FAILED (retry queued) or DEAD (attempts exhausted); on timeout TIMEOUT (retry queued) or DEAD
SUCCESSHandler returned success; result storedterminal
FAILEDAttempt failed and another attempt is queued (new execution, Trigger RETRY)terminal for the row
TIMEOUTAttempt exceeded the job timeout; another attempt is queuedterminal for the row
RETRYINGDefined by the schema; the worker records retries as new QUEUED rowsnot used by the worker
DEADDead-lettered: attempts exhausted, or the job definition no longer exists ("job definition no longer registered"). Audit job.execution.deadRetry creates a new execution
CANCELLEDCancelled by Cancel, or released because the concurrency lock was busy (the same work is re-queued 5 seconds later)terminal

If no handler is registered for the job (owning plugin not loaded), the attempt fails with no handler registered for job CODE (owning plugin not loaded) and follows the normal retry rules.

Permissions ​

Enabling, disabling and changing the settings of a job, and retrying or cancelling an execution, pass the privileged action gate on job.manage (a privileged role or an explicit grant, and no denying rule); otherwise HTTP 403 with actor "x" lacks job.manage permission. Running a job (POST /api/v1/jobs/{jobCode}/execute), listing jobs, monitoring and execution history are not gated by this check: modules start their own jobs on behalf of ordinary users (for example payroll calculation), so running needs a per-job right that is not yet built. Operations are audited with the acting user as Actor.

API and CLI ​

Method and pathPurpose
GET /api/v1/jobsAll jobs of the tenant
GET /api/v1/jobs/{jobCode}One job; 404 when unknown
POST /api/v1/jobs/{jobCode}/executeRun now; returns {"executionId": n}; 404 unknown job; 422 with {"message": "job x is disabled"}
POST /api/v1/jobs/{jobCode}/enable, /disableSwitch on or off (204)
PATCH /api/v1/jobs/{jobCode}/settingsBody: priority, timeoutSeconds, concurrencyPolicy, maxAttempts, retryBackoff, retryInitialDelaySeconds, retryMaxDelaySeconds
GET /api/v1/jobs/monitoringTotals, avgDurationMs, failureRatePercent (null until an execution completed)
GET /api/v1/jobs/{jobCode}/executionsPaged history (pageSize default 25, max 500)
GET /api/v1/job-executions/{id}One execution
POST /api/v1/job-executions/{id}/retry422 execution N is not DEAD/FAILED (status=X) otherwise
POST /api/v1/job-executions/{id}/cancel422 execution is not cancellable (not QUEUED, or not found)
bash
erp api get /api/v1/jobs
erp api post /api/v1/jobs/backup.run/execute

erp api supports get, post, put and delete. The settings update is a PATCH; use the Studio screen or an HTTP client with your session token for it.

Limits and behavior ​

  • The scheduler evaluates schedules every 30 seconds. A job is queued when the next cron time after its last dispatch (or creation time) has passed. Cron expressions use six fields, seconds first,, for example 0 15 2 * * *.
  • Workers poll every 2 seconds, claim at most 5 executions per tenant at a time, and run on a pool of 4 threads.
  • Scheduling is skipped for a tenant whose region assignment is migrating (see Tenant migration).
  • A timeout cannot forcibly stop Java code. A handler that ignores interruption keeps running in the background after the attempt is recorded as TIMEOUT.
  • Every job operation writes an audit event of category job (see Logging).

Errors and troubleshooting ​

Message or symptomCauseFix
Execute now icon disabledJob status is not ENABLEDSelect Enable
job x is disabledAPI call to execute a disabled jobEnable it first
execution N is not DEAD/FAILED (status=SUCCESS)Retry requested for another statusRetry applies to FAILED and DEAD only
Many CANCELLED rows with no errorConcurrency lock busy; work was re-queuedNormal for SINGLE jobs under contention
no handler registered for job x (owning plugin not loaded)The plugin that owns the job is disabled or not loadedEnable the plugin in Extensions
execution exceeded 300s timeoutHandler too slowRaise Timeout in Job Settings

My tasks ​

My tasks is the personal approval inbox. It lists the human approval tasks assigned to the signed-in user by workflows and business rules (the requireApproval action) and lets the user claim, approve, return or reject them. Approvers and line managers use it. Authoring approvals is described in Workflows and rules.

Where to find it: Workspace > Administration > My tasks. Page key task-inbox; the screen title reads "My Tasks".

Key concepts ​

TermMeaning
Human taskOne approval step of a workflow instance, assigned to one or more candidate approvers.
Candidate approverAn identity listed on the task. Only candidates can claim or decide.
Approval modeHow several approvers combine: first-response (the first decision decides), all-must-approve (all candidates must approve; one reject or return ends it), quorum (a required number of approvals).
ClaimReserves the task for the current user before deciding.
ReturnSends the task back for rework: a third outcome, recorded as decision returned, which the workflow can route separately from rejected.

Fields and options ​

Grid columns:

ColumnDescription
Task"Task #id" with "Workflow instance N" below
ApprovalApproval mode; select filter
Statuspending or claimed; select filter

The header shows "N pending for" followed by your user name. The grid has search ("Search my tasks"), refresh, and the empty text "No pending approvals for" followed by your user name. The list contains only tasks in status pending or claimed where the user is a candidate approver.

Return dialog ("Return for rework"): explanatory text "Sends this task back to the requester instead of rejecting it outright. Say what needs fixing - it's recorded with the decision."

FieldTypeDefaultRequiredDescription
What needs to changeMulti-line textemptyNoStored as the decision comment (trimmed) and merged into the workflow instance context

Actions ​

ActionShown whenEffectAPI
ClaimStatus pendingReserves the task for youPOST /api/v1/workflows/human-tasks/{id}/claim?approver=<user>
ApproveStatus claimedRecords approvalPOST /api/v1/workflows/human-tasks/{id}/decide with approved: true
ReturnStatus claimedOpens the dialog; Return sends decision: "returned" and the commentsame
RejectStatus claimedRecords rejection (approved: false)same

Procedures ​

  1. Open My tasks. A row "Task #118 / Workflow instance 54", Approval first-response, Status pending appears.
  2. Select Claim. The status changes to claimed and the actions Approve, Return, Reject appear.
  3. Select Return, type "Attach the signed quote", select Return. The task leaves your list and the workflow follows its returned transition.

Statuses and lifecycle ​

StatusMeaning
pendingWaiting for a candidate to claim
claimedHeld by an approver; also the state while a multi-approver mode still waits for more decisions
approvedFinal: approved
rejectedFinal: rejected
returnedFinal: returned for rework
delegatedHanded to another identity (delegation is not offered on this screen)

In all-must-approve the task finalizes when everyone has approved, or at the first reject or return. In quorum it finalizes when the required count of approvals is reached, or when too many rejections make the quorum unreachable. A return vetoes in every mode.

Permissions ​

The user must be a candidate approver. The decision is also checked against the workflow's permission: resource workflow:<workflow name>, action approve, reject or return. Claiming checks candidacy only. Errors: Actor "x" is not a candidate approver for human task N (tenant T) and Actor "x" is not permitted to "approve" workflow "w" (tenant T).

API and CLI ​

bash
erp api get "/api/v1/workflows/human-tasks?approver=jane.doe"
erp workflow tasks 54
erp workflow instance 54
erp workflow history 54

POST /api/v1/workflows/human-tasks/{id}/decide body: approver, approved (boolean), optional decision (approved, rejected, returned; wins over approved), optional comment. POST /api/v1/workflows/human-tasks/bulk-decide takes taskIds, approver, approved, decision, comment and returns per-task success or error; one failing task does not stop the others.

Limits and behavior ​

  • The list shows only the current user's tasks; it is not an administrator's view of everyone's tasks.
  • A claim that cannot be granted (already claimed by someone else) returns HTTP 409 and the task stays unclaimed for you.
  • Decision comments are stored with the decision and returned in the workflow result as {"decision": "...", "comment": "..."}.

Errors and troubleshooting ​

Message or symptomCauseFix
Task missing from the listYou are not in the candidate list, or the task is finishedAsk the workflow owner to check the approver rules
is not a candidate approverDecision attempted by someone elseUse the assigned identity
is not permitted to "approve" workflowMissing workflow:<name> grantGrant the action in the Permission Designer