Acumatica · Customization

Acumatica Inventory Adjustment Screen — A Deep Dive

Acumatica Inventory Adjustment Screen — A Deep Dive is the screen the user actually lives in. Every other piece of Acumatica — the workflows, the reports, the integrations —.

John Kihiu12 min read

Inventory Adjustments (IN301000) is the screen that reconciles what the system thinks is on the shelf with what's actually there, and it's one of the few transaction screens where the customization requests are less about workflow and more about cost accuracy. The graph is INAdjustmentEntry; the header/detail pair is INRegister/INTran, the same pair used by receipts, issues, and transfers — INRegister.DocType is what distinguishes an adjustment from every other inventory movement.

What an adjustment actually does

An adjustment can increase quantity (a positive adjustment, effectively a receipt without a PO), decrease quantity (a negative adjustment, consuming existing cost layers), or move cost without moving quantity (a cost adjustment). Which of these applies is determined by the sign and fields entered on the line, not by a separate document type selector — this is the detail that trips up new users expecting three distinct screens.

Key tabs

Extending INAdjustmentEntry

The most common customization is requiring a reason code or approval before a negative adjustment above a value threshold posts — Acumatica ships reason codes as a feature, but enforcing that one is mandatory above a dollar amount, or routing it through an approval map, is custom logic on the graph extension.

C# · GRAPH EXTENSION
public class INAdjustmentEntry_Extension : PXGraphExtension<INAdjustmentEntry>
{
    protected virtual void INTran_RowPersisting(PXCache cache, PXRowPersistingEventArgs e)
    {
        var line = (INTran)e.Row;
        if (line == null || line.InvtMult != -1) return; // only negative (outbound) lines

        decimal extCost = (line.UnitCost ?? 0m) * (line.Qty ?? 0m);
        if (extCost >= 5000m && string.IsNullOrEmpty(line.ReasonCode))
            throw new PXSetPropertyException("Reason code is required for write-offs over $5,000.");
    }
}

Custom fields and tabs via the Customization Project Editor

Adding a field to the Details grid (an internal "adjustment category" separate from reason code, for example) is a straightforward DAC extension on INTran. Because INTran is shared across every inventory document type, scope any custom field's visibility to the Adjustment screen specifically, or it will unexpectedly show up on Receipts and Issues too.

Common validation and event-handler use cases

Beyond reason-code enforcement: defaulting a subaccount segment from the item's product category rather than the posting class default, blocking adjustments to items under active cycle count, and triggering a notification (via a business event or a direct call from the graph extension) when a single adjustment exceeds a value threshold, so finance sees large write-offs before month end rather than during it.

Gotchas

The cost method assigned to an item (FIFO, Average, Specific) determines what a negative adjustment actually consumes, and that method is effectively locked once transactions exist against the item — a customization that assumes Average-cost behavior will misbehave silently on a FIFO item with multiple open cost layers. Adjustments don't require a linked Sales or Purchase document, which means the audit trail for "why was this adjusted" lives entirely in the reason code and description fields — if a customization needs a stronger audit trail, that has to be added explicitly, it isn't implicit in the document type. And negative adjustments on lot/serial-tracked items require selecting which specific lot/serial is being removed; a customization that bulk-imports adjustments without lot/serial detail will fail validation on any tracked item.

Cost adjustments are not quantity adjustments

A pure cost adjustment (revaluing existing stock without changing quantity) uses different fields on the same INTran row than a quantity adjustment. Customizations that generate adjustment lines programmatically need to set the right combination deliberately — mixing the two on one line produces a document that looks valid but posts incorrectly.

Wrapping up

Inventory Adjustments looks like the simplest inventory screen and is, in practice, the one most sensitive to the item's underlying cost method. Customizations that add friction (reason codes, thresholds, notifications) are welcome and safe; customizations that assume a uniform costing behavior across all items are the ones that come back as a support ticket during the next physical count.

John Kihiu
Acumatica ERP Developer · Laravel Engineer

Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.