Configure Native Approvals Workflows

What are Native Approvals?

Native approvals are workflows designed to automate the approval process for tasks and functions within a system. They are ingrained in the functioning of the system and follow its inherent rules and procedures.

Native approvals in Moveworks provide a sequence of validations for different actions or requests, such as permissions to a resource or additions to a distribution list. These processes can be tailored according to specific roles, tasks, and predefined conditions.

They expedite approval requests by categorizing them based on certain parameters and directing each to an appropriate authority for approval. By employing conditions and rules, these approval workflows filter and sort requests to eliminate unnecessary steps and find the most efficient path to resolution.

Default Native Approval Workflows in Moveworks

Moveworks offers a variety of built-in, or 'default', native approval workflows, acting as standard templates for common use cases. They represent the foundational elements that can be customized to form flexible and adaptive approval workflows fitting an organization's unique approval process needs.

  1. APP_ADMIN: The Application Administrator's approval is necessary to carry out certain functions.
  2. MANAGER: This type of approval requires the consent of the individual's Manager.
  3. AUTO_APPROVE: Here, tasks or requests are automatically approved, bypassing the need for an approving authority.
  4. STANDARD_TRUST_MODEL: This workflow triggers if the requestor is their manager or their role matches predetermined roles. If these conditions aren't met, it falls back to require the Distribution List Owner's approval.
  5. STANDARD_WITH_FALLBACK_TO_MANAGER: Similar to Standard Trust Model, but when the initial conditions aren't satisfied, approval falls back to the Manager.
  6. MOST_RESTRICTIVE_TRUST_MODEL: A workflow that operates under stricter conditions for automatic approval. If not met, it reverts to require the Distributor List Owner's consent.
  7. MOST_RESTRICTIVE_WITH_FALLBACK_TO_MANAGER: A stricter workflow that requires the Manager's approval as a fallback when initial conditions aren't fulfilled.
  8. LEAST_RESTRICTIVE_TRUST_MODEL: This workflow operates under more flexible approval criteria. When conditions aren't met, approval from the Distribution List Owner is sought.
  9. GSUITE_OPEN_OR_OWNER: Specific to G-Suite requests, this workflow requires the consent of the Owner, or the group must be open for the action to go through.
  10. AUTO_APPROVE_FULL_TIME_ELSE_MANAGER: If a full-time user makes a request, it's approved automatically. Otherwise, it calls for approval from the Manager.
  11. AUTO_APPROVE_FULL_TIME_ELSE_APP_ADMIN: Similar to the previous workflow, but if the requestor is not a full-time user, approval from the App admin is required.
  12. APP_ADMIN_THEN_MANAGER: A two-step approval process. First, the App Admin needs to approve. If approved, the workflow moves to require the Manager's approval.
  13. MANAGER_THEN_DL_OWNER_WITH_FALLBACK_TO_AUTO_APPROVE: A process where Manager approval is sought first, followed by the DL Owner. If these aren't fulfilled, it falls back to automatic approval.
  14. MANAGER_THEN_DL_OWNER : A sequential workflow that first seeks the Manager's approval, then progresses to the DL Owner.
  15. ADD_TO_DL_APPROVAL: This workflow refers to getting approval to be added to a Distribution List. It typically requires the consent of the most restrictive role, falling back to the manager's approval if necessary.
  16. REMOVE_FROM_DL_APPROVAL: This pertains to getting approval to be removed from a Distribution List. The process mirrors the ADD_TO_DL_APPROVAL workflow.
  17. CREATE_DL_APPROVAL: This workflow automatically approves the creation of a Distribution List.
  18. GET_DL_MANAGER_APPROVAL: Here, the approval from the Manager of the Distribution List is required.
  19. MOST_RESTRICTIVE_WITH_FALLBACK_TO_DL_MANAGER: A stricter approval process that moves from requiring DL owner approval to DL Manager approval if initial conditions are not met.

Adding Custom Approval Workflows

Moveworks enables businesses to streamline and tailor their approval workflows to meet organizational requirements. Through native approval logic and flexible customizations, Moveworks can handle diverse approval scenarios. This document provides a detailed overview of how to write custom approval workflows using Moveworks' native approval syntax. It covers various approval models, logic types, and the syntax components that make it all possible. We also provide practical examples to illustrate how these workflows can be configured

To create a custom approval workflow:

  1. Navigate to Moveworks Native Approvals: In Moveworks Setup, navigate to Moveworks Native Approvals on the left hand menu under the Access Management grouping

  2. Create a new approval by clicking 'create'

  3. Name the Custom Approval Workflow: Provide a unique identifier for your custom workflow.

  4. Input the Workflow Expression: The workflow expression is written using a JSON block. Refer to the JSON Documentation below for guidelines on crafting this expression effectively.

  5. Add the new approval flow to the software - Navigate to Access Software > Software Catalog and edit the software you would like to add the custom approval to. Choose 'Custom Approval Workflow' under 'Provisioning Method' and use the dropdown under 'Custom Approval Workflow' to select the new approval you created.

1. Approval Expressions and Logic Types

Approval From Approval Group

This model sends approval requests to a specific group of users based on their role or a predefined external ID. It allows for parallel approval with a configurable number of approvers. Approval group approvals are supported for Okta, Azure, and GSuite. For thi

Example:

{
  "parallel_group_expression": {
    "group": {
      "external_id": "00gq0p1j6jGsb0ZCO2p8",
      "integration_id": "aee48223-5f11-4e26-b0f9-e33f935bacc1"
    },
    "max_to_ask": 2,
    "number_required": 1,
    "role": "MEMBER"
  }
}

Note: integration_id refers to the Moveworks internal ID for the System the group lives in (I.e. Okta or Azure). Please reach out to Moveworks Support for the integration ID for the system you need to configure group approvals with.

external_id refers to the approver group ID in the external system such as Okta or Azure.


2. Sequential Approval

Sequential approval ensures that approval requests are delivered in a defined order. Approvals are sent to users one by one in a specific sequence. Once the first approver approves, the second approver will receive the approval notification.

Example:

{
  "sequential_expression": {
    "expressions": [
      {
        "user_constant_expression": {
          "user": "example@moveworks.ai"
        }
      },
      {
        "user_constant_expression": {
          "user": "example2@moveworks.ai"
        }
      },
      {
        "user_constant_expression": {
          "user": "example3@moveworks.ai"
        }
      }
    ]
  }
}

Example: Manager then App Admin:

{
  "sequential_expression": {
    "expressions": [
      {
        "manager_expression": {}
      },
      {
        "app_admin_expression": {}
      }
    ]
  }
}

3. Conditional Approval with Fallback

This model evaluates conditions (e.g., user email or role) and routes the approval request accordingly. If the condition isn’t met, the request can be passed to another predefined approval workflow.

Example:

{
  "condition_expression": {
    "clauses": [
      {
        "condition": {
          "rule_v2": "requestor.email_addr.$LOWERCASE() == \"example1@moveworks.ai\".$LOWERCASE()"
        },
        "expression": {
          "user_constant_expression": {
            "user": "approver@moveworks.ai"
          }
        }
      },
      {
        "condition": {
          "rule_v2": "requestor.email_addr.$LOWERCASE() == \"example2@moveworks.ai\".$LOWERCASE()"
        },
        "expression": {
          "user_constant_expression": {
            "user": "approver2@moveworks.ai"
          }
        }
      }
    ],
    "default_expression": {
      "referenced_expression": {
        "name": "NAME_OF_ANOTHER_APPROVAL_MODEL"
      }
    }
  }
}

4. Conditional Role-Based Approval

Conditions can be based on roles or user attributes such as department or level. This allows for dynamic approval workflows based on the role selected by the user.

The role_canonical_name_to_provision should match the 'Unique role name' configured in the software entry in Moveworks Setup.

Example:

{
  "condition_expression": {
    "clauses": [
      {
        "condition": {
          "rule_v2": "approval_request.approvable_entity.app_entity.role_canonical_name_to_provision.$LOWERCASE() == \"role_name\".$LOWERCASE()"
        },
        "expression": {
          "sequential_expression": {
            "expressions": [
              {
                "user_constant_expression": {
                  "user": "example@moveworks.ai"
                }
              },
              {
                "user_constant_expression": {
                  "user": "example1@moveworks.ai"
                }
              }
            ]
          }
        }
      },
      {
        "condition": {
          "rule_v2": "approval_request.approvable_entity.app_entity.role_canonical_name_to_provision.$LOWERCASE() == \"role_name_2\".$LOWERCASE()"
        },
        "expression": {
          "condition_expression": {
            "clauses": [
              {
                "condition": {
                  "rule_v2": "$LOWERCASE((users_requested_for[0].role)) == \"cse\".$LOWERCASE()"
                },
                "expression": {
                  "auto_approve_expression": {}
                }
              },
              {
                "condition": {
                  "rule_v2": "$LOWERCASE((users_requested_for[0].role)) == \"csm\".$LOWERCASE()"
                },
                "expression": {
                  "parallel_expression": {
                    "expressions": [
                      {
                        "user_constant_expression": {
                          "user": "approver1@moveworks.ai"
                        }
                      },
                      {
                        "user_constant_expression": {
                          "user": "approver2@moveworks.ai"
                        }
                      },
                      {
                        "user_constant_expression": {
                          "user": "approver3@moveworks.ai"
                        }
                      }
                    ],
                    "number_required": 1
                  }
                }
              }
            ],
            "default_expression": {
              "auto_deny_expression": {}
            }
          }
        }
      }
    ],
    "default_expression": {
      "auto_deny_expression": {}
    }
  }
}

5. Approval Based on Work Status

Approvals can be routed based on a user's work status (e.g., Full-time, Contractor, etc.).

Example:

{
  "condition_expression": {
    "clauses": [
      {
        "condition": {
          "rule_v2": "users_requested_for[0].work_status == \"FULL_TIME\""
        },
        "expression": {
          "app_admin_expression": {}
        }
      }
    ],
    "default_expression": {
      "sequential_expression": {
        "expressions": [
          {
            "manager_expression": {}
          },
          {
            "app_admin_expression": {}
          }
        ]
      }
    }
  }
}

6. Approval Based on Custom and User Attributes

This model uses custom attributes like seniority, department, or custom roles to determine the approval path. For example, if a user’s seniority level is above a certain threshold, they might bypass some approval steps.

Example:

{
  "condition_expression": {
    "clauses": [
      {
        "condition": {
          "rule_v2": "users_requested_for[0].custom_attributes.seniority_level IN [\"Director\", \"VP\", \"SVP\", \"EVP\"]"
        },
        "expression": {
          "auto_approve_expression": {}
        }
      }
    ],
    "default_expression": {
      "sequential_expression": {
        "expressions": [
          {
            "manager_expression": {}
          },
          {
            "parallel_expression": {
              "expressions": [
                {
                  "user_constant_expression": {
                    "user": "vp_leader@example.com"
                  }
                },
                {
                  "user_constant_expression": {
                    "user": "svp_leader@example.com"
                  }
                }
              ],
              "number_required": 1
            }
          }
        ]
      }
    }
  }
}

General Syntax Breakdown

Here’s a quick reference for understanding the different syntax components in Moveworks approval models:

1. user_constant_expression

This expression specifies an individual user for approval, identified by their email.

Example:

{
  "user_constant_expression": {
    "user": "example@moveworks.ai"
  }
}

2. sequential_expression

This sends approval requests one after the other in a defined sequence.

Example:

{
  "sequential_expression": {
    "expressions": [
      {
        "user_constant_expression": {
          "user": "approver1@moveworks.ai"
        }
      },
      {
        "user_constant_expression": {
          "user": "approver2@moveworks.ai"
        }
      }
    ]
  }
}

3. parallel_expression

This sends approval requests to multiple users simultaneously. The number_required field specifies how many approvals are needed.

Example:

{
  "parallel_expression": {
    "expressions": [
      {
        "user_constant_expression": {
          "user": "approver1@moveworks.ai"
        }
      },
      {
        "user_constant_expression": {
          "user": "approver2@moveworks.ai"
        }
      }
    ],
    "number_required": 1
  }
}

4. auto_approve_expression

This automatically approves the request without requiring intervention.

Example:

{
  "auto_approve_expression": {}
}

5. auto_deny_expression

This automatically denies the request without requiring intervention.

Example:

{
  "auto_deny_expression": {}
}

6. referenced_expression

This references another approval model.

Example:

{
  "referenced_expression": {
    "name": "other_approval_m"
  }
}

7. condition_expression and rule_v2

Conditions allow the routing of requests based on user attributes, custom attributes, or request-specific data. rule_v2 evaluates expressions that can include operations on data, such as comparing values or checking membership in a list.


Conditions Based on User Attributes

As referenced in the examples above, you can create conditional approval flows based on user data. To see what data is populated for users, navigate to User Identity > Ingested Users.

Moveworks allows for external system user level data to a predefined list of supported attributes:
first_name
last_name
email_addr
role
department
manager_email
full_name
employee_id
cost_center_id
cost_center_name
country_code
timezone
region
city
state
work_status

To update or check the mapping of these fields navigate to User Identity > Ingest Users. Edit the configuration and navigate to page 2 and select 'Advanced Mode'. Field mappings will be pulled from the system marked as 'Is Primary Source' unless they are specified in the 'Override User Profile Fields' section or are a system specific ID such as user_id_info.user_itsm_id_info.

Please note, any changes to attribute mapping will take effect following the next user ingestion cycle.

Custom Attributes Configuration

Custom attributes allow for highly tailored approval models based on organizational-specific attributes, such as department, role, or seniority. To configure custom attributes for your organization, you must work with the Moveworks implementation team. Contact support to initiate custom attribute configurations.