Pay

The running jobjob_7Hq2 · accepted · document.fr-CA.pdf · $49.00 final

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.

Run
grep -A6 "roles: {" services/deal.ts
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 },
  },
ShapeWrittenPaidOn a lost or refunded job
Flatpay: 250, or { usd: 250, on: 'act' }at the accepted act, on every outcome of it: an attestation, a send-back, a declinestands
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 heldnothing 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 closesnothing 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 closesnothing 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:

Call
→ GET /gigs   # as mbr_7Hq4, on closers.deals: the pay is on the teaser, before a claim
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

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:

fromThe buyer paysYour ledger
left outyour price− pay, out of your price
'buyer'your price, plus the pay as its own linethe 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:

npx services.dev check services/deal.ts --odds   # you fund the setter, as deal.ts does
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)

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

Call
→ GET /me/earnings?period=2026-11   # as mbr_7Hq4: flat pay paid, share pay held
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

Every member has it on every plan:

ProtectionWhat it means
Flat pay is funded before it postsA 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)
Flat pay is finalPaid 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)
Send-backs are contestedA member can contest a send-back on their own attested work; only an upheld one counts against them
Refunds are yoursA refund or a chargeback never takes back accrued pay: it lands on your account
Held share pay is ring-fencedIt 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
Held is shownShare pay shows as held, with the date its window closes and why
The fee is fixedPay is fixed when the Task posts; the fill ladder only raises it
Call
→ GET /me/earnings/tsk_7Hp3   # as mbr_7Hq3, an attorney who declined on api.lawyer
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

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:

Run
git diff pools/closers.ts
magic values: member = mbr_7Hq4
+  fee: { usd: 20, per: 'gig' },
Run
npx services.dev check
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 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.

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

Run
git diff brand.ts services/demand-letter.ts
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' },
Run
npx services.dev check
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.feesfalse forbids
sharesany share price or share line, so the brand never prices on the result
percent_payshare pay to any role
split_professional_feedividing a member-rail fee with the brand
percent_member_feealways 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, every case that moves a closer's share.

AppWhat it shows
Customer portalPay only when it's charged to the buyer or sold on the member's rail, as its own line
Delivery portalEach Task's pay and shape before the claim, then accrued, held and paid, by Task and by brand
Owner consolePay by role and by member, held share pay by date, and what each raise cost
KeyWrittenLeft outDoes
roles.<r>.paynumber | { usd; on: 'act' | '<step>.<guard>' | <end> } | { share; of; on }nothingWhat the role earns, fixed when its Task posts
roles.<r>.pay.from'buyer'your priceCharges the pay to the buyer on top
roles.<r>.pay.killnumbernone on a shareWhat a share role accrues when the buyer withdraws after the claim
roles.<r>.pay.rail'brand' | 'member' | 'entity'the rules row'sWho sells it: rails
Pool.fee{ usd: number; per: 'month' }noneThe 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 allowedYour fee policy
CodeWhen
member_chargedcheck: 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_exposedcheck: a refund, a dispute or a balance would draw on held share pay
effort_chargedcheck: pay charged to the buyer before a usd: 0 price's end, unnamed
pay_unfunded402 on an order: flat pay that comes before any charge can't be drawn from your balance or your bank account
fee_policycheck: a price or pay uses a form Brand.fees forbids; a tenant offer that does answers 422
price_below_costcheck: 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, and share pay on Team. Pay protection and member_charged hold on every plan.