Previous Blog

Next Blog

Workflow Design

Workflow Design

Designing Workflows That Teams Actually Follow

The best workflows aren’t the most complete—they’re the easiest to follow. Embed triggers, cut mental steps, and make the right path the lazy one.

Ethan Walker

Ethan Walker

Head of AI Operations

5 min read

Table of Contents

I once worked with a product team that had spent two months building the perfect Notion wiki for their launch process. It had 14 stages, color-coded RACI matrices, conditional branching for different feature types, and an embedded Loom video explaining how to use it. It was gorgeous. Six weeks later, they’d run three launches completely outside the system. When I asked why, a senior developer shrugged and said, “It takes longer to read the process than to just ship the thing.”

That’s the fatal flaw in most workflow design. We mistake comprehensiveness for quality. We build systems that document every edge case and cross-functional dependency, only to watch our teams route around them in Slack DMs and hallway conversations. The best workflow isn’t the one that’s most complete—it’s the one that’s least resistible. If following the defined path feels harder than coordinating ad hoc, your workflow has already failed.

After analyzing adoption rates across dozens of teams, I’ve found the breaking point sits around three mental steps. If a person has to remember more than three things to correctly execute a recurring task—which tool to open, which field to update, whom to notify—adherence falls off a cliff. The fix isn’t more documentation. It’s redesigning the workflow so the correct next action is obvious, automatic, or ideally, eliminated entirely.

The “Right Thing” Must Be the Easy Thing

I learned this principle from a manufacturing plant, of all places. On the assembly line, they called it poka-yoke: mistake-proofing. Workers didn’t need training manuals to insert a component correctly because the physical jig only allowed the correct orientation. The path of least resistance was also the correct one.

In knowledge work, we don’t have physical jigs. But we can still apply the same logic. A workflow that requires someone to open a separate app, copy a ticket ID, paste it into a commit message, and then manually move a card is friction-heavy. One where the commit message automatically links the ticket via a branch-naming convention and updates the card via integration is friction-light. The second workflow gets followed; the first gets skirted.

So when designing a workflow, I now ask three questions for every step a human has to take:

  1. Can this step be automated without losing necessary judgment?

  2. If not, can the system prepopulate context so the human decision is a single click?

  3. If neither, is the step placed as close as possible to where the person is already working?

The third question is where most teams stumble. They design workflows that send people hunting. “Go update the status in Jira” when the person is deep in their IDE. “Log the conversation in HubSpot” when they’re on a Zoom call. The friction of context-switching becomes the reason the workflow dies. A far better approach: embed the workflow step into the tool where the work happens. If the conversation is in Slack, the status update should be triggerable from Slack. If the code is in GitHub, the deployment approval should be possible from a pull request comment.

Make the Triggering Event Unavoidable

A workflow that requires someone to remember to start it is already fragile. The most adhered-to workflows are triggered by an external event that can’t be missed: a form submission, a deal stage change, a CI pipeline failure, a calendar invite for a recurring review. The trigger initiates the workflow, not human memory.

I once helped a legal team eliminate a persistent bottleneck around contract approvals. Their old workflow: sales would email legal a contract, legal would triage it, and somewhere in that handoff, contracts sat for days. The fix wasn’t a reminder system. We embedded a “Submit for Legal Review” button inside the sales team’s existing HubSpot deal view. That button fired a webhook that created a dedicated task in the legal team’s queue with all the deal context pre-attached. The trigger wasn’t a separate step; it was a natural endpoint of the sales conversation. No training needed. Adoption was near 100% in the first week.

The underlying principle is that a workflow’s entry point must live where the work lives. If you’re designing a bug escalation workflow, the trigger should be inside the support tool the triage team already uses—a button, a tag, a custom field change. Don’t ask them to open a new tab and fill out a form. That form becomes the graveyard of good intentions.

A Tiny Example: Embedding a Decision Tree as Code

Sometimes, a complex decision gets turned into a document that nobody reads. I’ve started representing lightweight decision logic as a simple JSON structure that can be rendered inside the team’s existing tools or even a CLI. Here’s a trivial example from a content approval workflow, where the next step depends on the type of content and its estimated reach:

{
  "trigger": "content_draft_submitted",
  "rules": [
    {
      "if": { "type": "blog", "reach": "internal" },
      "then": { "assign": "peer_review", "sla_hours": 24 }
    },
    {
      "if": { "type": "blog", "reach": "external" },
      "then": { "assign": "editor_review", "required_approvers": ["editor", "legal"]

{
  "trigger": "content_draft_submitted",
  "rules": [
    {
      "if": { "type": "blog", "reach": "internal" },
      "then": { "assign": "peer_review", "sla_hours": 24 }
    },
    {
      "if": { "type": "blog", "reach": "external" },
      "then": { "assign": "editor_review", "required_approvers": ["editor", "legal"]

{
  "trigger": "content_draft_submitted",
  "rules": [
    {
      "if": { "type": "blog", "reach": "internal" },
      "then": { "assign": "peer_review", "sla_hours": 24 }
    },
    {
      "if": { "type": "blog", "reach": "external" },
      "then": { "assign": "editor_review", "required_approvers": ["editor", "legal"]

This isn’t supposed to live in a vacuum. The idea is that an automation reads this file and routes the task automatically, while a dashboard displays the rule in human-readable form. The single source of truth for the workflow logic becomes a file that both humans and machines can consume, not a dusty Confluence page. When the logic changes, you update the file; the routing updates instantly. Nobody has to “remember” the new process.

You don’t need sophisticated tooling. Even a simple internal CLI script can fetch this file and guide someone through the decision: “What type of content? (1) Blog, (2) Email Campaign…” and then output the required next step. That alone eliminates the “wait, which channel do I use for this?” ambiguity that kills flow.

Designing for Adherence Over Exhaustiveness

The temptation is to build workflows that handle every exception. But the more branches you add, the less likely anyone is to follow them. I now advise teams to design for the 80% case and have a single, visible escape hatch for the rest. For example: “If your situation doesn’t fit these three paths, post in #workflow-exceptions with the word ‘override’ and a brief reason.” That’s it. No multi-page escalation policy. A human reviews those exceptions and either handles them or, if a pattern emerges, updates the file.

This does two things. It keeps the automated workflow clean and fast, and it surfaces where the model is incomplete. Over time, the system evolves to cover more ground without ever becoming a bloated rulebook. The team trusts the workflow because it handles the common case flawlessly and doesn’t punish them for the rare one.

The product team that abandoned their Notion wiki? We rebuilt their launch process as a single GitHub Project board with four columns and an automated trigger from a “launch/ready” label. The board had exactly three swimlanes—critical, standard, minor—each with a predefined set of required checklist items that auto-populated. The escape hatch was a single issue template for “custom launch coordination.” They never used it. The workflow was so light, so embedded, that following it was genuinely easier than negotiating through DMs. Within a quarter, on-time launches went from 60% to 92%.

Workflow adoption isn’t a training problem. It’s a design problem. If people aren’t following your process, don’t schedule another workshop. Remove a step. Embed a trigger. Make the right path the path of least resistance. The best workflows don’t feel like process. They feel like the natural way work moves.

More from the blog

Continue learning how work is evolving

Read more perspectives on AI-powered workflows, team operations, and the systems shaping the future of work.

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