Building a workflow that routes approvals automatically

Approvals are one of the most common sources of delay. Not because decisions are hard, but because routing is manual. Someone asks in the wrong place. A request sits without an owner. The next step is unclear.

This tutorial shows a practical pattern for routing approvals with clear ownership, predictable steps, and minimal overhead.


Step 1: Define the approval event

Start by defining what counts as an approval request. Keep the trigger narrow. A status change. A label applied. A form submitted. The simpler the trigger, the easier the workflow is to maintain.

Example trigger pattern

A common approach is to trigger when an item enters an “Approval” stage.

const trigger = { event: "item.status_changed", to: "Approval" };
const trigger = { event: "item.status_changed", to: "Approval" };
const trigger = { event: "item.status_changed", to: "Approval" };


Step 2: Route to the right owner

Routing should be based on stable rules. Team, category, priority, or workspace. Avoid routing based on free text fields. Those create ambiguity.

Simple routing table

const routeTo = { security: "team_security", billing: "team_finance", default: "team_ops" };
const routeTo = { security: "team_security", billing: "team_finance", default: "team_ops" };
const routeTo = { security: "team_security", billing: "team_finance", default: "team_ops" };


Step 3: Require the right context

Approvals slow down when reviewers lack context. The workflow should enforce a small set of required fields before it requests approval. This prevents back and forth.

Good required fields are usually:

  • Owner

  • Short summary

  • Impact or risk level

  • Link to supporting material


Step 4: Automate the handoff and notification

Once routing and requirements are clear, automation becomes straightforward. Assign an owner. Notify the right channel. Set a due date if appropriate. Record the action.

await client.workflows.create({
  name: "Approval routing",
  trigger,
  actions: [{ type: "assign", to: routeTo.default }, { type: "notify", channel: "approvals" }],
});
await client.workflows.create({
  name: "Approval routing",
  trigger,
  actions: [{ type: "assign", to: routeTo.default }, { type: "notify", channel: "approvals" }],
});
await client.workflows.create({
  name: "Approval routing",
  trigger,
  actions: [{ type: "assign", to: routeTo.default }, { type: "notify", channel: "approvals" }],
});


Step 5: Make it observable

Approvals are operational. They need visibility. Track how long items stay in approval. Track how often requests bounce back. Use that feedback to improve the workflow.

A lightweight metric set:

  • Time in approval

  • Rejected requests

  • Requests without required fields


What to do next

Start with one approval type and one routing rule. Run it for a week. Improve based on what actually happens. Most teams only need two or three approval workflows to remove a surprising amount of coordination overhead.

On this page

No headings found on page

Keep exploring how modern teams ship

Keep exploring how modern teams ship

© 2026

All rights reserved.

© 2026

All rights reserved.

© 2026

All rights reserved.

Create a free website with Framer, the website builder loved by startups, designers and agencies.