Docs
/
what you can do

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.

WhatCallWhy
the streams this install operates, with coverage and ledger totals side by sideGET /api/revenue/summarycoverage 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 hereGET /api/revenue/streams/<id>/bindingsthe only honest answer to "will this publish anything" — it names every simulated step and why it is simulated
what a run actually didGET /api/jobs?kind=revenue.recipea revenue run IS a job; progress, trace, cancel and retry live there and are not duplicated in this domain
what is scheduledGET /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.

TabPathGroupWhat 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 (no-git)markdownjson
Generated from the Leumas repository. Every page cites the file it came from.leumas.techllms.txt