---
title: "Pool health"
url: https://services.dev/docs/operate/pool-health
captured: [operate-pool.txt]
---
# Pool health

URL: https://services.dev/docs/operate/pool-health

> Whether your Pool fills, and whether it pays. Time to claim, who was eligible and when no one was, how much of the declared time is used, what members earn, how long pay takes to reach their bank, and who left, for each role and region, with an alarm and the control that answers each one.

Pool health answers one question: does work reach a qualified person fast enough, and does their pay reach them? A Pool is a market, so its health is measured as a market's is, from the record of every Task and every payout.

## The measures

| Measure | What it counts | Alarm, `pool.alarm` with |
|---|---|---|
| fill | Tasks posted and claimed, p50 and p90 time to claim, each rung the [fill ladder](https://services.dev/docs/people/pool/fill.md) climbed, and Tasks no one reached | `claim_slow`, past `Pool.health.claim_p90`; `unreached`, on the first |
| eligible | minutes with no eligible member, by role and region, and why: away, at their limit, conflicted or out of credential | `no_eligible` |
| load | claimed hours against the hours members declared, and standby committed | `overloaded`, past 90% for a week |
| earnings | pay per active member per week, p50, beside retainers | none: it reads |
| payouts | act to funds in the member's bank, p50 and p90, and payouts returned | `payout_late`, past `Pool.health.payout_p90` |
| churn | members who left, and whether each named a successor on their subjects | none: it reads |
| cover | [coverage](https://services.dev/docs/people/pool/coverage.md) in force on every act, and claims against it | `cover_lapsing`, 30 days out |

## A week in April

apis.tax's practitioners, the week before the filing date:

```bash
npx services.dev pools health practitioners --since 7d --live
```

```txt title="magic values: none"
practitioners · gigs.tax · live · 2027-04-05 → 2027-04-11 · 48 members, 41 active, 7 away
  fill      612 reviews · 99.5% claimed · p50 24m, p90 2h50m to claim · 58 raised, 3 widened · 3 unreached
  eligible  no eligible signer for the US-NJ leg for 3h 10m on Tuesday: both New Jersey CPAs away · every other role and leg covered
  load      87% of declared hours · 22 members on spring standby, 440 hours committed this week
  earnings  $1,180.00 a week per active member, p50 · $8,800.00 in retainers this week
  payouts   same-day, two days after each act · act to funds in the member's bank: p50 2d 9h, p90 3d 2h · 0 returned
  churn     1 member left · named a successor on her 6 subjects of record
  cover     $500,000 an act · 0 claims · every act's tail open to its assessment date
```

The same numbers over the API, for your own dashboards or your agent:

```bash
curl https://apis.tax/pools/practitioners/health?since=7d -H "authorization: Bearer $OWNER"
```

```json title="200 · magic values: none"
{
  "object": "pool_health",
  "pool": "practitioners",
  "window": { "from": "2027-04-05", "to": "2027-04-11" },
  "fill": { "tasks": 612, "claimed": 0.995, "claim_p50": "24m", "claim_p90": "2h50m", "raised": 58, "widened": 3, "unreached": 3 },
  "eligible": [{ "role": "signer", "leg": "US-NJ", "none_for": "3h10m", "why": "every eligible member away" }],
  "load": { "utilization": 0.87, "standby": { "members": 22, "hours": 440 } },
  "earnings": { "weekly_p50_usd": 1180, "retainers_usd": 8800 },
  "payouts": { "schedule": "same-day", "to_bank_p50": "2d9h", "to_bank_p90": "3d2h", "returned": 0 },
  "churn": { "left": 1, "successors_named": 1 },
  "alarms": ["pool.alarm:no_eligible:signer:US-NJ"]
}
```

The one alarm comes with the moves that answer it. None of them reaches into a member's pay or rank:

```bash
open https://apis.tax/console/pool
```

```txt title="magic values: none"
  alarm    pool.alarm · no eligible signer for the US-NJ leg, 3h 10m on Tuesday · 9 New Jersey legs waited, 0 dates at risk
  options  offer New Jersey CPAs a standby seat · raise the leg's fee a rung sooner · invite from gigs.tax's demand board
```

| Move | Does |
|---|---|
| offer a standby seat | committed hours for a dated season, paid on top of act pay: [the tax season](https://services.dev/docs/examples/tax/season.md) |
| raise a rung sooner | the ladder's raise reaches the Task earlier, from your line |
| invite from the door | posts the open role and region to the door's public demand board |
| widen the region | only where the Rules row allows it: [where](https://services.dev/docs/people/where.md) |

`respond: { 'pool.alarm:no_eligible': { raise: 'sooner' } }` makes the second move the moment the alarm fires, and `Pool.health` sets when each alarm fires.

## Where members see it

Members see their own earnings, payouts and track record in the [delivery portal](https://services.dev/docs/app/members.md), never the Pool's measures. A door with `public: true` publishes the part a professional deciding to join would want: open Tasks by role and region, the fee range and the median time to claim.

Pool health is on [Launch](https://services.dev/docs/money/plans.md#launch), with your first Pool. A Pool you import reports its health to you for the Tasks it fills for you; its operator reads the rest.

## Controls

| Call (CLI) | API | Event | On the console | Plan |
|---|---|---|---|---|
| `pools health <pool> --since 7d` | `GET /pools/:name/health` | `pool.alarm` | `/console/pool` | [Launch](https://services.dev/docs/money/plans.md#launch) |
| `pools standby <pool> --role <role> --in <region> --season <from>..<to>` | `POST /owner/pools/:name/standby` | `standby.offered` | `/console/pool` | [Team](https://services.dev/docs/money/plans.md#team) |
| `pools raise <pool> --role <role> --in <region> --sooner` | `POST /owner/pools/:name/raise` | `task.raised` | `/console/pool` | [Launch](https://services.dev/docs/money/plans.md#launch) |
| `pools invite <pool> --role <role> --in <region>` | `POST /owner/pools/:name/invites` | `pool.invited` | `/console/pool` | [Team](https://services.dev/docs/money/plans.md#team) |
| `pools widen <pool> --role <role> --to <region>` | `POST /owner/pools/:name/widen` | `pool.widened` | `/console/pool` | [Launch](https://services.dev/docs/money/plans.md#launch) |

---

- Up: [Run your Service](https://services.dev/docs/operate.md)
- Previous: [Move a step to AI](https://services.dev/docs/operate/line.md)
- Next: [Dates at risk](https://services.dev/docs/operate/dates.md)
