---
title: "List Funnel"
method: GET
path: "/admin/onboarding"
tags: ["admin-onboarding"]
---

# List Funnel

`GET /admin/onboarding`

## Request

- Base URL: `https://app.zeno-works.ch` (the document declares no server; this is the origin it was published from)
- URL: `https://app.zeno-works.ch/admin/onboarding`
- Auth: none declared

Who is stuck getting into the product, where, and for how long (admin).

One row per in-flight wizard draft, **stalest first** — the funnel is a worklist, so
the row that has not moved outranks the one saved a minute ago.

"Stalled" is measured on ``step_entered_at``, not ``updated_at``. The latter bumps on
a ~1s autosave debounce, so it answers "is this person active" and structurally cannot
answer "how long have they been stuck on THIS step" — a user re-typing the same
balance sheet for three days looks identical to a healthy one under it. Drafts
predating that column report an unknown step age and fall back to the weaker signal.

The counts strip deliberately spans **two populations that need opposite responses**:
users stuck inside the wizard (an accountant can usually unblock them) and people
whose activation mail never left the building (``undelivered_signups`` — a platform
failure, invisible from every other surface, and the one to fix first because they
cannot reach a wizard at all). ``created_recently`` is the only output measure; without
it the page reports four ways of being stuck and reads as a funnel that never
converts.

``require_admin``, not the in-session variant: ``OnboardingDraft``, ``User`` and
``AgentKeyRequest`` are GLOBAL — a draft belongs to a person, before any company
exists — so no tenant predicate applies and this gate is the only authorization.

## Headers

- `authorization` string, nullable

## Cookies

- `access_token` string, nullable

## Response `200`

Successful Response

- FunnelOut
  - `rows` FunnelRowOut[], required
    - `user_id` string, required
    - `email` string, required
    - `company_name` string, nullable, required
    - `current_step` string, required
    - `step_label` string, required
    - `days_on_step` integer, nullable, required
    - `days_since_update` integer, required
    - `stalled` boolean, required
    - `next_action` string, required
    - `blocking` string[], required
    - `blocker_codes` string[], required
    - `blockers_known` boolean, required
    - `blockers_recorded_at` string, date-time, nullable, required
  - `counts` FunnelCountsOut, required
    - `in_flight` integer, required
    - `stalled` integer, required
    - `undelivered_signups` integer, required
    - `accounts_without_drafts` integer, required
    - `created_recently` integer, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/zeno-works/apis/zeno-api.md) · [All operations](https://skmtc.dev/zeno-works/apis/zeno-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zeno-works/apis/zeno-api/revisions/1eb93dde146c?raw)
