Building blocks: people
In short: with human.request (Ask a person) the workflow asks a colleague a question with a few answers and waits for the answer. With task.create (Task) the workflow leaves a task and continues straight away. Both land in To do and, if the run is about a conversation, on the ticket.
Where to find this
Account > Workflows, open a workflow, Add step, group A person. Who: from the role Organisation admin. The colleague who gets the question or task handles it in To do or on the ticket.
An Ask a person step in the workflow editor with Title, Text, Answers, Button texts, Show, Fields to fill in (JSON schema), Starting values, For and Deadline (minutes), and for each answer the If choice.
human.request: Ask a person
Asks a colleague a question with a few answers (the exits of the step) and optionally fields to fill in or edit, and waits for the answer or for the deadline.
Input
| Name | Label | Type | Required | Explanation |
|---|---|---|---|---|
title |
Title | Text | yes | The question in a few words, visible in To do. |
text |
Text | LongText | no | More explanation for the colleague. |
exits |
Answers | Answers | yes | The answers to choose from, as ids in lower case, such as ["approve", "reject"]. 1 up to and including 6, all different, each starting with a lower-case letter or digit, followed by lower-case letters, digits, - or _, at most 41 characters. Not expired. Every answer is an exit. |
exitLabels |
Button texts | AnswerLabels | no | The text on each button, in the organisation’s language, for example {"approve": "Approve", "reject": "Reject"}. At most 60 characters per button, only for answers from exits. |
show |
Show | Json | no | An object with what the colleague gets to see to decide, with readable keys in the colleague’s language. Values are usually references, for example {"Report": "{{verslag.text}}"}. |
fields |
Fields to fill in (JSON schema) | Json | no | A JSON schema (an object, "type": "object") of the fields the colleague fills in or edits. Leave it out if the colleague only chooses an answer. |
values |
Starting values | Json | no | The starting values of those fields (a first version the colleague can edit), an object; may contain references. |
assignee |
For | User | no | The user id of a colleague, or a reference to the colleague the event mentions, such as {{trigger.recordedByUserId}}. Left out: for everyone. |
deadlineMinutes |
Deadline (minutes) | Number | no | Minutes until the question expires. 7 days by default, greater than 0, at most 30 days. |
A new step starts with {"exits": ["approve", "reject"]}.
Exits: every answer from exits, plus expired (expired) if nobody answered before the deadline.
Output fields
| Field | Label | Content |
|---|---|---|
answer |
Answer | The chosen answer (a value from exits). |
fields |
Fields to fill in (JSON schema) | What the colleague filled in or edited, following the schema of fields. |
answeredBy |
Answered by | The user id of whoever answered. |
actionId |
Action | The id of the question. |
With expired, only actionId is filled.
Example: having a report approved before it goes to the dossier.
{
"id": "controle",
"label": "Have the adviser check the report",
"block": "human.request",
"inputs": {
"title": "Check the report",
"text": "Is this report of the conversation correct?",
"exits": ["approve", "reject"],
"exitLabels": { "approve": "Correct, send it", "reject": "Do not send" },
"show": { "Report": "{{verslag.text}}" },
"fields": { "type": "object", "properties": { "verslag": { "type": "string", "title": "Report" } } },
"values": { "verslag": "{{verslag.text}}" },
"assignee": "{{trigger.recordedByUserId}}",
"deadlineMinutes": 2880
},
"exits": { "approve": "naar-dossier" }
}
Here the run ends at reject and expired, because those exits lead nowhere. You read the edited text later as {{controle.fields.verslag}}.
What the colleague sees: a card with the title, the text, what the workflow shows (show), the fields from the schema and the answers as buttons. Above it, if the run has them, are the customer, the recording and the documents the run made. The card is in To do and, if the run is about a conversation, on the ticket.
When to use it: for every decision a person has to make before the workflow continues, and as an approval before something goes to a customer or another system. When not to: if the workflow does not need to wait. Use task.create then.
task.create: Task
Leaves a task for a colleague, with an optional due date. The run does not wait: the task stays in the colleague’s To do.
Input
| Name | Label | Type | Required | Explanation |
|---|---|---|---|---|
title |
Title | Text | yes | What needs to happen, in a few words. |
text |
Text | LongText | no | More explanation. |
assignee |
For | User | no | The user id of a colleague, or a reference such as {{trigger.recordedByUserId}}. Left out: for everyone. |
dueMinutes |
Due in (minutes) | Number | no | Minutes until the task is due, greater than 0, at most 365 days. The run does not wait. |
Exits: none; continues with next.
Output fields: actionId (Action), the id of the task.
When to use it: for work a person does later (“call the customer back on Friday”), and as a safety net for an error: give a step an onError to a task with {{<step>.error}} in the text. When not to: if what the workflow does next depends on the answer. Use human.request then.
Good to know
- A question or task is attached to the run’s ticket if it has one, and to the other objects of the run (the customer, the recording).
- A question or task that is still open on a closed or deleted ticket expires by itself; a waiting
human.requestthen continues viaexpired. Work that has to happen after closing belongs in a workflow, not as an open item on the closed ticket. - Waiting costs nothing: a run that waits for an answer stands still until the answer or the deadline comes.
- A fixed
assigneewho may not handle the organisation’s tickets makes the step fail. If a reference from the event ({{trigger.<...>UserId}}) is such a person, the work goes to everyone. - Never put ids (ticketId, messageId, actionId) in
show: the question is already linked to the ticket.
