Skip to main content

Migration Guide

Changing your costing method is a significant decision that affects inventory valuation, financial statements, and operational processes. This guide covers everything you need to know about migrating to Group Average Costing.


Before You Begin

Migration Impact Assessment

Migration Impact Checklist
═══════════════════════════════════════════════════════════════════════════════

FINANCIAL IMPACT:
□ Inventory valuation will change
□ COGS for open/future periods will change
□ Balance sheet inventory accounts affected
□ May require restatement for comparability

OPERATIONAL IMPACT:
□ Historical transaction costs may be recalculated
□ Reports will show different margins
□ Cost Engine will reprocess transactions
□ Saved searches may need updates

SYSTEM IMPACT:
□ Backdated transactions will use new method
□ Open transactions may be affected
□ Integrations may need review
□ Custom scripts referencing cost may need updates

COMPLIANCE IMPACT:
□ May need auditor approval
□ Could affect tax reporting
□ Financial statement footnote disclosure
□ Internal policy updates needed

Prerequisites Checklist

RequirementStatusNotes
Perpetual Inventory enabledRequiredGroup Average requires perpetual
Multi-Location InventoryRequiredGroup Average is location-agnostic
Administrator accessRequiredPreference changes need admin
No pending transactionsRecommendedProcess or void open items
Period closedRecommendedSwitch at period boundary
Backup completeRequiredFull account backup before change
Test in SandboxHighly RecommendedTest migration path first

Migration Paths

From Location Average to Group Average

Location Average → Group Average Migration
═══════════════════════════════════════════════════════════════════════════════

BEFORE (Location Average):
────────────────────────────────────────────────────────────────────────────────
Item: WIDGET-A

Main Warehouse: 100 units @ $10.00 = $1,000.00
Regional DC: 50 units @ $14.00 = $700.00
West Warehouse: 75 units @ $12.00 = $900.00
────────────────────────────────────────────────────────
Total: 225 units = $2,600.00

Each location has its own average cost.

MIGRATION:
────────────────────────────────────────────────────────────────────────────────
Enable Group Average Costing in preferences
Cost Engine recalculates all item costs

AFTER (Group Average):
────────────────────────────────────────────────────────────────────────────────
Item: WIDGET-A

Main Warehouse: 100 units @ $11.56 = $1,155.56
Regional DC: 50 units @ $11.56 = $577.78
West Warehouse: 75 units @ $11.56 = $866.67
────────────────────────────────────────────────────────
Total: 225 units = $2,600.00

Group Average = $2,600 / 225 = $11.56

────────────────────────────────────────────────────────────────────────────────

KEY POINT: Total inventory VALUE stays the same
Individual location values change
All locations now use same unit cost

From FIFO to Group Average

FIFO → Group Average Migration
═══════════════════════════════════════════════════════════════════════════════

BEFORE (FIFO):
────────────────────────────────────────────────────────────────────────────────
Item: WIDGET-A

Layer 1: 100 units @ $9.00 = $900 (oldest - sells first)
Layer 2: 75 units @ $11.00 = $825
Layer 3: 50 units @ $13.00 = $650 (newest - sells last)
──────────────────────────────────────
Total: 225 units = $2,375

FIFO maintains separate cost layers.

MIGRATION:
────────────────────────────────────────────────────────────────────────────────
Enable Group Average Costing
All layers collapse into single average

AFTER (Group Average):
────────────────────────────────────────────────────────────────────────────────
Item: WIDGET-A

All Inventory: 225 units @ $10.56 = $2,375

Group Average = $2,375 / 225 = $10.56

────────────────────────────────────────────────────────────────────────────────

KEY POINT: Total inventory VALUE stays the same
Cost layers eliminated
All units now valued at same average
Future COGS will differ from FIFO method

From LIFO to Group Average

LIFO → Group Average Migration
═══════════════════════════════════════════════════════════════════════════════

BEFORE (LIFO):
────────────────────────────────────────────────────────────────────────────────
Item: WIDGET-A

Layer 1: 100 units @ $9.00 = $900 (oldest - sells last)
Layer 2: 75 units @ $11.00 = $825
Layer 3: 50 units @ $13.00 = $650 (newest - sells first)
──────────────────────────────────────
Total: 225 units = $2,375

MIGRATION:
────────────────────────────────────────────────────────────────────────────────
Enable Group Average Costing
LIFO layers collapse into average

AFTER (Group Average):
────────────────────────────────────────────────────────────────────────────────
Item: WIDGET-A

All Inventory: 225 units @ $10.56 = $2,375

────────────────────────────────────────────────────────────────────────────────

⚠️ WARNING: LIFO to Average is significant change
COGS pattern will change substantially
May have tax implications (consult advisor)

From Standard Cost to Group Average

Standard Cost → Group Average Migration
═══════════════════════════════════════════════════════════════════════════════

BEFORE (Standard Cost):
────────────────────────────────────────────────────────────────────────────────
Item: WIDGET-A

Standard Cost: $10.00 (set by user)
Quantity: 225 units
Inventory Value: 225 × $10.00 = $2,250.00

Purchase Variances accumulated in variance accounts:
PPV Account Balance: $125.00 (unfavorable)

True Cost: $2,250 + $125 = $2,375

MIGRATION:
────────────────────────────────────────────────────────────────────────────────
Change costing method to Average
Decision needed: How to handle variance account?

Option A: Leave variance in place
- Inventory stays at $2,250
- Variance remains separate
- New purchases use average method

Option B: Journal entry to absorb variance
- Debit Inventory: $125
- Credit PPV: $125
- New value: $2,375
- Average: $2,375 / 225 = $10.56

AFTER (Group Average):
────────────────────────────────────────────────────────────────────────────────
Depends on option chosen above.

Option A Result: 225 units @ $10.00 = $2,250
Option B Result: 225 units @ $10.56 = $2,375

Step-by-Step Migration Process

Phase 1: Preparation (1-2 Weeks Before)

Phase 1: Preparation Checklist
═══════════════════════════════════════════════════════════════════════════════

WEEK 1-2 BEFORE MIGRATION:

□ Document Current State
├─ Export current inventory valuation report
├─ Record current costing method per item
├─ Screenshot current preference settings
└─ Save current GL balances for inventory accounts

□ Clean Up Open Transactions
├─ Process all pending item receipts
├─ Bill all received items (clear IRNB)
├─ Process pending item fulfillments
├─ Complete or void open transfer orders
└─ Resolve inventory count variances

□ Complete Period-End
├─ Run month-end close procedures
├─ Reconcile inventory to GL
├─ Post any necessary adjustments
└─ Lock prior period

□ Test in Sandbox
├─ Refresh sandbox from production
├─ Perform migration in sandbox
├─ Verify inventory values
├─ Test transactions with new method
└─ Document any issues found

Phase 2: Migration Day

Phase 2: Migration Day Procedure
═══════════════════════════════════════════════════════════════════════════════

MIGRATION DAY (Preferably Weekend/Low Activity):

□ Pre-Migration (Morning)
├─ Verify no users entering transactions
├─ Complete full backup
├─ Export final pre-migration inventory report
└─ Note current Cost Engine queue status

□ Execute Migration

│ Step 1: Navigate to Preferences
│ ───────────────────────────────────────
│ Setup > Accounting > Accounting Preferences
│ Go to Items/Transactions subtab

│ Step 2: Change Costing Setting
│ ───────────────────────────────────────
│ ☑ Enable "Use Group Average Costing"
│ Click Save

│ Step 3: Confirm Change
│ ───────────────────────────────────────
│ System will warn about impact
│ Confirm you want to proceed


□ Post-Migration Verification
├─ Wait for Cost Engine to process
├─ Run inventory valuation report
├─ Compare to pre-migration report
├─ Verify total value matches (should be same)
└─ Check sample items for correct average

Phase 3: Validation

Phase 3: Validation Checklist
═══════════════════════════════════════════════════════════════════════════════

IMMEDIATELY AFTER MIGRATION:

□ Inventory Value Validation

│ Query to verify total value unchanged:

│ SELECT
│ SUM(il.quantityonhand * il.averagecost) AS total_value
│ FROM
│ inventoryitemlocations il
│ JOIN item i ON il.item = i.id
│ WHERE
│ i.itemtype = 'InvtPart'
│ AND il.quantityonhand > 0

│ Compare to pre-migration total - should match!


□ Sample Item Verification
├─ Check 10-20 high-value items
├─ Verify group average calculation is correct
├─ Confirm all locations show same average
└─ Test a purchase receipt - average should recalculate

□ Transaction Testing
├─ Create test purchase receipt
├─ Verify group average updates
├─ Create test sale
├─ Verify COGS uses group average
├─ Create test transfer
└─ Verify no cost change on transfer

□ Report Validation
├─ Run standard inventory reports
├─ Run margin analysis reports
├─ Verify GL inventory balance matches subledger
└─ Test custom reports for accuracy

Post-Migration Considerations

Impact on Historical Data

Historical Data Considerations
═══════════════════════════════════════════════════════════════════════════════

WHAT CHANGES:
────────────────────────────────────────────────────────────────────────────────
• Future transactions use new method
• Current inventory revalued at group average
• Open period transactions may be recosted

WHAT DOESN'T CHANGE:
────────────────────────────────────────────────────────────────────────────────
• Closed period transactions remain as posted
• Historical reports for closed periods unchanged
• Posted GL entries stay in place

BACKDATING CONSIDERATIONS:
────────────────────────────────────────────────────────────────────────────────
If you enter a transaction dated BEFORE the migration:

┌─────────────────────────────────────────────────────────────────────────┐
│ ⚠️ CAUTION: Backdated transactions will use the NEW costing method │
│ │
│ This could cause: │
│ • Unexpected cost recalculations │
│ • GL adjustments │
│ • Changes to COGS in prior periods │
│ │
│ RECOMMENDATION: Avoid backdating after migration │
│ Or understand the full impact before backdating │
└─────────────────────────────────────────────────────────────────────────┘

Reporting Adjustments

ReportAction Needed
Inventory ValuationUpdate to not segment by location cost
Margin AnalysisReview - margins will be consistent now
COGS ReportVerify accuracy with new method
Inventory TurnoverRecalculate using new average costs
Location ProfitabilityReview methodology - costs now uniform
Custom SearchesCheck formulas referencing item cost

Process Changes

Operational Process Updates
═══════════════════════════════════════════════════════════════════════════════

PURCHASING:
────────────────────────────────────────────────────────────────────────────────
Before: Different locations might have had different costs
After: All receipts blend into single group average

Action: Educate buyers that location doesn't affect cost anymore

INVENTORY MANAGEMENT:
────────────────────────────────────────────────────────────────────────────────
Before: Transfers between locations could affect costs
After: Transfers have no cost impact

Action: Simplify transfer procedures - no cost considerations

FINANCE:
────────────────────────────────────────────────────────────────────────────────
Before: May have analyzed costs by location
After: Single cost across all locations

Action: Update margin analysis methodology
Review location profitability metrics

SALES:
────────────────────────────────────────────────────────────────────────────────
Before: COGS could vary by fulfillment location
After: COGS is consistent regardless of ship location

Action: Update sales commission calculations if cost-based

Rollback Plan

If Migration Fails

Rollback Procedure
═══════════════════════════════════════════════════════════════════════════════

IF CRITICAL ISSUES DISCOVERED:

Step 1: Stop All Transactions
────────────────────────────────────────────────────────────────────────────────
• Notify users to stop entering data
• Lock transaction entry if possible

Step 2: Assess Issue
────────────────────────────────────────────────────────────────────────────────
• Is it a data issue or calculation issue?
• Can it be corrected without rollback?
• What's the business impact?

Step 3: Rollback Options
────────────────────────────────────────────────────────────────────────────────

Option A: Revert Preference Setting
─────────────────────────────────────
• Go back to original costing method
• Cost Engine will reprocess
• May not fully restore if transactions posted

Option B: Restore from Backup
─────────────────────────────────────
• Contact NetSuite Support for backup restore
• Loses all transactions since backup
• Nuclear option - use only if necessary

Option C: Manual Corrections
─────────────────────────────────────
• Post adjusting entries
• Correct specific items
• Document all corrections

Step 4: Post-Rollback Verification
────────────────────────────────────────────────────────────────────────────────
• Verify inventory values restored
• Test sample transactions
• Communicate status to stakeholders

SuiteQL: Migration Queries

Pre-Migration Analysis

-- Analyze current cost variation by location (before migration)
-- High variation = larger impact from migration
SELECT
i.itemid,
i.displayname,
COUNT(DISTINCT il.location) AS num_locations,
MIN(il.averagecost) AS min_cost,
MAX(il.averagecost) AS max_cost,
MAX(il.averagecost) - MIN(il.averagecost) AS cost_variation,
SUM(il.quantityonhand) AS total_qty,
SUM(il.quantityonhand * il.averagecost) AS total_value
FROM
item i
JOIN inventoryitemlocations il ON i.id = il.item
WHERE
i.itemtype = 'InvtPart'
AND il.quantityonhand > 0
GROUP BY
i.id, i.itemid, i.displayname
HAVING
COUNT(DISTINCT il.location) > 1
ORDER BY
cost_variation DESC

Post-Migration Verification

-- Verify all locations show same average cost (post-migration)
SELECT
i.itemid,
i.displayname,
COUNT(DISTINCT il.averagecost) AS distinct_costs,
CASE
WHEN COUNT(DISTINCT il.averagecost) = 1 THEN 'OK - Uniform'
ELSE 'ERROR - Multiple costs found'
END AS status
FROM
item i
JOIN inventoryitemlocations il ON i.id = il.item
WHERE
i.itemtype = 'InvtPart'
AND il.quantityonhand > 0
GROUP BY
i.id, i.itemid, i.displayname
HAVING
COUNT(DISTINCT il.averagecost) > 1

Compare Before/After Values

-- Template for comparing inventory values
-- Run BEFORE migration, save results
-- Run AFTER migration, compare totals

SELECT
'Pre-Migration' AS snapshot,
COUNT(DISTINCT i.id) AS item_count,
SUM(il.quantityonhand) AS total_qty,
SUM(il.quantityonhand * il.averagecost) AS total_value
FROM
item i
JOIN inventoryitemlocations il ON i.id = il.item
WHERE
i.itemtype = 'InvtPart'
AND il.quantityonhand > 0

-- After migration, run same query
-- total_value should match (total_qty will also match)

Best Practices Summary

PhaseBest Practice
PlanningTest in sandbox first, always
PlanningGet stakeholder buy-in (finance, ops, audit)
PlanningDocument current state thoroughly
TimingMigrate at period-end or fiscal year-end
TimingChoose low-activity window
ExecutionClear open transactions before migration
ExecutionHave rollback plan ready
ValidationVerify total value unchanged
ValidationTest all transaction types
Post-MigrationMonitor Cost Engine queue
Post-MigrationUpdate affected reports and processes

Need Help?

If you encounter issues during migration:

  1. Check Cost Engine Status - Transactions pending costing may cause temporary discrepancies
  2. Review System Notes - Look for error messages on affected records
  3. Contact NetSuite Support - For complex issues or backup restores
  4. Consult Your Accountant - For financial statement impact questions

Next Steps