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
- Extracts order reference (if present) — looks for a Purchase Order Number or Order Number in the W19 loop's extended reference information
- Looks up the original order (if referenced) — finds the Sales Order or Transfer Order to use for item matching and location resolution
- Processes each W19 loop (adjustment detail):
- For each
warehouseAdjustmentItemDetailwithin 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
- For each
- 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
- Resolves the entity — finds the Customer record first (including parent customer), then falls back to the Vendor record, to read 947 configuration preferences
- Reads Inventory Adjustment Preferences from the entity's enabled transaction types (see Configuration below)
- 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
- 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)
- 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 Identifier | Qualifier | Matches To |
|---|---|---|
| Product Service ID | Vendor Number / Vendor Part Number | Item's Vendor Item Number in NetSuite |
| Product Service ID | UPC / EAN / EAN-UCC-8 | Item's UPC Code in NetSuite |
| Product Service ID | Purchase Order Line Ref | Line number on the original order |
| Product Service ID | SKU | Item'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
- Open the relevant Customer or Vendor record
- Go to the Orderful subtab > Enabled Transaction Types
- 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.
| Setting | Behavior |
|---|---|
| Off (default) | Only negative adjustments (reductions) are processed. Positive adjustments are rejected. |
| On | Both 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 Code | Meaning | GL Account |
|---|---|---|
DA | Damage | Inventory Damage Expense |
SH | Shrinkage | Inventory Shrinkage Expense |
RT | Return | Returns & Allowances |
CC | Cycle Count | Inventory 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:
- Per-line account override — if the adjustment line has a direct account assignment (from custom processing or integration logic), that account is used
- Reason code mapping — if the line's reason code matches an entry in the Reason Code Accounts configuration, use that account
- Default account — if no reason code mapping matches, use the Default Account
- 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 Element | Qualifier | Used For |
|---|---|---|
| Reference Identification | Purchase Order Number | Finds the original Sales Order or Transfer Order |
| Reference Identification | Order Number | Alternate order reference |
Adjustment Lines (W19 Loop)
Each inventory adjustment is represented as a W19 loop containing one or more warehouseAdjustmentItemDetail entries:
| 947 Element | Maps To | Notes |
|---|---|---|
| Product Service ID + Qualifier | Item matching | See matching table above |
| Credit/Debit Quantity | Adjustment quantity | Positive = increase, negative = decrease |
| Unit of Measure | UOM | |
| Inventory Transaction Type Code | Transaction type | Classification code for the adjustment type |
| Quantity or Status Adjustment Reason Code | Reason code | Used for GL account resolution |
| Warehouse Lot Number | Lot number | If the item is lot-tracked |
| Weight + Weight Qualifier + Weight Unit Code | Weight data | Optional weight information |
Inventory Adjustment Record
The connector creates a NetSuite Inventory Adjustment with:
| Field | Value | Notes |
|---|---|---|
| Subsidiary | From entity configuration | Falls back to primary subsidiary |
| Account | Resolved GL account | From reason code mapping or default |
| Memo | Orderful 947 Adjustment {ID} | Links to the Orderful transaction |
Each adjustment line becomes an inventory sublist line:
| Field | Value | Notes |
|---|---|---|
| Item | Matched item internal ID | From line item matching |
| Adjust Qty By | Adjustment quantity | Positive or negative |
| Location | From matched order line | If available |
| Units | Unit of measure | If provided in the 947 |
Validation Rules
| Rule | What Happens |
|---|---|
| Invalid quantity (not a number) | Line is rejected |
| Item not found on referenced order | Error logged — line is skipped |
| Negative adjustment exceeds ordered quantity | Error logged — line is flagged |
| No GL account resolved | Entire 947 is rejected |
| Lines resolve to different GL accounts | Entire 947 is rejected |
| Positive adjustment when not allowed | Entire 947 is rejected |
Troubleshooting
Inventory Adjustment Not Created
| Check | How to Fix |
|---|---|
| 947 not enabled | Enable 947 on the Customer or Vendor's Enabled Transaction Types |
| No default account configured | Set the Default Account in the 947 Inventory Adjustment Preferences |
| Positive adjustments blocked | If the 947 has positive quantities, enable Allow Positive Adjustments |
| Mixed reason codes → different accounts | Ask your 3PL to split adjustments by reason code into separate 947s |
Wrong GL Account Used
| Check | How to Fix |
|---|---|
| Reason code mapping missing | Add the reason code to the Reason Code Accounts configuration on the entity |
| Reason code not sent by 3PL | The 947 may be missing the reason code field — check the raw EDI. Without a reason code, the default account is used. |
| Default account is wrong | Update the Default Account in the Inventory Adjustment Preferences |
Items Not Matching
| Check | How to Fix |
|---|---|
| No order reference in 947 | Some 947s don't reference an order — item matching requires an order reference. Ask your 3PL to include the Purchase Order Number. |
| Identifiers don't match | Compare the product service IDs in the 947 with item records in NetSuite (UPC, vendor number, SKU) |
Error Messages
| Error | Meaning | Solution |
|---|---|---|
| "Could not resolve account for adjustment" | No reason code mapping matched and no default account is set | Configure 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 accounts | Have your 3PL split adjustments by reason code |
| "Positive adjustments are not allowed" | 947 contains positive quantities but Allow Positive Adjustments is off | Enable Allow Positive Adjustments if this is expected |
| "Invalid quantity" | The quantity value in the 947 is not a valid number | Coordinate with your 3PL to fix the data |
| "Negative adjustment exceeds ordered quantity" | The reduction is larger than the original order quantity | Verify the adjustment amount with your 3PL |
What's Next
- 940 Warehouse Shipping Order — For fulfillment-related 3PL communication
- Inventory Advice (846) — For proactive inventory reporting (outbound, not adjustment-based)
- 3PLs and 900-Series Overview — Back to the overview
Updated 20 days ago
