---
referrals: 3
kind: program
payer: domain:acme.example
code: acme_seats
category: saas
status: open
at: 2026-10-30T00:00:00Z
crit: high_water
---
# Acme seat expansion

Rates, amounts and names in this file are placeholders, not recommendations or market rates. Each party sets its own terms.

In plain words: a referrer earns 17.00 per seat, only for seats above the highest count that customer has reached so far. Dropping seats and adding them back earns nothing new.

Change first: `payer`, `code` and the price per seat. Report `units.seats` as the customer's current total, not the change.

## Rules

### new_seats

- on: seat_change
- basis: per_unit
- price.amount: 17.00
- price.asset: USD
- price.per: 1
- price.unit: seats
- price.high_water: true
- recurring.months: 12

## Attribution

- model: last_touch
- window_days: 60
- allowed_kinds: link, code

## Settlement

- holdback_days: 30
- clawback_days: 60
- cycle: monthly
- payout_asset: USD
- rails: ach

## Example

Made-up lines. A customer goes to 5 seats, down to 2, then up to 7. Only the first 5 and the 2 above the old high earn.

To run it, save this file as `REFERRALS.md` and these lines as `referrals.jsonl`, then run `node referrals.mjs run REFERRALS.md referrals.jsonl --as-of 2027-03-01T00:00:00Z`.

As of: 2027-03-01T00:00:00Z

```jsonl
{"type":"agreement","code":"alice","partner":"domain:alice.example"}
{"type":"event","at":"2026-11-02T09:00:00Z","kind":"seat_change","source":"billing:seats_1","customer":"cu_6f708192a3b4c5d6","units":{"seats":"5"},"asset":"USD","token":"rf1.acme_seats.alice"}
{"type":"event","at":"2026-12-02T09:00:00Z","kind":"seat_change","source":"billing:seats_2","customer":"cu_6f708192a3b4c5d6","units":{"seats":"2"},"asset":"USD"}
{"type":"event","at":"2027-01-02T09:00:00Z","kind":"seat_change","source":"billing:seats_3","customer":"cu_6f708192a3b4c5d6","units":{"seats":"7"},"asset":"USD"}
```

## Worked result

Computed by `run_ledger` as of 2027-03-01T00:00:00Z, on the made-up lines above. Computed amounts are arithmetic on the records and terms you sent. They do not say what anyone owes. Your contract decides that.

| Event | Who | Working | Computed | Note |
|---|---|---|---|---|
| seat_change, 2026-11-02 | alice | 5 seats at 17.00 per 1 | 85.00 | disclosure_unstated |
| seat_change, 2026-12-02 | alice | This is not above the highest count so far. | 0.00 | high_water |
| seat_change, 2027-01-02 | alice | 2 seats at 17.00 per 1 | 34.00 | disclosure_unstated |

`disclosure_unstated`: The token doesn't say whether this touch was disclosed. A short link proves nothing about that, and the referrer still carries the duty.

| Payee | Asset | Earned | Reversed | Net | Held | Payable |
|---|---|---|---|---|---|---|
| alice | USD | 119.00 | 0.00 | 119.00 | 0.00 | 119.00 |


## Why these settings

`high_water` pays for net new seats, so seat churn can't be paid twice, and listing it in `crit` makes an engine without that feature refuse rather than overpay.
