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

GET
/api/open/v1/managerhub/team

Department roster + engagement / seniority stats

GET
/api/open/v1/managerhub/progress/summary

One rolled-up completion figure per category + benchmarks

GET
/api/open/v1/managerhub/progress/onboarding

Every member's onboarding progress

GET
/api/open/v1/managerhub/progress/journeys

Completion counts per department journey

GET
/api/open/v1/managerhub/progress/courses

Completion counts per department course

GET
/api/open/v1/managerhub/progress/certificates

Holder counts per department certificate

Department filtering

Every endpoint requires a department_ids filter.

Query paramNotes
department_idsRequired. 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.

FieldNotes
first_name, last_name, full_nameThe names as shown in the app.
avatar_urlURL of the profile picture, "" when the member has none.
statusactive, inactive (no activity for 21+ days) or invited (not registered yet).
last_active_atISO-8601 timestamp with offset of the member's last activity, or null.
next_shift_atLocal 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_monthsWhole months since hire date (falls back to registration date); always 0 for a member with status invited.
engagement_pctShare (%) 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_offboardingtrue while the member is inside their offboarding window.
offboarding_starts_atISO-8601 timestamp of when the member's offboarding starts, or null.
terminated_atISO-8601 timestamp of the member's leaving date, or null.
stats.engagement.department_pctShare (%) of the members whose last activity is within the last 30 days, invited members included.
stats.engagement.org_baseline_pctThe same share across every registered user in the company, recomputed daily.
stats.seniority.department_avg_months, stats.seniority.company_avg_monthsAverage 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.

  • users pools every member's items across onboarding steps, journeys, courses and certificates: completed items over assigned items.
  • onboarding, journeys, courses and certificates count members: the sums of the per-item counts on the endpoints below.
  • offboarding is only sent when offboarding is turned on for the company: active_count is the members inside their offboarding window, upcoming_count the 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
    }
  ]
}