---
title: "The closers' Pool"
url: https://services.dev/docs/examples/sales/pool
captured: [sales-build.txt, sales-pool.txt]
---
# The closers' Pool

URL: https://services.dev/docs/examples/sales/pool

> One Pool for the three roles a deal escalates to. Setters, closers and nurturers join on an existing door, hold a claim while they work the account, climb tiers on their own track record, keep all of their pay, and may come in through a firm. A seller of a licensed offer adds one credential line.

*sales's words: deal is a job, account is a subject, gig is a task, closer is a member, seller is a client, seller is a buyer (examples/sales/brand.ts).*

One Pool serves the deal's three roles. Standing is the track record, built only from outcomes, so a win counts once its payment proves it. Every gig posts at a fixed pay, frozen at the claim.

```bash
cat pools/closers.ts
```

```txt title="magic values: none"
  name: 'closers',
  door: 'closers.deals',
  roles: { setter: {}, closer: {}, nurturer: {} },
  join: {
    segments: ['SMB', 'midmarket', 'enterprise'], industries: 'text[]',
    acv: 'money: your typical deal size', hours: 'number: spare hours a week',
  sees: { teaser: ['industry', 'value band', 'stage', 'pay', 'signals'] },
  rank: ['fit', 'track'],
  tiers: [{ name: 'SMB' }, { name: 'midmarket', after: 10, on_time: '90%' }, { name: 'enterprise', after: 40, on_time: '95%' }],
  firms: true,
  hold: { claim: '48h', then: 'touch' },
  contest: { by: 'staff', within: '14d' },
  payouts: { schedule: 'weekly', hold_first: { tasks: 5, for: '7d' } },
```

## What each line sets

| Key | In this Pool |
|---|---|
| `door` | `closers.deals`, an existing door another account operates, with closers.sale as its consumer face: a placement line of $25 on each filled gig, never from a closer's pay |
| `roles` | `setter` books the meeting and is paid once it is held, `closer` holds it and takes the deal to won or lost, `nurturer` revives a deal whose account goes quiet |
| `join` | Four fields over two steps after the email, then the payout account |
| `sees` | The teaser shows the industry, the value band, the stage, the pay and the signals; the account's name opens at the claim |
| `rank` | Each gig's feed is ordered by fit with the member's industries and segments, then by track record |
| `tiers` | SMB to start; midmarket after 10 gigs at 90% on time; enterprise after 40 at 95% |
| `firms` | A firm enrolls its bench under its own name; each member claims and keeps their own track record |
| `hold` | 48 hours from the claim to a first touch; then each touch on the record renews the claim, and only `gone_dark`, an end or giving it back releases it |
| `contest` | A closer contests an outcome the match missed, and the brand's staff rule within 14 days |
| `payouts` | Weekly, on Fridays; a new member's first 5 gigs wait 7 days |

## Join, and climb

A closer joins in their own session: [step 1 of the closer's path](https://services.dev/docs/examples/sales/delivery-portal.md#1-join). A loss on the merits stays counted, and a revival is a new deal, so nothing erases it. A deal the seller ends, or one gone dark, never counts. A tier holds while the last 90 days meet its bar:

```txt
→ GET /closers/me/track   # as mbr_7Hq4, 41 gigs later
```

```txt title="200 · mbr_7Hq4 · closers · tier enterprise since 2 Oct 2026 · 41 gigs · 96% on time · magic values: none"
  closer    18 gigs · 7 won · $412,000 closed · median 23 days from claim to the end
  setter    17 gigs · 17 meetings held
  nurturer  6 gigs · 3 revived · 3 confirmed dead
  counted   11 closes lost on the merits · each revival is its own deal, so no loss is erased
  not counted  4 gigs: 2 gone dark and withdrawn, 1 ended lost by the seller, 1 signed and never paid · a seller's end never counts against you
  source    outcomes on the record only: wins proven by payment, never a deal's content
  rule      a tier holds while the last 90 days meet its bar: enterprise 95% on time · under it for 90 days, you move down one tier, never below SMB
```

## Who may claim

A gig above a member's tier names what they need:

```txt
→ POST /gigs/tsk_7Hr8/claim
```

```txt title="magic values: none"
  "code": "not_eligible",
  "reason": "tsk_7Hr8 is an enterprise gig, and you are in SMB: midmarket after 10 gigs at 90% on time, enterprise after 40 at 95%. You have 2.",
```

## When no one claims

The hold lapses, and the gig reopens to the next tier's feed, the same gig at the same pay. The deal waits at its step for a person and is never handed back to AI. The owner console lists every gig open past its hold: [when no one claims](https://services.dev/docs/examples/sales/branches.md#when-no-one-claims).

## When the offer needs a license

**The line**

A seller of insurance needs a licensed producer in the account's state. One line names the credential and where it applies:

```bash
git diff pools/closers.ts
```

```txt title="magic values: none"
-  roles: { setter: {}, closer: {}, nurturer: {} },
+  roles: { setter: {}, closer: { credential: 'insurance producer', where: 'account.state' }, nurturer: {} },
+  scopes: { 'insurance producer': 'region' },
```

**Join**

The door's verifier checks the license against the state's record:

```txt
→ POST /closers/join {"email":"rosa@example.com","answers":{"credential":{"insurance producer":{"license":"TX-2219040","region":"US-TX"}}}}
```

```txt title="magic values: none"
← 200 mbr_7Hv2 · closers · rosa@example.com · applying · insurance producer · US-TX · verifying with the state's licensing record
  verified  insurance producer · US-TX · active to 31 Aug 2027 · facts.credentials, written by the door's verifier
```

**A claim without it**

```txt
→ POST /gigs/tsk_7Hv3/claim
```

```txt title="magic values: none"
  "code": "not_eligible",
  "reason": "tsk_7Hv3 is a close for an account in US-TX, and the closer role needs an insurance producer license there.",
  "param": "credential",
  "cure": { "do": "add_credential", "credential": "insurance producer", "region": "US-TX", "http": "POST https://closers.deals/closers/me/credentials" },
```

The license makes the closer eligible and never caps what AI does on the steps before the close.

## Firms

A firm is an envelope, never a member. It enrolls, routes and may take one payout for its bench. A gig is still claimed by one person, who keeps their own record:

```txt
→ POST /closers/firms {"name":"Ridgeline Sales Partners","members":["ana@ridgeline.example","li@ridgeline.example","omar@ridgeline.example"],"payout":"firm"}
```

```txt title="201 · frm_7Hq2 · Ridgeline Sales Partners · 3 invited · each joins in their own name and keeps their own track record · magic values: none"
  routing   the firm may prefer its members for a seller it names · a gig is still claimed by one member, never by the firm
  payouts   consolidated to the firm's account weekly · each member's line shown to them, whole
```

[Pool()](https://services.dev/docs/people/pool.md) covers every key, and [track records](https://services.dev/docs/people/pool/track.md) what a tier is earned on.

---

- Up: [The sales example](https://services.dev/docs/examples/sales.md)
- Previous: [The Deal Service](https://services.dev/docs/examples/sales/deal.md)
- Next: [Porting api.forsale](https://services.dev/docs/examples/sales/port.md)
