Manager Hub
Department-level reporting: the team roster and onboarding, journey, course, and certificate progress for one or more departments.
Every request reports on the department(s) named in the required department_ids parameter. Figures are pooled across the given departments.
Required scope: read:managerhub. The Manager Hub feature must be enabled for the company, see feature-gated endpoints.
Endpoints
/api/open/v1/managerhub/teamDepartment roster + engagement / seniority stats
/api/open/v1/managerhub/progress/summaryOne rolled-up completion figure per category + benchmarks
/api/open/v1/managerhub/progress/onboardingEvery member's onboarding progress
/api/open/v1/managerhub/progress/journeysCompletion counts per department journey
/api/open/v1/managerhub/progress/coursesCompletion counts per department course
/api/open/v1/managerhub/progress/certificatesHolder counts per department certificate
Department filtering
Every endpoint requires a department_ids filter.
| Query param | Notes |
|---|---|
department_ids | Required. Comma-separated department group IDs (e.g. 12 or 12,40), no spaces. Figures are pooled across the given departments; a member of several is counted once. A missing or malformed value returns 422. IDs that match no group are not an error: they give empty lists and zero counts. |
A department's members are its users who are not deactivated or deleted and not excluded from statistics in the CMS. Invited users who have not registered yet are members too.
/managerhub/team
The department roster — every member with their status, last activity, next shift, seniority, engagement and leaving date, sorted by user id — plus the department's engagement and seniority benchmarks.
| Field | Notes |
|---|---|
first_name, last_name, full_name | The names as shown in the app. |
avatar_url | URL of the profile picture, "" when the member has none. |
status | active, inactive (no activity for 21+ days) or invited (not registered yet). |
last_active_at | ISO-8601 timestamp with offset of the member's last activity, or null. |
next_shift_at | Local start time of the member's next shift as scheduled in the department's timezone, sent without a timezone offset (e.g. 2026-06-20T08:00:00); do not read it as UTC or convert it. Unlike last_active_at, it carries no offset. null when the member has no upcoming shift in the requested departments. |
seniority_months | Whole months since hire date (falls back to registration date); always 0 for a member with status invited. |
engagement_pct | Share (%) of the last 30 days on which the member opened the app, from tracking data, as a whole number. null when tracking is unavailable; 0 for a tracked-but-inactive member. |
is_offboarding | true while the member is inside their offboarding window. |
offboarding_starts_at | ISO-8601 timestamp of when the member's offboarding starts, or null. |
terminated_at | ISO-8601 timestamp of the member's leaving date, or null. |
stats.engagement.department_pct | Share (%) of the members whose last activity is within the last 30 days, invited members included. |
stats.engagement.org_baseline_pct | The same share across every registered user in the company, recomputed daily. |
stats.seniority.department_avg_months, stats.seniority.company_avg_months | Average months since hire date (else registration date) of registered members, and of all registered users in the company (recomputed daily). |
{
"data": {
"members": [
{
"id": 4821,
"first_name": "Jane",
"last_name": "Doe",
"full_name": "Jane Doe",
"avatar_url": "https://…",
"status": "active",
"last_active_at": "2026-06-18T07:12:00+02:00",
"next_shift_at": "2026-06-20T08:00:00",
"seniority_months": 14,
"engagement_pct": 73,
"is_offboarding": false,
"offboarding_starts_at": null,
"terminated_at": null
}
],
"stats": {
"engagement": { "department_pct": 64.0, "org_baseline_pct": 61.0 },
"seniority": { "department_avg_months": 11.0, "company_avg_months": 9.5 }
}
}
}/managerhub/progress/summary
One rolled-up completion figure per category, plus the benchmark header. overall_completion and onboarding_time compare the department against an org-wide baseline (recomputed daily). Each category block is { completed_count, total_count, completed_pct }, where completed_pct is a whole number. When onboarding is turned off for the company, stats.onboarding_time and the onboarding block are left out of the response; the other keys are unchanged.
userspools every member's items across onboarding steps, journeys, courses and certificates: completed items over assigned items.onboarding,journeys,coursesandcertificatescount members: the sums of the per-item counts on the endpoints below.offboardingis only sent when offboarding is turned on for the company:active_countis the members inside their offboarding window,upcoming_countthe members whose window opens later.
{
"data": {
"stats": {
"overall_completion": { "department_pct": 68.0, "org_baseline_pct": 61.0 },
"onboarding_time": { "department_avg_days": 11.0, "company_avg_days": 14.0 }
},
"users": { "completed_count": 120, "total_count": 200, "completed_pct": 60 },
"onboarding": { "completed_count": 18, "total_count": 24, "completed_pct": 75 },
"offboarding": { "active_count": 1, "upcoming_count": 2 },
"journeys": { "completed_count": 40, "total_count": 72, "completed_pct": 56 },
"courses": { "completed_count": 95, "total_count": 140, "completed_pct": 68 },
"certificates": { "completed_count": 30, "total_count": 48, "completed_pct": 63 }
}
}/managerhub/progress/onboarding
Every department member's onboarding progress, plus the share who have finished. Only registered, active members are listed, plus invited members when the company counts invited users in its statistics. Completed members carry time_spent_days; members still onboarding carry days_overdue (0 when not overdue) and days_used. When onboarding is turned off for the company, or has no onboarding journey, the response has zero counts and an empty users list.
{
"data": {
"completed_pct": 75,
"completed_user_count": 18,
"total_user_count": 24,
"users": [
{
"id": 4821,
"first_name": "Jane",
"last_name": "Doe",
"full_name": "Jane Doe",
"avatar_url": "https://…",
"completed_count": 6,
"total_count": 6,
"is_completed": true,
"time_spent_days": 9
}
]
}
}/managerhub/progress/journeys
Completion counts for every published journey, except the onboarding journey, that is assigned to a group one of the members is in — the department itself or any other group of theirs. total_user_count is the members the journey is assigned to.
{
"data": [
{
"id": 7,
"title": "Leadership Track",
"completed_user_count": 12,
"total_user_count": 30,
"completed_pct": 40
}
]
}/managerhub/progress/courses
Completion counts for every published course assigned to a group one of the members is in, plus courses that are open to everyone (no groups and no assigned users). image_url is the course cover, or null. A course counts as completed for a member once they have passed all its chapters, whether or not a course-level completion was ever recorded.
{
"data": [
{
"id": 12,
"title": "Food Safety Basics",
"image_url": "https://…",
"completed_user_count": 21,
"total_user_count": 30,
"completed_pct": 70
}
]
}/managerhub/progress/certificates
Holder counts for every certificate, published or not, unlocked by one of the courses above. total_user_count is every department member, whether or not the course is assigned to them.
{
"data": [
{
"id": 5,
"title": "Food Hygiene",
"completed_user_count": 24,
"total_user_count": 30,
"completed_pct": 80
}
]
}