Revenue
<!-- 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
GET /api/revenue/streams/<id>— readcoverage.steps.- A step of kind
executororledgerruns for real.gapanswers with a receipt andreasonsays why. gatemeans 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
POST /api/revenue/streams/<id>/runwith{recipeId, bindings}— this is a PREVIEW; it answers 202 with a job id.- Watch the job. A
simulated: truestep result is the receipt, not the work. - 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
POST /api/revenue/streams/<id>/schedulewith{recipeId: "scheduled", schedule: {cron: "0 9 1"}}.- It becomes a plan of kind
revenue.recipe; confirm it inGET /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
- Run the
recoveryrecipe with{mode: "execute"}and the original run’s ids inbindings.
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.