Inventory adjustment log: reason codes and audit trail
Set up an inventory adjustment log with reason codes, approvals, and a clear audit trail to explain every stock change and speed up audits.

Why stock changes need to be explained clearly
An inventory adjustment is a manual change to what your system says you have on hand. Youâre not receiving stock or shipping it out. Youâre correcting the number because reality and the record donât match.
That sounds simple, but itâs one of the quickest ways to lose trust in your data. If the only note is âstock changed,â nobody can tell whether the change was routine, a mistake, or something that needs investigation. During an audit, âwe fixed itâ isnât proof. Managers and auditors want to see what happened, who did it, when it happened, and why it was allowed.
Most adjustments come from the same real situations: items get damaged or expire, something goes missing, a recount changes the result, a supplier ships short, or a picking or packing error is found after the fact.
Clear reason codes help you separate âexpected lossâ (like damage) from âunacceptable lossâ (like theft) and from âprocess noiseâ (like recount corrections). That makes patterns easier to spot, root causes easier to fix, and your numbers easier to defend.
A âpermanent historyâ means you donât overwrite the past. Each change is saved as its own record, with the before and after quantities and the details behind the decision. If someone later edits a reason or note, that edit should be recorded too. This matters because inventory affects financial results. If you canât show the trail, you canât prove the count.
Many teams start with a spreadsheet. As volume grows, moving the log into a simple internal app with permissions and an audit trail helps keep the history consistent and harder to bypass.
Reason codes and audit trail: simple definitions
An inventory adjustment log only works if it answers one question every time: why did stock change? Two tools make that possible: reason codes and an audit trail.
Reason codes (and why they beat free text)
A reason code is a short, standard label selected from a list, such as Damage, Theft, Recount correction, Expired, or Supplier short-ship. It forces consistency so reports can group changes without guessing what someone meant.
Free-text notes still matter, but theyâre not a substitute. Notes explain what happened and what you checked. The reason code classifies the event. If you rely on notes alone, you get ten versions of the same idea (âbroken,â âdamaged,â âcracked,â âfellâ), and your data stops being comparable.
Audit trail (not just an activity log)
An activity log might say âQuantity changed from 12 to 9.â An audit trail explains how that happened and whether it followed your rules.
A good audit trail captures who made the change and when, what changed (item, location, quantity before and after), and why it changed (reason code plus a note).
For audits, you also want supporting evidence. That can be a photo of damaged packaging, a count sheet, return paperwork, a disposal record, a supplier invoice reference, or a ticket or incident number. The point isnât to collect paperwork for its own sake. Itâs to make the adjustment defensible months later.
Approvals strengthen traceability. If a manager approves, the trail should show who approved, when, and what they approved (including any edits). If you build the workflow in AppMaster, you can require reason code selection and keep a permanent history so edits donât overwrite the original record.
Roles and responsibilities for adjustments
An adjustment should never be âjust a number change.â If people donât know who can change stock, when they can do it, and who checks it later, your adjustment log becomes a quiet place to hide mistakes.
Start by defining who can create adjustments. In many warehouses, itâs the team that finds the issue first: receiving (short shipments), returns (damaged returns), or floor staff during cycle counts. Separately, define who can approve, who can post, and who reviews trends.
Approvals are where you draw the line between âroutineâ and âsensitive.â A small damage write-off might be auto-approved, while anything high value, repeated, or unusual should require a second person. Use clear thresholds (by value, quantity, SKU type, or reason code) so the rule is the same every time.
Trend review is a different job than approval. Finance may look for valuation impact, operations for process problems, and loss prevention for theft patterns. Reviews should happen on a schedule (weekly or monthly), not only when something goes wrong.
To reduce misuse, separate duties so one person canât create, approve, and close the loop. Keep it simple: creators and approvers should be different people, approvers shouldnât edit the original details (only approve or reject), and âadmin overrideâ access should be limited and logged.
If you later automate roles and approvals in AppMaster, you can build permission rules and simple approval flows without code while keeping a permanent history of who did what and when.
What fields your adjustment log should include
An inventory adjustment log is only useful if someone else can read it later and understand what happened, who did it, and why it was allowed. Think of it as a receipt for every stock change.
Start with a consistent header: date and time, location (warehouse, store, bin zone), the user who created it, and the source (cycle count, customer return, damage report, system sync, and so on).
Then capture line-level details for each item. Audits often fail because teams store only the net change, not the full before-and-after picture.
At the line level, capture the SKU (and lot/serial/expiry if you use them), quantity before, quantity change (+ or -), quantity after, and the unit of measure (each, case, kg) so conversions donât silently corrupt the data. Add the reason code plus a short note. If evidence lives elsewhere, store an attachment reference (photo ID, ticket number, count sheet number) so the trail stays connected.
Approvals matter as much as the numbers. Track approval status, approver name or role, and timestamps for created, submitted, approved, and posted. If you allow edits, record who edited and when, and keep the prior values.
Finally, every adjustment needs a unique adjustment ID that never changes. It should be searchable and appear on related documents (count sheets, return paperwork). In an internal tool, generate the ID automatically and lock posted adjustments so the history stays clean.
Designing reason codes that people will actually use
Reason codes only work if people can pick the right one in a few seconds. If the list is long, unclear, or full of âother,â your adjustment log turns into guesswork and audits get messy.
Start small. A short set of codes beats a perfect taxonomy nobody uses. Add new codes only when you see the same explanation showing up repeatedly in notes.
A practical starter set usually covers the main buckets: damage (including expired), theft or loss, recount or cycle count correction, supplier issues (short shipped or wrong item), and returns.
Keep codes mutually exclusive when you can. For example, âRecount correctionâ shouldnât be used for a broken item found during the recount. That should still be âDamage.â The recount is how you discovered it, not why it happened.
Make each code carry the details youâll need later. âDamageâ alone is vague. Require a couple of fields that match the code, such as damage type (crushed, leaking, expired) and where it happened (receiving dock, pick/pack, transit). For âSupplier issue,â capture the PO number and whether it was short, wrong, or defective.
Adoption improves when codes use plain language, overlaps are removed, âOtherâ is limited (and always requires a note), and usage is reviewed monthly so dead codes are retired.
Finally, decide which codes require approval. Theft, large write-offs, and any adjustment above a threshold usually need manager sign-off. Small recount corrections may not.
Step-by-step: how to record an adjustment the right way
An adjustment shouldnât start with âjust fix the number.â It starts with noticing a mismatch, then verifying what happened, and only then changing stock.
A simple workflow that holds up in an audit
First, record the discrepancy and its context: where it showed up (warehouse, bin, SKU, document) and who found it.
Next, verify before changing anything. Do a quick recount, check nearby bins for mis-slots, review receiving and shipping paperwork, and confirm units of measure (case vs each is a common trap). If the discrepancy is tied to an order, record the order number.
Then enter the adjustment consistently: select the correct item and location (and lot/serial if used), enter the quantity change with the correct sign, choose one reason code, and add a short note that explains what you checked and what you found. Add an evidence reference (photo ID, count sheet number, RMA, incident report) and submit for approval if policy requires it.
After posting, make sure the system preserves the original value, new value, timestamp, and user. If you use approvals, store the approver and approval time too.
Donât skip the follow-up
Set a daily or weekly review of adjustment summaries. Look for patterns: repeated damage in one area, frequent recount corrections on one SKU, or too many âunknownâ reasons. If you build the workflow in AppMaster, you can make reason codes required, enforce approvals above a threshold, and provide a simple review screen for supervisors without adding extra busywork.
How to keep a permanent change history
A permanent history means you can answer three questions months later without guessing: what changed, who did it, and why. The easiest way to get there is to treat adjustments like accounting entries. You record events. You donât rewrite the past.
Make posted entries immutable
Once an adjustment is posted, keep the original values and store every change as a new record. Avoid editing the quantity on an old line item, even if it feels quicker. Overwrites erase context and make audits painful.
Each posted entry should include the before and after quantity (not just the difference), who created it and who approved it (if required), timestamps for both actions, the reason code and note, and a unique adjustment ID.
Donât allow deleting posted adjustments. If someone made a mistake, use a reversal: create a new adjustment that cancels the wrong one, then add another adjustment with the correct numbers. This keeps the trail intact and shows that the correction was intentional.
When corrections happen often (for example, a recount reveals the first count was wrong), link the follow-up adjustment to the original using a simple ârelated adjustment IDâ field.
Set retention and access rules
Decide how long you keep adjustment history and supporting notes. Many teams keep it for years because audits can look back far.
Limit who can post, approve, or reverse adjustments, and log every permission change. If you automate the process in AppMaster or any internal tool, make âappend-onlyâ a rule in the workflow, not just a habit.
Common mistakes that break auditability
Most inventory problems donât come from one big error. They happen when small shortcuts pile up, and then nobody can explain what changed, when, and why.
One common issue is too many reason codes. When the list is long or confusing, people stop thinking and pick whatever is closest. The data looks organized, but itâs effectively random, and trend reporting becomes unreliable.
Another trap is free-text-only notes. Notes help, but if every adjustment is just a sentence, you canât group, filter, or compare causes over time. You end up reading hundreds of entries by hand.
High-impact changes need extra control. If anyone can write off 500 units without a second set of eyes, you might have an audit trail, but it doesnât prove the change was valid.
A few workflow patterns cause repeated audit pain: batch edits that update many items at once without line-level reasons and quantities, missing details like location or lot/serial when they matter, and âcleaning upâ by editing old records instead of creating a new correcting entry.
That last one is critical. An audit trail is about history, not perfection. If someone enters -12 instead of -2, the fix should be a new adjustment that reverses the error, with its own reason code (for example, âdata entry correctionâ) and a short note.
A quick way to test your log is to sample 10 adjustments and ask: could a new person explain each one without asking questions? If not, tighten required fields, reduce and clarify reason codes, and add approvals for the changes that carry real risk.
Example scenario: missing items after a recount
A cycle count in aisle B flags a problem: SKU âWIDGET-250â should have 200 units, but the counter finds 188. Thatâs 12 units missing, and your adjustment log needs to explain why stock changed, not just that it changed.
First, the counter checks the basics: confirm the bin label matches the SKU, scan nearby overflow locations, and verify no open picks are sitting in a tote. A second person recounts. The recount still lands on 188, so itâs not a simple miscount.
Now choose the reason code based on evidence. If camera footage or a broken seal suggests loss, âtheftâ may fit. If the shipping area shows a completed order that was packed but never deducted, it points to a pick/transaction error. If you discover the book quantity was wrong due to a prior counting mistake, use ârecount correction.â The rule is simple: pick the reason you can support.
A strong entry makes the decision easy to follow later. It includes the SKU and location (and lot/serial if used), before quantity (200) and after quantity (188), the reason code and a short note referencing evidence (recount sheet ID, ticket number), who requested and who approved it, timestamps, and any attachment references if your system supports them.
An auditor can then confirm who counted, who approved, when it happened, what changed (minus 12), and why you chose that reason.
Quick checklist for a clean adjustment process
A clean adjustment process is less about perfect counts and more about consistent records. If someone opens your log six months later, they should understand what changed, who did it, and why it was acceptable.
Before posting an adjustment, confirm the basics: pick a reason code, add a short note that explains what happened, record quantity before and after (so the math is visible), ensure the system captures user and timestamp automatically, and attach or reference proof when it helps (photo, RMA, recount sheet ID, ticket number). If the reason code requires approval, get it before posting.
Set âapproval requiredâ triggers so staff donât have to guess. Common triggers include theft or suspected theft, write-offs above a threshold, large recount differences, adjustments that would create negative stock, and backdated changes to prior periods.
Protect the history. Once an adjustment is posted, it shouldnât be deleted. If it was wrong, reverse it with a new entry that references the original and uses a clear reversal or correction reason code.
Next steps: standardize and then automate
Standardize what you already do. Pull the last 30 to 90 days of adjustments and list every âreasonâ people typed or selected. Youâll see repeats (and vague entries like âmiscâ or âfixâ). Group them into a short set that explains why stock changed without debate.
Keep the list small enough to memorize. Many teams land on 8 to 15 codes with plain names that match real life (damage, theft, supplier short-ship, recount correction, expired, customer return, production scrap). Keep âOtherâ only if it always requires a short note.
Then lock down who can do what. The adjustment log isnât just a record. Itâs a control. Define who can create versus approve and post, set thresholds for approvals, decide what proof is needed for high-risk reasons, and keep ownership clear for each location or bin.
Once the basics are stable, add a simple review routine. A weekly 15-minute check often catches patterns early: repeat adjustments on the same SKU, the same shift, or the same reason code.
When youâre ready to move beyond spreadsheets, AppMaster can be a practical way to build an internal adjustment log with a PostgreSQL-backed data model, required fields, approval workflows, and an append-only history that records who changed what and when.
FAQ
An inventory adjustment is a manual correction to the on-hand quantity when the system record doesnât match reality. Itâs not a receipt, transfer, or shipment; itâs an explicit âwe are changing the book quantity because we verified itâs wrong.â
Use a reason code to classify why stock changed so you can report and audit consistently. A note explains the specific situation you found, what you checked, and any references like a count sheet or incident number.
Start with a small set that covers your real situations and is easy to choose in a few seconds. Most teams do well with codes for damage/expired, theft or loss, recount or cycle count correction, supplier short-ship or wrong item, and returns, then add only when you see repeated notes that donât fit.
âOtherâ is fine as a safety valve, but it should always require a clear note so it doesnât become a dumping ground. If âOtherâ shows up often, thatâs a signal to create one or two new codes that match whatâs really happening.
An activity log might only show that a quantity changed. An audit trail also captures who made the change, when it happened, what exactly changed (including before and after), why it changed (reason code and note), and how it was approved if approvals are required.
Record enough to make the adjustment defensible later, not just believable today. Common proof is a count sheet ID, return paperwork reference, disposal record, supplier document reference, or a photo identifier for damage, so someone can trace the decision months later.
Require approvals for high-risk or unusual changes, like high-value write-offs, theft/loss reasons, big quantity swings, negative stock outcomes, or backdated adjustments. The key is to make the trigger predictable so staff donât have to guess when manager sign-off is needed.
Separate duties so one person canât create, approve, and quietly âfixâ issues alone. A practical setup is that warehouse staff create adjustments, a manager approves, and a different role (often ops or finance) reviews trends on a schedule.
Donât edit or delete posted adjustments; create a new entry that reverses the wrong one, then post the correct adjustment with a clear correction reason and note. This keeps the history intact and makes it obvious what happened and how it was fixed.
A spreadsheet works at low volume, but itâs easy to bypass and hard to keep consistent permissions and history. In an internal app built with AppMaster, you can require reason codes, enforce approvals, store before-and-after quantities, and keep an append-only change history so edits donât overwrite the original record.


