Each row also reports where the request sits in Mercura's processing lifecycle, the true handling time spent on it, and the timestamps around it:
status— the lifecycle state:NEW,IN_PROGRESS,DONE,CANCELLED,PARSING, orPARSING_FAILED.active_seconds— the true handling time: the total active (engaged) seconds a user spent working the request before export. This is the exact per-request figure behind the in-app time per position metric — the same usage telemetry, read straight from that computation — and it counts only time the request was actively being worked. Defined for exported tenders only:nullfor orders, for requests not yet exported, and for exported requests with no recorded active time.first_opened_at— when a user first opened the request, ornullif it was never opened.exported_at— when the request was first exported to your system, ornullif it has not been exported yet.completed_at— the most recent completion / re-export. Unlikeexported_at(set once, on the first export) this advances on every re-export.
Use active_seconds for handling time. To reproduce the time per position figure Mercura shows in-app, divide by positions_with_selection and aggregate as a pooled ratio across the rows:
-- matches the in-app dashboard
seconds_per_position = SUM(active_seconds) / SUM(positions_with_selection)Two details decide whether your number matches ours:
- Use
positions_with_selection, notposition_count. The metric measures effort per resolved line. Relevant positions that never got a selection are inposition_countbut were not worked, so including them understates the figure. - Pool the totals; don't average the per-request ratios.
AVG(active_seconds / positions_with_selection)weights a 3-position request exactly as heavily as a 300-position one. Request sizes are long-tailed — small requests are the most common — so the mean of ratios lands well above the pooled value. Both are legitimate statistics; only the pooled one is what the dashboard reports.
Per-selection effort is a different question, and selection_count is the right denominator for it:
seconds_per_selection = SUM(active_seconds) / SUM(selection_count)Rows where active_seconds is null (orders, unexported requests, or requests with no recorded telemetry) must be excluded from both — they are unmeasured, not zero.
Do not use
exported_at - first_opened_atas handling time. That span is wall-clock: a request opened on Monday and exported on Wednesday reads as two days even if only 20 minutes of work went in. It includes overnight and idle gaps, so it cannot tell you how long the user actually spent.active_secondsis the field that answers that. The timestamps are still useful for lifecycle reporting (when a request entered/left each state).