> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ravenna.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Setting up access provisioning

> Step-by-step guide to configure applications, approval templates, access policies, access levels, and agent-assisted access requests.

export const Checkbox = ({items = []}) => {
  const [checked, setChecked] = useState(Array(items.length).fill(false));
  const toggle = index => {
    setChecked(prev => {
      const copy = [...prev];
      copy[index] = !copy[index];
      return copy;
    });
  };
  return <div className="custom-checkbox-list">
      {items.map((text, index) => <div key={index} className="custom-checkbox-item flex items-center mb-2">
          <input type="checkbox" checked={checked[index]} onChange={() => toggle(index)} className="mr-2" />
          <span>{text}</span>
        </div>)}
    </div>;
};

"Can I get access to X" is the single most common IT request and the one most often handled by a DM to whoever answers first. Set up access provisioning and that becomes a flow where users request through a form or your AI agent, each request routes to the right approvers, and access is granted automatically once approved. This guide walks through the complete setup from application catalog to agent-assisted requests.

<Callout icon="link" color="#6B7280">Learn about [access provisioning concepts](/documentation/automate/access-provisioning/overview)</Callout>

## What good looks like

<Checkbox
  items={[
"A requester asks the agent in plain language and gets a form prefilled with the right application",
"They only see applications and access levels they are actually eligible for",
"Low-risk access is a single manager approval, privileged access takes more",
"The grant happens automatically, and the entitlement is visible afterwards",
"Time-bound access expires without anyone remembering to remove it"
]}
/>

## How the pieces connect

Access provisioning is built from four layers that cascade into each other. You configure them from the bottom up:

| Layer | What it defines | Attaches to |
| - | - | - |
| **Approval template** | Who approves, in how many rounds, and whether any or all approvers must sign off | An access policy |
| **Access policy** | Who is eligible to request, which approval template applies, allowed durations, whether business justification is required | One or more access levels |
| **Access level** | A permission tier within an application, and how access is provisioned once approved | An application |
| **Application** | The tool or service being requested | Your catalog |

The result is a single access request form that adapts to each requester. Users pick an application and an access level, the form shows only what they are eligible for, the access policy routes the request to the approvers defined in its approval template, and provisioning runs through the access level's provisioning method.

<Note>You do not need to build a workflow for this. Approval routing and provisioning both happen automatically from the policy and access level configuration. Workflows are for the exceptions, covered in [optional workflow automation](#optional-workflow-automation) below.</Note>

## Before you begin

Before starting, make sure you have:

* A request channel already running, which the [IT help desk](/guides/playbooks/it/help-desk) playbook covers
* An identity provider integration (Okta, Microsoft Entra ID, Google Workspace, JumpCloud, Cloudflare, or OneLogin) for automated provisioning
* An understanding of your organization's application catalog and which apps require access management
* A clear picture of who should approve access, so you can turn that into approval templates
* (Optional) An AI agent deployed to a Slack channel for conversational requests

## Step 1: Import or create applications

Applications are the foundation of access provisioning. You can sync them from your identity provider or create them manually.

<Steps>
  <Step title="Sync applications from your identity provider">
    Navigate to **Settings** > **Integrations**, connect Okta, Microsoft Entra ID, JumpCloud, OneLogin, or Cloudflare, and enable application syncing. Applications and their groups import automatically.

    Google Workspace is the exception: it syncs users and groups but not applications. Create those applications manually in the next step.
  </Step>

  <Step title="Create applications manually">
    Navigate to **Settings** > **Applications**, click **Add Application**, and fill in the name, domain, owner, approver, and workspaces. Save the application when complete.
  </Step>
</Steps>

<Tip>Catalog the applications people ask for, not your whole estate. Pull a month of requests, count them, and start with the top ten. Record an owner on each one, because that is the field that stops every approval question becoming an IT question later.</Tip>

<Callout icon="link" color="#6B7280">Learn about [applications and access levels](/documentation/automate/access-provisioning/applications)</Callout>

## Step 2: Create approval templates

Approval templates define who approves an access request and in what order. Create them first, because access policies reference them.

<Steps>
  <Step title="Navigate to approval templates">
    Go to **Settings** > **Approvals**.
  </Step>

  <Step title="Click New Template">
    Click **New Template** to open the template form.
  </Step>

  <Step title="Configure template details">
    Fill in the following fields:

    * **Name**: A descriptive label such as "Manager approval" or "Security access review"
    * **Description**: When this template should be used
    * **Workspaces**: Which workspaces can use this template. Leave empty to make it available everywhere.
  </Step>

  <Step title="Add approval rounds">
    Add one round per approval stage. For each round, set:

    * **Policy**: **Any can approve** or **All must approve**
    * **Approvers**: Specific users, user groups, or dynamic roles such as the requester's manager
  </Step>

  <Step title="Save the template">
    Save the template. It is now available to attach to an access policy.
  </Step>
</Steps>

Create one template per approval path you need. A typical setup looks like this:

| Template | Rounds | Use for |
| - | - | - |
| Manager approval | Manager review (any can approve) | Standard, low-risk access |
| Team lead and IT | Manager review, then IT sign-off | Access managed by a specific team |
| Security access review | Manager review, security review (all must approve), IT sign-off | Admin and privileged access |

<Tip>Use the **Requester's manager** dynamic approver rather than naming individuals. It resolves at request time, so the template keeps working as your org chart changes. Name individuals only in the rounds where the answer depends on a specific person's judgment, usually the security review.</Tip>

<Callout icon="link" color="#6B7280">Learn about [approval templates](/documentation/tickets/approvals/templates)</Callout>

## Step 3: Create access policies

Access policies define who can request access and under what conditions. Each policy sets how requests are approved: not at all, by users or groups you pick, or through an approval template.

<Steps>
  <Step title="Navigate to the Policies tab">
    Go to **Settings** > **Applications** and open the **Policies** tab.
  </Step>

  <Step title="Click New Policy">
    Click **New Policy** to create a new policy.
  </Step>

  <Step title="Configure policy details">
    Fill in the following fields:

    * **Name**: A descriptive label such as "Standard access" or "Privileged access review"
    * **Description**: When this policy should be used
    * **Eligible groups**: Which user groups can request access under this policy. Leave empty to allow all users.
    * **Ineligible groups**: Which user groups are explicitly excluded
    * **Approval**: Select **Approval template** and pick the template you created in Step 2. Select **Users or Groups** for a single round of named approvers, or **Not required** only if requests under this policy should be approved automatically.
    * **Expiry**: How long access granted under this policy lasts. See the table below.
    * **Business Justification**: Toggle on if requesters must explain why they need access
  </Step>

  <Step title="Save the policy">
    Save the policy. You attach it to access levels in the next step.
  </Step>
</Steps>

### Tiering by risk

Write your tiers down before you build the policies, because the tiers are what the rest of the configuration hangs off. Three cover most catalogs:

| Tier | Examples | Approval | Duration |
| - | - | - | - |
| **Standard** | A design tool, a note-taking app, read access to a dashboard | Manager, any can approve | No expiry |
| **Elevated** | A CRM seat, a billing tool, a repo with customer data | Manager, then the application owner | Requester selects, offer 30 and 90 days |
| **Privileged** | Production consoles, admin roles, anything with a break-glass story | Manager, security review with all must approve, then IT | Fixed and short, 8 hours is a reasonable default |

One policy per tier, reused across every application, is far easier to maintain than a policy per app. It works for ten apps and collapses at fifty.

### Choosing an access duration

| Mode | What happens | Also configure |
| - | - | - |
| **No expiry** | Access is permanent, with no duration field on the form | Nothing |
| **Fixed duration** | Access always lasts a set amount of time, with no duration field on the form | **Duration**: the enforced length, entered as a number and a unit, such as `8` **Hours** |
| **Requester selects** | The requester chooses from a list of allowed durations on the request form | **Duration Options**: the durations to offer, each set as a number and a unit. Requesters pick from these on the form. On the policy page, select **Edit Options** in the **Default Duration** dropdown to add, reorder, or remove them. |

Durations display in words, such as **12 Hours** or **1 Month**. A month is always 30 days. See [configure duration options](/documentation/automate/access-provisioning/policies#configure-duration-options) for details.

Make expiry the default rather than the exception. Permanent access is the reason access reviews are painful, and Ravenna revokes on expiry, so an unused seat leaves on its own and shows up as a reclaimed license rather than an audit finding.

<Note>A policy with **Approval** set to **Not required**, or with no approval template, auto-approves every request that passes its eligibility check. Choose **Users or Groups** or attach a template on any policy that needs a human decision.</Note>

<Callout icon="link" color="#6B7280">Learn about [access policies](/documentation/automate/access-provisioning/policies)</Callout>

## Step 4: Define access levels

Access levels represent the permission tiers within each application, such as Admin, Editor, or Viewer. Each level attaches an access policy and specifies how access is provisioned.

<Steps>
  <Step title="Open an application">
    Navigate to **Settings** > **Applications** and open the application you want to configure.
  </Step>

  <Step title="Go to the Access Levels tab">
    Select the **Access Levels** tab on the application detail page.
  </Step>

  <Step title="Click Add Access Level">
    Click **Add Access Level** to begin configuring a new tier.
  </Step>

  <Step title="Name and describe the level">
    Set the **Name** to a descriptive label such as "Admin", "Editor", or "Viewer", and use **Description** to explain what this level grants and when it should be requested.
  </Step>

  <Step title="Attach an access policy">
    Select the **Access Policy** that should govern this level. This is what determines eligibility and pulls in the approval template you configured in Step 2. If a single level needs its own rules, select **Custom** and set **Approval**, **Expiry**, **Business Justification**, and eligibility directly on the level. A custom policy can't be reused by other levels. See [custom access policies](/documentation/automate/access-provisioning/applications#custom-access-policies).
  </Step>

  <Step title="Choose the provisioning method">
    Set **Provisioning Method** to control how access is granted after approval. See the table below for which to pick.
  </Step>

  <Step title="Map to your identity provider group">
    For Group provisioning, select the corresponding group in your identity provider. This is how Ravenna knows which group to add the user to after approval.
  </Step>

  <Step title="Repeat for each permission tier">
    Add an access level for every permission tier your application supports. Levels with different approval requirements should point at different access policies.
  </Step>
</Steps>

### Choosing a provisioning method

| Method | How access is granted | When to use it |
| - | - | - |
| **Group** | Ravenna adds the user to the mapped identity provider group | Your default for synced applications. Supported on Okta, Microsoft Entra ID, Google Workspace, JumpCloud, Cloudflare, and OneLogin. |
| **Application** | Ravenna assigns the user directly to the application in the identity provider | Okta applications where direct assignment is preferred over groups. Okta is the only provider that supports it. |
| **Manual** | An authorized provisioner grants access in the target system, then confirms it in Ravenna | Tools with no identity provider connection |
| **Workflow** | Ravenna hands the approved request off to a workflow you build | Complex provisioning that the other methods cannot express, such as calling an external API or chaining several systems |

Group and Application are the methods that give you end-to-end automation. Reach for Workflow only when the provisioning itself needs custom logic.

<Warning>
  On OneLogin, Group provisioning maps to either a group or a role, and a user can belong to only one OneLogin group at a time. A second group-mapped grant fails rather than displacing the first, so if a user might hold two grants at once, map those access levels to OneLogin roles, which are additive. See [OneLogin access provisioning](/integrations/onelogin/overview#access-provisioning).
</Warning>

## Step 5: Configure the request form

The form is how users submit access requests, and it is also what your AI agent presents. Create one form for access requests and let the field configuration adapt it per requester.

<Steps>
  <Step title="Create or open a form">
    Go to **Forms** and create a new form (or edit an existing one).
  </Step>

  <Step title="Add an Application Select field">
    Add an **Application Select** field. This lets users choose from the applications in your catalog.
  </Step>

  <Step title="Add an Access Level Select field">
    Add an **Access Level Select** field. This field dynamically shows the access levels available for the selected application, filtered by the requester's eligibility.
  </Step>

  <Step title="Add a Business Justification field">
    Add a **Business Justification** text area field. It renders only for access levels whose policy requires a justification, and it is required whenever it renders.
  </Step>

  <Step title="Add a Duration field">
    Add a **Duration** field. It renders only for access levels whose policy uses **Requester selects**, and it is required whenever it renders. Levels on a fixed duration or no expiry hide it automatically.
  </Step>

  <Step title="Save and publish the form">
    Save your form and publish it so it is available to users.
  </Step>
</Steps>

<Note>The Access Level Select field is dependent on the Application Select field. It only shows access levels for the selected application, filtered by the requester's eligibility based on the attached access policy.</Note>

<Tip>Add both the Business Justification and Duration fields even if only some policies need them. The access policy decides whether each one appears, so you do not need a separate form per policy.</Tip>

One form covers your whole catalog. Because eligibility filtering and policy-driven fields both resolve per requester, two people opening the same form see different applications, different access levels, and different fields.

## Step 6: Enable agent-assisted requests

Once your form is published, you can enable your AI agent to handle access requests conversationally through Slack. The agent fills out and submits the form you built in Step 5, so it inherits the same eligibility filtering, approval routing, and provisioning. It has no separate path of its own.

<Steps>
  <Step title="Open your agent">
    Navigate to **Agents** in the sidebar and select the agent you want to configure.
  </Step>

  <Step title="Go to the Identity tab">
    Select the **Identity** tab on the agent configuration page.
  </Step>

  <Step title="Enable Software Access Requests">
    Scroll to the **Advanced Settings** card and toggle **Software Access Requests** on. This exposes eligibility-aware tools to the agent.
  </Step>

  <Step title="Create agent rules for access request scenarios">
    Add a rule so the agent presents the form and prefills what the requester already described.

    <Prompt description="When someone asks for access to a tool, present the Software Access Request form. Prefill the application and access level from what they said. Do not tell them who the approvers are, the request routing handles that.">
      When someone asks for access to a tool, present the Software Access Request form. Prefill the application and access level from what they said. Do not tell them who the approvers are, the request routing handles that.
    </Prompt>
  </Step>

  <Step title="Deploy the agent to your Slack channel">
    Deploy the agent to your Slack channel so users can submit access requests conversationally.
  </Step>
</Steps>

<Warning>The agent needs a published access request form to work with. It does not have a built-in form of its own, so complete Step 5 before enabling this.</Warning>

<Note>Requests submitted through the Ravenna API or an MCP client are different. They do not need a form you built, because Ravenna creates and reuses a **Software Access Request** form in the target workspace. It appears in **Forms** with a **System** badge and is marked **Managed by Ravenna**, so it cannot be edited. Leave it in place.</Note>

<Callout icon="link" color="#6B7280">Learn about [software access requests for agents](/documentation/automate/access-provisioning/agent)</Callout>

## Step 7: Test the flow

Validate the complete setup before rolling it out to your organization.

<Steps>
  <Step title="Submit a test request">
    Submit a test access request via the form or through the agent.
  </Step>

  <Step title="Verify approval routing">
    Confirm that the access policy's approval template was applied to the ticket and that the expected approvers were notified.
  </Step>

  <Step title="Approve and verify provisioning">
    Approve the request and confirm that provisioning occurs. For synced applications, check the identity provider to verify the user was added to the correct group.
  </Step>

  <Step title="Confirm the entitlement is created">
    Verify that the entitlement appears in the **Entitlements** tab on the relevant application.
  </Step>

  <Step title="Test manual provisioning">
    For access levels using Manual provisioning, test the flow by marking the entitlement as provisioned after granting access in the target system.
  </Step>
</Steps>

<Tip>Test with a real requester from an eligible group, not just an admin account. Eligibility filtering is the part most likely to surprise you.</Tip>

## After you launch

Watch three things through the first two weeks:

* **Provisioning failures.** Check the Entitlements tab on your busiest applications. A failure here is silent from the requester's side.
* **Requests that skip the form.** If people still DM for access, the agent rule is not firing or the catalog is missing the app they want.
* **Approvals sitting.** An approval nobody actions is worse than no approval. Add a reminder before you add more rounds.

<Callout icon="link" color="#6B7280">Learn about [entitlements](/documentation/automate/access-provisioning/entitlements)</Callout>

## Optional workflow automation

Your access provisioning setup is complete without any workflows. Add one only when you need behavior the policy and access level configuration cannot express:

* **Custom provisioning logic**: set an access level's provisioning method to **Workflow** and build a workflow that performs the provisioning steps, such as calling an external API or chaining several systems together.
* **Post-provisioning follow-up**: use the **Entitlement Status Changed** trigger to send a confirmation message, alert on provisioning failures, or notify a team when access is revoked.

<Callout icon="link" color="#6B7280">Learn about [workflow triggers and actions](/documentation/automate/workflows/triggers-actions)</Callout>

## Where teams get this wrong

<AccordionGroup>
  <Accordion title="A policy per application">
    It works for ten apps and collapses at fifty. Tier the risk instead.
  </Accordion>

  <Accordion title="Approvals on everything">
    If a manager approves a note-taking app, they stop reading the ones that matter.
  </Accordion>

  <Accordion title="Cataloging the estate instead of the requests">
    Nobody requests the app that was already provisioned at hire.
  </Accordion>

  <Accordion title="Skipping the test with a real requester">
    Eligibility filtering behaves differently for an admin. Test as someone in an eligible group.
  </Accordion>
</AccordionGroup>

## Next steps

<CardGroup cols={2}>
  <Card title="Access reviews" icon="shield-check" href="/guides/playbooks/security/access-reviews">
    Prove who has what, on a schedule.
  </Card>

  <Card title="Monitor entitlements" icon="key" href="/documentation/automate/access-provisioning/entitlements">
    Track active access grants and handle provisioning failures.
  </Card>

  <Card title="Refine policies" icon="sliders-horizontal" href="/documentation/automate/access-provisioning/policies">
    Adjust eligibility and duration options based on usage patterns.
  </Card>

  <Card title="Add more applications" icon="grid-2" href="/documentation/automate/access-provisioning/applications">
    Expand your catalog as teams request additional tools.
  </Card>
</CardGroup>

<Callout icon="link" color="#6B7280">Put this to work in the [employee lifecycle](/guides/playbooks/hr/employee-lifecycle), [employee onboarding](/guides/playbooks/hr/employee-onboarding), and [employee offboarding](/guides/playbooks/hr/employee-offboarding) playbooks</Callout>


## Related topics

- [Access provisioning](/documentation/automate/access-provisioning/overview.md)
- [Access reviews](/guides/playbooks/security/access-reviews.md)
- [Software access requests for agents](/documentation/automate/access-provisioning/agent.md)
- [Applications](/documentation/automate/access-provisioning/applications.md)
- [Access policies](/documentation/automate/access-provisioning/policies.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.