Approval flowsBeta

Add an approval workflow builder to your product.

Your users define the steps: who reviews, in what order, what happens on approve or reject. Velt runs the pipeline and records every step.

No more building a workflow engine to close an enterprise deal.

Free tier. No credit card. First comment in 5 minutes.

AFQ3 forecast / approval chain
live

Approval chain

FP&A LeadPassed
Mandatory·1 / 1
CommitteePending
Quorum·2 / 3
CFOWaiting
Mandatory·1 / 1
Add a step
Build this

Approval workflows running inside products at

Migrating from an in-house workflow engine or another SDK?Compare·Migration guide

What it is

Humans and agents, one pipeline.

Velt Approval Flows is a workflow engine for review and sign-off, embeddable in your product. Your users define multi-step pipelines through your product’s UI; your product authors them through Velt’s definition API: human reviewers, parallel groups with quorum, and AI review agents, in whatever order the work requires. One workflow execution can carry both actor types, with every override recorded.

Workflow · marketing emailone DAG · agent + human
Brand AgentFinding pinned to the headline
agentfailed
SarahApprove / Reject
humanwaiting
Compliance AgentQueued behind sign-off
agentpending

override · recorded

Dismissing the agent finding needs a comment — recorded as overrideOfAi by the team lead.

consent visible·both actor types

How it works

Three steps to your first workflow.

Wrap your app, define a workflow as JSON through the REST API, dispatch a run per work item, and record decisions from your own review panel. Signed events stream every transition back to your backend.

01Install
terminal
npm install @veltdev/react
02Wrap
_app.tsx
<VeltProvider
  apiKey={VELT_API_KEY}>
  <YourApp />
</VeltProvider>
03Record
review-panel.tsx
// define via REST, dispatch a run,
// record decisions from your panel
await velt.workflow.recordReviewerDecision({
  executionId, stepId: "legal", decision: "approve",
});
With Velt

The mechanics

A workflow is a JSON-configured graph of steps: agent and human node types, with parallel groups as containers. A definition is a versioned template; each submission dispatches an execution that tracks its own progress. Approve advances; reject follows your declared route, a follow-up step or a bounded revision loop back to the author with prior attempts attached. Routing is static or conditional, with edges carrying sandboxed JSON-AST expressions over step output and dispatch context, no eval. Dispatch is idempotent, so retries never spawn duplicate runs. Every transition is timestamped, attributed, and persisted; HMAC-signed webhooks fire on each, and a polling API replays by sequence number.

// execution.dispatched · step.awaiting-approval · group.quorum-met · step.completed

Build it yourself

What an in-house version requires

  • a state machine with persistent, restart-safe executions
  • sequential and parallel step orchestration with quorum math
  • conditional routing over step output and context
  • group assignment with reassignment rules
  • SLA timers and escalation
  • a notification pipeline
  • workflow versioning so in-flight reviews survive definition changes
  • webhook security: signing, idempotent callbacks, retries
  • per-step permissions and an audit record for every transition

Teams that build it budget a quarter for the first version and keep paying for the long tail. The 3 steps above replace the first quarter; the capability wall below replaces the long tail.

MCP: the faster path.

Skip the steps. Have your agent set it up.

npx -y @velt-js/mcp-installer

Launch approval workflows this week.

No credit card. Works with React, Next.js, Vue, Angular, and HTML.

Get Free API Key

Capabilities

Every approval, routed and recorded.

Each card shows the real mechanics. Toggle to Code for the exact snippet behind it.

01nodes
One pipelineagent + human
Brand AgentPre-screened the deck
agent node
LegalSigned off on the clause
human node
// nodes
{ "id": "brand", "type": "agent" }
{ "id": "legal", "type": "human" }

Agent and human nodes

Agent checks and human approvals compose one pipeline through one API. The agent pre-screens the deck before legal signs off on the clause.

02quorum
Quorum2 of 3
RomanApproved
ChrisApproved
MayaPending
quorum metWaiting siblings released
// quorum
{ "type": "group", "quorum": 2,
  "cancelOnQuorum": true }

Parallel groups and quorum

Reviewers run simultaneously under an N-of-M threshold; once quorum is met, waiting siblings are released. Two of three sign-offs move the contract without the third calendar.

03routing
amount > 25,000
trueCFOfalseBudget owner
// routing
{ "if": "amount > 25000",
  "then": "cfo", "else": "budget-owner" }

Conditional routing

Edges carry sandboxed predicates over step output and dispatch context, with no code execution. Invoices over 25,000 route to the CFO, the rest to the budget owner.

04mandatory
Reviewers2 required
LegalApproval required
mandatory
FinanceApproval required
mandatory
Brand AgentBonus voice
optional
// mandatory
{ "requiredNodeIds": ["legal", "finance"] }

Mandatory reviewers

Per-step reviewer lists carry mandatory flags, and quorum groups can name members whose approval is required. Legal and finance must both sign; brand counts as a bonus voice.

05sla
SLA timer24h
ControllerNo action in 24h
breached
Ops leadPicked up the step
approved
// sla
{ "slaMs": 86400000,
  "onBreach": "escalate" }

SLA timers and escalation

Per-step deadlines mark a stalled step breached and route it along the escalation edge you define, firing an event. The filing stops sitting because the approver is on vacation.

06loops
Revision loopmax 3
Legal redlineBack to deck writer
attempt 1 / 3Prior attempts attached
// loops
{ "onReject": "loop-to-author",
  "maxIterations": 3 }

Revision loops

A rejection loops the run back to the author with every prior attempt and reason attached, capped before escalation. The legal redline returns to the deck writer instead of failing the run.

07override
Admin overrideaudited
Admin10:02

Force-approved the parked step: reviewer unreachable.

overriderecorded
// override
velt.workflow.forceApprove({
  step, reason: "reviewer unreachable",
});

Admin override with audit

An operator can force-approve, force-reject, or cancel a parked step, and the audit log separates reviewer decisions from overrides. The contract moves while the reviewer is unreachable, on the record.

08versioning
v3in-flight runs
1 run openkeeps its rules
v4new runs
currentdispatches on v4
// versioning
// in-flight runs keep v3
// new runs dispatch on v4

Workflow versioning

Every save creates a version; in-flight runs keep the rules they started with, new runs get the current ones. A mid-quarter policy change never breaks an open budget review.

09events
Signed eventsHMAC
step.completed#4210signeddelivered
step.awaiting#4211signedretry 2s…8m
Missed a delivery? Replay by sinceSeq
// events
GET /v2/workflow/events?sinceSeq=4210

Signed events and replay

Every transition posts an HMAC-signed webhook with retries, and missed deliveries replay by sequence number from the events API. Your audit pipeline never misses a sign-off.

10governance
exec_8842live
statusin review
pending stepCFO sign-off
decisions2
// governance
GET /v2/workflow/executions/exec_8842

Governance as API

One call returns a run’s status, pending step, and every recorded decision. Your publishing agent checks the approval state before touching the counterparty’s data.

We had agent and human steps in one pipeline within a sprint. The quorum math and the retries we’d scoped a quarter for were already done.

Staff engineer · contract platform

Little big details

The long tail, already built.

Shipped functionality only. The confirmed set leads; coming-soon items are labeled. This is the part of an in-house build that never ends.

Definition vs execution model: versioned templates, per-dispatch runs pinned to their versionAgent and human node types in one definitionDefinitions scoped to workspace, organization, or document; most specific match winsParallel groups with waitAll, cancelOnQuorum, and joinOnQuorum policiesQuorum counts approvals only, with required-member quorum (requiredNodeIds)Mandatory and optional reviewers per stepStrict mode: every human node declares a reject path, no silent dead-endsRevision loops with a 1-to-20 iteration cap and full previousAttempts historyConditional edges via sandboxed JSON-AST expressions; no evalSLA timers via slaMs with breach routing, enforced by the linterAgent nodes with configurable polling cadence and a hard runtime ceilingDefinition linter with explicit error codes for every graph mistakeWorkflow versioning with optimistic concurrency (ifVersion) and prior-version snapshotsIdempotent dispatch (idempotencyKey) and idempotent decision recordingMonotonic per-execution event sequence with catch-up polling by sinceSeqHMAC-SHA256 signed webhooks with exponential retries and dead-letteringWebhook URL safety: HTTPS only, private and loopback hosts rejectedExecution-level and step-level cancellation with an audited reason vocabularyAdmin force actions plus reviewer-scoped resolve, distinguished in the audit logGraph capacity of 100 nodes and 500 edges per definitionWebhook node runtimeComing soonCustom approval states per element (Draft, Review, Approved, any set)Coming soonDynamic routing where your webhook decidesComing soonGroup-based assignment with reassignment locked to the step’s groupComing soonAd-hoc step insertion and removal mid-flightComing soonSLA pre-breach reminders to the assigned reviewerComing soonHuman override of agent findings with per-finding granularityComing soonRole-based permissions per step with 403 on unauthorized actionsComing soonFive prebuilt UI components (VeltApprovalFlow and siblings), white-label and themeableComing soonVersion diff history, rollback, and pruningComing soon

Make it yours

Your review surface, your routing.

Prebuilt review components for the fast path, headless mode for fully custom approval UIs, and JSON definitions, signed webhooks, and version pinning underneath.

Look

The five prebuilt components (VeltApprovalFlow, VeltApprovalStep, VeltApprovalComments, VeltApprovalActions, VeltApprovalAuditLog), all white-label and themeable, with headless mode for fully custom approval UIs and template variables and dark mode.

VeltApprovalFlowthemed
Brand AgentPre-screened
agent
LegalYour tokens, your chrome
VeltApprovalStepVeltApprovalCommentsVeltApprovalActionsVeltApprovalAuditLogheadless

Behavior

JSON workflow definitions with your own node ids and routing, free-form trigger context that edge conditions and agents read, signed event webhooks into your pipeline, version pinning per execution, and definitions scoped to workspace, organization, or document.

definition.jsonyour ids
nodeslegal_gatecfo_signoff
routingamount > 25000
webhooksigned event
versionpinned · v4
scopeworkspaceorgdocument
We built the builder UI our PMs wanted on top of Velt’s definition API. The engine, the quorum, and the audit record were the parts we didn’t have to write.

Product lead · agency platform

In production

Approval flows, in products like yours.

Tabbed by vertical, with verified customer screenshots.

SummaryNext StepsDemoCustomer Stories

Hey Conductor!

This Digital Sales Room gives you everything you need to move forward — from proposal to plan.

Our Mutual Action Plan
Training2 / 5
Creating a new Room1
Build a working demo room
Contract sign-off
Maya2m

@Fin We need to make a working demo for Rene and his team

Brand agent first, brand lead second, legal last: every deck and campaign email walks the same chain before the client sees it. A rejection routes back with the redline attached.For sales enablement

See it running in products like yours.

30 minutes, with an engineer, not a sales deck.

Book Demo
SOC 2 Type IIHIPAAEU data residencyAudit-ready

Comment content at workflow steps can live on your infrastructure via the self-host data provider, with only minimal identifiers on Velt. Flow metadata is stored in a configurable region, encrypted at rest, and client-side encryption keys are available before data leaves the browser. See self-hosting and governance.

Book Demo

Proof

The enterprise deal, unblocked.

“Build us a workflow engine” stopped blocking our deals.

1 enterprise deal

The customer demanded a multi-step approval engine before they would sign. We shipped it on Velt instead of building one, and closed the quarter.
VP Engineering, sales enablement platform

2 of 3

Our close week needs quorum sign-off on every filing. Two-of-three with required members was a config change, not a project.
Controller, FP&A platform

0 spinners

Agent steps pre-screen generated work and humans hold the gates. Our users watch the pipeline instead of trusting a black box.
Product lead, AI-native SaaS

FAQ

Questions about approval flows.

Install @veltdev/react, wrap your app in VeltProvider with your API key, and define a workflow as JSON through the REST API. Dispatching against a work item creates an execution that routes itself; your review panel records decisions through the decision API.

Yes. Agent is a node type: it runs automatically when the workflow reaches it and reports pass or fail with a findings summary that downstream routing reads. For human judgment on agent output, a human step downstream holds the gate.

Yes. A step declares its reviewer list with mandatory and optional members, and a parallel group runs steps simultaneously with an N-of-M threshold that can require specific approvers. When quorum is met the group resolves and remaining assignments are released; resolving "whoever is on call" happens in your backend, which passes the chosen userIds in.

Per-step SLA timers. If no action lands within the configured duration, the step is marked breached and routes along the escalation path you define, and a breach event fires so your backend knows.

You decide per step: route the run to a follow-up step, or loop it back to the author with every prior attempt and rejection reason attached, capped at a set iteration count with an escalation route when the cap is hit. Every human step must declare a reject path; the engine refuses definitions with silent dead-ends.

No. Every save creates a new version; in-flight executions keep the version they started on, and new runs use the current one. Updates are guarded against concurrent edits, and prior versions are snapshotted.

Every transition creates a timestamped, attributed event: who was asked, who acted, what they decided, and whether an admin overrode a reviewer. The full chain per run is queryable through the events API. See /audit-trail.

No. Velt ships the engine, the definition APIs, and the review-surface components; you build the builder UI that fits your product, and your users define workflows through it.

Beta means the feature is real and running in production with two caveats: API contracts may still change between releases, and access requires being added to the beta list. Ask through Book Demo or your existing Velt contact.

Velt is priced on usage, not seats: you pay for documents with review activity in a month, and there is a free tier for development and early production. Approval flows are part of the SDK, not a separately priced add-on.

Add an approval workflow builder to your product.

Free tier. No credit card. First comment in 5 minutes.

30 minutes, with an engineer, not a sales deck.