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
| Requirement | Status | Notes |
|---|---|---|
| Perpetual Inventory enabled | Required | Group Average requires perpetual |
| Multi-Location Inventory | Required | Group Average is location-agnostic |
| Administrator access | Required | Preference changes need admin |
| No pending transactions | Recommended | Process or void open items |
| Period closed | Recommended | Switch at period boundary |
| Backup complete | Required | Full account backup before change |
| Test in Sandbox | Highly Recommended | Test 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
| Report | Action Needed |
|---|---|
| Inventory Valuation | Update to not segment by location cost |
| Margin Analysis | Review - margins will be consistent now |
| COGS Report | Verify accuracy with new method |
| Inventory Turnover | Recalculate using new average costs |
| Location Profitability | Review methodology - costs now uniform |
| Custom Searches | Check 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
| Phase | Best Practice |
|---|---|
| Planning | Test in sandbox first, always |
| Planning | Get stakeholder buy-in (finance, ops, audit) |
| Planning | Document current state thoroughly |
| Timing | Migrate at period-end or fiscal year-end |
| Timing | Choose low-activity window |
| Execution | Clear open transactions before migration |
| Execution | Have rollback plan ready |
| Validation | Verify total value unchanged |
| Validation | Test all transaction types |
| Post-Migration | Monitor Cost Engine queue |
| Post-Migration | Update affected reports and processes |
Need Help?
If you encounter issues during migration:
- Check Cost Engine Status - Transactions pending costing may cause temporary discrepancies
- Review System Notes - Look for error messages on affected records
- Contact NetSuite Support - For complex issues or backup restores
- Consult Your Accountant - For financial statement impact questions
Next Steps
- Overview & Setup - Review Group Average fundamentals
- Calculation Logic - Understand how costs are calculated
- GL Impact - Learn about journal entries