Publishing work for tenant admins
Document information
- Canonical URL:
/docs/12_workflows/20_publishing-work-for-tenant-admins - Version:
2026-10-02 - Tags:
operations,tenant-admin,integrations,processflow,webapps,guides
This guide tells tenant admins how to craft integrations, ProcessFlows, and WebApps so Operations My Work shows honest, actionable work. Use the Tenant Admin Console you already have — ProcessFlow editor, integrations, WebApps, DataPool. Do not invent a second task system.
Goals
- Employees only see human-valuable work (approvals, actions, exceptions).
- Approve/Reject appears only when a real process human-input gate is open.
- My Work stays empty until real processes write rows — never seed demo employee tasks.
Checklist
- Prepare the request model — On Operations
/, use Prepare request model (installs DataPool schemaoperational_requests). Or callPOST /api/v1/operations/request-model. - Connect source systems — Create integrations for CRM / ERP / support (Tenant Admin → Integrations). Test connectors before process wiring.
- Publish business ProcessFlows — Set process
categorytobusinessso operators see runs under/runs. - Write My Work with helpers — Prefer
tf.operations.openApproval/openAction/openException/updateProgress/complete(requires sandboxapicapability). - Validate —
tf.operations.validate(payload)orPOST /api/v1/operations/requests/validatebefore go-live. - Wire human input for approvals — Pause the process, capture the pending human-input id, pass it as
human_request_idin the same step that opens approval (or the next step immediately after). - Optional WebApp intake — A WebApp may start the process; it should not invent My Work rows itself. The process owns upserts.
Work kinds to publish
| Kind | Helper | Must include |
|---|---|---|
| Approval | tf.operations.openApproval | external_id, subject, process_name, human_request_id |
| Action required | tf.operations.openAction | external_id, required_action |
| Exception | tf.operations.openException | external_id, preferably required_action + execution_id |
| Progress | tf.operations.updateProgress | external_id plus journey/checks/system_refs |
| Complete | tf.operations.complete | external_id |
Enrich employee clarity with why_visible, consequence, and ai_summary.
Approval example
// After the process creates a pending human decision:
const pendingId = String(human_request_id ?? "");
await tf.operations.openApproval({
external_id: `crm-${account_id}`,
subject: "Approve customer credit limit",
party: account_name,
process_name: "Customer credit review",
human_request_id: pendingId,
why_visible: "You are the credit owner for this account.",
consequence: "Approving raises the credit limit in CRM.",
required_action: "Confirm risk checks and approve or reject.",
journey_beat: "in_process",
journey_stage_label: "Credit decision",
checks: [
{ label: "KYC complete", state: "verified" },
{ label: "Risk score", state: "needs_review" }
],
system_refs: [{ system: "CRM", label: "Account", external_ref: account_id }]
});
If human_request_id is missing, openApproval throws. A raw api.put with attention: "approval" and no id soft-warns; pass strict: true to reject.
Integrations
- Use connectors to read case/order/ticket state and write outcomes after Approve/Reject.
- Map stable
external_idvalues from the source system so upserts update the same My Work card. - Keep employee-facing copy in process fields (
required_action,why_visible), not raw connector error payloads.
ProcessFlows
- Automatic steps: call connectors / DataPool; use
updateProgressso the journey strip advances. - AI-assisted steps: put a short result in
ai_summary; still require a human gate for decisions. - Human steps: open approval or action; set
actor_hint: "person". - Failure paths:
openExceptionwith clear recovery text; store input so Retry works when appropriate.
WebApps
- Forms and portals start or continue processes; they are not a parallel My Work writer.
- After a WebApp POST executes a process, that process should open the correct work kind.
- See WebApps ProcessFlow integration.
Common failures
| Symptom in My Work | Cause | Fix |
|---|---|---|
| Approval pill, no Approve buttons | Missing human_request_id | Pause with human input; use openApproval |
| Empty My Work forever | Schema not installed or no business process writing | Prepare request model; publish writers |
| Card never updates | Changing external_id each run | Keep a stable id per case |
Process missing from /runs | Wrong category | Set category: business |