veren.
Fixes series · 09

When the business rule does not fit the software

“Someone requests a room for five days. We have space on three of them. The system makes us approve all five or reject all five, so we reject and ask them to book again.”
AuthorVictor Daj
Published17 June 2026
Reading time4 min read
Written forOperations lead running scheduling, booking or approval workflows

The rejection that was not a rejection

A request arrives on Monday: one room, five days, starting next week. You open the calendar. Tuesday, Wednesday and Thursday are free. Monday and Friday are held by a group that booked months ago. The request is one record with one decision attached, and that decision has two values, approve or reject. So you reject it, write a note listing the three free days, and ask the requester to book again. Most do. Some do not, and you never learn why.

Nothing in the system counts this as a failure. The request was processed within the target and the room will probably get used. The only trace that something went wrong is your note, and it lives in an email nobody will ever analyse.

Where the model and the decision came apart

Whoever designed the booking form was not wrong. A requester experiences a five day booking as one thing, so the form captured it as one thing and approval was attached to it. That is the natural first version of most workflows.

The mismatch is between two units that should be the same and are not. The decision unit is the resource on the day: whether this room is free on this Tuesday. The record unit is the whole request. Approval sits on the record, so you can only answer at that resolution, though the honest answer is per day.

Every workaround you have adopted compensates for that gap. A comment field on the rejection is the usual one, and it is the same workaround at lower resolution: the per day decision exists, but only as prose someone must read and retype. It never reaches a status, so it never reaches a report or a backlog.

Splitting the record without splitting the experience

The fix we agreed with a national youth platform, and are building now, changes the record granularity rather than the form. A five day request is stored as five records, one per day, each approvable on its own. The decision unit and the record unit are now the same.

On its own that would make matters worse. Five unrelated rows lose the requester intent, and a form that asks for five bookings instead of one moves the work onto them. So the split stays below the surface: the requester fills in one form and sees one booking in their list, as before. An indicator on each day record marks that it belongs to one multi day request, so the reviewer still sees one intent.

This is a data model change, not a feature request. Live systems accumulate workarounds because nobody wants to touch the model. Decide the granularity deliberately, once, with a plan for existing records, rather than patching around it.

Partial approval as a real outcome

Once each day carries its own decision, a request can end in three states rather than two: approved, rejected, or partly approved. The third needs a status of its own, because in the old model partial fulfilment was never a legitimate outcome, only a failure to fulfil.

It also needs its own notification, because a rejection notice tells the requester the opposite of what happened. Then what they do next is a choice rather than a chore: keep the three days, or ask about alternatives for the other two.

If you expect users to find partial approval confusing, weigh it against what they get now: a rejection they do not understand, followed by an instruction to try again.

What the reviewer sees

In the administration view being built, the days of one request sit together as separate records, each carrying an indicator that they belong to one multi day request. The reviewer opens the request, sees five days with availability against each, and approves three in one pass, rejecting the other two in the same action.

For the system owner, the change is where the decision is kept. Each day carries its own status, so a partly approved request becomes a state the system holds rather than a sentence a reviewer typed into an email. When the decisions sit in the records, the report can start to match what happened.

The same mismatch elsewhere

Booking is the example, but the pattern is general: a request modelled at the resolution the requester experiences, and a decision made at a finer one. A purchase request with eight lines where six should be granted. A week of leave where Thursday clashes. A shift rota where one person can cover half the slots. An order where two items are in stock and one is not.

The tell is the same every time: staff reject and ask for resubmission, or decide in email and type the answer back in. The checklist with this post lists those signs and the modelling decision behind each, so you can name what your team has been absorbing.

Source engagement: a national youth platform.

Comes with · Checklist

Workflow mismatch checklist: is your data model fighting your process?

Seven signs that your system is modelled at the wrong level for the decisions your staff make, each with the underlying cause, so you can tell a defect from a habit.

Interactive. Fill it in on the page, the result updates as you go, and your answers stay in your browser.

One hour on the workflow that costs you the most manual work.

Bring the process as it actually runs, workarounds included. No preparation needed and no obligation afterwards.

Also in this series
A practical first step

Find the right AI starting point.

Align the business case, governance and first implementation—without starting a large programme.

Short enquiry

How can we reach you?

Takes about two minutes.