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)
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 |