Orbit — complete functional guide
Product: Orbit by Ideonex Scope of this document: every screen, every field, every option value, and what each one means in practice.
This is written to be read in two ways. Read Part 1 straight through to learn how the product is meant to be used. Use Parts 2 onward as a reference when you need to know what a particular dropdown value actually does.
Everything here describes how the product actually behaves. Where it does not do something people commonly assume it does, that is called out rather than left for you to discover.
Part 1 — The flow
1. The mental model
Five nouns, nested. Learn these and the rest of the product follows.
Organisation ─ one workspace, one bill, one set of users
│
├── Department ─ optional. A role granted here covers every project beneath it
│ └── Team ─ a group of people you can assign work or roles to as a unit
│
└── Project ─ a place you work in. Owns its issue types, workflow,
│ board, components, versions, SLA policies, security levels
│
├── Issue ─ the unit of work. Typed, keyed (ENG-142), owned, staged
│ ├── Sub-tasks, links, comments, attachments, work logs
│ ├── Participants ─ everyone with a named job on it
│ └── Baton ─ who is holding it *right now*
│
├── Board / Backlog / Sprints / Roadmap
├── Releases / Environments / Deployments
└── Test suites / cases / cyclesTwo ideas separate this product from a plain ticket list, and both are worth understanding before you start.
The baton. Every status declares which role owns work sitting in it. When an issue moves to "QA Failed", the engine knows that status is owned by the developer role, looks up who is filling the developer role on that issue, and hands it to them. Nobody reassigns anything by hand. The current holder is called the baton holder, and the product tracks how long they have held it, who passed it to them, how many times the issue has changed hands, and how many times it has gone backwards.
Stage versus status. A status is precise ("Regression Failed"). A stage is the macro phase a manager asks about ("it's in QA"). Every status belongs to exactly one of 16 stages, from a shared catalogue, which is what lets a portfolio report ask "how much work is stuck in QA across 40 projects" and get a truthful answer even though each project renamed its statuses.
2. Getting the workspace running
2.1 Register the organisation
/signup. You choose a workspace name and slug, create the owner account, and pick how many paid users you are registering.
- Price is INR 100 per paid seat per month. Viewer-role users are free.
- The organisation owner consumes one seat.
- The first 10 organisations ever registered can claim one calendar month free with no Razorpay charge. Eligibility is counted in a global counter; deleting an organisation does not give the place back. The offer is available only at initial registration, never later.
- The free month includes the full feature set.
2.2 Order of setup
Do these in order. Each one makes the next useful.
- Create a project (
/projects→ new). Pick its type; that decides which issue types it accepts. See §16. - Invite people (
/admin/people). Each invitation carries a role. - Install a workflow (
/admin/workflows). Nothing is seeded beyond a starter workflow — you choose a template or keep it minimal. - Set project role defaults (project settings). This is the step teams skip and then wonder why routing does nothing. Without it, every new issue starts with an empty roster and the first handoff lands on nobody.
- Optionally: SLA policies, security levels, components, versions, custom fields, automation rules, SSO.
2.3 Signing in
- Password login at
/login. - Single sign-on if an administrator has configured and enabled a provider: Google, Microsoft, GitHub, Okta, generic OpenID Connect, or SAML.
- If the workspace has enforced SSO turned on, password login is rejected for everyone except the workspace owner, who keeps a break-glass path in case the identity provider breaks.
On first login the server quietly creates anything missing — a starter project, a board, a general chat channel — and gives any issue without a project a home and an issue key.
3. A day in the product
This is the path the product is designed around. Follow it once and the rest of the reference will make sense.
Morning: what is actually on you
Two screens, and the difference matters.
| Screen | What it shows | Use it when |
|---|---|---|
/my-work | Everything assigned to you that is not finished, in no particular order | You want your whole plate |
/my-queue | Work currently in your hands, oldest first, plus approvals awaiting your signature | You want the list with someone waiting on the other end |
/my-queue is the one to start with. It is ordered by how long the baton has sat with you, so the thing at the top is the thing somebody has been waiting on longest.
Raising work
/issues/new, or /create-ticket (the old URL, which redirects). Or, from chat, /ticket PROJ "Title" high @someone.
You pick a project, an issue type, and a priority; you write a title and a description. Everything else is optional at creation and can be filled in later. See §4 for every field.
The issue gets a key on creation — ENG-142 — from the project's own counter. That key never changes and is what people quote in conversation.
Moving work
Open the issue. The header answers three questions a status field cannot:
- Where is it? The stage pipeline — a stepper showing how far through it is.
- Who has it? The baton card — the holder, the role they are acting in, how long they have held it, and whether they are overdue.
- What can be done next? The transition bar.
The transition bar shows every move available to you. The forward move is the only filled button, so the common case is a glance rather than a read. Moves you cannot make are shown disabled with the reason, not hidden — "Close needs the two open subtasks finished" tells you what to do, where a missing button just looks broken.
Press a transition. If it has a screen, you are asked for the fields it needs (a rejection always asks for a reason). If it has validators, they run server-side and refuse with an explanation. If it has an approval gate, the issue parks where it is and an approval request goes out; the move completes when quorum is met.
Then the baton moves, automatically, to whoever fills the role that owns the new status.
The round trip that shows why this exists
A bug in the Defect Lifecycle workflow:
QA raises it → baton: triage officer
Triage confirms and routes → baton: dev lead
Dev lead assigns → baton: developer
Developer fixes, marks ready → baton: QA lead (handoff #1, forward)
QA lead assigns a tester → baton: QA engineer
Tester fails it → baton: the developer who wrote it
(handoff #2, backward, bounceCount = 1)
Developer fixes again → baton: the tester who failed it
(not "the queue" — the baton remembers)
Tester passes it → baton: reporter, to verify
Reporter confirms → ClosedNobody reassigned anything. handoffCount is 4, bounceCount is 1. An issue whose bounce count reaches 3 is flagged as ping-ponging, because work that has failed QA three times is usually a misunderstood requirement rather than a careless developer.
Closing and reopening a bug: the QA engineer who verified a fix can Close it from QA Passed, Regression Passed or Shipped. Anyone who works bugs can Reopen a closed or done bug (a reason is required). Won't fix and Cancel need issue:close (Project Manager and above).
Ending the day
- Log time on what you worked on (issue screen → Log work).
- Anything you are blocked on: park it with a transition whose intent is
park, and say why. It returns to where it came from when you resume it. /reportsif you run a team.
Part 2 — Work items
4. Creating an issue, field by field
Screen: /issues/new.
| Field | Required | Options | What it means |
|---|---|---|---|
| Project | yes | Every project you can see | Decides the issue key prefix, the available issue types, the workflow, the board and the custom fields |
| Issue type | yes | The project's own list — see §5 | Decides which workflow governs the issue, through the project's workflow scheme |
| Title | yes | Free text, max 250 characters | What people will see in every list. Write it as the thing to be done |
| Description | yes | Free text, Markdown by default | The detail. Format is markdown unless set to plain |
| Priority | defaults to medium | The create form offers all six: lowest, low, medium, high, urgent, highest | How soon it should be picked up. Drives SLA targets |
| Due date | no | Date picker, restricted to today through today + 7 days on this form | A hard date for the whole issue. Note the one-week cap on the create form; longer dates are set on the issue screen |
| Story points | no | Number, steps of 0.5 | Relative size. Feeds velocity and burndown |
| Estimate (minutes) | no | Whole minutes | Original estimate. Feeds remaining-estimate and timesheet reporting |
| Labels | no | Comma-separated free text | Cross-cutting tags. Searchable, filterable |
| Assignee | no, and only shown if you hold issue:assign | Any active user | The first baton holder. Leave empty and the workflow's role defaults fill it |
Created through the API, an issue can also carry a parent (making it a sub-task), a sprint, an epic, components, versions, a security level, a milestone and custom fields.
If the project has no issues yet you will be sent to create a project first. Issues cannot exist outside a project.
5. Issue types, and when to use each
Sixteen types exist. A project only offers the subset that suits it.
Development types
| Type | Use it when | Notes |
|---|---|---|
epic | A large body of work spanning several sprints | Carries the roadmap. Putting a milestone on an epic places it on the timeline |
story | A unit of user-visible value, sized and estimated | The normal currency of a scrum team |
task | Work that needs doing but is not user-facing | The default type |
subtask | A slice of a parent issue | Always has a parent. Many workflows refuse to close a parent while sub-tasks are open |
bug | Something is behaving wrongly and must be fixed | Gets the Defect Lifecycle workflow by default. Carries severity |
improvement | Something works, and could work better | This is the "enhancement" type. Use it for polish, performance and usability work on shipped behaviour |
feature | New capability that does not need epic-level breakdown | Between a story and an epic in practice |
spike | Time-boxed investigation with a question to answer, not a thing to deliver | Use this for "we need to find out whether X is possible". Close it with the answer written down |
Note on the terms you may be used to. If your previous tool used scenario / bug / enhancement, the mapping is: scenario → a test case under Testing, or aspikeif it is an investigation rather than a test; bug →bug; enhancement →improvement. Test scenarios are first-class objects here rather than an issue type, which is what lets them be executed repeatedly in cycles and produce defects.
Service management types
| Type | Use it when | Notes |
|---|---|---|
incident | Something is broken in production now | Incident Response workflow. Can open a war-room chat channel automatically |
problem | The underlying cause behind one or more incidents | Outlives the incident. Incidents link back to it |
service_request | Someone wants something delivered from a catalogue | Service Request Fulfilment workflow. The requester closes it, not the agent |
change / change_request | A planned modification to a live system | ITIL Change workflow, with a CAB gate |
access_request | Access to a system, tool or dataset | A service request with its own label for reporting |
hardware_request | A laptop, a monitor, a phone | As above |
software_request | A licence or an installation | As above |
Which types a project offers
Set from the project type at creation, and editable afterwards:
| Project type | Issue types offered | Default type |
|---|---|---|
| software | epic, story, task, subtask, bug, improvement, feature, spike | task |
| service_desk | incident, service_request, problem, change, change_request, access_request, hardware_request, software_request | service_request |
| business | task, subtask, improvement, service_request | task |
| ops | task, subtask, incident, change, problem | task |
Development and service issues live in one collection deliberately: links, comments, attachments, watchers, activity, search and audit then work uniformly across both, so a bug found in QA can link to the production incident that caused it with no special machinery.
6. Priority, severity, impact, urgency, risk
Five different questions. They are separate fields because conflating them is how a backlog ends up with forty "critical" items.
Priority — how soon we will act
Stored values: lowest, low, medium, high, urgent, highest. The create form, the issue screen and the API all offer the full set.
Priority is what SLA targets are keyed on, and the default sort on every work list.
Severity — how badly it is broken
sev1, sev2, sev3, sev4, or blank. Mostly used on bugs and incidents.
| Value | Conventional meaning |
|---|---|
sev1 | Total loss of service or data; no workaround |
sev2 | Major function unusable; painful workaround |
sev3 | Minor function affected; acceptable workaround |
sev4 | Cosmetic or trivial |
Severity is a statement of fact about the defect. Priority is a decision about scheduling. A sev1 in a system nobody uses this quarter can legitimately be low priority.
Service fields: impact and urgency
On service issues, these two justify the priority rather than replacing it.
- Impact — how wide the blast radius is:
low,medium,high,organisation. - Urgency — how soon it has to be fixed:
low,medium,high,critical.
Change fields: change type and risk
On change and change_request issues:
- Change type —
standard(pre-approved, routine, low risk),normal(goes to the Change Advisory Board),emergency(bypasses the board, still needs one signature, and the audit records that it was an emergency). - Risk —
low,medium,high. The ITIL workflow asks for a rollback plan before a change with risk can proceed.
7. Resolutions
Set when an issue enters a status flagged as a resolution. Entering such a status also stamps resolvedAt.
| Value | Use it when |
|---|---|
| (blank) | Not resolved. Every open issue |
done | Completed as described |
fixed | A defect that has been corrected |
wont_do | A deliberate decision not to do it. Not a failure; a choice |
duplicate | Another issue already covers it. Link the two |
cannot_reproduce | Tried, could not make it happen. Say what you tried |
declined | The request was refused, e.g. an access request denied |
Terminal statuses (done, closed, cancelled, rejected, duplicate, wont-do) cannot be left except through an explicit reopen transition.
8. Issue links
Nine link types, in mirrored pairs plus one symmetric.
| Link | Meaning | Reverse shown on the other issue |
|---|---|---|
blocks | This must finish before the other can proceed | is_blocked_by |
is_blocked_by | Cannot proceed until the other is done | blocks |
relates_to | Loosely connected, worth reading together | relates_to |
duplicates | Same thing as the other, raised twice | is_duplicated_by |
is_duplicated_by | The other is a duplicate of this one | duplicates |
causes | This produced the other, e.g. a change that caused an incident | is_caused_by |
is_caused_by | Produced by the other | causes |
clones | Created as a copy of the other | is_cloned_by |
is_cloned_by | The other was cloned from this | clones |
is_blocked_by is not decoration: the no_blocking_links validator refuses a transition while any blocking link is still open.
9. The issue screen
/issues/:id. Everything you can do to one piece of work.
The header
| Element | What it gives you |
|---|---|
| Stage pipeline | A stepper of the stages this workflow touches, with the current one marked. How far through it is |
| Baton card | Who holds it, the role they hold it in, how long they have held it, whether they are past their respond-by time |
| Transition bar | Every move. Forward move filled, others outlined, blocked ones disabled with the reason |
| Roster panel | Who fills which role on this issue, and which roles the workflow expects but nobody fills. Vacancies show up here before a gate refuses to open |
| Handoff trail | Every team-to-team pass, with direction and how long the previous holder had it |
| Approval card | Shown while a gate is open: who must sign, who has, and your own approve/reject buttons if you are one of them |
Fields you can edit inline
Project, type, priority, severity, assignee, reporter, labels, components, fix release, affects release, environment, milestone, sprint, story points, due date, start date, estimates, security level, and any custom fields the project defines.
Service issues additionally show: requester, requester department, category, subcategory, impact, urgency, change type, risk.
Actions
| Action | What it does |
|---|---|
| Hand this over | Pass the baton to a named person, with an optional note. Use it for "on leave until Thursday, over to you" |
| Return to the queue | Drop the baton so anyone in the role can claim it |
| Set / remove role | Fill or clear a participant role on this issue |
| Comment | Markdown. @email mentions a person and notifies them. Comments can be edited, deleted, reacted to with emoji, and carry attachments |
| Internal note | A comment flagged internal. Hidden from reporters on service-desk projects. Needs ticket:internal_note |
| Log work | Minutes spent, with a note. Accumulates into timeSpentMinutes and the timesheet report. One entry can be at most 24 hours (1440 minutes); log longer work as one entry per day |
| Watch / unwatch | Get notified about everything on this issue |
| Vote | Register interest. Useful for prioritisation |
| Link | Add one of the nine link types to another issue |
| Attach | Files. See §32 |
| Delete issue | Needs issue:delete |
Tabs
- Comments — the conversation, newest last. Internal notes marked.
- History — every field change, as from/to pairs, with who and when.
- Handoffs — the team-to-team passes, separate from the noise of ordinary field edits.
Security level
If the project defines security levels, an issue can be restricted to one. An issue with no level is visible to anyone who can see the project — that is the normal case and the deliberate default.
Someone who cannot read a restricted issue gets a 404, not a 403. Confirming that a restricted issue exists is itself a leak.
The people named on the issue keep access by default (includeParticipants, includeReporter), so applying a level cannot lock an assignee out of their own work.
Part 3 — The workflow engine
10. Stages, statuses and categories
Three layers, each answering a different question.
Status category — what boards and burndowns read
Three values, and only three:
| Category | Meaning |
|---|---|
todo | Not started |
in_progress | Being worked on |
done | Finished |
Renaming a status never breaks velocity or burndown maths, because those read the category.
Stage — the macro phase
Sixteen, ordered. The order is the pipeline.
| # | Stage | Meaning |
|---|---|---|
| 0 | Intake | Raised, not yet accepted |
| 1 | Triage | Classified, reproduced and routed |
| 2 | Refinement | Specified, designed and estimated |
| 3 | Ready | Accepted and queued for delivery |
| 4 | Development | Being built |
| 5 | Code Review | Peer and architecture review |
| 6 | Build | Merge, pipeline and artefacts |
| 7 | QA | Test team verification |
| 8 | UAT | Business acceptance |
| 9 | Security | Security and compliance review |
| 10 | Staging | Pre-production verification |
| 11 | Release | Packaging, change approval, go/no-go |
| 12 | Deployment | Going live |
| 13 | Post-Release | Production verification and warranty |
| 14 | Closure | Final states |
| 99 | Suspended | Parked. Returns to wherever it came from |
Suspended sits outside the line on purpose. Work can be parked from anywhere and returns to where it came from, so giving it a position on the pipeline would make every burndown lie.
Status — the precise state
138 statuses in the shared catalogue, each tagged with its stage and the baton role that owns it. Full list in §11.
Status flags
Each status can carry four flags:
| Flag | Effect |
|---|---|
isResolution | Entering it sets a resolution and stamps resolvedAt |
isTerminal | Nothing leaves except an explicit reopen transition |
pausesSla | SLA clocks stop ticking while the issue sits here |
targetMinutes | How long work may sit here before it is flagged stale. Per-stage expectation, distinct from the whole-issue SLA |
Why a shared catalogue
The moment two projects both invent "In QA" with different spellings, cross-project reporting stops working and every board needs a bespoke mapping. A shared id space means the portfolio question gets a truthful answer.
Your organisation still owns its copy: statuses are expanded from the catalogue and copied onto your workflow at install time, so you can rename "QA Failed" to whatever your team calls it without a later release overwriting the change.
11. The full status catalogue
Every status in the shared vocabulary, grouped by stage. Owner is the baton role that holds work sitting in that status: this column is the whole routing mechanism, so read it as "who has it while it is here".
Total: 138 statuses across 16 stages.
Intake — Raised, not yet accepted.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Draft | draft | Reporter | todo | Being written. Not visible to triage yet. | |
| Submitted | submitted | Triage Officer | todo | Handed to triage. | |
| Awaiting Information | intake-awaiting-info | Reporter | todo | pauses SLA | Back with the reporter for detail. |
| Duplicate Suspected | duplicate-suspected | Triage Officer | todo | ||
| Automated Triage | auto-triage | System | todo | Rules are classifying it. | |
| Intake Accepted | intake-accepted | Triage Officer | todo | ||
| Intake Rejected | intake-rejected | Reporter | todo | Sent back. Not yet closed. |
Triage — Classified, reproduced and routed.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| In Triage | triage | Triage Officer | in_progress | ||
| Severity Assessment | severity-assessment | Triage Officer | in_progress | ||
| Impact Analysis | impact-analysis | Business Analyst | in_progress | ||
| Reproduction Pending | reproduction-pending | QA Engineer | in_progress | ||
| Reproduction Confirmed | reproduction-confirmed | QA Engineer | in_progress | ||
| Not Reproducible | not-reproducible | Reporter | in_progress | Back with the reporter for steps. | |
| Needs Clarification | needs-clarification | Reporter | in_progress | pauses SLA | |
| Routing to Team | routing | Development Lead | in_progress | ||
| Triage Approved | triage-approved | Development Lead | in_progress |
Refinement — Specified, designed and estimated.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| In Refinement | refinement | Business Analyst | in_progress | ||
| Requirements Drafting | requirements-drafting | Business Analyst | in_progress | ||
| Requirements Review | requirements-review | Product Owner | in_progress | ||
| Design Pending | design-pending | Architect | in_progress | ||
| Design In Progress | design-in-progress | Architect | in_progress | ||
| Design Review | design-review | Architect | in_progress | ||
| Estimation Pending | estimation-pending | Development Lead | in_progress | ||
| Estimated | estimated | Development Lead | in_progress | ||
| Refinement Blocked | refinement-blocked | Business Analyst | in_progress | ||
| Refinement Complete | refinement-complete | Product Owner | in_progress |
Ready — Accepted and queued for delivery.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Backlog | backlog | Product Owner | todo | ||
| Prioritised | prioritised | Product Owner | todo | ||
| Sprint Candidate | sprint-candidate | Development Lead | todo | ||
| Sprint Committed | sprint-committed | Development Lead | todo | ||
| Ready for Development | ready-for-development | Developer | todo | ||
| Ready but Blocked | ready-blocked | Development Lead | todo |
Development — Being built.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Development Assigned | development-assigned | Developer | todo | ||
| In Development | in-development | Developer | in_progress | ||
| Development Paused | development-paused | Developer | in_progress | ||
| Awaiting Dependency | awaiting-dependency | Development Lead | in_progress | pauses SLA | |
| Awaiting Third Party | awaiting-third-party | Vendor / Third Party | in_progress | pauses SLA | |
| Local Testing | local-testing | Developer | in_progress | ||
| Unit Tests Pending | unit-tests-pending | Developer | in_progress | ||
| Unit Tests Failed | unit-tests-failed | Developer | in_progress | ||
| Unit Tests Passed | unit-tests-passed | Developer | in_progress | ||
| Development Complete | development-complete | Code Reviewer | in_progress | ||
| Development Rework | development-rework | Developer | in_progress | Came back from a downstream gate. |
Code Review — Peer and architecture review.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Pull Request Raised | pr-raised | Code Reviewer | in_progress | ||
| Code Review Pending | code-review-pending | Code Reviewer | in_progress | ||
| Code Review In Progress | code-review-in-progress | Code Reviewer | in_progress | ||
| Changes Requested | changes-requested | Developer | in_progress | ||
| Peer Review Pending | peer-review-pending | Code Reviewer | in_progress | ||
| Architecture Review | architecture-review | Architect | in_progress | ||
| Review Escalated | review-escalated | Development Lead | in_progress | ||
| Merge Conflict | merge-conflict | Developer | in_progress | ||
| Code Review Approved | code-review-approved | Build Engineer | in_progress |
Build — Merge, pipeline and artefacts.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Merge Pending | merge-pending | Build Engineer | in_progress | ||
| Merged | merged | Build Engineer | in_progress | ||
| Build Queued | build-queued | System | in_progress | ||
| Build Running | build-running | System | in_progress | ||
| Build Failed | build-failed | Developer | in_progress | ||
| Static Analysis Failed | static-analysis-failed | Developer | in_progress | ||
| Build Passed | build-passed | QA Lead | in_progress | ||
| Artefact Published | artifact-published | QA Lead | in_progress |
QA — Test team verification.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Ready for QA | ready-for-qa | QA Lead | in_progress | The dev-to-test handoff. | |
| QA Assigned | qa-assigned | QA Engineer | in_progress | ||
| QA In Progress | qa-in-progress | QA Engineer | in_progress | ||
| QA Blocked | qa-blocked | Development Lead | in_progress | ||
| QA Failed | qa-failed | Developer | in_progress | The test-to-dev handoff. Baton goes back. | |
| Retest Pending | qa-retest-pending | QA Engineer | in_progress | ||
| Test Case Review | test-case-review | QA Lead | in_progress | ||
| Defect Triage | defect-triage | QA Lead | in_progress | ||
| Regression Pending | regression-pending | Automation Engineer | in_progress | ||
| Regression In Progress | regression-in-progress | Automation Engineer | in_progress | ||
| Regression Failed | regression-failed | Developer | in_progress | ||
| Regression Passed | regression-passed | QA Lead | in_progress | ||
| QA Passed | qa-passed | QA Lead | in_progress | ||
| QA Sign-off | qa-signoff | QA Lead | in_progress |
UAT — Business acceptance.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Ready for UAT | ready-for-uat | UAT Coordinator | in_progress | ||
| UAT Scheduled | uat-scheduled | UAT Coordinator | in_progress | ||
| UAT In Progress | uat-in-progress | Business Owner | in_progress | ||
| UAT Blocked | uat-blocked | UAT Coordinator | in_progress | ||
| UAT Failed | uat-failed | Developer | in_progress | ||
| UAT Passed | uat-passed | UAT Coordinator | in_progress | ||
| Business Verification | business-verification | Business Owner | in_progress | ||
| UAT Sign-off Pending | uat-signoff-pending | Business Owner | in_progress | ||
| UAT Signed Off | uat-signed-off | Release Manager | in_progress |
Security — Security and compliance review.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Security Review Pending | security-review-pending | Security Analyst | in_progress | ||
| Security Scan Running | security-scan-running | System | in_progress | ||
| Security Findings Open | security-findings-open | Developer | in_progress | ||
| Penetration Test Pending | pen-test-pending | Security Analyst | in_progress | ||
| Compliance Review | compliance-review | Security Analyst | in_progress | ||
| Security Review Passed | security-review-passed | Security Analyst | in_progress | ||
| Security Sign-off | security-signoff | Security Analyst | in_progress |
Staging — Pre-production verification.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Ready for Staging | ready-for-staging | DevOps Engineer | in_progress | ||
| Staging Deploy Pending | staging-deploy-pending | DevOps Engineer | in_progress | ||
| Deployed to Staging | deployed-to-staging | QA Engineer | in_progress | ||
| Staging Verification | staging-verification | QA Engineer | in_progress | ||
| Staging Failed | staging-failed | Developer | in_progress | ||
| Staging Verified | staging-verified | Release Manager | in_progress |
Release — Packaging, change approval, go/no-go.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Release Candidate | release-candidate | Release Manager | in_progress | ||
| Release Notes Pending | release-notes-pending | Release Manager | in_progress | ||
| CAB Submission | cab-submission | Change Manager | in_progress | ||
| CAB Review | cab-review | Change Manager | in_progress | ||
| CAB Approved | cab-approved | Release Manager | in_progress | ||
| CAB Rejected | cab-rejected | Development Lead | in_progress | ||
| Go / No-Go | go-no-go | Release Manager | in_progress | ||
| Release Approved | release-approved | DevOps Engineer | in_progress | ||
| Release On Hold | release-on-hold | Release Manager | in_progress | pauses SLA |
Deployment — Going live.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Deployment Scheduled | deploy-scheduled | DevOps Engineer | in_progress | ||
| Deployment Window Open | deploy-window-open | DevOps Engineer | in_progress | ||
| Deploying | deploying | System | in_progress | ||
| Deployment Failed | deploy-failed | DevOps Engineer | in_progress | ||
| Rollback Initiated | rollback-initiated | DevOps Engineer | in_progress | ||
| Rolled Back | rolled-back | Development Lead | in_progress | ||
| Hotfix Required | hotfix-required | Developer | in_progress | ||
| Deployed to Production | deployed-to-production | QA Engineer | in_progress |
Post-Release — Production verification and warranty.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Production Verification | production-verification | QA Engineer | in_progress | ||
| Smoke Test Pending | smoke-test-pending | QA Engineer | in_progress | ||
| Smoke Test Failed | smoke-test-failed | DevOps Engineer | in_progress | ||
| Production Verified | production-verified | Release Manager | in_progress | ||
| Monitoring | monitoring | DevOps Engineer | in_progress | ||
| Post-Release Issue | post-release-issue | Developer | in_progress | ||
| Warranty Period | warranty-period | Support Agent | in_progress | ||
| Handover to Support | handover-to-support | Support Agent | in_progress |
Closure — Final states.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| Pending Closure | pending-closure | Reporter | in_progress | ||
| Reporter Verification | reporter-verification | Reporter | in_progress | Back to whoever raised it, to confirm. | |
| Closure Approved | closure-approved | Unassigned | in_progress | ||
| Done | done | Unassigned | done | resolution, terminal | |
| Closed | closed | Unassigned | done | resolution, terminal | |
| Cancelled | cancelled | Unassigned | done | resolution, terminal | |
| Rejected | rejected | Unassigned | done | resolution, terminal | |
| Duplicate | duplicate | Unassigned | done | resolution, terminal | |
| Won't Do | wont-do | Unassigned | done | resolution, terminal |
Suspended — Parked. Returns to wherever it came from.
| Status | Id | Owner | Category | Flags | Notes |
|---|---|---|---|---|---|
| On Hold | on-hold | Development Lead | in_progress | pauses SLA | |
| Blocked | blocked | Development Lead | in_progress | ||
| Deferred | deferred | Product Owner | todo | pauses SLA | |
| Awaiting Approval | awaiting-approval | Approver | in_progress | ||
| Awaiting Customer | awaiting-customer | Reporter | in_progress | pauses SLA | |
| Awaiting Vendor | awaiting-vendor | Vendor / Third Party | in_progress | pauses SLA | |
| Parked | parked | Product Owner | todo | pauses SLA | |
| Escalated | escalated | Development Lead | in_progress |
12. Baton roles and ownership routing
A baton role is a job a person does on one issue for one stage. It is not an organisation role. The same human is a reviewer on one issue and a developer on the next, and neither changes their permissions. Keeping the two separate is what lets ownership rotate without touching anyone's access.
The 23 roles
Handoff marks the roles that represent a different team picking the work up. Only those moments are stamped as handoffs, because the gap between a developer saying "done" and QA actually starting is where delivery time goes, and averaging it with intra-team churn hides it completely.
| Role | Id | Group | Handoff | What they own |
|---|---|---|---|---|
| Reporter | reporter | requester | yes | Whoever raised it. Gets it back to verify |
| Triage Officer | triage_officer | requester | yes | Classifies and routes incoming work |
| Product Owner | product_owner | product | yes | Decides whether and when it is built |
| Business Analyst | business_analyst | product | yes | Writes and owns the requirement |
| Architect | architect | engineering | yes | Owns technical design and its review |
| Development Lead | dev_lead | engineering | yes | Routes work inside the engineering team |
| Developer | developer | engineering | yes | Builds it |
| Code Reviewer | reviewer | engineering | yes | Reviews the change before it merges |
| Build Engineer | build_engineer | engineering | no | Owns merge and pipeline health |
| QA Lead | qa_lead | quality | yes | Owns the test plan and the QA gate |
| QA Engineer | qa_engineer | quality | yes | Executes the tests |
| Automation Engineer | automation_engineer | quality | yes | Owns the regression suite |
| UAT Coordinator | uat_coordinator | business | yes | Runs the acceptance cycle |
| Business Owner | business_owner | business | yes | Accepts it on behalf of the business |
| Security Analyst | security_analyst | governance | yes | Owns security and compliance review |
| Change Manager | change_manager | governance | yes | Runs the change advisory gate |
| Release Manager | release_manager | delivery | yes | Owns what ships and when |
| DevOps Engineer | devops_engineer | delivery | yes | Owns environments and deployment |
| Support Agent | support_agent | service | yes | Owns it once it is live |
| Approver | approver | governance | yes | Named approver on a gate |
| Vendor / Third Party | vendor | external | yes | Outside the organisation. Clock usually pauses |
| System | system | system | no | Automated. Held by nobody |
| Unassigned | nobody | system | no | Terminal or unowned |
system and nobody are held by no human. A build runs on its own and there is nobody honest to put on the hook for it; assigning those to a person would make "work assigned to me" meaningless.
How the baton moves
Each transition declares a baton mode. status_owner is the default and the one to reach for: the target status already declares who owns it, so the arrow needs no configuration and stays correct when someone reorders the workflow.
| Mode | Behaviour | Use it for |
|---|---|---|
status_owner | Route to whoever fills the target status's owner role | Almost everything |
keep | Ownership does not change | Purely administrative moves |
actor | Whoever fired it now owns it | "I'll take this" |
previous | Hand back to whoever held it last | Some rejection arrows |
role | Pin to a named role regardless of the target status | The rejection arrow that must go to the developer, not to whoever happened to be last |
reporter | Back to whoever raised it | Final verification before closure |
unassigned | Drop it into a queue for someone to claim | Shared pools |
Two extra settings on any transition's baton:
fallbackRole— where to look if the chosen role has nobody in it on this issue. Without one the engine leaves the issue unassigned rather than guessing, which is safe but lets a queue silently fill with ownerless work. Naming a lead here is the usual answer.respondWithinMinutes— the new holder is expected to act within this many minutes. Past it, the baton shows as overdue and the chaser sends one reminder, not one every half hour.
Who actually fills a role
Three layers, most specific wins:
- Per-issue participants — someone explicitly set on this issue.
- Project role defaults — who fills each role on new work in this project.
- Nothing — the role is vacant, shown in the roster panel, and a gate that needs it will refuse with that reason.
Project role defaults accept three strategies:
| Strategy | Behaviour |
|---|---|
fixed | Always the same person |
round_robin | Intended to rotate through a pool, with the cursor stored so rotation survives a restart |
least_loaded | Intended to pick whoever in the pool currently holds the least work |
Today onlyfixedtakes effect. The API accepts and storespool,strategyand the rotation cursor, but the roster seeder reads the singleuserfield, so a default with only a pool and no named user fills nothing. Set a named user on every role default you rely on.
Participants versus assignee
The single assignee answers "who is holding it right now". It cannot answer "who tested it", "who reviewed the code" or "which lead routed it" — and in a real delivery flow those are the questions asked three months later when something regresses.
Participants are that record. They are additive and never overwritten, so the roster of everyone who touched an issue survives every reassignment. Several people may hold the same role (two reviewers); at most one is primary, and that is the one the baton routes to. Removing someone clears them rather than deleting the record, so history survives.
Handoff directions
Every recorded handoff carries a direction, and the direction is the quality signal.
| Direction | Meaning |
|---|---|
forward | Progressing down the pipeline |
backward | Sent back for rework. Increments bounceCount |
lateral | Same stage, different team |
park | Suspended |
resume | Returned from suspension |
Two counters on every issue:
handoffCount— times it has changed hands between teams. A bug at 9 has been round the houses and is worth a human looking at.bounceCount— times it has been sent backwards. At 3 the issue is flagged as ping-ponging, which is a smell rather than a rule: work that has failed QA three times is usually a misunderstood requirement, and it is worth a conversation before the fourth attempt.
13. Transitions: intents, validators, screens, gates
A transition is one arrow in the state machine. Every status change goes through the engine — the issue screen, a board drag, an automation rule and an approval completing all take the same path, so a gate cannot be bypassed by using a different screen.
Intent — how the move reads in the UI
| Intent | Meaning | How it renders |
|---|---|---|
forward | The happy path | The one filled button |
reject | Send work back upstream | Outlined, usually asks for a reason |
park | Suspend it | Outlined |
resume | Return it from suspension | Outlined |
escalate | Push it up | Outlined |
cancel | Abandon it | Outlined |
reopen | Bring a terminal issue back | Outlined |
neutral | None of the above | Outlined |
Who may fire a transition
Three independent gates, all of which must pass:
requiredPermissions— permissions the caller holds in this project.allowedRoles— the original organisation-role gate. Kept so workflows saved before permissions existed keep working. New workflows should leave it empty and use permissions.allowedBatonRoles— only people holding these roles on this issue. This is the gate permissions cannot express: a QA engineer may holdissue:transitionacross the project, but only the tester actually testing this bug should be able to fail it.
Validators — the 21 guards
Evaluated server-side before a move is allowed. They are data, not code, so you compose your own gates without a deploy.
| Validator | Parameters | Refuses unless |
|---|---|---|
assignee_required | — | The issue has an assignee |
participant_required | role | Someone fills that baton role on this issue |
field_required | field | That issue field is non-empty |
custom_field_required | key | That project custom field is filled |
comment_required | — | The mover supplies a comment |
attachment_required | — | Evidence is attached: a screenshot, log or recording |
estimate_required | — | An original estimate is set |
story_points_required | — | Story points are set |
due_date_required | — | A due date is set |
all_subtasks_done | — | Every sub-task is in a done category |
no_blocking_links | — | No open is_blocked_by link remains |
no_open_child_defects | — | No child defect is still open |
linked_issue_required | linkType | A link of that type exists |
parent_in_stage | stage | The parent has reached that stage |
min_minutes_in_status | minutes | The issue has sat here at least that long. A soak timer — "held fifteen minutes, because a smoke test is not a verification" |
approval_granted | gate | That approval gate has passed |
test_execution_passed | — | The linked test execution passed |
security_review_passed | — | Security review has passed |
release_assigned | — | A fix release is set |
sprint_assigned | — | The issue is in a sprint |
A validator can carry its own message, so a gate explains itself instead of producing a generic failure.
Transition screens
Fields the user is asked for as part of the move, rather than on the issue's edit form. This is what lets "Reject" demand a reason while "Approve" demands nothing, without either polluting the normal form.
Field types available on a screen: text, textarea, select, multiselect, number, date, user, checkbox. Each can be required and can carry help text.
Post-functions — what happens after a successful move
| Post-function | Effect |
|---|---|
assignToSelf | The mover becomes the assignee |
clearAssignee | Unassign |
notifyWatchers | Notify everyone watching. On by default |
addComment | Append a fixed comment |
recordParticipant | Stamp the actor into a named participant role, so "who reviewed this" is answerable months later without reading the activity log |
setResolution | Set a resolution |
clearResolution | Clear it, e.g. on reopen |
addLabel / removeLabel | Tag management |
openWarRoom | Create a chat channel for this issue. Incidents and escalations |
bumpPriority | Push it to the top of the receiving queue |
14. Approvals
An approval is different from a permission. A permission asks "may you press this button". An approval asks "has a named person signed this off", and the signature has to outlive the request.
Firing a gated transition opens an Approval record and parks the issue where it already is. The move completes when quorum is met. There is deliberately no generic "awaiting approval" limbo status in the ITIL template: the issue stays in "CAB Review", so that status keeps meaning what it says.
Configuring a gate
| Setting | Meaning |
|---|---|
name | What is being approved, e.g. "Change Advisory Board" |
role | Approvers are the issue's participants holding this baton role |
approvers | And/or these named people |
approverPermission | And/or anyone holding this permission |
minApprovals | How many must approve. 0 means all of them — the honest default for a CAB, and it stays correct when the roster changes |
allowSelfApproval | Whether the requester may sign their own request. Off by default |
rejectionIsFinal | Any single rejection fails the gate rather than waiting for quorum. On by default |
expiresInHours | Auto-expire an unanswered gate |
onRejectStatus | Where the issue goes if rejected |
Decisions
Each decision is approved, rejected or abstained, with an optional comment. Abstentions do not count toward quorum.
Captured with each decision, for a regulated audit trail: the role the person was acting in at the time, their IP and their user agent. The acting role is snapshotted so a later role change cannot rewrite history.
The approver list itself is snapshotted when the gate opens. Removing someone from a role mid-flight does not silently change who the approvers were.
Approval statuses
pending, approved, rejected, cancelled, expired.
Where you see them
/my-queue carries an approvals section — everything waiting on your signature. The issue screen shows the approval card with progress.
The payload from the transition screen is held on the approval and replayed when the gate passes, so the resolution and comment the requester typed are not lost while waiting.
15. The six workflow templates
Installed on request from Administration → Workflow studio, never seeded. An organisation that wants five statuses keeps five: dropping a forty-state workflow onto a team that did not ask for one is how process tooling gets a reputation for being in the way.
Statuses are copied onto your workflow at install, so you own your copy and can rename anything without a later release overwriting it.
| Template | Key | Category | Applies to | What it is |
|---|---|---|---|---|
| Enterprise SDLC | enterprise_sdlc | software | story, task, feature, improvement | The full pipeline: triage, refinement, development, code review, build, QA, UAT, security, staging, release and production verification, with the work handing itself between teams at every gate |
| Defect Lifecycle | defect_lifecycle | software | bug | Raised, reproduced, triaged, fixed, retested and verified by the person who found it. Counts every bounce between dev and test |
| Change Management (ITIL) | change_management | itsm | change, change_request | Raise, assess risk, submit to CAB, approve, schedule, implement, verify and review. Every gate leaves a signature. Requires a rollback plan |
| Incident Response | incident_response | itsm | incident, problem | Detect, declare, mitigate, resolve and review. Opens a war room on declaration and holds the incident open until the review is written |
| Service Request Fulfilment | service_request | itsm | service_request, access_request, hardware_request, software_request | Request, approve, fulfil and confirm. The requester closes it, not the agent |
| Lean Delivery | lean_delivery | software | any | Seven states, one QA gate, and the work still hands itself to the right person. For teams who do not want ceremony |
Workflow schemes
workflow on a project is the default and the fallback. A workflow scheme routes per issue type on top of it, because a bug and an epic do not travel the same road: forcing one workflow onto both means either the epic collects eleven statuses it never enters, or the bug skips the QA gate.
Expected roles
A workflow declares which baton roles it wants filled. These surface on the issue as empty slots to staff, which is how a team discovers it has no QA lead on a bug before the QA gate refuses to open rather than after.
Board columns from a template
Installing a template also proposes board columns grouped by stage, not one per status. One column per status would give a forty-column board nobody can read.
A note on the designer
The workflow studio is read-and-install plus API editing. Workflows can be installed from a template and edited through PUT /api/projects/workflows/:id with the full document, but there is no visual drag-and-drop transition editor yet.
Part 4 — Planning and delivery
16. Projects and their settings
A project is a place you work in, not a filter you set. Cross-project screens exist too (/work/issues, /delivery/releases), and they are the same components rendered outside a project.
Creating a project
| Field | Options | What it decides |
|---|---|---|
| Name | Free text | Display |
| Key | Uppercase prefix, e.g. ENG | Issue keys: ENG-1, ENG-2. There is a suggest-key endpoint. Unique per organisation, and effectively permanent |
| Type | software, service_desk, business, ops | Which issue types the project accepts, and the default type |
| Methodology | kanban, scrum | Scrum adds sprints and a backlog. Kanban is continuous flow |
| Visibility | open, private | Private projects are only visible to members |
| Lead | A user | Who runs delivery |
| Product owner | A user | Who decides what gets built, as distinct from who runs delivery |
| Department | A department | A role assigned at department level covers every project beneath it, so a manager sees across their area without being added to each project |
| Teams | Teams | Staffing as a unit, distinct from individual members |
| Members | Users, each lead / member / viewer | Project-level membership |
| Workflow | An installed workflow | The default and the fallback |
| Start / target date | Dates | Planning |
Project status and priority
These describe the project itself, not the work inside it. A project can be on hold with every issue open, or completed with a few stragglers; conflating the two hides both.
- Status:
draft,active,on_hold,completed,archived - Priority:
low,medium,high,critical
Project settings you will actually use
| Setting | What it is | Why it matters |
|---|---|---|
| Issue types | The subset of the 16 this project accepts | A software project has no business raising a hardware request |
| Default issue type | Pre-selected on the create form | |
| Default assignee | Fallback owner for new issues | |
| Workflow scheme | Per-issue-type workflow routing | A bug and an epic do not travel the same road |
| Role defaults | Who fills each baton role on new work | The setting that makes routing work. Without it every issue starts with an empty roster. Name a user, not just a pool: see §12 |
| Components | Named parts of the product, each with a lead and an optional default assignee | New issues in a component are auto-assigned to its default assignee |
| Versions | Legacy version names kept for old issues | New work should use Releases, which survive a rename |
| Labels | The project's suggested label list | |
| Custom fields | Per-project fields on every issue | See below |
| SLA policies | Response and resolution clocks | See §21 |
| Security levels | Per-issue visibility restrictions | See below |
Custom fields
Nine types: text, textarea, number, date, select, multiselect, checkbox, user, url.
Each field can be marked required, given an option list (for select types), ordered, and restricted to specific issue types so a bug form does not sprout a field that only makes sense on a change request.
Security levels
Project permissions answer "who can see this project". A security level narrows it to one issue — an HR case or an unpatched vulnerability lives in an ordinary project and must not be readable by everyone in it.
Each level has a name, description, colour, and three additive membership lists: users, teams and role keys. Two switches keep people from being locked out of their own work:
includeParticipants(on by default) — anyone named on the issue keeps accessincludeReporter(on by default) — whoever raised it keeps access
An issue with no level is visible to anyone who can see the project. That default matters: security that is opt-out gets applied to everything and then worked around.
Removing a level that issues still use is refused, because deleting it would make those issues visible to the whole project.
17. Boards, backlog, sprints, roadmap
Board
/work/board, or /projects/:id/board.
A board column maps one or more workflow statuses into one visual lane. Templates propose columns grouped by stage, because one column per status would give a forty-column board nobody can read.
| Board setting | Meaning |
|---|---|
| Type | kanban or scrum |
| Columns | Name, the statuses it contains, order, colour |
| WIP limit | Per column. The UI flags the column red when exceeded. 0 means no limit |
| Swimlanes | Named horizontal bands, each with its own filter on top of the board filter |
| Filter | Board-level filter, e.g. only bugs, or only the current release |
| Hide done after | Cards in a done column older than N days disappear. Default 14 |
| Card fields | What shows on a card. Default: key, assignee, priority, story points, labels, due date |
Dragging a card between columns fires a real transition through the engine, so validators, gates and baton routing all apply. A drag that would fail a validator is refused with the reason, not silently reverted.
Backlog
/work/backlog. Ordered list of everything not in an active sprint. Ranking is a sparse float, so a drag-and-drop reorder is a single write rather than a renumber of the whole list.
Needs backlog:prioritise to reorder.
Sprints
/work/sprints, or the project's Sprints tab. Scrum projects only, in practice.
Sprint states: future, active, closed.
| Action | What happens |
|---|---|
| Start sprint | Takes a snapshot of the committed issues and points. That snapshot is what makes scope creep measurable afterwards |
| Complete sprint | Asks first: shows the issues and points still open and where they should go — back to the backlog or into a planned sprint. Nothing changes until you confirm, because a closed sprint cannot be restarted |
| Burndown | One sample per day: remaining points, remaining issues, completed points |
Every sprint an issue has ever been in is kept in sprintHistory, for scope-change reporting.
Roadmap
/work/roadmap, or the project's Roadmap tab. Milestones and releases by quarter, with the epics that deliver them.
An epic is placed on the timeline by giving it a milestone: it is then drawn under that milestone, in the milestone's quarter. Use Move to milestone… on an epic (its ⋯ button, which works from the keyboard too) to schedule it, move it to another milestone or take it off the timeline; setting the Milestone field on the epic does the same. Epics with no milestone are listed under Epics without a milestone.
The timeline shows the current quarter and the next three. Milestones dated before it are in an Overdue lane (open ones are flagged Overdue), those after it in a Later lane, and only milestones without a date are under No target date. Every row shows its date.
A milestone's ⋯ menu offers Edit… (name, target date, status, release, description) and every status change, so a commitment that slips is rescheduled rather than removed and added again (removing it unlinks its epics). Milestone statuses: planned, in_progress, at_risk, completed, cancelled.
18. Finding work: views, quick filters, the query language
Named views
| Route | View | What it is |
|---|---|---|
/my-work | My work | Everything assigned to you that is not finished |
/my-queue | My queue | Work in your hands, oldest first, plus approvals awaiting you |
/work/issues | Issues | Development work across projects you can see |
/work/bugs | Bugs | Defects, most urgent first |
/service/tickets | Service desk | Requests and incidents raised by the business |
/service/incidents | Incidents | Things that are broken now |
Quick filters
Offered in the toolbar menu:
| Filter | Query |
|---|---|
| All open | statuscategory != done |
| Mine | assignee = currentUser() AND statuscategory != done |
| Reported by me | reporter = currentUser() |
| Overdue | due < now() AND statuscategory != done |
| Unassigned | assignee IS EMPTY AND statuscategory != done |
| Updated this week | updated > -7d ORDER BY updated DESC |
The query language
A JQL-like language. It compiles to a database filter, and anything it cannot parse produces a message aimed at the person who typed it, not a stack trace.
Operators
field = value field != value
field IN (a, b, c) field NOT IN (a, b)
field ~ "text" contains
field IS EMPTY field IS NOT EMPTY
field > value >= < <= (dates and numbers)
AND / OR parentheses supported
ORDER BY field ASC|DESCFunctions: currentUser(), now(), startOfWeek(), startOfMonth(), and relative dates like -7d and +3d.
Fields you can query
project, key, type (or issuetype), status, statuscategory, resolution, priority, severity, assignee, reporter, creator, watcher, labels (or label), component, fixversion, sprint, epic, parent, storypoints, created, updated, due (or duedate), resolved, summary (or title), description, text.
Sortable fields: key, created, updated, due, priority, status, storypoints, rank, title, assignee.
Examples
project = ENG AND status != Done AND assignee = currentUser() ORDER BY priority DESC
labels IN (regression, customer) AND created > -14d
text ~ "login timeout" AND priority IN (high, urgent)Saved filters
Save a query with a name. Visibility is private, org or shared, and a filter can be starred to pin it. Anything that runs in the list can be saved, including project keys and active sprint names (project = PAY). Your filter names are unique: a second filter with the same name (ignoring case and surrounding spaces) is refused.
Bulk edit
issue:bulk lets you apply a change to every issue matching a selection in one go. Bulk changes still run through the engine.
19. Testing
Testing is first-class here rather than an issue type, which is what lets the same scenario be run in every regression cycle and keep a history.
Three objects:
Suite ─ a folder. One level of nesting only: "Checkout" → "Payments"
└ Case ─ a definition of what to check
└ Execution ─ one run of that case inside one cycle, with a verdictTest suites
| Field | Meaning |
|---|---|
| Name, description | |
| Parent | One level of nesting. Deeper trees become unnavigable and nobody files anything correctly |
| Regression default | Suites a regression cycle pulls in automatically |
Test cases
A case is a definition. Running it produces an execution.
| Field | Options | Meaning |
|---|---|---|
| Key | PAY-TC-14 | Human-readable, per project |
| Title, description | ||
| Preconditions | Free text | What must be true before you start |
| Steps | List of action → expected pairs | The script |
| Expected result | Free text | The overall outcome |
| Type | functional, regression, smoke, integration, performance, security, usability | What kind of checking this is |
| Priority | low, medium, high, critical | Which cases run first when time is short |
| Automation status | manual, automated, candidate | candidate means "worth automating, not done yet" — the backlog for the automation engineer |
| Covers issues | Links to issues | What this case exists to protect. A failing case can then point straight at the story it covers |
| Owner, labels |
Test case types, in practice
| Type | Use it for |
|---|---|
functional | Does this feature do what the requirement says |
regression | Did we break something that used to work |
smoke | Is the build even worth testing |
integration | Do two systems talk to each other correctly |
performance | Is it fast enough under load |
security | Authorisation, injection, data exposure |
usability | Can a real person actually complete the task |
Test cycles
A cycle is the unit QA works in: "regression for 2.5.0". It pins a set of cases at a point in time, so editing a case later never rewrites history.
| Field | Options | Meaning |
|---|---|---|
| Kind | regression, smoke, release, sprint, adhoc | Why this round is happening |
| Status | planned, in_progress, complete, signed_off, abandoned | Where the round is |
| Release / sprint / environment | References | What is being tested, and where |
| Start / end date, owner | ||
| Sign-off | Who declared it good enough to promote, when, and a note | The gate |
Executions and verdicts
One execution per case per cycle: re-testing updates the verdict in place, which is what "retest until green" means.
| Verdict | Meaning |
|---|---|
not_run | Not attempted yet |
in_progress | Someone is running it now |
passed | Behaved as expected |
failed | Did not. Raise a defect |
blocked | Could not run it — environment down, dependency missing. Not a pass and not a failure |
skipped | Deliberately not run this round |
Per-step results carry not_run, passed, failed or blocked, and the steps are copied from the case at execution time so a later edit to the case does not silently change what was tested.
Each execution can carry a comment, attachments (screenshots and logs backing the verdict), a duration, and a defect — the bug raised from this failure. Raising a defect from a failed execution links the two, which is what makes regression sign-off a real gate rather than a status somebody sets.
Signing off. QA signs off a cycle (test:signoff) once every test has run, nothing failed, was blocked or skipped, and no defect is open. A cycle that does not meet that can still be signed off with a waiver and a written reason, by a project administrator (the project's manager or lead, project:admin), an organization admin or the owner. The waiver and its reason are kept on the cycle and in the audit log.
20. Releases, environments, deployments
Releases
A version of a project that ships. Referenced by id, so renaming a version does not orphan the issues pointing at it.
| Field | Options | Meaning |
|---|---|---|
| Version | Free text | Not every team uses semver |
| Name, description, release notes | ||
| Status | planning, development, qa, regression, uat, approved, deployed, completed, cancelled | Where the release is |
| Owner, start date, target date | ||
| Current environment | Reference | Where this version currently sits, updated by successful deployments |
Release gates. A release carries approvals against three gates: qa, regression and uat; a decision for any other gate is refused. Each approval is approved or rejected with a note, and the latest decision per gate wins — a rejected gate blocks approval until it is approved again. Gates are decided by a release approver (release:approve), a project administrator, an organization admin or the owner. A release cannot reach approved until every required gate is approved — which is what stops that status meaning nothing more than somebody clicking a button.
On an issue: fix release is the version it is scheduled to ship in; affects release is the version where it was found.
Environments
| Field | Options | Meaning |
|---|---|---|
| Name, key, description, URL | key is lowercase and unique per project | |
| Kind | development, qa, staging, uat, production, other | What the environment is for |
| Tier | Number: dev 0, qa 1, staging 2, uat 3, prod 4 | Position in the promotion path |
| Is production | Boolean | Production is treated differently throughout |
| Requires approval | Boolean | A deploy here is refused unless the release is in approved status, which means every release gate has been signed |
| Health | healthy, degraded, unhealthy, unknown | Current state |
| Current version / release / last deployed | Denormalised | So listing environments does not need a lookup per row |
The promotion path is enforced. A release cannot be deployed to a tier until it has already reached the tier below. Try it and the deploy is refused with "that release has not reached the environment below this one; deploy it there first". That is what makes the tier numbers mean something rather than being decoration.
Going backwards is always allowed: a rollback, or re-deploying to development, is never blocked by the promotion path. The rule also only applies to a deployment that names a release; an ad-hoc versioned deploy with no release attached is not checked.
The default environments created for a project are Development (0), QA (1), Staging (2), UAT (3) and Production (4, marked production and requiring an approved release).
Deployments
| Field | Options | Meaning |
|---|---|---|
| Environment, release, version | What went where | |
| Branch, commit, build number | Free text | Traceability back to the code |
| Status | pending, in_progress, succeeded, failed, rolled_back | |
| Kind | deploy, rollback, hotfix | |
| Deployed by / approved by / notes | ||
| Rollback of | Reference | Set when this deployment reverses an earlier one |
Duration is stamped automatically when a deployment finishes.
Permissions worth knowing: deployment:create to deploy at all, deployment:production to deploy to a production environment, and deployment:rollback to reverse one.
Part 5 — Service management
21. Service desk and SLAs
A service_desk project accepts the eight service issue types and hides the development ones. Service issues carry an extra block of fields, grouped so it is obvious which belong to a ticket and which to a development issue: a story has no urgency, an incident has no story points.
Service fields
| Field | Options | Meaning |
|---|---|---|
| Requester | A user | Who asked. Distinct from reporter: an agent can raise a ticket on behalf of someone else, and the SLA belongs to the requester |
| Requester department | A department | For reporting on where demand comes from |
| Category / subcategory | Free text | Your own taxonomy |
| Impact | low, medium, high, organisation | How wide |
| Urgency | low, medium, high, critical | How soon |
| Change type | standard, normal, emergency | On changes only |
| Risk | low, medium, high | On changes only |
| Approved by / at | Stamped when a gate passes | |
| Origin incident | Reference to another issue | The incident that produced this bug, or the problem record behind it |
Internal notes
A comment can be flagged internal. Internal notes are hidden from reporters on service-desk projects. Posting one needs ticket:internal_note. Someone who cannot read internal notes sees no trace of them — not in the comments, not in the history, and no notification or email.
What the requester sees and does
A requester who works through the service desk (the Client role) sees their ticket, its public replies and the people working it. Hand-offs, history, the work log and engineering issues linked to the ticket stay internal.
When their ticket is resolved, the requester closes it, not the agent:
| Action | What happens |
|---|---|
| Confirm resolution | The ticket moves to Closed |
| Reopen | Still broken: the ticket goes back into work (In Progress on the Service Desk workflow), with an optional comment, and the SLA restarts |
Both are recorded in the ticket's history and the audit log. On the Service Request Fulfilment workflow the requester confirms from reporter verification the same way.
SLA policies
Defined per project. Each policy is one clock.
| Setting | Options | Meaning |
|---|---|---|
| Name | Free text | |
| Metric | first_response, resolution | What the clock measures |
| Targets | Minutes per priority: urgent, high, medium, low | Defaults are 240 / 480 / 1440 / 4320 minutes |
| Pause in statuses | A list of status ids | The clock stops while the issue sits in any of them |
| Business hours only | Boolean, on by default | Only count time inside the organisation's working calendar |
| Enabled | Boolean, off by default |
How a clock behaves
- Starts when the issue is created, or at first response for the
first_responsemetric. - Pauses while the issue sits in a status flagged
pausesSla, or in a status named in the policy's pause list. Waiting on a customer or a vendor is not time the delivery team is burning. - Breaches when elapsed unpaused time passes the target for the issue's priority. A breach is stamped with the time it happened.
- In business-hours mode, only working days and working hours count, so a ticket raised at 5pm Friday does not breach over the weekend.
The working calendar is set in workspace settings: working days (default Monday to Friday) and working hours (default 09:00 to 18:00).
Two notification types fire off clocks: sla-warning and sla-breach. There is also an sla_breached automation trigger.
Part 6 — People and administration
22. Roles and permissions
Permissions are the only thing authorisation checks against. Roles are data that map onto the permission list, so adding a role is a configuration change rather than a deploy.
Two naming conventions carry most of the meaning
:any— acts on other people's records, not just your own.issue:editlets you edit yours;issue:edit:anylets you edit anyone's.:admin— configures the thing rather than using it.
Anything scoped to a project is resolved per project. Holding project:admin does not mean holding it everywhere.
The 13 role templates
Seeded into every organisation as templates, not law. An owner can edit them or add their own.
| Role | Key | Usual scope | What it is for |
|---|---|---|---|
| Organization Owner | org_owner | org | Full control, including billing and security. Every permission |
| Organization Admin | org_admin | org | Runs the workspace day to day, without billing, SSO, API keys or role management; includes internal notes, QA/regression gate sign-off, release/environment/deployment/roadmap management and permanent project deletion. DevOps Engineers are invited by the owner |
| Product Manager | product_manager | project | Owns what gets built and when it ships. Roadmap, releases, release approval |
| Project Manager | project_manager | project | Runs delivery: sprints, board, project configuration |
| Engineering Manager | engineering_manager | department | Cross-project visibility, workload and approvals |
| Team Lead | team_lead | team | Assigns and unblocks work within the team |
| Developer | developer | project | Builds and ships work items |
| QA Engineer | qa_engineer | project | Owns test coverage, execution and regression sign-off; signs the QA and regression release gates |
| DevOps Engineer | devops_engineer | project | Owns environments, deployments and releases, plus webhooks and API keys |
| Support Engineer | support_engineer | org | Handles service tickets and escalates into engineering |
| Employee | employee | org | Everyday member: raises work and tickets, joins the conversation |
| Viewer | viewer | org | Internal read-only: follows the work without changing it. Does not consume a paid seat |
| Client | client | project | External: sees only their own tickets, never internal notes |
Role assignments and scope
A role is granted to a principal (a user or a team) at a scope:
| Scope | Effect |
|---|---|
org | Everywhere |
department | Every project under that department. This is how a manager sees across their area without being added to each project |
team | Everything the team is assigned to. Joining QA confers QA's access; leaving removes it |
project | One project |
A user's effective permissions are: their base role's permissions, plus any granted overrides, minus any revoked overrides. Role assignments (project, team, department or org scope) can only add permissions inside their scope; they never take any away. To keep someone out of sensitive work, use a private project (only members, the lead and assigned people see it) or an issue security level. A revoked override removes a permission everywhere.
Legacy roles
Five original role names still work and map onto templates:
| Legacy | Maps to |
|---|---|
viewer | Viewer (internal read-only, not the external Client role) |
employee | Employee |
agent | Support Engineer |
admin | Organization Admin |
superadmin | Organization Owner |
Billing effect
Only viewer is a free role. Everyone else consumes a paid seat.
23. Organisation structure
/admin/departments, /admin/teams, /admin/roles.
Departments
A division of the organisation: Engineering, Product, Support.
| Field | Meaning |
|---|---|
| Name, key, description | key is lowercase and unique |
| Head | Who runs it |
| Parent | Nests one level: "Engineering → Platform". Deliberately not an unbounded tree |
A project belongs to a department, and a role granted at department level covers every project beneath it.
Teams
A working group: Frontend, Backend, QA, DevOps. Teams are the unit work is assigned to and the unit permissions are granted to.
| Field | Options | Meaning |
|---|---|---|
| Name, key, description | key lowercase, unique | |
| Department | A department | Where it sits |
| Function | engineering, frontend, backend, qa, devops, design, product, support, other | What the team does, so a project can be staffed by capability |
| Lead | A user | |
| Members | Each lead or member, with an allocation percent (0–100) | Allocation is a rough share of that person's time, used for sprint capacity |
| Channel | A chat channel can be attached to the team |
A person can belong to several teams — the developer who also sits in an on-call rota — which is why team membership is not a field on the user.
24. People, invitations, single sign-on
People
/admin/people. List, search, view and edit users. Actions: invite, deactivate, reactivate, delete, change role, set per-user permission overrides.
A user carries: name, email, employee id, department, job title, avatar, timezone, phone, presence, notification preferences.
Presence is online, away, busy or offline, plus an optional custom status with an emoji and a do-not-disturb-until time.
Invitations
Generated in People. Each invitation carries a role: viewer, employee, agent or admin.
Invitation statuses: pending, accepted, revoked, expired.
Acceptance and failure are reported per recipient, and a failed send keeps a copyable invitation link so you can pass it on by hand. The link points at the app URL configured on the server, so a misconfigured APP_URL ships links that look fine and go nowhere.
The recipient lands on /invite/:token.
Single sign-on
/admin/sso. Needs sso:manage.
Supported providers: local (password), Google, Microsoft, GitHub, Okta, generic OpenID Connect, and SAML 2.0 (optional).
Setting one up
- Create an application at the identity provider.
- Add the connection here and save it, to get its callback / redirect URI.
- Register that exact URI with the provider.
- Enter the credentials.
- Run the connection test.
- Enable it.
Enforced SSO requires a successful connection test first. Changing credentials, endpoints, scopes or provider configuration clears the previous test and disables the connection until it passes another one.
Per-connection settings
| Setting | Meaning |
|---|---|
| Label | What the sign-in button says |
| Domains | Emails on these domains route to this connection automatically |
| Client id / secret | Secrets are encrypted at rest and never returned to the browser |
| Issuer / discovery URL | OIDC discovery, or explicit endpoints |
| Token auth method | HTTP Basic or request body |
| Scopes | What to request |
| JIT provisioning | Create an account on first successful sign-in |
| Default role for JIT | viewer, employee, agent or admin |
| SAML | Entry point, entity id, IdP certificate, SP key and certificate, signature algorithm, and an attribute map for email, name, first name, last name and groups |
Caveats stated by the product
- The configuration test checks provider metadata and signing keys. It does not prove the client credentials work. Complete a real sign-in before requiring SSO for the team.
- SAML needs
@node-saml/node-samlinstalled and HTTPS for cross-site callback cookies. It reports unavailable until installed. - The workspace owner always keeps password recovery access.
Workspace authentication policy
Set in workspace settings:
| Setting | Meaning |
|---|---|
| Enforce SSO | Password login is rejected for everyone except the owner |
| Allow JIT provisioning | Auto-create accounts from SSO |
| Default role for JIT | Which role those accounts get |
| Session lifetime (days) | Default 7 |
| Require MFA for admins | Flag exists on the organisation record |
25. Automation
/admin/automation. Needs automation:manage. Rules can be organisation-wide or scoped to one project.
A rule is: when this happens → if these are true → do these things.
Triggers
| Trigger | Fires when |
|---|---|
issue_created | A new issue is raised |
issue_updated | An issue changes. You can restrict it to named fields |
issue_transitioned | A status change goes through the engine |
issue_assigned | The assignee changes |
comment_added | Somebody comments |
sla_breached | An SLA clock breaches |
due_date_approaching | A due date is near |
scheduled | On a cron expression you supply |
webhook_received | An inbound webhook arrives |
Conditions
conditionMatch is all (every condition must hold) or any (one is enough).
Each condition is a field, an operator and a value.
| Operator | Meaning |
|---|---|
eq / ne | Equals / does not equal |
in / nin | Is / is not one of a list |
contains / not_contains | Substring or array membership |
gt / gte / lt / lte | Greater / less than, for numbers and dates |
is_empty / is_not_empty | Field has no value / has one |
changed | The field changed in this event |
Actions
| Action | What it does |
|---|---|
assign | Set the assignee |
transition | Move the issue. Goes through the engine, so validators and gates still apply |
set_field | Set any issue field |
add_label / remove_label | Tag management |
add_comment | Post a comment |
add_watcher | Add someone to the watch list |
notify | Send a notification |
post_to_channel | Post a chat message |
call_webhook | Call an outbound HTTPS endpoint |
create_subtask | Create a child issue |
link_issue | Add a link |
add_to_sprint | Put it in a sprint |
Guard rails
| Guard | Default | Purpose |
|---|---|---|
maxRunsPerHour | 200 | Stops a runaway rule |
lastAutomationAt on the issue | Rules avoid re-triggering themselves in a loop | |
lastError | The last failure, shown in the UI | |
enabled | on | Turn a rule off without deleting it |
There is a test endpoint per rule, so you can try one before enabling it.
26. Integrations: webhooks and API keys
/admin/integrations. Needs webhook:manage or apikey:manage.
Webhooks
Outbound HTTPS calls when something happens.
| Setting | Options | Meaning |
|---|---|---|
| Name, URL | HTTPS public destinations only | |
| Events | A list of event names | What to send |
| Project | Optional | Scope it to one project |
| Format | guideuni (raw event envelope), slack, teams | Slack and Teams modes post a chat-shaped payload to an incoming webhook instead of the raw envelope |
| Headers | Key/value | Extra headers on each delivery |
| Secret | Every delivery carries an HMAC-SHA256 signature header. Verify it at the other end | |
| Enabled |
Deliveries use pinned DNS resolution and bounded retries. The product tracks consecutive failures, the last delivery time, the last status code and the last error, and will disable a webhook with a stated reason. There is a test button per webhook.
API keys
Machine credentials for the REST API.
| Field | Meaning |
|---|---|
| Name | What it is for |
| Prefix | Visible identifier. The full key is shown once, at creation |
| Scopes | Which permissions the key carries |
| Expires at | Optional expiry |
| Last used at | So you can spot a dead key |
| Revoke | Immediate |
Only a hash of the key is stored, so a lost key cannot be recovered, only replaced.
27. Audit log and workspace settings
Audit log
/admin/audit. Needs audit:view. Exportable.
Every entry records: the actor, the actor's email, the action, the category, the target, a structured diff of what changed, the IP, the user agent and the outcome.
| Dimension | Values |
|---|---|
| Actor type | user, api_key, system, automation, sso |
| Category | auth, issue, project, user, billing, security, chat, admin |
| Outcome | success, failure |
Retention is 365 days.
Workspace settings
/admin/settings. Needs org:manage.
| Setting | Default | Meaning |
|---|---|---|
| Issue key counter padding | 0 | Zero-pad issue numbers, e.g. ENG-0042 |
| Working days | Mon–Fri | Which days count for SLA business hours |
| Working hours | 09:00–18:00 | Which hours count |
| Default project | none | Where unassigned work lands |
| Chat enabled | on | Turn chat off for the workspace |
| Email notifications | on | Master switch |
| Auth policy | Enforce SSO, JIT provisioning, default JIT role, session lifetime, MFA for admins |
There is also an admin diagnostics endpoint, including a test-email send that an authorised owner can fire at their own address.
Transfer ownership (owner only, at the bottom of the page): choose an active member who is not an external client, confirm with your password, and they become the workspace owner. You stay in the workspace as an Organization Admin; only the new owner can transfer it back. A wrong password is refused without signing you out.
28. Billing and seats
/admin/billing. Needs billing:view; changes need billing:manage.
The plan
| Plan | Price | Notes |
|---|---|---|
Launch offer (free) | ₹0 | One calendar month free, first 10 organisations only, claimed at registration |
Business (business) | ₹100 per user per month | The normal plan. 1 to 2000 seats |
Retired plan ids (business_annual, enterprise) stay readable for existing data. Legacy ids monthly, yearly and pro alias onto current plans. All new calculations are INR only; historical invoices and legacy USD fields are retained rather than rewritten.
Included at every level
Unlimited projects, 250 GB storage, 200 automation rules, custom workflows, SSO, SAML, 365-day audit retention, 50 webhooks, 20 API keys, chat and SLAs.
Seats
- A seat is billed for active users in a non-free role. Viewers are free.
- The owner consumes one seat.
- User creation is blocked once seats used reaches seats purchased.
GET /api/billing/seats/previewquotes a seat change before you commit it.
Subscription statuses
trialing, active, past_due, cancelled, expired.
An expired trial loses access to core product endpoints while billing remains available, so you can always pay to get back in.
Payments
Razorpay, INR. Verification checks the signature, the captured status, the order, the amount and the currency. Seat-change and renewal receipts are bound to the authenticated organisation and cannot be reused for a different purpose or quantity.
Payment purposes: signup, seat_change, renewal, plan_change. Invoice statuses: draft, open, paid, void, refunded.
Renewal is an explicit payment you make from Billing & seats. Recurring mandates and automatic debits are not implemented.
You can also cancel (optionally at period end) and resume.
Part 7 — Communication and reporting
29. Chat, calls and meetings
Channels
/chat, /chat/:channelId. Needs chat:use.
| Channel type | Meaning |
|---|---|
public | Anyone in the workspace can find and join |
private | Invite only |
dm | One to one |
group_dm | A small group, no channel name |
A general channel is created with the workspace, one per project, and one per team. An incident workflow can open a war room channel automatically.
Per-member settings: channel role (owner, admin, member), muted, and notify on — all, mentions or none.
Messages
Messages support threads, emoji reactions, pinning, editing, deletion, and read state per channel.
Attachment and block types on a message: issue_ref (an issue preview), link_preview, code, image, file, system, poll.
Author types: user, bot, system, automation — so a message posted by an automation rule is visibly not a person.
Slash commands
| Command | Usage | What it does |
|---|---|---|
/help | /help | List every available command |
/ticket | /ticket PROJ "Title" [priority] [@assignee] | Create an issue from chat, credited to the channel it came from |
/assign | /assign PROJ-123 @user | Assign an issue |
/status | /status PROJ-123 in-progress | Move an issue to a new status |
/me | /me | Show issues assigned to you |
/find | /find "search text" | Search issues by text |
/topic | /topic New topic text | Set the channel topic |
/invite | /invite @user | Add someone to this channel |
/shrug | /shrug [text] | Append a shrug |
Calls
/calls, /call/:roomId. Needs call:start. Screen sharing needs call:screenshare; recording needs call:record.
Meetings
/meetings. Needs meeting:schedule to create one.
| Field | Options | Meaning |
|---|---|---|
| Title, agenda | Agenda up to 2000 characters | |
| Media | audio, video | |
| Starts at | Date and time | |
| Duration | 5 to 480 minutes, default 30 | |
| Status | scheduled, cancelled |
Each meeting exposes an .ics invite at /api/meetings/:id/invite.ics, so it can be added to a normal calendar.
30. Notifications
The bell in the header, plus optional email and web push.
Types
ticket-assigned, status-changed, comment, review, closed, reassigned, baton-passed, baton-overdue, approval-requested, approval-decided, mention, chat-message, thread-reply, watching, sla-breach, sla-warning, due-soon, sprint, automation, billing, security, invite.
baton-passed is deliberately separate from ticket-assigned. The handoff is the thing being announced, not the assignment: "QA passed this back to you, it failed on Safari" reads differently from "you have been assigned an issue", and people triage them differently in a busy inbox.
Priority
low, normal, high.
Per-user preferences
| Preference | Default | Effect |
|---|---|---|
| on | Send email as well as in-app. Switch it off under My profile → Notifications | |
| In-app | on | The bell |
| Mentions only | off | Suppress everything except direct mentions |
| Daily digest | off | One summary instead of a stream |
When Email is on (and the workspace's Email notifications switch is on), you are also emailed when you are @mentioned, an issue is assigned or handed to you, something of yours is due soon or has been waiting on you too long, and when a meeting you are invited to is scheduled, changed or cancelled. The requester of a service ticket is emailed about public replies and status changes on it. Nobody is emailed about their own action, and an internal note is never emailed.
Actions
Mark one read, mark all read, clear all, see the unread count.
Web push
Browser push notifications: fetch the public key, subscribe, send a test, unsubscribe. Works per device.
31. Reports
/reports. Needs report:view. report:team and report:org widen the scope from your own work to a team's and then the whole organisation.
Tabs: Overview, Throughput, Velocity, Workload, SLA. A cycle time and a timesheet report are also available from the API.
| Report | Question it answers |
|---|---|
| Dashboard / overview | What is the state of things right now |
| Throughput | How many items are we finishing per period |
| Cycle time | How long does work take from start to finish |
| Velocity | How many points per sprint, and how consistent |
| Workload | Who is carrying what |
| Timesheet | Where logged time went |
| SLA | Which clocks are at risk and which breached |
The baton data backs two things a status field cannot show: stage ageing (how long work has sat in each phase) and the bounce report (which issues keep going backwards). heldMs is denormalised onto each handoff so the bounce report is one query rather than a windowed scan.
32. Attachments
Attach files to issues, comments and test executions.
- Stored on the server's local disk by default, or S3.
- There is a usage endpoint so you can see how much space the workspace is consuming against the 250 GB allowance.
- Download and delete are permission-checked against the issue the attachment belongs to, so an attachment on a restricted issue is restricted too.
Deployment note for administrators: attachments are written to local disk. Render rebuilds the application directory on every deploy, so without UPLOAD_DIR pointed at a mounted persistent disk, every uploaded file is lost at the next release.
Part 8 — Reference
33. Every permission
Every permission in the system, and which of the 13 role templates grants it out of the box. Roles are editable, so treat the right-hand column as the shipped default rather than a rule.
Short names: Owner, Admin, PM (Product Manager), PjM (Project Manager), EM (Engineering Manager), Lead (Team Lead), Dev, QA, DevOps, Support, Employee, Viewer, Client.
Total: 74 permissions.
Work items
| Permission | Granted by default to |
|---|---|
issue:view | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Support, Employee, Viewer |
issue:create | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Support, Employee |
issue:edit | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Support, Employee |
issue:edit:any | Owner, Admin, PM, PjM, EM, Lead |
issue:delete | Owner, Admin, PjM |
issue:assign | Owner, Admin, PM, PjM, EM, Lead |
issue:transition | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Support, Employee |
issue:close | Owner, Admin, PM, PjM, EM, Lead |
issue:bulk | Owner, Admin, PM, PjM, EM, Lead |
issue:link | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Support, Employee |
worklog:log | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Support, Employee |
worklog:edit:any | Owner, Admin, PM, PjM, EM, Lead |
Projects and configuration
| Permission | Granted by default to |
|---|---|
project:view | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Support, Employee, Viewer |
project:create | Owner, Admin |
project:admin | Owner, Admin, PjM |
project:archive | Owner, Admin |
project:delete | Owner, Admin |
project:member:manage | Owner, Admin, PjM |
workflow:admin | Owner, Admin |
board:admin | Owner, Admin, PM, PjM, EM |
Agile planning
| Permission | Granted by default to |
|---|---|
sprint:view | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, Employee, Viewer |
sprint:manage | Owner, Admin, PM, PjM, EM |
backlog:prioritise | Owner, Admin, PM, PjM, EM, Lead |
epic:manage | Owner, Admin, PM, PjM, EM |
roadmap:view | Owner, Admin, PM, PjM, EM, Dev, Viewer |
roadmap:manage | Owner, PM, PjM |
Releases
| Permission | Granted by default to |
|---|---|
release:view | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Viewer |
release:manage | Owner, PM, PjM, DevOps |
release:approve | Owner, PM, EM |
Environments and deployments
| Permission | Granted by default to |
|---|---|
environment:view | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps |
environment:manage | Owner, DevOps |
deployment:view | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps |
deployment:create | Owner, Dev, DevOps |
deployment:production | Owner, DevOps |
deployment:rollback | Owner, DevOps |
Testing
| Permission | Granted by default to |
|---|---|
test:view | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, Viewer |
test:manage | Owner, Admin, PjM, EM, Lead, QA |
test:execute | Owner, Admin, PjM, EM, Lead, QA |
test:signoff | Owner, QA |
Service management
| Permission | Granted by default to |
|---|---|
ticket:view | Owner, Admin, Support, Employee, Client |
ticket:view:any | Owner, Admin, Support |
ticket:create | Owner, Admin, Support, Employee, Client |
ticket:assign | Owner, Admin, Support |
ticket:resolve | Owner, Support |
ticket:internal_note | Owner, Support |
sla:manage | Owner, Admin |
People and org structure
| Permission | Granted by default to |
|---|---|
user:view | Owner, Admin, EM, Support, Viewer |
user:invite | Owner, Admin |
user:manage | Owner, Admin |
role:manage | Owner |
department:view | Owner, Admin, EM, Support |
department:manage | Owner, Admin |
team:view | Owner, Admin, EM, Lead, Support, Viewer |
team:manage | Owner, Admin |
team:member:manage | Owner, Admin, EM |
Organisation and platform
| Permission | Granted by default to |
|---|---|
org:view | everyone |
org:manage | Owner |
billing:view | Owner |
billing:manage | Owner |
sso:manage | Owner |
automation:manage | Owner, Admin |
webhook:manage | Owner, Admin, DevOps |
apikey:manage | Owner, DevOps |
audit:view | Owner, Admin |
Reporting
| Permission | Granted by default to |
|---|---|
report:view | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Support, Employee |
report:team | Owner, Admin, PM, PjM, EM, Lead |
report:org | Owner, Admin, EM |
Communication
| Permission | Granted by default to |
|---|---|
chat:use | everyone |
channel:create | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Support, Employee |
channel:admin | Owner, Admin |
message:delete:any | Owner |
call:start | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Support, Employee |
call:screenshare | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Support, Employee |
call:record | Owner |
meeting:schedule | Owner, Admin, PM, PjM, EM, Lead, Dev, QA, DevOps, Support, Employee |
34. What the product does not do
Stated plainly, because finding these out in week nine of a rollout is worse than reading them now. All of these are taken from the product's own notes.
Not implemented
| Thing | Status |
|---|---|
| SCIM provisioning | Not implemented, and deliberately not advertised in the pricing catalogue |
| Enforced MFA | The flag exists on the organisation record; enforcement is not implemented |
| Recurring billing mandates / automatic debits | Not enabled. Renewal is an explicit Razorpay payment you make from Billing & seats |
| Visual workflow designer | The studio is read-and-install. Workflows can be installed from a template and edited through the API, but there is no drag-and-drop transition editor |
| Payment webhooks and reconciliation | Fulfilment happens after the browser submits the verified receipt. Add webhooks before relying on unattended payment recovery at production scale |
| Marketplace integrations | Not present |
| Enterprise compliance certifications | Not held |
Operational limits
| Limit | Detail |
|---|---|
| Single backend instance | Realtime presence, scheduled jobs and the SSO handoff cache use process-local state. Horizontal scaling needs a shared Socket.IO adapter, durable scheduling and shared handoff storage |
| Uploads on local disk | Use a persistent volume. Object storage and malware scanning are separate deployment work |
| Free-tier SMTP | Render Free blocks SMTP ports 25, 465 and 587. Use the Resend HTTPS provider instead |
| Resend free-tier quotas | Quota errors are reported as failed sends. No paid service is enabled automatically |
Things that are easy to misread
- A status is not a stage. Reports and the pipeline stepper read the stage; boards and burndowns read the status category. Renaming a status changes neither.
assigneeand the baton holder are the same person by definition. They are stored twice so the baton can carry its own timestamps, and the engine keeps them in step. A plain assignee change — a board drag, a bulk edit, an automation rule — repoints the baton.- Participants are additive. Removing someone clears them rather than deleting the record, so the roster of who touched an issue survives.
- A restricted issue returns 404, not 403. That is intentional.
- The create form caps the due date at one week out. Longer dates are set on the issue screen.
- "Unlimited admins" is not a claim the product makes. Administrator counts are governed by roles and seats like everything else.
- This is a substantial ticketing and collaboration feature set, not complete Jira or Slack parity. The product says so itself.
Appendix A — Route map
Public
| Route | Screen |
|---|---|
/ | Landing |
/login | Sign in |
/pricing | Plans |
/signup | Register an organisation |
/auth/callback | SSO landing |
/invite/:token | Accept an invitation |
Signed in
| Route | Screen | Permission |
|---|---|---|
/dashboard | Overview | — |
/my-work | Everything assigned to you | issue:view |
/my-queue | In your hands, oldest first, plus approvals | issue:view |
/projects | Project list | project:view |
/work/issues | All development work | issue:view |
/work/bugs | Defects | issue:view |
/work/board | Board | project:view |
/work/backlog | Backlog | project:view |
/work/sprints | Sprints | sprint:view |
/work/roadmap | Roadmap | roadmap:view |
/delivery/releases | Releases | release:view |
/delivery/environments | Environments | environment:view |
/delivery/deployments | Deployments | deployment:view |
/delivery/testing | Test suites, cases, cycles | test:view |
/service/tickets | Service desk | ticket:view |
/service/incidents | Incidents | ticket:view |
/issues/new | Create an issue | issue:create |
/issues/:id | The issue screen | issue:view |
/chat, /chat/:channelId | Chat | chat:use |
/meetings, /calls | Meetings and calls | chat:use, call:start |
/call/:roomId | A call | chat:use |
/reports | Reports | report:view |
/profile | Your profile | — |
Inside a project
/projects/:projectId plus: (nothing) for the overview, board, backlog, sprints, roadmap, issues, releases, testing, environments, deployments, team, settings.
Administration
| Route | Screen | Permission |
|---|---|---|
/admin/people | People and invitations | user:view |
/admin/teams | Teams | team:view |
/admin/departments | Departments | department:view |
/admin/roles | Roles and assignments | role:manage |
/admin/workflows | Workflow studio | workflow:admin |
/admin/automation | Automation rules | automation:manage |
/admin/integrations | Webhooks and API keys | webhook:manage or apikey:manage |
/admin/sso | Single sign-on | sso:manage |
/admin/audit | Audit log | audit:view |
/admin/billing | Billing and seats | billing:view |
/admin/settings | Workspace settings | org:manage |
Old URLs that still work
/tickets → /service/tickets · /employees and /team → /admin/people · /board → /work/board · /backlog → /work/backlog · /issues → /work/issues · /create-ticket → /issues/new · /billing → /admin/billing · /tickets/:id → /issues/:id
Appendix B — API surface
Base path /api. Authentication is a bearer token from /api/auth/login or an API key.
| Mount | Covers |
|---|---|
/api/organizations | Registration, slug check, organisation count, current org |
/api/auth | Login, providers, SSO start/callback/exchange, current user, password change, sign out everywhere |
/api/users | Directory, invitations, profile, activation, deletion |
/api/departments, /api/teams, /api/roles | Organisation structure and role assignments |
/api/projects | Projects, workflows, workflow catalogue, role defaults, security levels, key suggestion |
/api/issues | Issues, transitions, ranking, participants, baton, approvals, comments, watch, vote, links, work logs, bulk edit, the baton inbox and the approvals inbox |
/api/boards, /api/sprints | Board data, sprint start/complete/burndown |
/api/releases, /api/environments, /api/deployments, /api/milestones | Delivery |
/api/testing | Suites, cases, cycles, executions, defects, sign-off |
/api/overview, /api/search, /api/reports | Dashboard, query language, the seven reports |
/api/chat, /api/calls, /api/meetings | Channels, DMs, messages, reactions, pins, read state, commands, ICE servers, meeting invites |
/api/attachments | Download, delete, usage |
/api/notifications | List, unread count, mark read, clear, web push |
/api/billing, /api/payments | Plans, quotes, orders, verification, invoices, seats, cancel, resume |
/api/sso | Connections, connection test |
/api/admin | Integrations, saved filters, automation test, webhook test, API keys, audit, diagnostics |
/api/tickets | Legacy ticket endpoints, kept working |
Appendix C — Glossary
| Term | Meaning here |
|---|---|
| Baton | Who is holding a piece of work right now, and in what role |
| Bounce | A backward handoff. Work sent upstream for rework |
| Ping-ponging | Three or more bounces on one issue. A smell, not a rule |
| Stage | One of 16 macro phases, from Intake to Closure |
| Status | A precise state within a stage. 138 in the shared catalogue |
| Status category | todo, in_progress or done. What boards and burndowns read |
| Participant | Someone with a named job on an issue. Additive, never overwritten |
| Handoff | A pass between teams, not between individuals |
| Gate | An approval that must collect signatures before a transition completes |
| Validator | A server-side guard that refuses a transition, with a reason |
| Screen | Fields asked for as part of a transition |
| Post-function | A side effect that runs after a successful transition |
| Security level | A per-issue visibility restriction inside an ordinary project |
| Seat | A billable active user in a non-free role |
Generated from the source of ticketing-tool-server and ticketing-tool-application. The status catalogue and permission tables are machine-generated from config/stageCatalogue.js and config/permissions.js, so regenerate them rather than hand-editing when those files change.