Bottleneck Tracking: Where Work Stalls and Why
The workflow-health view: time each study spends per state, the 48-hour at-risk flag, the rejection log with bounce counts, and using it to keep the queue moving.
The Workflow Health tab of Audit Trails answers the operational question the chronology cannot: where is work actually stalling? It reconstructs, from the status-transition rows already in the audit log, how long every study has spent in each state, and it pairs every rejection with the resubmission that followed. It reports — it does not notify: nothing here sends an alert, an email or an SLA breach event.
Where studies stall
Every status transition on a study opens or closes a state span: the time
the study sat in one state. Spans are rebuilt from the transition rows each
time you open the tab, and the API returns each one with its duration already
computed in whole minutes (duration_minutes), which the list renders as
2d 4h. The longest-waiting spans sit at the top of the list.
| Field | Meaning |
|---|---|
| State | The workflow state the study sat in, with its human-readable label |
| Duration | How long the span ran, in minutes, computed server-side at read time |
| Entered / Exited | The transition that opened the span and the one that closed it; an open span has no exit |
| Responsible role | The role that owns the state, read from the state’s role mapping — who the span is waiting on |
| Status | One badge: At Risk, Active (the study is still in that state), or Closed |
The badge shows a single value, and at-risk wins over the other two — a historical span that closed after more than 48 hours reads “At Risk” rather than “Closed”, so check the exit timestamp before concluding the study is still sitting there.
The at-risk rule
A span whose computed duration exceeds 48 hours is flagged at-risk
(strictly more than 48h — the constant behind it is BOTTLENECK_ALERT_HOURS).
That is the whole mechanism: a boolean on the span, evaluated when the view
loads, with no watcher, no reminder and no escalation on top of it. Refreshing
the tab re-measures open spans against the current time, which is why an
untouched study moves from Active to At Risk on its own. The flag is a status
on the span, not a judgment on the study — a busy partner week legitimately
produces at-risk sign-off spans, which is why the view pairs duration with the
responsible role. The Overview KPI “At-Risk Bottlenecks” is narrower than the
list: it counts only at-risk spans that are still active.
The rejection log
Rejections are tracked as cycles, not single events:
- The rejection — every transition into the rejected state, with the rejection reason text as captured on that transition’s justification notes, plus the actor and their role.
- The resubmission — the first later transition out of rejected, paired to
the rejection as its resubmission (
resubmitted_aton the row). The card itself prints the route, the actor, the reason and the bounce count. - The bounce count — how many transitions into rejected that study has accumulated. A study with a bounce count of two or three is a pattern, not an accident: the reasons across its bounces are the fix list.
Cycles are newest-rejection-first, and the same actor, study and date filters apply to this list.
Using it to keep the queue moving
- Work the at-risk list longest first. Each span names its responsible role; escalate or reassign accordingly.
- Read the bounce counts before the rejections. A study bouncing repeatedly has a recurring defect in the file (usually a disposition or a parameter), and the reasons will repeat — fix the cause, not the symptom.
- Cross-check against My Tasks. The bottleneck list tells you where the queue is stuck; My Tasks tells you which of those studies are waiting on you.
- Export the underlying rows when the stall needs to be raised above the team — the ledger export covers the transition and override rows behind these spans.
Reading the numbers together
The two lists answer complementary questions:
- Bottlenecks tell you where work is slow — which state, for how long, and waiting on which role.
- Rejections tell you why work bounces — which studies keep coming back, and with what reasons.
A study that is both at-risk in a state and high on bounce count is the clear priority: it is slow and it is failing review. A study that is at-risk but never rejected is simply waiting — a capacity or priority issue, not a quality one. A study that bounces often but never sits at risk is a quality issue with fast turnaround. Each points at a different fix.
FAQ
Is the workflow tab paginated? No. The list asks the API for the 100 longest spans (the endpoint defaults to 50 and caps out at 500, so this is a window on the worst offenders, not the whole set) and the counter beside the heading reports how many spans exist in total; the rejection list loads in full. The other tabs are server-paginated.
What counts as “time in a state”? From the transition that entered the state to the transition that left it — or, for the state the study currently holds, to now. Timestamps are normalised to UTC before the arithmetic, so stored timezone offsets cannot distort a duration.
Do failed or draft studies appear? A study appears from its first transition; a draft that has not moved yet has no spans until it does. A study left open in a state it no longer holds closes that span at its last recorded transition, so an interrupted history does not produce an infinite span.
See it working in your workspace
Sign in to run the steps above on a real study — or book a demo and we will walk the workflow end to end.
Related docs
Audit Trails: The Complete Study Chronology
The study chronology across the firm: every state change, review, override and access event in time order with identity, plus the cross-study forensic search.
Read docExporting Ledgers: CSV, Excel and Certified PDF
The three ledger export formats: CSV and Excel as working files, and a PDF carrying a SHA-256 content fingerprint and certification block for the proceeding.
Read doc