Building a Workflow Engine in Asana for Cross-Functional Business Processes (using task types)

Why Standard Task Management Was Not Enough

Asana is an excellent project management platform. It provides tasks, forms, custom fields, approvals, rules, and automation features that cover a wide range of use cases. However, challenges arise when business processes span multiple departments and contain decision points, rework loops, approvals, and mandatory checks.

Consider a typical Engineering Change Request process in a manufacturing environment.

A request may initially be submitted by Production, reviewed by Engineering, validated by Quality, processed by Purchasing, and finally implemented by Production. In practice, however, the process is often far more complex. Quality may reject a design and return it to Engineering. Purchasing may not be required for certain changes. Additional approvals may be required depending on cost, risk, or customer impact.

At this point, many organizations discover a limitation: Asana is designed for project management, not as a full Business Process Management (BPM) system. It does not provide a native workflow engine with predefined states and allowed transitions.

The challenge therefore becomes simple:

How can we ensure that a task is always forwarded to the correct next department?

The Traditional Approach

The most common solution is to create a status field containing values such as:

  • New
  • In Progress
  • Review
  • Approved
  • Completed

This works well as long as the workflow is linear.

However, as soon as departments appear multiple times in the process, this approach becomes difficult to maintain.

Imagine the following process:

Production → Engineering → Quality → Engineering → Purchasing

When the task arrives in Engineering for the second time, how does the system know whether it should proceed to Purchasing or return to Quality again?

A simple status field does not provide enough information to determine the next valid step.

A Different Approach

Instead of storing where a task currently is, I decided to store where the task is allowed to go next.

This is achieved by using Asana Task Types as routing instructions.

Examples:

  • Production → Engineering
  • Engineering → Quality
  • Quality → Purchasing
  • Purchasing → Production

Each task type represents a specific departmental transition.

In other words, task types are no longer used to describe what a task is. Instead, they describe where the task should go next.

This transforms task types into a lightweight routing engine.

Why This Works

Whenever a department completes its work, users do not choose the next department manually.

Instead, they select the predefined task type that represents the next process transition.

For example, when Engineering has completed its work, the task type may already be set to “Engineering → Quality”.

A rule detects this value and automatically:

  • Moves the task to the Quality section
  • Assigns the appropriate users
  • Updates phase information if required
  • Prepares the next routing step

Once the task reaches Quality, another task type such as “Quality → Purchasing” is automatically assigned.

This means that every task always knows what the next valid destination is.

The Three Layers of the Architecture

The solution is built around three separate layers.

Layer 1: Sections

Sections represent the department that is currently responsible for the task.

Typical sections may include:

  • Production
  • Engineering
  • Quality
  • Purchasing

At any given time, a task belongs to exactly one section.

This provides clear ownership and visibility.

Layer 2: Task Types

Task types represent the next allowed process transition.

Examples include:

  • Production → Engineering
  • Engineering → Quality
  • Quality → Engineering
  • Quality → Purchasing
  • Purchasing → Completed

This is the core concept of the solution.

The current section answers the question:

“Who is responsible right now?”

The task type answers the question:

“Where is this task supposed to go next?”

Layer 3: Workflow Phases

For more complex scenarios, a custom field called “Phase” can be introduced.

Examples:

  • 01 - Initial Assessment - Production
  • 02 - Technical Evaluation - Engineering
  • 03 - Quality Validation - Quality
  • 04 - Procurement Preparation - Purchasing

The purpose of the phase field is to distinguish between different situations in which the same department may appear multiple times.

Without this additional information, automation can become ambiguous in highly complex workflows.

Example Use Case: Engineering Change Request

To illustrate the concept, let’s follow a realistic engineering change request.

A production issue is identified and submitted through an Asana form.

The request enters the Production section.

Based on the form information, automation assigns the task type:

“Production → Engineering”

Once the Production team completes its initial assessment, a rule automatically routes the task to Engineering.

After reviewing the request, Engineering determines that Quality must validate the proposed solution.

The task type changes to:

“Engineering → Quality”

The request is forwarded automatically.

During validation, Quality discovers a potential issue and requires adjustments.

The task type becomes:

“Quality → Engineering”

The task returns to Engineering.

After revisions are completed, Engineering forwards the task back to Quality.

This time the solution passes validation.

Quality assigns the task type:

“Quality → Purchasing”

Purchasing evaluates supplier impact and procurement requirements before routing the task to its final implementation stage.

Throughout the entire process, users do not need to determine where the task should be routed. The routing logic is stored directly within the task itself.

Handling Decision Points

Many business processes contain approval gates or branching logic.

For example, Quality may need to decide whether a change is approved or rejected.

Instead of relying on comments or manual communication, decisions are stored in custom fields.

Examples include:

  • Approval Status
  • Review Result
  • Risk Level
  • Classification

Automation rules evaluate these values and select the appropriate next routing task type.

As a result, the workflow can branch automatically based on business decisions.

Using Subtasks as Mandatory Checklists

Many departments are required to perform a standard set of activities before forwarding a task.

Examples may include:

  • Complete technical review
  • Upload documentation
  • Perform risk assessment
  • Verify customer requirements

Whenever a task enters a new phase, automation can create these subtasks automatically.

Additional rules then verify whether all subtasks have been completed.

If they are not completed:

  • The task remains in the current department
  • The routing action is reversed
  • An automated reminder can be generated

This effectively creates a process gate without requiring specialized workflow software.

Is This a Workaround?

Partially.

This architecture is not the standard way most organizations configure Asana.

However, it is not a workaround in the usual sense either.

A workaround typically compensates for a missing feature in an ad-hoc manner.

This approach is better described as an architectural pattern.

It uses standard Asana functionality—task types, custom fields, forms, sections, and rules—to create behavior that resembles a workflow engine.

The result is a highly structured process environment without requiring additional software.

Benefits of the Approach

The solution offers several significant advantages.

Every task knows its next valid destination.

Routing decisions become standardized and auditable.

Users no longer need to understand the entire workflow to perform their work correctly.

The architecture supports:

  • Multiple departments
  • Approval processes
  • Rework loops
  • Alternative process paths
  • Mandatory checklists
  • Automated notifications

Most importantly, the entire solution remains inside Asana.

There is no need for a separate BPM platform, workflow tool, or custom development effort.

Conclusion

The key idea behind this approach is simple:

Task types do not describe what a task is. They describe where a task is allowed to go next.

By turning task types into routing instructions, Asana can be used for far more than traditional project management.

Combined with sections, workflow phases, custom fields, and automation rules, this architecture enables organizations to manage sophisticated cross-functional processes that would traditionally require dedicated workflow software.

For simple workflows, the approach is unnecessary.

For complex business processes involving multiple departments, decision points, approvals, and rework cycles, it can transform Asana into a surprisingly capable workflow engine while remaining fully within the platform’s standard functionality.

5 Likes

@Max_GlaĂź,

Nice post! I agree that this is a great capability of Asana, and one that is not nearly as well-known as it should be (even considering that Custom Task Types are a somewhat newish feature in Asana).

It might help to clarify the feature that you refer to as “task types” by calling them “Custom Task Types,” which I think may be the more official name Asana uses.

A simplification I’m wondering if you are aware of:

In this kind of a workflow, I usually use no Sections in the project at all, but instead let Asana use the Custom Task Type to automatically generate the groupings:

That eliminates sections and rules required to keep the sections in sync…and is more colorful!

Thanks,

Larry

2 Likes

Hi Larry,

Thanks for the suggestion and for pointing out the terminology. You’re right, “Custom Task Types” is the more accurate name.

Looking at your example, I think our use cases are slightly different. In your setup, the Custom Task Type appears to represent the current stage of the process, which makes grouping by Custom Task Type a very elegant solution.

In my case, I use many Custom Task Types such as “Engineering → Quality”, “Quality → Engineering”, “Quality → Purchasing”, etc. Each Custom Task Type represents a specific transition between two departments rather than the current status of the task.

The main goal is to prevent routing mistakes. Users do not need to decide where a task should go next. They simply select the appropriate transition when their work is finished, and the automation handles the rest. This makes forwarding a task a conscious action rather than something that happens automatically based on field changes.

Because there are many different transition-based Custom Task Types, grouping by them would become quite fragmented. The Sections therefore serve a different purpose: they show the department that is currently responsible for the task and provide a consolidated view of the status of all active requests.

Thanks again for sharing your approach. I can definitely see it being the cleaner option for workflows where the Custom Task Types represent process stages rather than transitions.

Best regards,
Max

Example transition rule:

1 Like

Thanks for clarifying, @Max_GlaĂź. I understand how your workflow is different and benefits from Sections, so that makes sense, certainly.

I’ll leave my comment for the benefit of others’ workflows that might more closely match my example, because I find a lot of folks miss the ability to group by their custom task type and avoid sections and greatly simplify.

Thanks again,

Larry

1 Like