WorkflowHub, explained properly.
Everything from "what is a workflow" to the complete routing-rule reference. Written for the person who has to actually build and run this — not a brochure.
1. Core concepts
Five nouns. Learn these and the rest of the product reads itself.
| Concept | What it is | Analogy |
|---|---|---|
| Workflow | The design: the queues work passes through, the form it carries, the rules that govern it. | The blueprint |
| Work item | One unit of work moving through a workflow. Carries field values, notes, attachments, and a full history. | The ticket / the file folder |
| Queue | A step. Work waits here until someone (or an agent) works it and routes it onward. | The in-tray on a desk |
| Field | One piece of structured data on the work item's form. | A box on the form |
| Rule | Logic the platform enforces: block a move, set a value, require a field, route automatically. | The policy in the binder |
The mental model that matters: a work item is a form that travels through queues. Each queue is a step. At each step, a person or an agent fills in that step's outputs as fields, and the workflow's rules read those fields to decide whether the item is allowed to advance. If you remember nothing else, remember that: structured fields are what let the process govern itself. A note saying "looks good" cannot be enforced. A field ReviewOutcome = Approved can.
2. Workflows
A workflow is a design object containing queues, one or more work-item types, the fields on those types, routes between queues, rules, and permissions. You build it on a visual canvas (Workflows in the menu) or by asking an AI to build it for you over MCP.
2.1 Anatomy
- Start point — where new items enter.
- Queues — the steps. See §3.
- Routes — the legal moves between queues. If there is no route, the move is impossible — this is the single most common cause of "my item won't move."
- Junctions — a decision node that picks the next queue by evaluating criteria, instead of asking a person to choose.
- End point — routing here finishes the item (current queue becomes null, status
Finished). - Work-item types — the form definitions. A workflow can carry more than one.
- Variables — named workflow-level values (thresholds, endpoints, feature switches) that rules and external apps both read. Managed under the workflow; permission-gated separately (§8).
2.2 Designing one: the order that works
- List the steps first. Write the real ones on paper. "Intake → Triage → Work → Review → Done" is a workflow; "stuff we do" is not.
- Name what each step PRODUCES. This becomes a field. Review produces a verdict. Testing produces a result. Deployment produces an outcome.
- Create the queues, then the routes between them. Only draw a route where the work legitimately flows. Extra routes are how work escapes your process.
- Add the fields — one per step output, typed (§4.2), not free prose.
- Add the rules that gate the moves (§5). "You may not leave Review until ReviewOutcome is set."
- Set permissions (§8), then publish.
The failure mode we see most: a beautifully drawn workflow with no rules. Nothing is enforced, so people (and agents) move work whenever they feel like it, and the process exists only in folklore. The rules are the process. The canvas is just its picture.
3. Queues
A queue is a step where work waits. Its configuration decides who sees the work and how they get it.
3.1 Queue types
| Type | Behaviour | Use when |
|---|---|---|
| Queue only | Shared pool. Anyone permitted pulls the next item. | Any team-shared step — the default for real throughput. |
| Inbox only | Work is assigned to a specific person and appears in their inbox. | Named-owner steps: an approval by one manager. |
| Inbox and queue | Both — assignable, but unassigned work is still pullable. | Teams that mostly self-serve but sometimes hand-assign. |
| Determined by junction | The junction's criteria decide the destination. | Automatic branching with no human choice. |
3.2 The settings that actually change behaviour
- Requires human approval — a hard gate. An agent cannot advance work out of this queue; only an interactive human can. This is the Golden Rule made mechanical, and it is enforced at the API, not in the UI, so it holds for every caller.
- Queue context / instructions — the human-facing "what do I do here?" text, shown on the work item's Instructions tab.
- Bound skills — operating guides delivered to whoever (or whatever) works this queue. See §9.3.
- Lease trigger — when work lands here, enqueue a task so an external worker (like the edge agent) can claim it.
- Enrichment (query queues) — on arrival, run a configured query and write the results into the item's fields. This is how you attach "everything we know about this customer" without a human looking it up.
- Subscriptions — users can watch a queue and be notified on arrival.
3.3 Pull, don't assign
The default working pattern is Pull Next: the platform hands the worker the highest-priority eligible item and locks it to them. This beats assignment for throughput because idle capacity finds work instead of waiting for a dispatcher. Assignment still exists for genuine named-owner steps.
4. Work items & fields
4.1 What a work item carries
- Ticket ID — human-facing, e.g.
OPS-482. Paste one into the top bar to open it. - Field values — the structured form data, grouped onto tabs.
- Description — the markdown body.
- Notes — commentary; can be marked internal.
- Attachments — files (with inline preview) or reference links.
- History — every action, who took it, and what kind of actor they were:
human,ai, orapp. Stamped server-side from the authentication path; never client-supplied, never editable. - Time entries — active-work timers with actor and source (
human/agent), started and ended. This is how "how long did it take" becomes a fact rather than a guess. - Links & dependencies — relationships to other items, including blocking dependencies.
4.2 Field types
Pick the type by what the value is for. If a rule will test it, it must be discrete and comparable — a combo box, not a paragraph.
| # | Type | Use for |
|---|---|---|
| 0 | Textbox | Short single-line text: titles, identifiers, a name. |
| 1 | MultiLineTextbox | Long free text: a summary, review comments. |
| 2 | Checkbox | A boolean gate/flag. Values are "true" / "false". |
| 3 | ComboBox | Single choice from a fixed list — the workhorse for gate-checkable outcomes. |
| 4 | CheckedListbox | Multi-select from a fixed list: affected components, a sign-off checklist. |
| 5 | Attachment | File upload on the form itself (versioned per field). |
| 6 | DateField | A date: target release, verified-on. |
| 7 | Label | Static text on the form — instructions, section headers. |
| 8 | SubWorkItem | Child items on the parent's form. |
| 9 | RadioButton | Small mutually-exclusive choice shown expanded. |
| 10 | UserList | Pick a user — approvers, owners. |
| 11 | DataGridView | Tabular data, often filled from a query. |
| 12 | Button | Fires an OnButtonClick rule. |
| 13 / 14 | TextboxWithSpellCheck / MultiLineTextboxWithSpellCheck | As above, with spell check — customer-facing prose. |
Design the field a gate will check. Before creating a field, ask: "does advancing past this step require this to be set?" If yes, that field is the subject of a BeforeWorkItemRouted rule — so give it a discrete, comparable value (= "Approved", = "Pass", = "true"), never a sentence.
5. Routing rules — technical reference
A rule is: trigger (when it evaluates) + scenarios (what must be true) + actions (what happens). Scenarios combine with AllScenariosAreTrue (AND) or AnyScenarioIsTrue (OR).
5.1 Triggers — when a rule fires
| # | Trigger | Fires | Typical use |
|---|---|---|---|
| 0 | BeforeWorkItemSave | Before field values are persisted | Default or derive a value; validate; block the save. |
| 1 | AfterWorkItemSave | Immediately after a successful save | Auto-routing on completion (§6.1) and automatic notes. |
| 2 | OnFieldUpdate | When a specific field changes | Show/hide dependent fields; cascade a list. |
| 3 | OnWorkItemOpen | When the item is opened | Set read-only state by who's looking. |
| 4 | BeforeWorkItemCreated | Before creation completes | Stamp defaults from context. |
| 5 | BeforeWorkItemFinished | Before an item is finished | Final completeness checks. |
| 6 | BeforeWorkItemRouted | Before any move between queues | The gate. Pair with CancelAction to refuse a move (§6.2). |
| 7 | AfterWorkItemCreated | After creation | Notify; enqueue downstream work. |
| 8 | AfterWorkItemFinished | After finishing | Fire a completion side-effect. |
| 9 | AfterWorkItemRouted | After a successful move | Announce arrival; stamp an entry time. |
| 10 | OnButtonClick | A Button field is clicked | Operator-initiated actions. |
5.2 Criteria — what a scenario can test
Each criterion compares something to a value using an operator: IsEqualTo, IsNotEqualTo, IsGreaterThan, IsGreaterThanOrEqualTo, IsLessThan, IsLessThanOrEqualTo, MatchesPattern, DoesNotMatchPattern.
| # | Criterion | Tests |
|---|---|---|
| 0 | Field | A field's value. The one you'll use most. |
| 1 | UserIsAMemberOfPermissionGroup | The acting user's group membership. |
| 20 | UserIsNotAMemberOfPermissionGroup | The inverse. |
| 2 | CurrentTimestamp | Clock time — business-hours logic. |
| 3 / 4 / 5 | WorkItemReceivedDate / CreatedDate / FinishedDate | Item dates — ageing and SLA logic. |
| 6 | WorkItemStatus | Current status. |
| 7 | WorkItemIsInQueue | Where the item is now. Essential for queue-scoping a rule (§6.3). |
| 8 | WorkItemIsNotInQueue | The inverse — build directional gates with it. |
| 9 / 10 | WorkItemHasBeenThroughQueue / HasNotBeenThroughQueue | History: "has this been reviewed at all?" |
| 12 | NextWorkItemStatus | The status the move would produce. |
| 13 / 14 | NextQueueIs / NextQueueIsNot | Where it's trying to go. Makes a gate apply to one destination only. |
| 15 | StaticValue | A constant — used to build always-true/false scenarios. |
| 16 / 17 / 18 | WorkItemStartingStatus / StartingQueueIs / StartingQueueIsNot | State at the start of the operation. |
| 19 | WorkItemHasNewNotes | Whether new notes were added. |
| 21 / 22 | WorkItemPreviousQueueIs / PreviousQueueIsNot | Where it came from — "returning from Review" logic. |
| 23 | WorkflowVariable | A workflow variable's value — thresholds without redeploying rules. |
| 24 | FieldJsonPath | A nested value inside a field's JSON blob (e.g. result.items[0].status). |
5.3 Actions — what a rule does
Field & form control
| # | Action | Effect |
|---|---|---|
| 0 / 1 | MakeFieldRequired / MakeFieldNotRequired | Conditional requirement — "if Type = Refund, Amount is required." |
| 2 | SetFieldValue | Write a value into a field. |
| 35 | SetFieldFromJsonPath | Extract a nested JSON value from one field into another. |
| 3 | SetListValueDatasource | Repoint a list's options (cascading dropdowns). |
| 4 / 5 | MakeFieldInvisible / MakeFieldVisible | Show fields only when relevant. |
| 6 / 7 | MakeFieldReadOnly / MakeFieldReadWrite | Lock a value after a step signs off. |
| 15 | SetPriority | Escalate automatically. |
| 18 / 19 | MakeNewEntryRequired / NotRequired | Require a new note/entry. |
Flow control — the ones that govern process
| # | Action | Effect |
|---|---|---|
| 10 | CancelAction | Refuse the operation. On BeforeWorkItemRouted this is your gate; the item does not move and the caller is told why. |
| 36 | RouteWorkItem | Move the item to the queue in the action's component key. Pair with AfterWorkItemSave so completing the work is what advances it. An auto-route still passes every gate — it stops a move being forgotten, it does not grant permission for a refused one. |
| 33 / 34 | EnableRoutingOption / DisableRoutingOption | Show or hide a destination for this item. |
| 8 / 9 | DisplayMessage / DisplayConfirmationMessage | Tell or ask the operator. |
| 13 | AddAutomaticNote | Write a visible note — make automated decisions observable. |
Integration & data
| # | Action | Effect |
|---|---|---|
| 12 / 20 | ExecuteQuery / ExecuteQueryGN2DB | Run a configured query. |
| 17 / 22 | SetFieldValuesToQueryResults (+GN2DB) | Fill fields from a query — auto-enrichment. |
| 11 / 21 | RunConfirmationQuery (+GN2DB) | Query, then ask the operator to confirm. |
| 26 / 27 | SetDataGridViewDataSource (+GN2DB) | Populate a grid field. |
| 16 | SendAnEmail | Send from a template. |
| 24 / 25 | CreateProcessedTriggerRecord / CreateUnprocessedTriggerRecord | Enqueue a task for an external worker — the hand-off to your own services. |
| 28 | LaunchUri | Open a URL. |
| 14 | RunScript | Run a configured script. |
| 29–32 | Enable/DisableNewSubWorkItemEntry, Enable/DisableEditSubWorkItemEntry | Control child-item entry. |
6. Rule recipes
Patterns worth copying, with the exact trigger/criteria/action combination.
6.1 Advance on completion (the engine moves work, not the worker)
Problem: people finish a step and forget to route. Work rots in a queue looking active.
Trigger: AfterWorkItemSave
Scenario: Field "TestResult" IsEqualTo "Pass"
AND WorkItemIsInQueue IsEqualTo "Test"
Action: RouteWorkItem -> queue "Verify"
(Value = "Auto-routed by the Test queue contract")
Now completing the work is the move. The note explains why it moved, so the history reads honestly.
6.2 The gate (nothing leaves without its evidence)
Problem: items advance out of Review with no recorded verdict.
Trigger: BeforeWorkItemRouted
Scenario: WorkItemIsInQueue IsEqualTo "Code Review"
AND Field "ReviewOutcome" IsEqualTo "" (unset)
Action: CancelAction ("Set ReviewOutcome before leaving Code Review.")
The refusal message is what the caller sees — write it as an instruction, not an error code.
6.3 Always queue-scope a field rule
The classic bug. "If TestResult = Pass then route to Verify" — without WorkItemIsInQueue = Test — keeps firing after the item reaches Verify, because the field is still Pass. The item bounces or refuses to settle. Any rule that reads a field and moves an item must also assert where the item is.
6.4 Directional gate (block one direction only)
Trigger: BeforeWorkItemRouted
Scenario: NextQueueIs IsEqualTo "Deploy"
AND Field "DeployApproved" IsNotEqualTo "true"
Action: CancelAction ("Deployment requires sign-off.")
Using NextQueueIs keeps the gate on entry to Deploy without freezing every other move.
6.5 Escalate by age
Trigger: BeforeWorkItemSave
Scenario: WorkItemCreatedDate IsLessThan {threshold}
AND Field "Priority" IsNotEqualTo "Critical"
Action: SetPriority(Critical) + AddAutomaticNote("Auto-escalated on age.")
Store the threshold as a workflow variable so ops can tune it without editing rules.
6.6 Conditional requirement
Trigger: OnFieldUpdate (RequestType) Scenario: Field "RequestType" IsEqualTo "Refund" Action: MakeFieldRequired(RefundAmount) + MakeFieldVisible(RefundAmount)
7. Projects
A workflow answers how work is done. A project answers what we're trying to accomplish — and it can span workflows.
- Membership — items from any workflow can belong to one project. Every item should belong to one; orphaned work is invisible to project reporting.
- Streams & board — group work into lanes and order it; the board is drag-to-reorder with execution order preserved.
- Stages — project-level phases, advanced independently of any single work item.
- Dependencies & critical path — declare that item B waits on item A. A blocked item is visibly blocked, and the critical path is computed.
- Templates — a reusable project shape (stages + transitions) instantiated for each new engagement.
- Priority & status — set at project level, visible on the item.
When to use which: if the answer to "what step is this at?" is the same set of steps every time, that's a workflow. If you're tracking "are we going to finish the Acme migration by Q3?", that's a project — spanning several workflows and a fixed end state.
8. Security model
8.1 How access is decided
Permissions are granted to groups and scoped to a component — usually a queue, sometimes a work-item type or the workflow itself. Users get permissions by group membership. A workflow's owner holds every permission on their own workflow by construction; that seat can't be edited away.
Two identity-shaped rules worth knowing: a permission check that fails on a lookup returns 404, never 403 — the platform does not confirm that something exists to someone not entitled to see it. And every action records actor kind (human, ai, app), stamped from the authentication path.
8.2 Permission reference
| # | Permission | Grants |
|---|---|---|
| 0 | WorkItemsFromQueue | Pull/work items from this queue. |
| 1 | ViewDetailsOnQueue | See item details in this queue. |
| 2 | CreateWorkItems | Create work in this queue. Also gates API/ingest creation. |
| 3 | ViewWorkItems | View items. |
| 4 | SearchForWorkItems | Use search — and run reports, which are search wearing a different hat. |
| 5 | ReopenWorkItems | Reopen a finished item. |
| 6 | OverrideWorkflowDirectionForWorkItems | Route against the drawn direction. Grant sparingly — it is the escape hatch from your own process. |
| 7 | OverrideFieldRequirementsForWorkItems | Save despite unmet field requirements. |
| 8 | EditFinishedWorkItems | Edit fields on a finished item. |
| 9 | DeleteWorkItems | Delete items. |
| 10 | EditWorkItemsAssignedToSomeoneElse | Act on another person's assigned work. |
| 12 | EditWorkItemInAnyQueue | Edit regardless of which queue holds it. |
| 13 | ViewDashboardView | See a dashboard view. |
| 14 | UnlockWorkItems | Break another user's edit lock. |
| 15 / 16 | ViewSummaryOnQueue / ViewSummaryOnWorkflow | See aggregate counts without item access. |
| 17 | ImportWorkItems | Bulk import (CSV). |
| 18 | FilterWorkItemsFromQueue | Filter rather than take strict next. |
| 19 / 20 / 21 / 25 | BatchRoute / BatchFinish / BatchNote / BatchFieldWorkItems | Bulk operations — separately granted, because bulk mistakes are bulk-sized. |
| 22 | DisplayTimerOnWorkItem | Show the active-work timer. |
| 23 / 24 | ViewWorkflowVariables / EditWorkflowVariables | Read / change workflow variables (scoped to the workflow). |
8.3 The Golden Rule, mechanically
Mark a queue requires human approval and an agent cannot advance work out of it — not through the UI, not through the API, not by finishing the item instead of routing it (finishing is routing to the end point, and the same gate applies). An interactive human passes. This is architectural, not a setting someone remembers to check per workflow.
8.4 Secrets
Credentials for external systems live with the edge agent on your hardware. The cloud coordinates work and never holds plaintext. Organizations may opt into admin-recoverable secrets explicitly; the default is zero-knowledge.
9. Setting up the agent
The edge agent is a single self-contained binary (Windows, macOS, Linux). No database, no server — it holds your credentials and does the work that touches your systems.
9.1 Install
- Download it from the Download Agent page in the app.
- Create an API key on the API Keys page. The key acts as you — its actions are attributed to your identity in history.
- Put the key in the agent's config, along with your API base URL.
- Bind the agent to the queue(s) it should work.
- Start it. Its dashboard shows what it's doing, what it's spent, and what it has claimed.
9.2 What the agent needs to succeed
- A queue with clear outputs. If a step's result isn't a field, the agent can't record it and the engine can't gate on it.
- A bound skill telling it how to do this step and the standard it's judged by (§9.3).
- Gates on the queues that matter. Don't rely on the agent's good judgement — encode the rule.
- A budget. The agent tracks spend per item; set the ceiling deliberately.
9.3 Skills — how you teach it
A skill is a markdown operating guide stored in the product and bound to a workflow, queue, or project. When work arrives, the skill travels with it. Write skills as you'd brief a competent new hire: what this step is for, what "done" means, what to do when the input is ambiguous, and what never to do.
Documents are the other kind of knowledge: reference material listed in the item's manifest and fetched on demand rather than pushed in full. Use skills for procedure, documents for reference.
10. What to expect on day one
Honest expectations, because a disappointed pilot is worse than a slow one.
10.1 Works well immediately
- Structured intake & triage — classify an incoming request, fill the form, route it by rule.
- Document extraction into fields — attach a PDF/scan, extract to structured data, hand a human a quick check rather than a retype.
- Enrichment — on arrival, query a system and attach the answer to the item.
- Drafting — replies, summaries, first-pass write-ups, held at a human approval gate.
- Governed hand-offs — moving work between teams with the evidence attached and the audit trail intact.
10.2 Needs a couple of iterations
- Judgement-heavy steps — the first version of a skill is rarely right. Expect to revise it after watching real items.
- Anything with an unwritten standard. If your team can't articulate what "good" means, the agent can't meet it. Writing the skill is often the first time the standard gets written down at all — that's a feature, but budget for it.
10.3 Don't start here
- Irreversible actions without a gate. Payments, external sends, deletions — put a human queue in front, always.
- Processes nobody agrees on. Automating a disputed process just makes the dispute faster.
A good first workflow: 3–5 queues, one AI-worked step, one human approval gate, two or three typed fields, and one gate rule. Run fifty real items through it before you build the second one. You'll learn more from that than from a quarter of design.
11. Measurement & reporting
Everything the platform records is designed to answer four questions about work that has already happened.
| Question | Where it comes from | Where you see it |
|---|---|---|
| Who did it? | History events stamped with actor and actor-kind (human/ai/app) | Item history; Report Builder grouped by assignee or created-by |
| How long did it take? | Time entries (actor, source, start/end) and queue-transition events | Reports → Stage times (p50/p85/max per queue) |
| How much work was done? | Finished events over time | Dashboard trend; Reports → Flow (throughput per week) |
| Where is it stuck? | Time in current stage vs that stage's own historical p85 | Reports → Aging, with stuck flags |
| What did it cost? | Agent spend recorded per execution | Reports → Cost (per stage, per finished item) |
Build your own views in Reports → Builder: filter, group by queue / status / priority / assignee / created-by / project / month, split by a second dimension, chart it, add workflow fields as columns, export CSV. Save it, and the report becomes a URL your BI tool can refresh — see the integration guide.
Questions this manual didn't answer?
Ask a human. During early access you're talking to the people who built it.