$75M skincare brand: DTC + Sephora + Amazon + 3PL on NetSuite OneWorld.
Anonymized engagement summary. Identifying details have been generalized. Pending written approval before naming the client.
The shape
- Industry: Skincare / clean beauty
- Revenue: $75M
- Channels at start: Shopify DTC, Amazon Vendor Central, one 3PL (ShipBob)
- Channels at end: Same plus Sephora retail (newly launched)
- Stack at start: QuickBooks Online + Cin7 + spreadsheet apparatus for retailer compliance and lot tracking
- Stack at end: NetSuite OneWorld with SuiteCommerce DTC, SPS Commerce for Sephora EDI, Celigo for Amazon Vendor Central, ShipBob integration
Why they moved
The triggering event was a Sephora launch on the calendar. Three months out, ops realized the existing stack would not survive retailer compliance — chargebacks already ran 1.8% on Amazon and would have run higher with Sephora’s tighter ASN timing.
Scope
OneWorld with 2 subsidiaries (US parent + Canadian sub). SuiteCommerce for DTC. SPS Commerce for Sephora EDI. Celigo for Amazon VC. Custom integration to ShipBob. Advanced Inventory with lot tracking and FEFO picking. Recall workflow design. Pricing waterfall (MSRP, Sephora cost, Amazon cost, distributor cost) modeled in NetSuite.
5-month implementation. Discovery 3 weeks, Design 4 weeks, Build 9 weeks, Test/UAT 3 weeks, Cutover + Hypercare.
Approach
Discovery was unusually channel-heavy. Week 1 was channel-by-channel order flow walkthroughs. Week 2 was the SKU rationalization audit and pricing waterfall design. Week 3 was integration architecture and lot/recall design.
The biggest design decision was where the pricing waterfall lived. Initial inclination was to keep it in spreadsheets and feed prices to NetSuite per channel. We pushed back — that’s the architecture they were already running and it was breaking. The waterfall got modeled in NetSuite as price levels on the item record with channel-specific rules. Margin reporting per SKU per channel actually ties out now.
SKU rationalization happened pre-cutover, not post. 1,200 SKUs at audit, 720 at cutover. Cut variants that were channel-specific repeats, cut SKUs with 12-month no-ship history, and consolidated pack-size variants where retailers accepted alternates.
Outcomes
| Metric | Before | After (month 6) |
|---|---|---|
| Inventory sync lag | 3 days | Real-time |
| Retailer chargebacks | 1.8% | 0.14% |
| SKU count | 1,200 | 720 |
| Sephora launch | At risk | Live, on time |
What worked
- Sephora launch as forcing function. Hard external deadline kept scope honest. No “let’s add this too” expansions during Build.
- SKU rationalization pre-cutover. Saved months of post-go-live cleanup. The line we drew (12-month no-ship, channel-specific variants) was defensible to merchandising.
- Pricing waterfall in NetSuite, not in spreadsheets. Took 2 weeks longer in Design but eliminated a recurring monthly reconciliation that would have outlived us by years.
What we’d do differently
- Recall workflow tabletop earlier. We designed the recall workflow during Build. Operations did not exercise it until UAT. A tabletop in Design would have surfaced 2–3 small workflow gaps earlier.