Skip to main content
Approval workflows are available on Professional and Enterprise plans.

Overview

Approval workflows let you gate requirements or guardrail changes. Configure multi-phase flows with flexible approval criteria based on specific users, roles, or permissions. Without an active approval flow, requirements and guardrail regenerations are auto-approved immediately. With a flow configured, submissions enter a pending state and require explicit approval before proceeding.

Key Concepts

Target Types

Approval flows can be configured for these submission types. Create / update / delete are split per entity so different policies can apply to each (e.g. a flow could require approval on delete but not on create):

Pending state and final disposition

Approval-gated actions never reach their final state until the request is approved.
  • Creates and updates stage the proposed data in the affected table itself, marked PROPOSED (overrides) or PROPOSED lifecycle (requirements). Read paths filter these out so users only see live state.
  • Deletes carry no pending state on the row — the open approval request itself is the pending marker. On approve the row is soft-deleted via deleted_at; on reject the row is untouched. Soft delete keeps the audit trail intact and makes restoration trivial.
  • An override update writes a new PROPOSED row whose supersedes_id points at the existing ACTIVE row. On approve, the superseded row is soft-deleted and the proposed row flips to ACTIVE. On reject, the proposed row is soft-deleted and the active row stays live.

Specific-user criteria

SPECIFIC_USER criterion values are stored as user_uid (the stable 5-word identifier). The UI surfaces and accepts login_identifier (email / UPN / SSO sub) so authors and approvers see human-readable handles; the form picker stores the corresponding user_uid under the covers. Even when an approver holds requirements:approve or guardrails:approve, they can only decide on a request if they satisfy the active phase’s expression — being named in a SPECIFIC_USER rule, for example.

Creating an Approval Flow

Navigate to Approval Management and select the Workflows tab.

Flow Configuration

  1. Name and description - Give the flow a meaningful name
  2. Target types - Select which submission types trigger this flow
  3. Phases - Define one or more sequential approval phases
  4. Default flow - Optionally mark as the default for its target types
  5. Auto-regenerate invalid guardrails without approval - An optional configuration, shown only when guardrail_regeneration is a target type. When enabled, automatic regeneration due to a failure at runtime skips this flow and proceeds without approval. User-initiated regenerations still require approval.

Target selectors (entity filters)

Target types decide which kinds of change a flow gates; an optional target selector narrows it to which entities — for example only enforced requirements, only marketplace ones, or only changes with a given lifecycle status. Lifecycle matching is on the resulting status — the status the requirement will hold after the change (the outcome you’re putting behind approval), not the status it’s in now. The builder labels this rule Resulting Status. Match the state each change produces:
  • Accepting a proposal brings it live at beta (the entry maturity — stable is a separate, later promotion), so gate go-lives with a beta selector.
  • Declining a proposal lands it at declined, so gate declines with declined.
  • Restoring a declined requirement returns it to proposed for re-triage, so gate restores with proposed.

Approval Expressions

Each phase defines an approval expression using a logical tree:
  • Specific User - A named user must approve (matched by user UID)
  • Role - Any user with the specified role can approve
  • Permission - Any user with the specified permission can approve
Combine criteria with AND (all must be satisfied), OR (any one suffices), or NOT (exclusion) operators. Expressions can be nested for complex approval requirements. Example: “Requires approval from any Admin OR both the Security Auditor AND a Contributor”

Multi-Phase Flows

Phases execute sequentially. Each phase must be fully approved before the next begins. If any phase is rejected, the entire request is rejected. Example: A two-phase flow for new requirements:
  1. Technical Review - Any contributor approves
  2. Compliance Sign-off - Security auditor approves

Reviewing Approval Requests

Navigate to the Pending Reviews tab in Approval Management. Each request shows:
  • The submitted entity (requirement name, guardrail code snippet)
  • Current phase and progress
  • Approve / Reject buttons (visible only if you have the required permission)

Decisions

  • Approve - Records your approval for the current phase. If the phase’s approval expression is now satisfied, the flow advances to the next phase (or completes).
  • Reject - Immediately rejects the entire request regardless of phase. The submitter is notified.

Feedback

You can provide feedback on any pending request without making an approval decision:
  • Vote - Upvote or downvote (one vote per user per request, toggleable)
  • Comment - Up to 280 characters. Edits are tracked; the last 12 versions are stored.

What Happens After Approval

Notifications

Zenable groups notifications into two categories, both configurable under Settings → Notifications in your profile.

Governance Activity

Immediate notifications for approval events:

Report Mail

An opt-in periodic digest that combines persisted notifications with calculated activity (findings, feedback, and PR/MR reviews) for the reporting period. Choose daily, weekly, or monthly cadence in your profile.

Required Permissions

Approvals are fully transparent: anyone with approvals:read can see every request, every decision, every comment, and who voted which way. There is no per-record permission gating beyond approvals:read. See Roles and Permissions for which roles include these permissions.

API Reference

Approval Flows

Approval Requests

Decision request body:
The decision field accepts approve or reject. The optional comment field (max 280 characters) is recorded with the decision.

Approval Feedback

Feedback request body:
The vote field accepts upvote or downvote (mutually exclusive, toggleable). Both fields are optional; you can vote without commenting or comment without voting. Feedback is upserted per user per request — submitting again updates your existing feedback. Comment edits are versioned (last 12 versions retained).

Audit Logging

All approval actions are recorded in the audit log:
  • Flow created, updated, or archived
  • Decision made (approve/reject)
  • Request created or resolved
  • Feedback submitted or edited
Access audit logs via the Audit section in the management console.
Need help? Contact us at hello@zenable.io