Group Average Cost Calculation
Understanding exactly how NetSuite calculates Group Average Cost is essential for accurate inventory valuation and financial reporting.
The Formula
Group Average Cost Formula
═══════════════════════════════════════════════════════════════════════════════
Total Inventory Value (All Locations)
Group Average Cost = ─────────────────────────────────────────
Total Quantity on Hand (All Locations)
Expanded:
Σ (Location₁ Value + Location₂ Value + ... + Locationₙ Value)
GAC = ─────────────────────────────────────────────────────────────────────
Σ (Location₁ Qty + Location₂ Qty + ... + Locationₙ Qty)
Step-by-Step Calculation
Initial State
Starting Point - No Inventory
═══════════════════════════════════════════════════════════════════════════════
Item: WIDGET-A
Locations: Main Warehouse, East DC, West DC
All locations: 0 qty, $0 value
Group Average Cost: N/A (no inventory)
Receipt 1: Main Warehouse
Transaction: Purchase Receipt #1
═══════════════════════════════════════════════════════════════════════════════
Receipt at Main Warehouse: 100 units @ $10.00
CALCULATION:
─────────────────────────────────────────────────────────────────────────────
Location Qty × Cost = Value
──────────────────────────────────────────────────────
Main Warehouse 100 $10.00 $1,000.00
East DC 0 - $0.00
West DC 0 - $0.00
──────────────────────────────────────────────────────
TOTAL 100 $1,000.00
Group Average Cost = $1,000.00 / 100 = $10.00
─────────────────────────────────────────────────────────────────────────────
RESULT:
┌─────────────────────────────────────────┐
│ Group Average Cost = $10.00 │
│ All locations use this cost │
└─────────────────────────────────────────┘
Receipt 2: East DC (Different Price)
Transaction: Purchase Receipt #2
═══════════════════════════════════════════════════════════════════════════════
Receipt at East DC: 50 units @ $14.00
BEFORE:
Total Qty: 100 units
Total Value: $1,000.00
Group Avg: $10.00
NEW RECEIPT:
50 units × $14.00 = $700.00
CALCULATION:
─────────────────────────────────────────────────────────────────────────────
Location Qty × Cost = Value
──────────────────────────────────────────────────────
Main Warehouse 100 $10.00 $1,000.00
East DC 50 $14.00 $700.00 ← NEW
West DC 0 - $0.00
──────────────────────────────────────────────────────
TOTAL 150 $1,700.00
Group Average Cost = $1,700.00 / 150 = $11.3333...
─────────────────────────────────────────────────────────────────────────────
RESULT:
┌─────────────────────────────────────────┐
│ Group Average Cost = $11.33 │
│ (Rounded to 2 decimal places) │
└─────────────────────────────────────────┘
IMPORTANT: Main Warehouse inventory is now ALSO valued at $11.33
Even though it was purchased at $10.00!
Receipt 3: West DC (Another Price)
Transaction: Purchase Receipt #3
═══════════════════════════════════════════════════════════════════════════════
Receipt at West DC: 75 units @ $12.00
BEFORE:
Total Qty: 150 units
Total Value: $1,700.00 (revalued)
Group Avg: $11.33
NEW RECEIPT:
75 units × $12.00 = $900.00
CALCULATION:
─────────────────────────────────────────────────────────────────────────────
Location Qty Value (Current)
──────────────────────────────────────────────────────
Main Warehouse 100 $1,133.00 (100 × $11.33)
East DC 50 $566.50 (50 × $11.33)
West DC 75 $900.00 (75 × $12.00) ← NEW at receipt cost
──────────────────────────────────────────────────────
TOTAL 225 $2,599.50
Group Average Cost = $2,599.50 / 225 = $11.5533...
─────────────────────────────────────────────────────────────────────────────
RESULT:
┌─────────────────────────────────────────┐
│ Group Average Cost = $11.55 │
└─────────────────────────────────────────┘
When Recalculation Occurs
Triggers for Recalculation
| Transaction Type | Triggers Recalc? | Details |
|---|---|---|
| Purchase Receipt | Yes | New inventory at purchase price |
| Item Receipt | Yes | Receiving against PO |
| Vendor Bill (3-way) | Yes | If price differs from receipt |
| Inventory Adjustment (+) | Depends | Only if cost specified |
| Inventory Adjustment (-) | No | Uses current average |
| Assembly Build | Yes | Components consumed, assembly received |
| Work Order Completion | Yes | WIP transferred to finished goods |
| Transfer Order | No | No cost change (same company) |
| Sale/Fulfillment | No | Uses current average |
| Return (Customer) | No | Returns at current average |
| Return (Vendor) | No | Removes at current average |
Recalculation Timing
Cost Engine Processing
═══════════════════════════════════════════════════════════════════════════════
Transaction Posted
│
▼
┌─────────────────────┐
│ Queue for Costing │
│ Engine Processing │
└─────────┬───────────┘
│
▼
┌──────────────┐
│ Cost Engine │ ◄─── Runs hourly (configurable)
│ Process │
└──────┬───────┘
│
├──► Recalculate affected items
│
├──► Update inventory values
│
├──► Generate GL adjustments
│
└──► Mark transaction as costed
Note: Group Average recalculation happens during Cost Engine runs,
not immediately upon transaction save.
Calculation Examples
Example 1: Multiple Receipts, One Sale
Complete Transaction Sequence
═══════════════════════════════════════════════════════════════════════════════
STEP 1: Receipt at Location A - 100 @ $10
────────────────────────────────────────────
Before: 0 qty, $0 value
Receipt: 100 × $10 = $1,000
After: 100 qty, $1,000 value
Group Avg = $1,000 / 100 = $10.00
STEP 2: Receipt at Location B - 60 @ $15
────────────────────────────────────────────
Before: 100 qty, $1,000 value, Avg $10.00
Receipt: 60 × $15 = $900
After: 160 qty, $1,900 value
Group Avg = $1,900 / 160 = $11.875 → $11.88
STEP 3: Sale from Location A - 40 units
────────────────────────────────────────────
Before: 160 qty, $1,900.80 value (160 × $11.88)
Sale: 40 × $11.88 = $475.20 (COGS)
After: 120 qty, $1,425.60 value
Group Avg = $11.88 (unchanged - sales don't recalc)
STEP 4: Receipt at Location A - 80 @ $13
────────────────────────────────────────────
Before: 120 qty, $1,425.60 value, Avg $11.88
Receipt: 80 × $13 = $1,040
After: 200 qty, $2,465.60 value
Group Avg = $2,465.60 / 200 = $12.328 → $12.33
═══════════════════════════════════════════════════════════════════════════════
FINAL STATE:
Location A: 140 units @ $12.33 = $1,726.20
Location B: 60 units @ $12.33 = $ 739.80
TOTAL: 200 units = $2,466.00
Example 2: Assembly Build Impact
Assembly Build with Group Average
═══════════════════════════════════════════════════════════════════════════════
Assembly Item: FINISHED-PRODUCT
Components Required:
- 2 × COMPONENT-A (Group Avg: $5.00)
- 3 × COMPONENT-B (Group Avg: $8.00)
- 1 × COMPONENT-C (Group Avg: $12.00)
BUILD: 10 assemblies
COMPONENT CONSUMPTION:
────────────────────────────────────────────
Component-A: 20 units × $5.00 = $100.00
Component-B: 30 units × $8.00 = $240.00
Component-C: 10 units × $12.00 = $120.00
─────────────────────────────────────────
Total Component Cost: $460.00
ASSEMBLY RECEIVED:
────────────────────────────────────────────
10 × FINISHED-PRODUCT received
Cost per Assembly = $460.00 / 10 = $46.00
If FINISHED-PRODUCT already had inventory:
────────────────────────────────────────────
Before: 25 units @ $44.00 = $1,100.00
Build: 10 units @ $46.00 = $ 460.00
After: 35 units = $1,560.00
New Group Avg = $1,560 / 35 = $44.57
Precision and Rounding
NetSuite Rounding Rules
Rounding Behavior
═══════════════════════════════════════════════════════════════════════════════
Standard Rounding: 2 decimal places for currency
Example Calculation:
Total Value: $1,700.00
Total Qty: 150
Exact: $1,700 / 150 = $11.333333...
Rounded: $11.33
Rounding Variance:
150 × $11.33 = $1,699.50
Actual value: $1,700.00
Variance: $0.50 (absorbed in rounding)
This small variance is normal and typically immaterial.
Extended Precision Settings
Some NetSuite accounts allow extended precision:
| Setting | Decimal Places | Use Case |
|---|---|---|
| Standard | 2 | Most businesses |
| Extended | 4-6 | High-volume, low-margin items |
| Quantity | 0-6 | Depends on unit of measure |
Edge Cases
Zero Quantity Scenarios
What Happens When Quantity Reaches Zero?
═══════════════════════════════════════════════════════════════════════════════
Scenario: Sell all inventory
Before: 100 units @ $10.00 = $1,000
Sale: 100 units @ $10.00 = $1,000 (COGS)
After: 0 units
RESULT:
- Quantity: 0
- Value: $0
- Average Cost: RETAINED at $10.00
WHY?
NetSuite keeps the last average cost for:
- Future receipts (as reference)
- Returns processing
- Reporting consistency
Next Receipt:
- New receipt of 50 @ $12.00
- Fresh calculation: 50 × $12 = $600
- New Average: $12.00 (last $10.00 is replaced)
Negative Inventory
Negative Inventory Handling
═══════════════════════════════════════════════════════════════════════════════
If Allow Negative Inventory is enabled:
Before: 10 units @ $10.00 = $100
Sale: 15 units @ $10.00 = $150 (COGS)
After: -5 units @ $10.00 = -$50
Average Cost: Still $10.00 (unchanged)
When Receipt Arrives:
Before: -5 units @ $10.00 = -$50
Receipt: 20 @ $12.00 = $240
Net Qty: -5 + 20 = 15 units
Net Value: -$50 + $240 = $190
New Average: $190 / 15 = $12.67
⚠️ WARNING: Negative inventory can cause costing anomalies
Avoid if possible for accurate costing
Backdated Transactions
Backdated Transaction Impact
═══════════════════════════════════════════════════════════════════════════════
Current Date: Jan 15
Current Average: $12.00
Backdated Receipt Entered: Jan 5, 100 @ $8.00
WHAT HAPPENS:
─────────────────────────────────────────────────────────────────────────────
1. Cost Engine identifies backdated transaction
2. Recalculates average as of Jan 5
(inserting the receipt in chronological order)
3. Rolls forward all subsequent transactions:
- Jan 6 sale: COGS recalculated with new average
- Jan 7 receipt: Average recalculated
- Jan 10 sale: COGS recalculated
- ... continues to present
4. GL adjustments generated for any differences
5. Current average may change from $12.00
⚠️ IMPACT: Backdated transactions can cause cascading recalculations
and GL adjustments across many transactions!
Formula Reference Card
Quick Reference - Group Average Formulas
═══════════════════════════════════════════════════════════════════════════════
BASIC AVERAGE:
─────────────────────────────────────────────────────────────────────────────
GAC = Total Value / Total Quantity
AFTER RECEIPT:
─────────────────────────────────────────────────────────────────────────────
New GAC = (Old Value + Receipt Value) / (Old Qty + Receipt Qty)
Where:
Old Value = Old Qty × Old GAC
Receipt Value = Receipt Qty × Receipt Unit Cost
AFTER SALE:
─────────────────────────────────────────────────────────────────────────────
GAC = Unchanged (sales don't affect average)
COGS = Sale Qty × Current GAC
New Value = Old Value - COGS
New Qty = Old Qty - Sale Qty
AFTER ADJUSTMENT (Qty Only):
─────────────────────────────────────────────────────────────────────────────
GAC = Unchanged
Increase: New Value = Old Value + (Adj Qty × Current GAC)
Decrease: New Value = Old Value - (Adj Qty × Current GAC)
AFTER ADJUSTMENT (With Cost):
─────────────────────────────────────────────────────────────────────────────
New GAC = (Old Value + Adj Value) / (Old Qty + Adj Qty)
Where Adj Value = Adj Qty × Specified Cost
Next Steps
- Multi-Location Scenarios - Complex transfer scenarios
- GL Impact - Journal entries and accounting
- Migration Guide - Switching costing methods