947 Warehouse Inventory Adjustment Advice

Receive inventory adjustments with configurable reason codes and GL account mapping

The 947 Warehouse Inventory Adjustment Advice is an inbound EDI transaction that records inventory adjustments from your 3PL. When your 3PL sends a 947 — for damage, shrinkage, cycle count corrections, returns, or other adjustments — the connector creates an Inventory Adjustment record in NetSuite with the correct GL account based on configurable reason code mappings.

The 947 is the most configurable of the 900-series transactions, with reason code-to-account mapping, positive/negative adjustment controls, and per-entity preferences.

When Does a 947 Arrive?

A 947 is sent by your 3PL whenever they need to report an inventory change that isn't tied to a shipment or receipt — for example:

  • Damage — items damaged in the warehouse
  • Shrinkage — inventory lost or unaccounted for
  • Cycle count corrections — discrepancies found during physical counts
  • Returns — items returned to the warehouse
  • Reclassification — items moved between inventory categories

Unlike the 944 and 945, a 947 may or may not reference an original order. Some adjustments are standalone (not tied to a specific Sales Order or Transfer Order).

Data Flow

3PL identifies inventory adjustment
  → 3PL sends 947 to Orderful
  → Orderful delivers 947 to NetSuite connector
  → Connector maps adjustment lines and resolves items
  → Connector resolves GL account from reason code configuration
  → Inventory Adjustment record created in NetSuite

What the Connector Does

The 947 is processed in two phases:

Phase 1: Map Adjustment Lines

  1. Extracts order reference (if present) — looks for a Purchase Order Number or Order Number in the W19 loop's extended reference information
  2. Looks up the original order (if referenced) — finds the Sales Order or Transfer Order to use for item matching and location resolution
  3. Processes each W19 loop (adjustment detail):
    • For each warehouseAdjustmentItemDetail within the W19:
      • Extracts the quantity (can be positive or negative)
      • Extracts the reason code and transaction type code
      • Extracts the lot number (if present)
      • Extracts weight information (if present)
      • Matches the item to an ordered line item using product identifiers
      • Resolves the location from the matched line item
  4. Validates adjustment lines:
    • Quantities must be valid numbers
    • Items must match a line on the referenced order (if an order is referenced)
    • For negative adjustments: the absolute quantity can't exceed the ordered quantity

Phase 2: Create Inventory Adjustment

  1. Resolves the entity — finds the Customer record first (including parent customer), then falls back to the Vendor record, to read 947 configuration preferences
  2. Reads Inventory Adjustment Preferences from the entity's enabled transaction types (see Configuration below)
  3. Resolves GL account for each line:
    • Checks if the line's reason code has a specific account mapping
    • Falls back to the default account
    • Fails if no account can be resolved
  4. Validates:
    • All lines must resolve to the same GL account (multi-account adjustments are not supported in a single 947)
    • Positive adjustments must be explicitly allowed (disabled by default)
  5. Creates the Inventory Adjustment record in NetSuite with:
    • The resolved GL account
    • A memo: Orderful 947 Adjustment {transaction ID}
    • One line per adjustment item with quantity, location, and units

Line Item Matching

The connector matches each item in the 947 to a line on the referenced order. The 947 supports one additional identifier compared to other 900-series transactions:

947 IdentifierQualifierMatches To
Product Service IDVendor Number / Vendor Part NumberItem's Vendor Item Number in NetSuite
Product Service IDUPC / EAN / EAN-UCC-8Item's UPC Code in NetSuite
Product Service IDPurchase Order Line RefLine number on the original order
Product Service IDSKUItem's SKU in NetSuite

Both the primary (productServiceID) and alternate (productServiceID1) identifiers are checked, so each adjustment line can carry two identifiers for matching.

Configuration

Enabling 947 Processing

  1. Open the relevant Customer or Vendor record
  2. Go to the Orderful subtab > Enabled Transaction Types
  3. Add a line for 947 - Warehouse Inventory Adjustment Advice

Inventory Adjustment Preferences

This is the key configuration for 947 processing. These preferences are set on the Customer or Vendor record's 947 enabled transaction type entry and control how adjustments are processed.

Default Account

Field: Default Account

The GL account to use for inventory adjustments when no reason code-specific account is configured. This is the fallback account.

  • Required unless every possible reason code has its own account mapping
  • Set this to your general inventory adjustment or shrinkage account

Allow Positive Adjustments

Field: Allow Positive Adjustments (boolean)

Controls whether the connector accepts 947s that increase inventory.

SettingBehavior
Off (default)Only negative adjustments (reductions) are processed. Positive adjustments are rejected.
OnBoth positive and negative adjustments are accepted.

Why is this off by default? Most 3PL inventory adjustments are reductions (damage, loss). Positive adjustments are less common and could indicate data issues. Enable this only if your 3PL legitimately sends positive adjustments (e.g., cycle count corrections that increase inventory).

Reason Code → Account Mapping

Field: Reason Code Accounts (JSON array)

Maps specific reason codes from the 947 to specific GL accounts in NetSuite. This lets you route different types of adjustments to different accounts for accurate financial reporting.

Format:

[
  { "reasonCode": "DA", "accountInternalId": 123 },
  { "reasonCode": "SH", "accountInternalId": 456 },
  { "reasonCode": "RT", "accountInternalId": 789 }
]

Example mappings:

Reason CodeMeaningGL Account
DADamageInventory Damage Expense
SHShrinkageInventory Shrinkage Expense
RTReturnReturns & Allowances
CCCycle CountInventory Adjustment

The actual reason codes depend on what your 3PL sends — coordinate with your 3PL to understand their reason code values.

Account Resolution Priority

When the connector processes each adjustment line, it resolves the GL account in this order:

  1. Per-line account override — if the adjustment line has a direct account assignment (from custom processing or integration logic), that account is used
  2. Reason code mapping — if the line's reason code matches an entry in the Reason Code Accounts configuration, use that account
  3. Default account — if no reason code mapping matches, use the Default Account
  4. Fail — if none of the above resolve an account, the adjustment is rejected

Important constraint: All adjustment lines in a single 947 must resolve to the same GL account. If different lines map to different accounts, the 947 is rejected. This is a NetSuite limitation — a single Inventory Adjustment record can only post to one account.

Tip: If your 3PL sends 947s with mixed reason codes that map to different accounts, ask them to split adjustments into separate 947 transactions grouped by reason code.

Message Structure (Inbound)

Order Reference (Optional)

The 947 may include order references in the W19 loop's extended reference information:

947 ElementQualifierUsed For
Reference IdentificationPurchase Order NumberFinds the original Sales Order or Transfer Order
Reference IdentificationOrder NumberAlternate order reference

Adjustment Lines (W19 Loop)

Each inventory adjustment is represented as a W19 loop containing one or more warehouseAdjustmentItemDetail entries:

947 ElementMaps ToNotes
Product Service ID + QualifierItem matchingSee matching table above
Credit/Debit QuantityAdjustment quantityPositive = increase, negative = decrease
Unit of MeasureUOM
Inventory Transaction Type CodeTransaction typeClassification code for the adjustment type
Quantity or Status Adjustment Reason CodeReason codeUsed for GL account resolution
Warehouse Lot NumberLot numberIf the item is lot-tracked
Weight + Weight Qualifier + Weight Unit CodeWeight dataOptional weight information

Inventory Adjustment Record

The connector creates a NetSuite Inventory Adjustment with:

FieldValueNotes
SubsidiaryFrom entity configurationFalls back to primary subsidiary
AccountResolved GL accountFrom reason code mapping or default
MemoOrderful 947 Adjustment {ID}Links to the Orderful transaction

Each adjustment line becomes an inventory sublist line:

FieldValueNotes
ItemMatched item internal IDFrom line item matching
Adjust Qty ByAdjustment quantityPositive or negative
LocationFrom matched order lineIf available
UnitsUnit of measureIf provided in the 947

Validation Rules

RuleWhat Happens
Invalid quantity (not a number)Line is rejected
Item not found on referenced orderError logged — line is skipped
Negative adjustment exceeds ordered quantityError logged — line is flagged
No GL account resolvedEntire 947 is rejected
Lines resolve to different GL accountsEntire 947 is rejected
Positive adjustment when not allowedEntire 947 is rejected

Troubleshooting

Inventory Adjustment Not Created

CheckHow to Fix
947 not enabledEnable 947 on the Customer or Vendor's Enabled Transaction Types
No default account configuredSet the Default Account in the 947 Inventory Adjustment Preferences
Positive adjustments blockedIf the 947 has positive quantities, enable Allow Positive Adjustments
Mixed reason codes → different accountsAsk your 3PL to split adjustments by reason code into separate 947s

Wrong GL Account Used

CheckHow to Fix
Reason code mapping missingAdd the reason code to the Reason Code Accounts configuration on the entity
Reason code not sent by 3PLThe 947 may be missing the reason code field — check the raw EDI. Without a reason code, the default account is used.
Default account is wrongUpdate the Default Account in the Inventory Adjustment Preferences

Items Not Matching

CheckHow to Fix
No order reference in 947Some 947s don't reference an order — item matching requires an order reference. Ask your 3PL to include the Purchase Order Number.
Identifiers don't matchCompare the product service IDs in the 947 with item records in NetSuite (UPC, vendor number, SKU)

Error Messages

ErrorMeaningSolution
"Could not resolve account for adjustment"No reason code mapping matched and no default account is setConfigure the Default Account or add a mapping for the reason code
"All adjustment lines must resolve to the same account"Different lines mapped to different GL accountsHave your 3PL split adjustments by reason code
"Positive adjustments are not allowed"947 contains positive quantities but Allow Positive Adjustments is offEnable Allow Positive Adjustments if this is expected
"Invalid quantity"The quantity value in the 947 is not a valid numberCoordinate with your 3PL to fix the data
"Negative adjustment exceeds ordered quantity"The reduction is larger than the original order quantityVerify the adjustment amount with your 3PL

What's Next