Skip to content

Audit event reference

Every action a control plane operator takes — provisioning, suspending, decommissioning a tenant, inviting an org member, editing a plan — emits an OrgEvent to the audit log. The audit feed is the system-of-record for "who did what, and when" at the platform layer.

This page lists the events, what they mean, and what payload they carry. The wire shape is stable; new event types are additive.

The control plane admin console's Audit page is the primary surface — see Read the audit log. For programmatic access the events surface is documented under Reference — API.

Each event row carries this shape:

interface OrgEvent {
id: string // ULID, monotonic per org
type: OrgEventType // enum below
actor_id: string | null // user id; null for system events
actor_email: string | null // best-effort denormalised email
org_id: string
tenant_id: string | null // present when the event scopes to a tenant
data: Record<string, unknown>
created_at: string // ISO 8601, UTC
}

The type field is a closed enum following the <entity>.<action>.<phase> convention so consumers can prefix-filter cleanly. New types ship in versioned platform releases; existing types never rename.

The provisioning workflow emits per-phase events so the audit feed reads as a chronological narrative of the saga's progress.

TypeEmitted whenPayload includes
tenant.provisioning.startedA platform operator submits a provisioning request and the workflow row is writtentenant_slug, plan, requested_by
tenant.provisioning.step_completedA saga activity completes (one event per step — validate, allocate, schema, deploy, etc.)step, duration_ms
tenant.provisioning.step_failedA saga activity failed but the workflow is still inside its retry budgetstep, attempt, error
tenant.provisioning.completedProvisioning succeeded and the tenant is now Activetenant_id, total_duration_seconds, resources
tenant.provisioning.failedAn activity fails after retries; the compensation chain has runreason, failed_step, compensation_status
tenant.provisioning.compensatingA compensating activity has started while unwinding a failurestep, compensation_kind
tenant.provisioning.compensatedA compensating activity ran during failure or cancellation recoverystep, compensation_kind

Reset saga (escape valve for a stuck provisioning)

Section titled “Reset saga (escape valve for a stuck provisioning)”

Reset is a separate workflow from provisioning; it runs to clear a wedged workflow handle and emits its own three events.

TypeEmitted whenPayload includes
tenant.provisioning.reset_startedA platform operator submits a reset on a stuck tenantprevious_state
tenant.provisioning.reset_completedReset finished cleanly; the tenant is back in Pending with a fresh saga readyprevious_workflow_id
tenant.provisioning.reset_failedReset itself failed (rare; usually because cancel hadn't fully completed)reason
TypeEmitted whenPayload includes
tenant.deprovisioning.startedDecommission request accepted; resource release beginstenant_id, requested_by
tenant.deprovisioning.step_completedA decommission step completes (one event per step)step, duration_ms
tenant.deprovisioning.step_failedA decommission step failed but the workflow is still inside its retry budgetstep, attempt, error
tenant.deprovisioning.completedDecommission finished; resources releasedarchive_url (if archive policy is on)
tenant.deprovisioning.failedA decommission step failed; partial releasefailed_step, reason

Update saga (plan/region/topology applied to a tenant)

Section titled “Update saga (plan/region/topology applied to a tenant)”

The Update workflow re-applies the org's current plan to a tenant's namespace (retention, knobs). Used when the org's plan changes or when topology overrides shift.

TypeEmitted whenPayload includes
tenant.update.startedAn update workflow starts on a tenantchange_kind, requested_by
tenant.update.completedThe update applied cleanlychange_kind, duration_ms
tenant.update.failedThe update failed at some stepchange_kind, failed_step, reason

The plan-upgrade workflow flips the org's plan, recomputes effective knobs, briefly holds the tenant row read-only, and bumps the data-plane cache version.

TypeEmitted whenPayload includes
tenant.plan_upgrade.startedThe plan upgrade saga beginsfrom_plan, to_plan, requested_by
tenant.plan_upgrade.completedPlan upgrade finished cleanlyfrom_plan, to_plan, duration_ms
tenant.plan_upgrade.failedPlan upgrade failed and compensations are runningfailed_step, reason
tenant.plan_upgrade.compensatedA compensation step ran during plan-upgrade rollbackstep, compensation_kind
tenant.plan_upgrade.compensation_failedA compensation step itself errored — operator intervention may be required to clear stuck statestep, reason
TypeEmitted whenPayload includes
tenant.suspendedA platform operator pauses tenant trafficreason
tenant.resumedA suspended tenant is resumednone
TypeEmitted whenPayload includes
org.member_invitedA platform operator invites a new org memberinvitee_email, role
org.member_acceptedAn invited member acceptsmember_id
org.member_removedA member is removedmember_id, reason
org.member_role_changedA member's role within the org changesmember_id, from, to
org.invitation_resentA pending invitation's link was re-emailedinvitation_id
org.invitation_revokedA pending invitation was cancelled before acceptanceinvitation_id, reason
org.ownership_transferredThe Owner role moved from one member to anotherfrom_member_id, to_member_id
TypeEmitted whenPayload includes
plan.tenant_plan_changedA platform operator changes a tenant's plantenant_id, from, to, effective_at
policy.mfa_default_changedThe platform-wide MFA default for new tenants changesfrom, to

The endpoint takes optional type and tenant_id query parameters. The control plane console uses these to drive the audit page filters; SIEM exports use the same shape.

GET /api/v1/organizations/{id}/events?type=tenant.provisioning.failed&tenant_id={t}&cursor=01HZX...&limit=50

Three things are deliberately not in this feed:

  • Tenant-scoped events — what individual users did inside a tenant lives in the tenant's own audit log, not the platform feed. Access via the tenant admin console.
  • Read-only viewing — opening a page doesn't emit an event. Only state changes do.
  • Health probe results — infrastructure-level signals belong in the observability stack, not the audit ledger.