Resource planning

Overview
Planning answers three questions: who works on what? (board), how full are we? (capacity and utilisation) and where is a bottleneck coming? (forecast).
Capacity is not a plain calculation from weekly hours. Absences and a reserve share are taken into account — without a reserve you plan at 100 %, and every disturbance becomes a delay.
Core tasks
Plan on the board. Below the utilisation matrix the allocations appear as bars per person. Drag a bar with the mouse into another period; its length stays the same in working days of the project brand — if a public holiday of the brand falls into it, the allocation ends one day later. The handle at the edge of the bar changes the length; the planned hours grow or shrink along (the hours per working day stay the same). Without a mouse, pick the allocation in the field above the bars and move it with the buttons or the arrow keys by one working day at a time; with Shift held, the arrow keys change the length. Overallocation is made visible rather than prevented — sometimes it is the deliberate decision.
Create and change an allocation. A click on an empty cell or New allocation opens the dialog. As soon as person and period are chosen, it shows the utilisation before and after per week — in the colours of the configured thresholds. If the period extends beyond the project term, a warning appears; it is saved anyway, because preparation sometimes starts before the official start.
Pre-fill from the project. Pre-fill from project creates a tentative allocation over the project term for every project member: with a planning hint (e.g. 50 %) that share of the weekly hours times the term in weeks, otherwise the project's budget hours divided by the number of members. Anyone already allocated in the period gets no second suggestion. The suggestions are ordinary allocations — change hours, period and confidence as usual.
Plan with templates. For recurring projects, describe once under Planning board → Allocation templates who needs how much and when — e.g. "Shopware setup: 30 h development over two weeks, 8 h PM from week 2". Each line has a role, hours, an offset (from which week) and a duration in weeks. Plan from template (on the board or in the template list) asks for project, start and confidence and for a person per line; lines without a person are skipped. Allocations start on the Monday of the start week plus offset and end on the Friday of the last week; without a start, the project start applies. A template without a brand is available to all brands — only someone allowed to manage allocations in all brands can create and change it.
Read utilisation. The capacity view shows target and actual per person and period; the breakdown says what a utilisation consists of. The Team filter narrows the view to the employees of one team — the team set on the employee counts. A role limited to "own team only" sees, on the planning board, checklist and timeline, just the employees of its own teams and those without a team.
Utilisation is a grid of person × period with a fixed first column and header row; each cell shows the percentage plus planned and available hours, and its colour follows the configured thresholds.
See bottlenecks early. The forecast weighs known demand against capacity and shows when it gets tight. Besides Total, Per brand and Per employee there are the levels Per team (team set on the employee) and Per skill: there the capacity of all employees with that skill counts against their allocations plus the still open skill demands — so you see, for example, "front-end in week 34 planned at 130 %". With the filters Team, Skill and Brand the forecast shows the group's row and its employees. When weekly hours, project members or project dates change, the system recalculates capacity and forecast immediately in the background — not only at night. The early warning to the manager is still sent by the daily run only, so a change does not trigger the same warning again.
The forecast chart stacks planned and pipeline as bars per period and draws available as a line on top; the tooltip names the hours per series and the average utilisation.
Pipeline in the forecast. Brand and total rows contain the expected work from open deals (value × probability ÷ hourly rate, spread over four weeks from the expected close). Two factors weight it, both between 0.5 and 1.5 and neutral (1.0) without won deals: the trend — if more was won in the last three months than on average over the last twelve, the pipeline counts more — and the season — how much was won in this calendar month over the last two years, smoothed with the neighbouring months. The derivation appears below the pipeline figure, e.g. "Base 20.0 h × trend 1.15 × season 0.90".
Try out scenarios. A scenario is planning on trial: you move things without changing the live state, and apply only when it fits. With Hire a person / bring in a freelancer you add a hypothetical person with weekly hours and a period to the scenario. It counts as capacity in the comparison (weekly hours per working day, minus the default reserve share), and scenario rows can be assigned to it instead of an employee. The totals at the end of the comparison show utilisation with and without that person. Applying creates no person — the scenario reports who has to be hired or contracted.
A click on the name opens the scenario as a page of its own — with its own address that can be shared and reloaded. It holds people, allocations, the comparison with live planning as well as Apply and Discard.
Staff by skills. Skill matching suggests people who cover the requirement — ranked by level, then free capacity in the period, then history: who has already booked hours on the project, who was already allocated there, who has worked for the same customer. The history appears below the name. Reserve allocates the chosen person directly: an allocation is created in the demand's project — pre-filled with the demand's period and required hours, both editable — and the demand counts as covered. Anyone not allowed to manage allocations (or who switches the toggle off) only marks the demand as covered. If a demand is still open 14 days before its start, the project lead gets a notice — with matching employees "staff internally", without "check freelancers". If it is still open 3 days before the start, a final reminder follows; there are never more than these two per demand and start date. If the start is moved, reminders start over for the new start date. The bundled automation planning.skill_demand_unmet_remind (shown as Unbesetzter Skill-Bedarf: Projektleitung erinnern under Automations) does this — active by default, can be switched off.
See the demand on the project. On a project, the Resources tab shows the open skill demands, the planned versus booked hours per person and the totals including budget hours. People who booked time without being allocated are marked there.
Analyse the skill gap. Under Planning board → Skill Gap the skills in demand from the open skill demands stand next to what the workforce can do — per skill the number of demands, the required hours and the highest required level. Missing means nobody reaches the level; thin means fewer qualified people than demands. The Training column lists employees who already have the skill but below the required level — the obvious candidates for training. Expired certificates and people who have left do not count, freelancers do. Include covered demands also counts demands that are already staffed (total demand instead of only the open gaps). The table can be exported as CSV; via the API the analysis is GET /api/v1/planning/skill-gaps.
Plan vs. actual at month end. After each month end, the daily run captures per person what was planned, available and booked. The capacity view shows it under Plan vs. actual at month end with a month picker, the dashboard as the Plan vs. actual (month end) tile with the largest deviations. Later bookings do not change the captured state — it is the statement at period end. Via the API: GET /api/v1/planning/utilization-snapshots.
Fields in detail
| Field | Required | Values / format | What it does |
|---|---|---|---|
Employee employeeId | yes | an employee | Who is planned in. |
Project projectId | yes | an existing project | What for. |
Period from / to periodStart, periodEnd | yes | date | Over what period the plan runs. |
Planned hours plannedHours | yes | 0 or more | How much work is foreseen. Set against available time it yields utilisation — minus absences and public holidays, because planning goes against real availability, not against the calendar. |
Distribution distribution | no | even or weekly | How the hours spread across the period. |
Confidence confidence | no | planned, committed, tentative | How firm the allocation is. This is the most important distinction on the mask: tentative for a quote not yet accepted, committed for work someone is relying on. Without it a plan looks full that is half hope. |
Role roleHint | no | text | In what function the person is planned. |
Task title taskTitle | no | text, max. 1000 characters | What is to be worked on. A task can arise from it. |
Note note | no | text | A note on the allocation or on the reserve override. |
Shift by working days shiftWorkingDays | no | whole number (± working days) | Keyboard route on the board: moves the allocation by that many working days of the project brand; the length stays. |
Change end by working days resizeWorkingDays | no | whole number (± working days) | Keyboard route: lengthens or shortens the end, at least one working day remains; the hours grow along. |
Keep hours keepHours | no | yes/no | When changing the length, do NOT recalculate the hours — only the density changes. |
Existing allocation allocationUlid | no | identifier | Only for the preview in the dialog: when editing, the existing allocation counts in "before" only. |
Reserve share (default) reserveDefaultPct | yes | 0–100 % | Deducted from the available time unless the person or role has its own value (default 10 %). |
Warning above thresholdWarnPct | yes | 1–1000 % | From here a week counts as overbooked — yellow in the matrix, checklist entry, rescheduling suggestions (default 100 %). |
Critical above thresholdCriticalPct | yes | 1–1000 %, ≥ warning | From here the overload is critical — red, early warning to the manager (default 120 %). |
Underload below thresholdUnderPct | yes | 0–1000 %, ≤ warning | Below this a week counts as underloaded (default 70 %). |
Weight of tentative allocations tentativeFactorPct | yes | 0–100 % | How much tentative counts in the forecast — 50 % means half (default). |
Role roleId | one of person/role | role | Reserve override for all employees with this role, in every brand. Precedence: person before role before default; with several roles having an override, the highest share applies. |
Reserve share reservePct | yes | 0–100 % | Deviating reserve share of the person or role. |
Template name name | yes | text, max. 255 characters | Name of the allocation template, e.g. "Shopware setup". |
Description description | no | text, max. 1000 characters | What the template is meant for. |
Brand brandId | no | brand or empty | Empty = template for all brands (only with the permission for all brands); otherwise visible in that brand only. |
Lines lines | yes | 1–50 lines | Per line role (max. 50 characters), hours, offset in weeks from the start (0 = first week) and duration in weeks. When changing, the list replaces all lines. |
Start startDate | no | date | When applying: planning starts in this week (Monday); empty = project start. |
Assignment assignments | yes | line → employee | When applying: which person takes which line; lines without a person are skipped. |
Settings & permissions
- Own allocation/utilisation:
resources.allocation.view_own· Team:resources.allocation.view_team - Manage allocations:
resources.allocation.manage— applies only to your own projects (project lead
or project team) and to employees of your own team. Anyone who is to plan all projects of the brand additionally needs resources.allocation.manage_all. The project management role holds both permissions and therefore plans all projects of the brand; a custom role with only resources.allocation.manage stays limited to its own projects, and an attempt for someone else's project is then rejected with a message.
- View capacity:
resources.capacity.view· Reserve share:resources.capacity.manage - Planning settings (Settings → Resource planning: default reserve, thresholds, weight of tentative
allocations) and reserve per role apply to all brands — changing them requires resources.capacity.manage across all brands. The values take effect immediately in matrix, board, checklist, rescheduling and forecast.
- Allocate directly from skill matching:
resources.skill.matchandresources.allocation.managefor the
project · Demand view on the project: resources.capacity.view
- Forecast:
resources.forecast.view· Skill matching and skill gap:resources.skill.match - Scenarios:
resources.scenario.manage - Create, change and apply allocation templates:
resources.allocation.manage(applying checks the same rules as
creating an allocation: project brand, employees in your brands, own projects without …manage_all)
- Plan vs. actual at month end:
resources.capacity.view
Module flag: module.resources.
FAQ & troubleshooting
Someone appears overloaded although little is planned. Check absences and the reserve share — both reduce available capacity.
A scenario has no effect. Scenarios take effect only after being applied. Until then they are a thought experiment.
The forecast shows no bottleneck although it feels otherwise. It calculates with RECORDED demand. What is not planned does not appear there.