Skip to content

Custom actions — how an org composes its own

A custom action uses the same grammar, the same variable kinds, the same ceiling, and the same lifecycle as a managed one. Only two things differ: the org defines it (not Axowl), and the operation runs in the org’s own system.

To compose one, an org supplies four things:

PartWhat it isExample (a logistics org)
Target entitya business object — an existing Axowl entity, or one the org namesShipment
Action verbwhat is done to itapprove
Variable slotsthe limits the grant can carry, each with a kindregion[set] · value[num]
Eventa custom event the action emits (sealed into the chain)shipment.approved

That composes the catalog entry:

shipment.approve:region=KR,value<=50000,uses=*
└─ scope ─┘ └────── variable bag ──────┘
  • Same grammar. namespace.resource.action:key{op}value — the org picks the namespace (their system) and resource (their entity).
  • Same kinds. Ceiling-bearing [ref] entity-reference · [set] categorical · [num] numeric (compared by subsume), and [in] input-only (carried, not compared) — the operator encodes the kind, the value is always a string.
  • Same ceiling. A custom action is still bounded by the approver’s authority — an org admin can only delegate within what they hold.
  • Same lifecycle. uses / ttl / exp apply unchanged (ttl / exp are the time add-on).
  • Same RiskLevel model. The org assigns a RiskLevel → it routes to the matching approval tier, exactly like managed actions.
  • Origin = custom. Stored as an org-scoped catalog row (IsSystemPermission = false), versus managed rows on the system org.
ManagedCustom
Defined byAxowl (code + event catalog)the org (in-app)
Operation runs inAxowlthe org’s own system (via SDK)
Catalog rowsystem org · IsSystemPermissionorg-scoped row
Removableno (Axowl-owned)yes (the org’s own)
Grammar · kinds · ceiling · lifecycleidentical

Related: Action Library · Event & system control · Capability grants · SDK overview