---
title: "Pay"
url: https://services.dev/docs/money/pay
captured: [money-pay.txt]
---
# Pay

URL: https://services.dev/docs/money/pay

> What each person earns and how it enters the ledger. Flat pay on every outcome of an act, share pay at an outcome and held for its window, who funds each, the protection every member has, the one charge a member may ever see, and your brand's fee policy.

Pay answers what a person earns for their part, and who funds it. It's set per role, posted on the Task before anyone claims it, and never changed by what happens to the job afterwards. When it accrues and how it reaches the member is [Pay in the Pool](https://services.dev/docs/people/pool/pay.md).

## Two shapes

```bash
grep -A6 "roles: {" services/deal.ts
```

```txt title="magic values: member = mbr_7Hq4"
  roles: {
    setter: { pool: closers, pay: { usd: 250, on: 'meet.held' } },
    closer: { pool: closers, span: ['meet', 'propose', 'negotiate', 'close'], revive: { first_call: '24h' },
      pay: { share: '10%', of: 'closed_value', on: 'won', from: 'buyer' },
      talk: { as: 'client', mail: 'client_domain', calls: 'bridged' } },
    nurturer: { pool: closers, pay: 150 },
  },
```

| Shape | Written | Paid | On a lost or refunded job |
|---|---|---|---|
| Flat | `pay: 250`, or `{ usd: 250, on: 'act' }` | at the accepted act, on every outcome of it: an attestation, a send-back, a decline | stands |
| Flat, at a later step's guard | `{ usd: 250, on: 'meet.held' }` | when that guard accepts the step, as a setter's booking pays once the meeting is held | nothing until it accepts; then stands |
| Flat, at an end | `{ usd: 5_000, on: 'won' }` | at that end, held with the outcome's money until `outcome.window` closes | nothing at a different end; reverses only with its own outcome |
| Share | `{ share: '10%', of: 'closed_value', on: 'won' }` | at that end, held until `outcome.window` closes | nothing at a different end; reverses only with its own outcome |

A share pays the member whose act commits the end, whole, and is never split by attribution. Every earlier role earns its own flat fee, so the setter is paid at the held meeting and the closer at won. A share has no fee to take a kill share of, so `pay.kill` names one: the closer accrues it when the buyer withdraws the deal after the claim.

A member sees the shape and the amount on the teaser, before they claim:

```txt
→ GET /gigs   # as mbr_7Hq4, on closers.deals: the pay is on the teaser, before a claim
```

```txt title="200 · 2 gigs · magic values: member = mbr_7Hq4"
  tsk_7Hq5  closer  logistics · $50k–$100k · meeting booked · 10% of the closed value at won, charged to the seller · held 60 days · warm
  tsk_7Hr9  setter  fintech · $10k–$50k · sourced · $250 when the meeting is held, whatever the deal does next
```

## Who funds it

Pay comes out of your price unless `from: 'buyer'` charges it to the buyer on top, at the same moment as the act or the outcome. Then the member keeps all of it and the receipt shows it:

| `from` | The buyer pays | Your ledger |
|---|---|---|
| left out | your price | `− pay`, out of your price |
| `'buyer'` | your price, plus the pay as its own line | the pay passes through you to the member |

On deal.ts you fund the setter, which keeps "nothing on effort" true for the seller. Charging the setter to the seller instead changes the odds:

**You fund it**

```bash
npx services.dev check services/deal.ts --odds   # you fund the setter, as deal.ts does
```

```txt title="magic values: member = mbr_7Hq4"
services/deal.ts · the setter's $250.00 comes out of api.forsale's 5%, debited from its balance at the held meeting
  won     +$11,100.00 on $74,000 · you $3,388.66
  lost    +$0.00 · setter $250.00 when the meeting was held · placement $50.00, the setter's gig and the closer's · AI up to $40.00 · you −$340.00 when a closer loses it
  odds    breaks even at 9.1% won (about 1 in 11)
```

**The seller funds it**

```bash
git diff services/deal.ts && npx services.dev check services/deal.ts --odds   # the seller funds the setter
```

```txt title="magic values: member = mbr_7Hq4"
-    setter: { pool: closers, pay: { usd: 250, on: 'meet.held' } },
+    setter: { pool: closers, pay: { usd: 250, on: 'meet.held', from: 'buyer' } },
-  price: { usd: 0, share: '5%', of: 'closed_value', on: 'won', ai: 40,
+  price: { usd: 0, share: '5%', of: 'closed_value', on: 'won', ai: 40, effort: 'named',
services/deal.ts · the setter's $250.00 is charged to the seller at the held meeting, won or lost
  offer   "$250 a held meeting, then 5% at won" · the Site's sentence leads with it too
  won     +$11,350.00 on $74,000, the meeting included · you $3,638.66
  lost    +$250.00 at the held meeting · setter $250.00 · placement $50.00, the setter's gig and the closer's · AI up to $40.00 · you −$90.00 when a closer loses it
  odds    breaks even at 2.4% won (about 1 in 41)
```

A member's month: flat pay paid whatever the deals did, a share held to its window, a lost deal's share at $0:

```txt
→ GET /me/earnings?period=2026-11   # as mbr_7Hq4: flat pay paid, share pay held
```

```txt title="200 · mbr_7Hq4 · November 2026 · $900.00 paid · $7,400.00 held · magic values: member = mbr_7Hq4"
  setter     3 gigs   $750.00     meetings held · paid, whatever the deals did next
  nurturer   1 gig    $150.00     revived · paid
  closer     1 gig    $7,400.00   tsk_7Hw6 · won, proven by the payment · held to 12 Jan 2027
  closer     1 gig    $0.00       tsk_7Hq7 · lost · a share pays only at won
  charged    $0.00 · services.dev and api.forsale take nothing from your pay
```

## Pay protection

Every member has it on every plan:

| Protection | What it means |
|---|---|
| Flat pay is funded before it posts | A Task with flat pay posts only once its pay can be drawn from your balance or your bank account; until then the order answers 402 `pay_unfunded`, so no member works on pay that isn't there ([money outside a charge](https://services.dev/docs/money/flow-of-funds.md#money-outside-a-charge)) |
| Flat pay is final | Paid on a decline as on an attestation, and never clawed back, except after a recorded finding of bad faith, made in a contest by a credentialed peer, never by the brand that would recover the pay ([pay in the Pool](https://services.dev/docs/people/pool/pay.md#three-moments)) |
| Send-backs are contested | A member can contest a send-back on their own attested work; only an upheld one counts against them |
| Refunds are yours | A refund or a chargeback never takes back accrued pay: it lands on your account |
| Held share pay is ring-fenced | It reverses for one cause only, its own outcome's money going back inside the window, as `outcome.reversed`. A goodwill refund, a dispute on another charge or a negative balance never reaches it: it sits untransferred under its own job, and `check` fails `held_pay_exposed` on any line that would draw on it or change [the draw order](https://services.dev/docs/money/flow-of-funds.md#the-way-back) |
| Held is shown | Share pay shows as held, with the date its window closes and why |
| The fee is fixed | Pay is fixed when the Task posts; the [fill ladder](https://services.dev/docs/people/pool/fill.md) only raises it |

```txt
→ GET /me/earnings/tsk_7Hp3   # as mbr_7Hq3, an attorney who declined on api.lawyer
```

```txt title="200 · tsk_7Hp3 · api.lawyer · attorney · respond · declined · $175.00 · paid · magic values: member = mbr_7Hq4"
  accrued   Tue 3 Nov 11:40   decline accepted, with its memo   pay.accrued   $175.00
  why       flat pay is paid on every outcome of the act: an attestation, a send-back or a decline
```

## Members never pay to work

No line charges a member per Task, per lead or by a percentage of their pay, and `check` fails `member_charged` on any that would:

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

```txt title="magic values: member = mbr_7Hq4"
+  fee: { usd: 20, per: 'gig' },
```

```bash
npx services.dev check
```

```txt title="magic values: member = mbr_7Hq4"
  ✗ member_charged · A ledger line charges a member to work. A Pool may charge only a flat software fee per month, shown on its door before anyone joins: fee: { usd, per: 'month' }. pools/closers.ts:21 charges $20 per gig.
    at pools/closers.ts:21 · fee.per
✗ 1 to fix
```

The one member charge a Pool may carry is a flat software fee, `fee: { usd, per: 'month' }`, declared on its [door](https://services.dev/docs/people/pool/door.md#the-member-charter) before anyone joins, and charged only in a month with accrued pay. The one cost a member ever chooses is an instant payout's fee, at Stripe's cost and shown before they choose; a markup fails `member_charged`. You pay Stripe's processing on a member's own sale, so their $175 arrives as $175, and services.dev takes nothing from any member's pay.

## Your fee policy

`Brand.fees` switches a fee form off across every Service, and every tenant offer, in one line:

```bash
git diff brand.ts services/demand-letter.ts
```

```txt title="magic values: member = mbr_7Hq4"
   domain: 'api.lawyer',
+  fees: { shares: false, split_professional_fee: false },
   words: { job: 'matter', subject: 'asset', task: 'review', member: 'signer', pool: 'network', end: 'outcome' },
-  price: { usd: 149, release: 'send' },
+  price: { usd: 149, release: 'send', share: '10%', of: 'settlement' },
```

```bash
npx services.dev check
```

```txt title="magic values: member = mbr_7Hq4"
  ✗ fee_policy · A price uses a fee form the brand's fee policy forbids. Remove the share, or allow shares in brand.ts. services/demand-letter.ts:36 writes price.share, and brand.ts:9 sets fees.shares to false.
    at services/demand-letter.ts:36 · price.share
✗ 1 to fix
```

| `Brand.fees` | `false` forbids |
|---|---|
| `shares` | any share price or share line, so the brand never prices on the result |
| `percent_pay` | share pay to any role |
| `split_professional_fee` | dividing a member-rail fee with the brand |
| `percent_member_fee` | always `false`: a percentage charge to a member |

A tenant's offer that uses a forbidden form answers 422 `fee_policy`.

Worked in: [closing on closers.deals](https://services.dev/docs/examples/sales/delivery-portal.md#7-what-protects-your-pay), every case that moves a closer's share.

## In each app

| App | What it shows |
|---|---|
| Customer portal | Pay only when it's charged to the buyer or sold on the member's rail, as its own line |
| Delivery portal | Each Task's pay and shape before the claim, then accrued, held and paid, by Task and by brand |
| Owner console | Pay by role and by member, held share pay by date, and what each raise cost |

## Every form

| Key | Written | Left out | Does |
|---|---|---|---|
| `roles.<r>.pay` | `number \| { usd; on: 'act' \| '<step>.<guard>' \| <end> } \| { share; of; on }` | nothing | What the role earns, fixed when its Task posts |
| `roles.<r>.pay.from` | `'buyer'` | your price | Charges the pay to the buyer on top |
| `roles.<r>.pay.kill` | `number` | none on a share | What a share role accrues when the buyer withdraws after the claim |
| `roles.<r>.pay.rail` | `'brand' \| 'member' \| 'entity'` | the rules row's | Who sells it: [rails](https://services.dev/docs/money/lines-and-rails.md#rails) |
| `Pool.fee` | `{ usd: number; per: 'month' }` | none | The one member charge: a flat software fee on the door, charged only in a month with accrued pay |
| `Brand.fees` | `{ shares?; percent_pay?; split_professional_fee?; percent_member_fee?: false }` | every form allowed | Your fee policy |

| Code | When |
|---|---|
| `member_charged` | `check`: a line charges a member to work, a monthly fee in a month with no pay, or a marked-up instant payout fee |
| `held_pay_exposed` | `check`: a refund, a dispute or a balance would draw on held share pay |
| `effort_charged` | `check`: pay charged to the buyer before a `usd: 0` price's end, unnamed |
| `pay_unfunded` | 402 on an order: flat pay that comes before any charge can't be drawn from your balance or your bank account |
| `fee_policy` | `check`: a price or pay uses a form `Brand.fees` forbids; a tenant offer that does answers 422 |
| [`price_below_cost`](https://services.dev/docs/reference/check/price_below_cost.md) | `check`: pay and the AI cap add up to more than the price |

Pay to a Pool's members, flat pay at an end included, runs live on [Launch](https://services.dev/docs/money/plans.md#launch), and share pay on [Team](https://services.dev/docs/money/plans.md#team). Pay protection and `member_charged` hold on every plan.

---

- Up: [Money](https://services.dev/docs/money.md)
- Previous: [Refunds and disputes](https://services.dev/docs/money/refunds-and-disputes.md)
- Next: [Payouts](https://services.dev/docs/money/payouts.md)
