Delivery & Goods-In Log
Log every delivery as it arrives, compare what turned up against what was promised and ordered, and measure on-time, in-full and on-time-in-full by supplier with the discrepancies still open. Runs entirely in your browser. Nothing is uploaded.
Version 1.0.0 · Updated Aug 5, 2026
Overview
How to use Delivery & Goods-In Log
The complete in-tool guidance, reproduced here so you can read it before you download.
What this tool does
CM8-79 is a goods-in book that does arithmetic. You record each delivery as it arrives — what was expected, what turned up, when it was promised and what condition it was in — and the tool works out whether the supplier did what it said it would do. It produces on-time, in-full and on-time-in-full rates by supplier, a list of the discrepancies still open with their age, and a report you can put in front of a supplier at a review.
Everything runs inside this one file. There is no account, no upload and no network request of any kind, so your order references, prices and supplier names stay on the computer you are using.
Booking a delivery in
One line per item. If a vehicle brings four different products, that is four records sharing a delivery note reference, because a delivery can be late on one line and complete on another, and an average across the vehicle would hide both.
Two fields carry most of the weight and both are easy to fudge:
- Promised delivery date — the date the supplier committed to, taken from the order acknowledgement, not the date you would have liked and not a date you invented afterwards. If nobody ever committed to a date, leave it blank; the delivery is then counted as logged but not measurable for timing, which is honest, and the monthly chart shows those separately.
- Quantity received — what you counted, not what the delivery note claims. If you sign for the note figure without counting, this tool measures the supplier's paperwork rather than the supplier.
Both quantities on a line must be in the same unit. The tool cannot tell that 5,000 in one box means kilograms and 40 in the other means sheets, so it will happily subtract one from the other and report a nonsense variance. Put the unit in the unit field and keep it consistent for the item.
On time, and the day tolerance
Timing is measured in whole days against the promised date. Early is on time; there is no penalty for arriving before the promise, though an unwanted early delivery is worth a note.
Days early or late = date received − promised delivery date On time = days late ≤ on-time tolerance (days)
The tolerance is a setting, and it defaults to zero: the promised date is the promise. Setting it to one or two days is common where you take deliveries in windows rather than on dates, but it flatters the supplier, so quote it whenever you quote the rate. A supplier at 92 % on time with a two-day tolerance may be at 61 % on the day itself.
On-time rate = deliveries on time ÷ deliveries with a promised date × 100
The denominator is only the deliveries that carry a promised date. Deliveries without one are excluded rather than counted as failures, because you cannot fail a promise nobody made — but a rate built on half your records is a weak rate, so the tile prints the count it used.
In full, and the quantity tolerance
Quantity variance = quantity received − quantity expected Shortfall allowed = quantity expected × in-full tolerance ÷ 100 In full = quantity received ≥ quantity expected − shortfall allowed
The percentage tolerance exists for goods that cannot be delivered exactly: material cut to length, produce sold by weight, liquids in bulk. It defaults to 2 %. Do not use it to forgive missing cases of a counted item — if you order 240 rolls you should get 240 rolls, and a tolerance that quietly accepts 235 is a tolerance that stops you noticing.
Over-delivery counts as in full, because nothing is missing, but it is still an event: it ties up your money and your space and somebody has to decide whether to keep it. Beyond the tolerance the tool insists you raise a discrepancy for it.
In-full rate = deliveries in full ÷ deliveries with both quantities × 100
Why on-time-in-full is harsher
On-time-in-full — usually written OTIF — is the test that a delivery passed everything at once:
On time and in full = on time AND in full AND condition is “good”
This is the number people get wrong, so it is worth being blunt about. OTIF is not the average of its parts, and it is not one of them. A supplier can score 80 % on time and 80 % in full and still come out at 40 % on the combined test, because the failures land on different deliveries.
The sample log demonstrates it deliberately. Bramley Packaging has five deliveries: one arrived three days late, a different one arrived short, and a third arrived on time and complete but water-damaged. That is one failure in five on each test — 80 %, 80 % and 80 % — but only two of the five deliveries passed all three at once, so OTIF is 40 %. If those three faults had all landed on one delivery, the same three faults would have produced an OTIF of 80 %.
The rule of thumb. OTIF can never be higher than the lowest of its parts, and it is usually lower. If somebody quotes you an OTIF figure that is close to their on-time figure, ask which deliveries failed — either their faults cluster, or they are not really measuring all three.
Because it needs all three tests, OTIF also has the smallest denominator: a delivery with no promised date, or with a quantity missing, is not measurable and is left out. The tile shows how many deliveries went into the figure. If that count is much smaller than your delivery count, fix the record-keeping before you argue about the percentage.
Condition, quarantine and temperature
Condition is recorded once, at the gate, from five choices: good, damaged, partially damaged, wrong item and short dated. Only good passes the combined test — a delivery that arrives on the right day, in the right quantity and unusable is not a delivery that worked.
The wrong-item case is the one that catches people out. Twenty-four lengths of the wrong size still count as twenty-four, so the in-full test passes: the tool compares quantities, and it has no way of knowing whether the right thing arrived. That is exactly why condition is part of the combined test and why the in-full rate alone should never be read as “the order was right”.
The quarantine tick records that goods were taken in but not released to use. Use it whenever a decision is still outstanding, so that a stock figure elsewhere is never quietly counting goods you have not accepted.
The temperature fields record a reading and nothing more. The tool does not convert between scales, does not know what limit applies to your goods and does not judge whether the reading was acceptable — that is your procedure's job. Record the number in the scale your procedure uses and keep it consistent.
Discrepancies and their age
A discrepancy is anything you had to go back to the supplier about: short, over, damaged, wrong, short dated. Raising one is a tick and a description; closing one is a tick and a date.
Age of an open discrepancy = today − date received
The open-discrepancy table sorts by age, oldest first, and prints the line value beside each one. That value is the value of the whole line, not the value of the loss — the tool has no way of knowing whether you will get a full credit, a partial credit or nothing. Read it as a sense of what is exposed, not as a claim.
Write the description as though somebody else will have to chase it, because somebody else usually does. “Short” is useless three weeks later. “24 rolls short against the delivery note, note signed short at the gate, photographed, e-mailed to the account manager the same morning” is a case.
Ranking suppliers fairly
Percentages calculated from a handful of deliveries are noise. A supplier with two perfect deliveries scores 100 % and would sit at the top of every chart above a supplier who has delivered two hundred times at 96 %, which is nonsense — and it is the single most common way a supplier league table gets discredited in the room.
So the tool enforces a minimum. Set minimum deliveries before a supplier is ranked on the Settings tab; it defaults to four, which is still low. Suppliers below it appear in the performance table with their raw counts, their percentages replaced by an em dash and the reason printed alongside, and they are left out of the ranking chart entirely. Raise the minimum as your log grows — at a hundred deliveries a month, ten is more defensible than four.
The totals row of the performance table covers every supplier including the unranked ones, because it is a statement about your goods-in as a whole rather than a ranking.
What the tool refuses to accept
A few combinations are blocked at entry, because they are the ones that quietly destroy the figures:
- A shortfall or an over-delivery beyond tolerance with no discrepancy raised — if it was not worth raising, the quantities are wrong.
- A condition other than “good” with no discrepancy raised.
- A discrepancy with no description, closed with no date, or a date with the tick missing.
- A resolution date before the goods arrived, or any date in the future.
- A temperature reading with the check unticked, or a check with no reading.
None of these are opinions about how you should run goods-in. They are the cases where the tool would otherwise print a confident number built on a contradiction.
What it cannot tell you
It cannot tell whether the promised date was realistic, or whether it was moved by agreement after the order — if you re-promise a date, the supplier's on-time figure improves and this log will not know. Decide as a matter of policy whether you measure against the original promise or the latest one, and apply it the same way to every supplier.
It cannot tell whether a quantity was counted or copied from the delivery note, whether goods were checked by someone competent to check them, or whether a fault was caused by the supplier, the carrier or your own handling after unloading. It has no idea what anything is worth beyond the line value you typed.
And it measures what you logged. A goods-in log that only gets written up when something goes wrong will show a terrible OTIF for the good suppliers who are never recorded and an excellent one for nobody.
Printing and sharing
Print Report builds a report from whatever the current filter shows: the headline figures, the four charts, the open discrepancies, the supplier performance table, the full register and your closing notes. Print to PDF to send it.
The scope line under the title states the filter in force. Before you send anything to a supplier, filter the register to that supplier and check the date range — and state both tolerances, because a rate without its tolerances cannot be checked by the person receiving it.
Saving your work
Deliveries, settings and the report header are written to this browser's local storage as you type, and the toolbar shows the time of the last save. That storage belongs to one browser on one computer: another browser, a private window, a second machine or a clean-up tool that clears site data will not have it.
Treat Export .json as the real save — one file containing everything, which Import .json restores anywhere. Export CSV gives you the register for spreadsheet work, including every filtered record and every derived column, not only the rows drawn on screen. Reset asks twice, then erases everything this tool has stored. There is no undo.
Accuracy & disclaimer
This tool calculates from what you enter and nothing else. The rates it produces move with the tolerances you set and with the completeness of your records, and it cannot check either.
Goods-received records, retention periods, food and temperature-control duties, and what constitutes valid rejection of goods differ by country, by industry and by contract. This is an internal record-keeping and calculation aid — not legal advice, not a formal notice of rejection, and not a substitute for the terms of your own supply agreements.