# Revenue — what you can do

<!-- GENERATED by ops/tools/skill-sync — do not edit by hand. Run pnpm skills:sync. -->

<!-- GENERATED by ops/tools/skill-sync — do not edit by hand. Run `pnpm skills:sync`. -->

# Revenue — what you can do

`/admin/d/revenue` · pillar `account`

Run, schedule and account for the revenue streams — what each one really calls here, and what it recorded.

## Fetch this, never remember it

These change per install and per release. Call for them - a list written here would be a future lie.

| What | Call | Why |
|---|---|---|
| the streams this install operates, with coverage and ledger totals side by side | `GET /api/revenue/summary` | coverage depends on which adapters and provider connections THIS deployment has; the same stream is 90% wired on one install and 50% on another |
| step by step, what one stream will really do here | `GET /api/revenue/streams/<id>/bindings` | the only honest answer to "will this publish anything" — it names every simulated step and why it is simulated |
| what a run actually did | `GET /api/jobs?kind=revenue.recipe` | a revenue run IS a job; progress, trace, cancel and retry live there and are not duplicated in this domain |
| what is scheduled | `GET /api/planner/occurrences?from=&to=` | a revenue schedule IS a plan on the shared planner, so the calendar is the planner’s, not this domain’s |

## How to actually do things here

Written by hand, because the order and the traps are the part no file can derive.

### Find out whether a stream can really do the thing somebody asked for

1. `GET /api/revenue/streams/<id>` — read `coverage.steps`.
2. A step of kind `executor` or `ledger` runs for real. `gap` answers with a receipt and `reason` says why.
3. `gate` means the run stops and waits for a person, indefinitely and without holding a slot.

**Trap:** Never infer capability from the stream NAME or its category. `dropshipping` sounds fully automated and is 56% simulated here, because no supplier catalog adapter exists in this repo — the stream file’s own Gap clause says so, and the binding table quotes it.

### Run a stream

1. `POST /api/revenue/streams/<id>/run` with `{recipeId, bindings}` — this is a PREVIEW; it answers 202 with a job id.
2. Watch the job. A `simulated: true` step result is the receipt, not the work.
3. To do it for real, send `{mode: "execute"}`. It will still park at every publish, money or destructive gate.

**Trap:** A preview writes NO ledger rows, so `GET /api/revenue/ledger` staying empty after a preview is correct rather than broken. Reporting "the run recorded revenue" after a preview is the single easiest mistake to make in this domain.

### Schedule a stream

1. `POST /api/revenue/streams/<id>/schedule` with `{recipeId: "scheduled", schedule: {cron: "0 9 * * 1"}}`.
2. It becomes a plan of kind `revenue.recipe`; confirm it in `GET /api/planner/occurrences`.

**Trap:** A schedule does not imply consent to spend: the plan carries its own `mode` and it defaults to preview, so arming a cadence on a stream that charges a card is a second, separate decision.

### Reconcile a run whose books are wrong

1. Run the `recovery` recipe with `{mode: "execute"}` and the original run’s ids in `bindings`.

**Trap:** Recovery re-runs the LEDGER half only, and that is the whole reason it exists — re-running `manual` to fix the books would publish the video a second time.

## Tabs

Every one is a real URL. A tab with its own section below carries a real job.

| Tab | Path | Group | What it is for |
|---|---|---|---|
| `(index)` | - | - | - |
| `factories` | - | - | - |
| `clones` | - | - | - |
| `ledger` | - | - | - |

## API

Mounted prefixes that serve this domain: `/api/revenue`

The full route table is `leumas-capabilities/reference/api-routes.md`.



---
Source: .claude/skills/leumas-studio/reference/domains/revenue.md
Canonical: https://docs.leumas.tech/p/skills/leumas-studio/domains/revenue
