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

# Normalize Capacity Across Swimlanes

> Enable capacity normalization so each swimlane's capacity bar reflects the actual availability of its assigned users rather than a flat plan-level value.

## What you will achieve

After completing this guide, each swimlane on your Nextedy PLANNINGBOARD will display a capacity bar that accurately accounts for individual user availability within the plan's date range. Over-allocated users will be flagged visually, and users with no capacity in the current plan window will be suppressed from the board.

## Prerequisites

* Planningboard is installed and a board is already configured on a Polarion Wiki page or LiveDoc.
* Swimlane assignment type is set to **Users (Assignee)**. Capacity normalization works at the per-user level; it requires user-based swimlanes.
* Teams Service is set up with at least one team, team members, and a calendar. See [Set Up Teams Service](/planningboard/guides/capacity/teams-service-setup).
* At least one Polarion Plan with a start date and due date is visible on the board.

For swimlane-based normalization, your Polarion Plan IDs must follow a consistent pattern such as `Iteration_{planNum}-{teamName}` (e.g. `Iteration_5-alpha`). This naming convention is what allows Planningboard to group plans by iteration number across teams:

<Frame>
  <img src="https://mintcdn.com/none-17b4493f/f2B5Oj-k4j8GirhH/planningboard/assets/images/article-what-is-normalization-https-next-63646066.png?fit=max&auto=format&n=f2B5Oj-k4j8GirhH&q=85&s=699bdde3a181a1f8081d38084ade990b" alt="Polarion Plan detail page for 'Iteration 5 - Alpha (2025-11-02)' showing the plan ID field set to Iteration_5-alpha" width="1396" height="472" data-path="planningboard/assets/images/article-what-is-normalization-https-next-63646066.png" />
</Frame>

Work items must also have an enumeration custom field that identifies the team (for example, a field named `team`). Planningboard uses this field to map each work item to its swimlane:

<Frame>
  <img src="https://mintcdn.com/none-17b4493f/f2B5Oj-k4j8GirhH/planningboard/assets/images/article-what-is-normalization-https-next-1972da6d.png?fit=max&auto=format&n=f2B5Oj-k4j8GirhH&q=85&s=7f2c8fe475eb198c8f5bace9e7a1f078" alt="Work item PB-478 open in Polarion showing the Custom Fields section with a Team dropdown set to Gamma" width="1276" height="1056" data-path="planningboard/assets/images/article-what-is-normalization-https-next-1972da6d.png" />
</Frame>

<Warning title="Limitations — read before proceeding">
  Planningboard capacity tracking has the following confirmed limitations compared to Nextedy GANTT:

  * **No multi-assignee support.** If a work item has multiple assignees, capacity is not distributed across them. Only the primary assignee is counted.
  * **No sub-item effort distribution.** Effort from child work items is not rolled up to the parent for capacity calculations. Configure `capacityLoad` at the work-item level that holds the estimates.
  * **Whitespace-sensitive configuration.** Configuration property values must have no leading or trailing whitespace. A single extra space will silently prevent the feature from activating.
</Warning>

***

<Steps>
  <Step title="Verify Teams Service is providing capacity data">
    Capacity normalization depends on data from the Teams Service. Before configuring normalization, confirm that user capacity is flowing through correctly.

    Open the board and inspect the capacity bar in any swimlane. If the bar shows `0 / 0` for all users, the Teams Service is either not configured or not returning calendar data for the current plan range.

    Refer to [Track User Capacity](/planningboard/guides/capacity/user-capacity) and [Track Team Capacity](/planningboard/guides/capacity/team-capacity) to confirm the prerequisite setup is in place.

    ***
  </Step>

  <Step title="Enable `useTeamsService` in the widget">
    In the Widget Parameters panel, locate **Capacity** and confirm the `useTeamsService` parameter is enabled. This parameter connects the board to the Teams Service, which supplies `totalCapacity`, `allocatedCapacity`, and `availableCapacity` per user per plan.

    ```text theme={null}
    Capacity
      └─ Use Teams Service:  ✓  (enabled)
    ```

    When `useTeamsService` is active, the plan's flat `capacity` value is replaced by per-user capacity values derived from the team calendar and the percentage assignment for each user.

    In the same Widget Parameters panel, also confirm that the **Swimlanes (Rows)** section is set to use the team enumeration field. Set Assignment Type to **Enumeration Field** and enter the field ID (for example, `team`):

    <Frame>
      <img src="https://mintcdn.com/none-17b4493f/f2B5Oj-k4j8GirhH/planningboard/assets/images/article-what-is-normalization-https-next-24afc87b.png?fit=max&auto=format&n=f2B5Oj-k4j8GirhH&q=85&s=e484d662ea695022db86299cd39e3c9b" alt="Widget Parameters panel showing Swimlanes (Rows) with Assignment Type set to Enumeration Field and Field ID set to team" width="692" height="502" data-path="planningboard/assets/images/article-what-is-normalization-https-next-24afc87b.png" />
    </Frame>

    Finally, enable the **Normalization** option in the widget parameters. Under the **Normalization** section, set **Use Normalization by Swimlane** to **Yes**:

    <Frame>
      <img src="https://mintcdn.com/none-17b4493f/f2B5Oj-k4j8GirhH/planningboard/assets/images/article-what-is-normalization-https-next-c8c25404.png?fit=max&auto=format&n=f2B5Oj-k4j8GirhH&q=85&s=441ede453c76d2aad42d6dbb64746d54" alt="Widget Parameters panel showing the Normalization section with 'Use Normalization by Swimlane' set to Yes" width="676" height="164" data-path="planningboard/assets/images/article-what-is-normalization-https-next-c8c25404.png" />
    </Frame>

    <Note>
      Users who have no team calendar entry for the plan's date range will default to `totalCapacity = 0.0`. Their swimlane will show zero available capacity but will still appear on the board unless you also enable Plan Range filtering (see Step 4).
    </Note>

    ***
  </Step>

  <Step title="Configure `capacityLoad` to track effort">
    In the Widget Parameters panel, set the **Capacity Load** mode. Planningboard derives effort from `remainingEstimate` / `initialEstimate` time-tracking fields by default. If your team uses a custom field for effort points, specify it here.

    ```text theme={null}
    Capacity
      └─ Capacity Load:  remainingEstimate   (or your custom field ID)
    ```

    The `setEffort` calculation produces three values per work item:

    | Value        | Meaning                                                                    |
    | ------------ | -------------------------------------------------------------------------- |
    | `effort`     | Total estimate (initial or custom field value)                             |
    | `effortDone` | For resolved items, equals `effort`; for open items, 0                     |
    | `effortTodo` | Remaining work (`remainingEstimate` or custom field; 0 for resolved items) |

    Effort values are rounded to one decimal place. Ensure the field you reference holds numeric values in the same unit as your team calendar (hours or story points, whichever the Teams Service is configured to use).

    <Warning title="Whitespace in field IDs">
      Configuration parameters are whitespace-sensitive. Do not include spaces around the field ID value. `remainingEstimate ` (trailing space) will not resolve to the correct field.
    </Warning>

    ***
  </Step>

  <Step title="Suppress out-of-range users with Plan Range filtering">
    When a plan covers a short iteration and some team members have assignments only outside that window, their swimlanes contribute noise. Enable Plan Range filtering to show only users with active capacity in the currently displayed plans.

    Go to **Polarion Administration → Configuration Properties** and add:

    ```properties theme={null}
    nextedy.planningboard.activeTeamAssignmentsInPlanRangeOnly=true
    ```

    Once applied:

    * Users with team assignments overlapping the displayed plan range are shown.
    * Users with assignments entirely outside the plan range are hidden.
    * Work items previously assigned to hidden users are moved to the **Not Assigned / Other** swimlane.

    <Tip title="Property not taking effect?">
      If the property appears not to apply after saving, make a trivial edit to any other Configuration Property (add and remove a space) and save again. This forces Polarion to flush and re-read the configuration.
    </Tip>

    <Warning title="Deprecated alternative">
      An earlier property `nextedy.planningboard.activeTeamAssignmentsOnly=true` (introduced in version 25.3.0) hid only *past* assignments and was independent of the displayed plan scope. It was deprecated in version 25.12.0. Use `activeTeamAssignmentsInPlanRangeOnly` instead.
    </Warning>

    ***
  </Step>

  <Step title="Review the per-user capacity breakdown">
    After the configuration above is in place, each swimlane capacity bar reflects:

    ```text theme={null}
    availableCapacity = totalCapacity − allocatedCapacity
    ```

    Where:

    * **`totalCapacity`** — hours derived from the team calendar for the plan's start-to-due-date window, multiplied by the user's percentage assignment.
    * **`allocatedCapacity`** — sum of `remainingEstimate` (or custom field) for all work items assigned to the user within the plan.
    * **`availableCapacity`** — the remaining headroom. A **negative value indicates overallocation**.

    The board displays this as a progress bar inside each swimlane header. An overallocated swimlane will appear filled beyond 100%.

    ***
  </Step>
</Steps>

## Capacity flow at a glance

<Frame>
  <img src="https://mintcdn.com/none-17b4493f/zUlmOSLBIQ0HyaAX/planningboard/diagrams/guides/capacity/capacity-normalization/diagram-1.svg?fit=max&auto=format&n=zUlmOSLBIQ0HyaAX&q=85&s=5e18fcfdbecdfe4918d232bdd8cdc1d8" alt="Flow diagram showing Teams Service calendar entries and percentage assignment feeding totalCapacity, Work Items remainingEstimate feeding allocatedCapacity, both combining into availableCapacity, which drives the swimlane capacity bar" width="680" height="420" data-path="planningboard/diagrams/guides/capacity/capacity-normalization/diagram-1.svg" />
</Frame>

***

## Common pitfalls

<Warning title="User shows `0 / 0` capacity">
  The user has no team calendar entry covering the plan's date range. Either add a calendar record in the Teams Service for that period, or enable `activeTeamAssignmentsInPlanRangeOnly=true` to hide such users automatically.
</Warning>

<Warning title="Capacity bar does not update after reassigning a work item">
  Refresh the board using the **Refresh** button to reload capacity totals from the server. Capacity is calculated server-side and is not recalculated live on drag-and-drop.
</Warning>

<Warning title="All swimlanes show identical capacity">
  If `useTeamsService` is disabled or misconfigured, Planningboard falls back to the plan's flat `capacity` value, applying it uniformly to all swimlanes. Verify the Teams Service integration and confirm the parameter is saved correctly with no whitespace.
</Warning>

<Tip title="Multi-dimensional capacity">
  If your team tracks capacity across multiple dimensions (for example, separate front-end and back-end budgets per plan), see [Configure Multi-Dimensional Capacity](/planningboard/guides/capacity/multi-capacity) for the `multiCapacityLoad` parameter, which provides per-swimlane capacity breakdowns using a keyed capacity map.
</Tip>

***

## Verification

You should now see:

1. Each user swimlane displays a capacity bar with distinct values — not identical values across all swimlanes.
2. Users without team assignments in the current plan range are absent from the board (if `activeTeamAssignmentsInPlanRangeOnly=true` is set).
3. Overallocated swimlanes show a filled or overflowing capacity bar.
4. The **Not Assigned / Other** swimlane contains any work items that belonged to now-hidden users.

If capacity bars still show identical values or zeros, review [Capacity Calculation Issues](/planningboard/guides/troubleshooting/capacity-issues) for diagnostic steps.

***

## See also

* [Configure Capacity Tracking](/planningboard/guides/configuration/capacity-configuration)
* [Track Team Capacity](/planningboard/guides/capacity/team-capacity)
* [Track User Capacity](/planningboard/guides/capacity/user-capacity)
* [Visualize Capacity Load](/planningboard/guides/capacity/capacity-visualization)
* [Configure Multi-Dimensional Capacity](/planningboard/guides/capacity/multi-capacity)
* [Set Up Teams Service](/planningboard/guides/capacity/teams-service-setup)
* [Filter Swimlanes by Plan Range](/planningboard/guides/swimlanes/filtering-by-plan-range)
* [Capacity Calculation Issues](/planningboard/guides/troubleshooting/capacity-issues)

<Accordion title="Sources">
  **KB Articles**

  * What is 'Normalization'
  * Swimlane Assignment Types
  * Filter user swimlanes by Plan range

  **Support Tickets**

  * [#6777](https://support.nextedy.com/helpdesk/tickets/6777)
  * [#6605](https://support.nextedy.com/helpdesk/tickets/6605)
  * [#4714](https://support.nextedy.com/helpdesk/tickets/4714)

  **Source Code**

  * `PlanningBoardDataService.java`
  * `PlanningBoardWidget.java`
  * `planningboard.js`
  * `capacityHelperData.cy.ts`
  * `AssignmentMode.java`
</Accordion>
