Skip to content

Optimization Hopefield Home, the home-textiles brand I co-founded

Packed 6,000 loose towels into 1,000 sets with zero left over

Towels arrive as loose pieces but sell as fixed sets. My Excel Solver model packed a 6,000-piece order into 1,000 sets with zero left over, where packing the obvious way strands 42.

5 min read

Result
All 6,000 pieces packed into 1,000 sellable sets (730 combos, 270 single-type sets) with zero left over and every colour at or above its combo floor. Packing the floors first and splitting the rest strands 42 pieces.
Impact
Every towel becomes a sellable set, six of seven colours get all four listings, and the plan re-solves in seconds for each new order instead of an evening of arithmetic.
My role
Framed the packing decision, built the integer program in Excel Solver, and turned it into a reusable model for each purchase order · Solo
Context
Hopefield Home, the home-textiles brand I co-founded
Timeframe
2026
Tools
Excel SolverInteger ProgrammingLinear ProgrammingInventory PlanningPython
Links
Code and data available on request
0
pieces stranded of 6,000 (42 with the rule of thumb)
1,000
sellable sets: 730 combos and 270 single-type sets
6 of 7
colours with all four listings (the seventh is all combos by design)
The rule of thumb strands 42 pieces; the LP strands none
Pieces left stranded per colour: rule of thumb versus the LP plan Bars show pieces stranded if each colour's minimum combo sets are packed first and the rest is split into single-type sets: Zero Twist Sage Green 0, White 6, Oatmeal Beige 6, Charcoal 6, Half Zero Sage Green 10, Navy Blue 8, Terra Cotta 6, total 42. Dots show the LP plan, which strands 0 in every colour. 0 4 8 12 Zero Twist · Sage Green 0 Zero Twist · Sage Green: 0 stranded under the LP plan Zero Twist · White Zero Twist · White: 6 pieces stranded by packing the floor first 6 Zero Twist · White: 0 stranded under the LP plan Zero Twist · Oatmeal Beige Zero Twist · Oatmeal Beige: 6 pieces stranded by packing the floor first 6 Zero Twist · Oatmeal Beige: 0 stranded under the LP plan Zero Twist · Charcoal Zero Twist · Charcoal: 6 pieces stranded by packing the floor first 6 Zero Twist · Charcoal: 0 stranded under the LP plan Half Zero · Sage Green Half Zero · Sage Green: 10 pieces stranded by packing the floor first 10 Half Zero · Sage Green: 0 stranded under the LP plan Half Zero · Navy Blue Half Zero · Navy Blue: 8 pieces stranded by packing the floor first 8 Half Zero · Navy Blue: 0 stranded under the LP plan Half Zero · Terra Cotta Half Zero · Terra Cotta: 6 pieces stranded by packing the floor first 6 Half Zero · Terra Cotta: 0 stranded under the LP plan ● LP plan: 0 ▬ floor first: 42
Bars: pieces left over if each colour’s minimum combo sets are packed first and the rest is split into single-type sets. Dots: the LP plan. Computed from the order quantities and floors in the model workbook.

A 6,000-piece order had to become sets without stranding any

Hopefield is a home-textiles brand I co-founded and run on Amazon FBA and Shopify. Our order arrives as loose towels: bath towels, hand towels and washcloths in seven colours across two fabric lines. Customers buy sets. Every packing choice draws on shared piece pools, so a bad mix leaves, say, two hand towels in a colour with no bath towels to pair them with. Those pieces are cash tied up in stock nobody can buy.

The decision was how many of each set to pack in each colour. Success meant two things: no piece left over, and enough of the main listing, the Set of 6 combo, in every colour.

The order came in equal pieces, but the sets need different multiples

The order was 1,000 combo-set equivalents: 2 bath, 2 hand and 2 washcloths per set, so 6,000 pieces. Each colour had equal counts of the three towel types, from 100 of each (White, Terra Cotta) to 500 of each (Navy Blue). We sell four set types:

Set Bath Hand Washcloth
Set of 6 combo 2 2 2
Set of 6 hand towels 0 6 0
Set of 4 bath towels 4 0 0
Set of 12 washcloths 0 0 12

The difficulty is in the multiples. After the combos, the remaining bath towels must divide by 4, the hand towels by 6 and the washcloths by 12. Because all three pools shrink together, the remainder must be a multiple of 12, and the number of combos decides whether it is.

How I built the model

Leftover pieces became the objective, and combo floors became constraints

I wrote the decision as an optimisation problem: 28 decision variables (7 colours × 4 set types), each the number of sets to pack. The objective is to minimise the total pieces left over. Two constraints keep it honest: leftovers can never go negative, so the plan never uses towels we don’t have, and each colour must pack at least a minimum number of combo sets, the floor I set for our main listing. I rejected doing it in a spreadsheet by trial and error, because a spreadsheet can check a plan but can’t search for the best one.

Whole sets need integer variables

A plain linear program can return 26.4 sets, and rounding afterwards can reopen leftovers or use pieces that don’t exist. I set every decision variable to integer and solved with Excel’s Simplex LP engine, so every answer is a plan someone can pack.

One input per colour makes it reusable for the next order

My first version hard-coded the piece counts. The final version takes one number per colour, the order quantity, and calculates the pieces from it. Changing the order and pressing Solve produces a new plan in seconds.

Zero of 6,000 pieces stranded; packing the obvious way strands 42

The solver returned this plan, with zero pieces left over in every colour:

Line · colour Pieces of each type Combo floor Combos Hand 6 Bath 4 Wash 12
Zero Twist · Sage Green 400 200 200 0 0 0
Zero Twist · White 100 25 26 8 12 4
Zero Twist · Oatmeal Beige 250 100 101 8 12 4
Zero Twist · Charcoal 250 100 101 8 12 4
Half Zero · Sage Green 400 100 104 32 48 16
Half Zero · Navy Blue 500 170 172 26 39 13
Half Zero · Terra Cotta 100 25 26 8 12 4
Total 6,000 pieces 720 730 90 135 45

The obvious way to plan by hand is to pack each colour’s floor, then split what’s left into single-type sets. That leaves remainders that don’t divide: White, for example, keeps 50 of each type, which strands 2 hand towels, 2 bath towels and 2 washcloths. Across the seven colours that approach strands 42 pieces. The model adds just 1 to 4 combos above the floor in each colour, 10 in total, so every remainder becomes a multiple of 12 and every piece lands in a set.

To check it, I re-solved the same problem as an integer program in Python (SciPy’s HiGHS solver). It confirmed zero leftover and found exactly this plan as the zero-waste option with the most single-type sets.

Recommendation: re-solve for every order, and add a tiebreak

Run the model for each purchase order before packing. Then add a second objective. Zero leftover has many solutions: packing all 1,000 as combos also wastes nothing but drops the single-type listings. The plan the solver returned happens to keep the most single-type sets, which is what we wanted, but the model should state that preference instead of relying on it.

Limitations and what I’d do next

  • Demand isn’t in the model. It wastes nothing, but it doesn’t know which sets sell fastest. Weighting sets by sales velocity would turn waste minimisation into profit maximisation.
  • The objective has many optimal answers. As above, a stated tiebreak should choose between zero-waste plans.
  • The floors are judgement calls. They come from my read of the main listing, not from a demand forecast.
  • Plan versus actual isn’t measured yet. The next check is whether each set sold through as expected, which would also tell me whether the floors were right.
Technical appendix

Formulation (as built in the workbook)

  • Decision variables. xc,s = sets of type s packed in colour c; 7 × 4 = 28, integer.
  • Leftovers. For each colour and towel type: pieces − 2 × combos − set size × single-type sets.
  • Objective. Minimise the sum of the 21 leftover cells.
  • Constraints. All variables integer; combos ≥ the colour’s floor and single-type sets ≥ 0; every leftover ≥ 0.
  • Inputs. Order quantity per colour; pieces of each type = 2 × order quantity.

Solver settings. Excel Solver, Simplex LP engine, minimise, integer constraint on all decision variables, integer optimality tolerance 1%. The model solves in seconds.

Floor-first remainders (pieces of each type left after packing exactly the floor):

Colour Remainder Stranded (hand mod 6 + bath mod 4 + wash mod 12)
ZT Sage Green 0 0
ZT White 50 2 + 2 + 2 = 6
ZT Oatmeal Beige 50 6
ZT Charcoal 50 6
HZ Sage Green 200 2 + 0 + 8 = 10
HZ Navy Blue 160 4 + 0 + 4 = 8
HZ Terra Cotta 50 6