Capacity by project

Flowtly Editorial Team5 min

The Resourcing grid reads top-down: project → role → person. Starting from the work rather than from the team means an unfilled job is visible as a gap in the plan, instead of being invisible because nobody is standing in it.

The three levels

A role is measured against the demand it asks for. Every role has a target — the amount of time the work actually needs each week — and the grid measures the people on it against that target. A role that asks for one person's full week has a target of 100%. A role that needs two people has a target of 200%. Where a role asks for nothing in particular, it falls back to one full-time slot, which is the common case.

You set a role's target from the grid: the people icon on a role row opens its demand, where you say how many people the work needs and over what period. Each full-time person becomes one open slot, and the slots add up to the target — two open slots at 100% make a role that needs 200%. See Setting a role's demand.

People on a role add up, and they are compared to the target. If two people are booked on the same 100% role at 75% and 50%, that role reads 125% — one slot with more people in it than it can hold, not two comfortably half-filled slots. But if the role asks for 200%, two people at 100% each read 200 / 200: fully staffed, and not flagged. Over-capacity means genuinely more people than the work asked for, and it is meant to look wrong, because it is a decision waiting to be made: either someone moves, or the role's target was too low.

A project averages its roles. A project with a role covered at 60% and a second role with nobody in it reads 30%, not 60%. Open roles pull the average down, which is the point — a project is not well staffed just because the people who are on it are busy.

Only roles that actually need someone that week count toward the average. A role with no booking and no vacancy that week is simply not running yet, and it does not drag the project's number down.

Reading a cell

Each cell covers one week and shows a small bar with a label.

The cell says It means
80% The role is 80% covered this week.
50 / 100 Partly covered: 50% staffed against a target of 100%.
200 / 200 Fully covered against a target of 200% — two people at 100% each.
needs 100% Nobody is booked. The whole target is open.
on leave The booked person is away this week.
40% draft A proposed booking that has not been confirmed.

The bar is drawn against a capacity line, and that line is the role's own target — so a role that needs 200% has its line at 200%, and a role fully staffed against it sits exactly on the line rather than looking overbooked. The bar keeps rising past the line to a quarter above it. Beyond that it shows a marker at the top rather than growing further, but the number is always the true one — a role booked at 200% says 200%. Nothing is rounded down to make the plan look healthier than it is.

When bookings and leave together push a week past full, the cell is ringed and washed in red. That is the signal to act.

Leave is subtracted, not ignored. Approved holidays appear as a hatched band hanging from the capacity line, sized to the days actually taken — three days off in a five-day week fills three fifths of it. A person who is away for the whole week reads on leave and counts as no coverage at all, so a project does not appear staffed by someone who is on a beach.

Open roles

A role with nobody on it is highlighted and reads Nobody assigned, followed by the week the vacancy opens — for example needed from W28. That week can be earlier than anything on screen, and deliberately so: a role that has been open since spring should say so, not appear to have opened this morning.

Its cells show the demand as needs 100% in an amber hatch. An open role has nothing to expand, so it has no arrow beside it.

To see only these, set the role filter to Open roles only.

Opening a cell

Select any cell and a panel opens on the right explaining where its number came from — the roles behind a project's average, the people behind a role's coverage, or everything else a person is booked on that week. It reads the plan and does not change it. An empty cell opens too, and says which fact it is stating.

See The cell drill-down.

Narrowing the grid

Two filters sit on the band above the grid, alongside the period controls, and they compose: Roles offers All roles or Open roles only, and Project narrows to one project. Setting both leaves the open roles on that project. Each choice adds a chip you can remove on its own.

Filtering to nothing shows a short No results line with a clear-filters link, rather than the teaching empty state — there is data, it is just hidden.

Drilling into a role

Select the arrow beside a role — or the role name itself — to reveal the people booked on it, one row each, with their own weekly bars. Select it again to collapse.

Roles start collapsed, and the grid does not remember which ones you opened: reloading the page returns to the collapsed view. Expanded rows join the keyboard order immediately, so the arrow keys move through them like any other row.

Working with the keyboard

The grid behaves as a spreadsheet does. Arrow keys move between cells and stop at the edges rather than wrapping round, Home and End jump to the ends of a row, and Ctrl+Home and Ctrl+End jump to the first and last cell of the whole grid.

Screen readers announce the grid as a grid: each cell reports its row and column position and the size of the grid it sits in, and a role row says whether it is expanded or collapsed as you move onto it — so you can tell where you are without seeing the screen. Expanding a role changes the announced row count straight away.

The legend

Beneath the grid, a legend names the four things a cell can show: Staffed, Open role — demand with nobody in it, Assigned person is on leave, and Internal / non-billable.

Three things to know about the numbers

  • A role with no open slots falls back to one full-time slot. Its target is 100%, so a role that genuinely needs only a day a week will read as under-covered until you tell it otherwise. Set the role's demand to the fraction of a person the work really needs, and the target follows.
  • Assigning someone does not reduce a role's target. The open slots are the statement of what the work needs, not a countdown of what is left to fill — so they stay put as people are added, and the grid works out the shortfall for you. Change what a role needs in its demand dialog, not by staffing it.
  • In the 90 days view, each column is a fortnight and shows the average of its two weeks. If either of those weeks was over capacity, the column still flags it — averaging never hides a conflict.

If the grid says the figures are incomplete

Very large plans can exceed what the page loads in one go. When that happens a notice appears above the grid warning that only part of the roster is shown. Narrow the period or the filter and the figures become complete again.

Example use cases

  • Scan a quarter for red cells to find every over-committed role before the plan is agreed.
  • Filter to open roles to see exactly which jobs are unfilled and from which week.
  • Expand a role reading 130% to see which two bookings collide and decide which one moves.
  • Check a project reading 40% and discover the shortfall is an unfilled role rather than an idle team.
  • Confirm that an approved holiday has already been accounted for before promising a delivery date.

Connection map

Derived fromPart ofRefers toFulfilsUses upPlanned vs actual
Documented hereDocumented elsewhere
job-size sizes capacity. project needs role. role drawn from position. role declares demand. booking fills role. booking books person. absence reduces capacity. booking consumes capacity. bench derived from capacity. booking planned vs actual time-entry.sizesneedsdrawn fromdeclaresfillsbooksreducesconsumesderived fromplanned vs actualJJob Size — The employment capacity an agreement commits to, in hours and minutes per week. The FTE percentage is calculated from it rather than entered: someone whose hours per week equal their job size is full-time.Job SizeCCapacity — A person's contracted week, less absence. Bookings are measured against their own contracted week, so 20 hours fills 83% of a 0.6 FTE and not 50%.CapacityPProject — The core organizational unit for a business initiative, client engagement or internal work. Everything tracked — time, cost, invoicing, profitability — hangs off one.ProjectRRole — One job to be done on a project. It may be open, partly filled, filled or over-filled, and it exists whether or not anyone is booked on it.RolePPosition — The catalogue of job titles a project role is drawn from.PositionDDemand — What a role needs, stated apart from who is doing it. Stored as one slot per full-time person, so 2.5 people is three slots. A role with none declared is treated as one full-time person.DemandBBooking — One person committed to one role for a stretch of weeks, at a percentage of their time. A booking is a plan, not a record of work done.BookingPPerson — An employee. The central record the rest of the workforce data hangs off — profile, documents, leave, benefits, rates.PersonAAbsence — Approved time off. It removes hours from a person's week before any booking is counted against it.AbsenceTThe bench — Everyone with room left in the period on screen, most free first. Derived from capacity on every period change; never a list anyone maintains.The benchTTime entry — What actually happened — work time logged against a project.Time entry