Seasonal Demand Intelligence
Eliminating $1.4M in Seasonal Overstock While Capturing Peak-Season Revenue
Industry
HVAC & Plumbing
Scale
$170M
Duration
20 Weeks
Location
Portland, Oregon
Engagement
AI Consulting
Executive Summary
The Director of Supply Chain at a 6-branch HVAC and plumbing distributor in Portland was trapped in the same annual cycle: over-purchase heating equipment and hydronic products ahead of the October-March season based on last year's sales, carry excess through spring, then markdown or return what didn't sell — while simultaneously stocking out on cooling and ventilation products during the June-September residential surge. The ERP's demand planning ran on trailing 12-month averages with manual seasonal adjustments the purchasing team made once per quarter. It couldn't distinguish residential replacement demand (driven by weather and housing age) from commercial project demand (driven by permit pipelines and GC schedules), and it treated all 6 branches the same despite serving fundamentally different construction markets. We embedded ML-driven seasonal demand intelligence into the distributor's purchasing workflow on Epicor Eclipse.
Business Impact
$1.4M
Annual seasonal overstock cost eliminated
41%
Reduction in peak-season stockouts on high-velocity items
19%
Improvement in inventory turns
$680K
Working capital released from seasonal inventory reduction
The Situation
The distributor served residential and commercial HVAC contractors across Oregon and Southwest Washington — a market shaped by Pacific Northwest weather patterns that created sharper seasonal swings than national averages. Heating season started earlier and ran longer than in most U.S. markets. The cooling season was compressed but intense — Portland's summer heat events had become more extreme and less predictable over the prior 5 years, generating residential AC demand spikes that the trailing-average forecast consistently underestimated.
The purchasing team made quarterly seasonal adjustments to the Eclipse min/max thresholds based on the prior year's sales. By the time they adjusted for summer, spring overstock was already consuming warehouse space and working capital. By the time they adjusted for winter, they'd already stocked out on the cooling products contractors needed in September.
- Residential replacement demand and commercial project demand followed fundamentally different seasonal curves — residential spiked with weather events and was nearly impossible to predict from historical averages alone, while commercial demand tracked construction activity and was predictable from permit data months in advance. Eclipse treated them as one demand stream
- The 6 branches served different market mixes. The Portland metro branches were 65% residential, 35% commercial. The Salem branch was 80% residential. The branch serving the Portland suburbs and tech corridor (Hillsboro/Beaverton) was 55% commercial, driven by data center and office construction. One set of seasonal min/max thresholds couldn't serve all 6
- The purchasing team of 3 buyers managed approximately 22,000 active SKUs. Seasonal adjustments were applied by product category (heating, cooling, plumbing) across the entire catalog — not by SKU, not by branch, and not by demand type. A hydronic boiler and a residential furnace filter were in the same “heating” category with the same seasonal uplift, despite having completely different demand patterns
- The annual overstock/markdown cycle cost approximately $1.4M — split between carrying costs on excess seasonal inventory ($620K), markdowns on product that didn't sell during the season ($480K), and return freight on items sent back to manufacturers ($300K)
- Peak-season stockouts on high-velocity items — residential AC condensing units in July, high-efficiency furnaces in November — generated an estimated $2.1M in lost sales annually. Contractors who couldn't get equipment same-day or next-day called the next distributor
- The purchasing team knew the quarterly adjustment process was too slow and too coarse. The Director of Supply Chain described it: "We adjust for winter in October based on what happened last winter. But last winter isn't this winter — last year we had an early freeze in late September that drove furnace demand 3 weeks ahead of normal. The year before, it was a mild October and demand didn't pick up until mid-November. We're always calibrating for a season that already happened."
The distributor was using a rear-view mirror to navigate a road that changed every year — adjusting inventory quarterly for seasonal patterns that shifted monthly, applying one set of rules to 6 branches serving different markets, and treating residential weather-driven demand and commercial pipeline-driven demand as if they behaved the same way.
The Challenge
The Director walked through the summer of 2024 as the case in point. Portland hit 100°F in late June — earlier and hotter than the prior 3 years. Residential contractors flooded the counter with demand for condensing units, mini-splits, and refrigerant. The purchasing team had set summer cooling inventory based on 2023 patterns, when the first heat event didn't hit until mid-July. By July 1st, the 3 Portland metro branches were stocked out on 8 of the top 12 residential cooling SKUs. The team placed emergency orders with manufacturers at expedited freight costs. Two weeks later, inventory arrived — just as the heat wave broke and demand dropped 40% below forecast for the rest of July.
Meanwhile, the Salem branch — 80% residential — had received the same seasonal uplift as the Portland commercial branch on commercial HVAC equipment. It was carrying $180K in rooftop units that wouldn't sell until the next school district project, while stocked out on the residential mini-splits that its contractors were desperate for.
- The quarterly adjustment cycle was structurally too slow. Seasonal transitions in the Pacific Northwest happened over 2-3 weeks, not 2-3 months. By the time the purchasing team recognized a pattern shift and adjusted Eclipse min/max levels, 4-6 weeks of demand had already been served (or missed) with the wrong inventory
- Trailing 12-month averages couldn't predict weather-driven residential demand. The difference between a September heat wave and a mild September was $400-600K in cooling product demand across the 6 branches — a variance that historical averages smoothed away
- Commercial project demand was predictable but the purchasing team wasn't using the signals. Building permits filed in Multnomah and Washington counties were public data available 60-90 days before material demand. The purchasing team didn't track permits — they tracked what contractors had ordered last year
- The 3 buyers were each responsible for different product categories, not different branches. The heating buyer set seasonal thresholds for all 6 branches. The cooling buyer did the same. No one was optimizing the branch-level mix
The Solution
We spent 5 weeks in discovery analyzing 4 years of transaction data across all 6 branches, mapped against weather data, building permit filings, and construction activity in each branch's trade area.
The critical finding: residential demand and commercial demand not only followed different seasonal curves — they responded to different leading indicators. Residential replacement demand correlated strongly with weather events (heat waves, cold snaps) and housing age demographics in each branch's trade area. Commercial demand correlated with permit filings 60-90 days prior. The trailing-average forecast Eclipse was using blended both demand types into a single curve that was wrong for both.
The system analyzed signals including:
- 4 years of SKU-level transaction data segmented by customer type (residential contractor vs. commercial mechanical contractor) and branch, revealing two distinct seasonal demand curves that had been invisible when blended together
- Historical weather data and 10-day forecast integration — ML models correlating temperature patterns, heat/cold events, and precipitation with residential demand surges at each branch, enabling demand adjustment 7-10 days ahead of weather-driven spikes
- County-level building permit data for every jurisdiction in the distributor's trade area — commercial permits filed 60-90 days prior feeding forward-looking commercial demand models by product category and branch
- Supplier lead time variability by season — manufacturers of heating equipment shipped faster in summer (low demand at the factory) and slower in fall (peak production). The purchasing calendar needed to account for seasonal lead time shifts, not just seasonal demand shifts
- Branch-level demand profiles built from the actual customer mix at each location — the Salem branch's 80% residential profile required fundamentally different seasonal inventory than the Hillsboro branch's 55% commercial profile
Residential demand and commercial demand followed different seasonal curves driven by different leading indicators. The ERP blended them into one forecast that was wrong for both. Separating them was the single highest-impact change — and it required ML, not a spreadsheet adjustment.
The Challenge
The Director walked through the summer of 2024 as the case in point. Portland hit 100°F in late June — earlier and hotter than the prior 3 years. Residential contractors flooded the counter with demand for condensing units, mini-splits, and refrigerant. The purchasing team had set summer cooling inventory based on 2023 patterns, when the first heat event didn't hit until mid-July. By July 1st, the 3 Portland metro branches were stocked out on 8 of the top 12 residential cooling SKUs. The team placed emergency orders with manufacturers at expedited freight costs. Two weeks later, inventory arrived — just as the heat wave broke and demand dropped 40% below forecast for the rest of July.
Meanwhile, the Salem branch — 80% residential — had received the same seasonal uplift as the Portland commercial branch on commercial HVAC equipment. It was carrying $180K in rooftop units that wouldn't sell until the next school district project, while stocked out on the residential mini-splits that its contractors were desperate for.
- The quarterly adjustment cycle was structurally too slow. Seasonal transitions in the Pacific Northwest happened over 2-3 weeks, not 2-3 months. By the time the purchasing team recognized a pattern shift and adjusted Eclipse min/max levels, 4-6 weeks of demand had already been served (or missed) with the wrong inventory
- Trailing 12-month averages couldn't predict weather-driven residential demand. The difference between a September heat wave and a mild September was $400-600K in cooling product demand across the 6 branches — a variance that historical averages smoothed away
- Commercial project demand was predictable but the purchasing team wasn't using the signals. Building permits filed in Multnomah and Washington counties were public data available 60-90 days before material demand. The purchasing team didn't track permits — they tracked what contractors had ordered last year
- The 3 buyers were each responsible for different product categories, not different branches. The heating buyer set seasonal thresholds for all 6 branches. The cooling buyer did the same. No one was optimizing the branch-level mix
The Solution
We spent 5 weeks in discovery analyzing 4 years of transaction data across all 6 branches, mapped against weather data, building permit filings, and construction activity in each branch's trade area.
The critical finding: residential demand and commercial demand not only followed different seasonal curves — they responded to different leading indicators. Residential replacement demand correlated strongly with weather events (heat waves, cold snaps) and housing age demographics in each branch's trade area. Commercial demand correlated with permit filings 60-90 days prior. The trailing-average forecast Eclipse was using blended both demand types into a single curve that was wrong for both.
The system analyzed signals including:
- 4 years of SKU-level transaction data segmented by customer type (residential contractor vs. commercial mechanical contractor) and branch, revealing two distinct seasonal demand curves that had been invisible when blended together
- Historical weather data and 10-day forecast integration — ML models correlating temperature patterns, heat/cold events, and precipitation with residential demand surges at each branch, enabling demand adjustment 7-10 days ahead of weather-driven spikes
- County-level building permit data for every jurisdiction in the distributor's trade area — commercial permits filed 60-90 days prior feeding forward-looking commercial demand models by product category and branch
- Supplier lead time variability by season — manufacturers of heating equipment shipped faster in summer (low demand at the factory) and slower in fall (peak production). The purchasing calendar needed to account for seasonal lead time shifts, not just seasonal demand shifts
- Branch-level demand profiles built from the actual customer mix at each location — the Salem branch's 80% residential profile required fundamentally different seasonal inventory than the Hillsboro branch's 55% commercial profile
Residential demand and commercial demand followed different seasonal curves driven by different leading indicators. The ERP blended them into one forecast that was wrong for both. Separating them was the single highest-impact change — and it required ML, not a spreadsheet adjustment.
Implementation
Deployment occurred over a 01 – 05 period.
Dual-Signal Demand Models
Separate ML models for residential demand (weather-driven, 7-10 day forward visibility) and commercial demand (permit-driven, 60-90 day forward visibility) at every branch.
Branch-Level Seasonal Profiles
Each branch's inventory targets calibrated to its actual residential/commercial customer mix rather than a single company-wide seasonal adjustment.
Weather-Integrated Demand Adjustment
10-day weather forecasts triggering automatic demand recalculations on weather-sensitive SKUs, enabling purchasing to position inventory 7-10 days ahead of residential demand surges.
Predictive Excess Inventory Alerts
ML-driven early warning when seasonal inventory is accumulating faster than demand velocity supports, triggering markdown or manufacturer return decisions weeks earlier than the quarterly review cycle.
Eclipse Integration
Demand intelligence feeding directly into Eclipse purchasing workflows — replacing the quarterly manual min/max adjustment with continuously updated, branch-specific stocking recommendations.
Dual-Signal Demand Models
Separate ML models for residential demand (weather-driven, 7-10 day forward visibility) and commercial demand (permit-driven, 60-90 day forward visibility) at every branch.
Branch-Level Seasonal Profiles
Each branch's inventory targets calibrated to its actual residential/commercial customer mix rather than a single company-wide seasonal adjustment.
Weather-Integrated Demand Adjustment
10-day weather forecasts triggering automatic demand recalculations on weather-sensitive SKUs, enabling purchasing to position inventory 7-10 days ahead of residential demand surges.
Predictive Excess Inventory Alerts
ML-driven early warning when seasonal inventory is accumulating faster than demand velocity supports, triggering markdown or manufacturer return decisions weeks earlier than the quarterly review cycle.
Eclipse Integration
Demand intelligence feeding directly into Eclipse purchasing workflows — replacing the quarterly manual min/max adjustment with continuously updated, branch-specific stocking recommendations.
Strategic Impact
Seasonal Precision Replacing Seasonal Guesswork
$1.4M in annual overstock cost eliminated — the carrying costs, markdowns, and return freight that accumulated every year from purchasing too much of the wrong product at the wrong branches ahead of seasons that didn't behave like the prior year. The Director: "We stopped buying for last winter and started buying for this winter. That sounds obvious, but it's impossible with trailing averages and quarterly adjustments."
Peak-Season Revenue Protection
Stockouts on the top 50 seasonal SKUs dropped 41% during the first heating season after deployment. The distributor captured an estimated $860K in sales that would have walked to competitors in prior years — contractors who needed furnaces in November and condensing units in July and couldn't wait 2 weeks for an emergency purchase order to arrive.
Working Capital Efficiency
$680K in working capital released from seasonal inventory reduction — capital that had been locked in heating products sitting in branches through April and cooling products sitting through November. Inventory turns improved 19% without any reduction in fill rates on high-velocity items. The CFO noted that the working capital release funded the entire engagement cost within the first seasonal cycle.
Key Takeaway
In HVAC distribution, seasonal demand isn't one pattern — it's two. Residential replacement demand responds to weather events that shift by weeks every year. Commercial project demand responds to permit pipelines visible months in advance. Every HVAC distributor who forecasts from a single trailing average is blending two signals into one forecast that's wrong for both. This distributor didn't need a more sophisticated ERP or a better spreadsheet model. It needed the demand signal separated into its actual components — residential weather-driven and commercial permit-driven — and modeled with the leading indicators that predict each one. The quarterly adjustment cycle that had driven purchasing for years was replaced by continuous, branch-level demand intelligence that saw seasonal transitions as they happened, not 6 weeks after.
Related Engagements
Contractor Pricing Intelligence
The VP of Commercial Sales at a 10-branch HVAC and plumbing distributor in Nashville discovered that the same 3/4" ProPress fitting sold for 11.4% less in Chattanooga than in Nashville — to comparable...
Mechanical Takeoff Intelligence
The Commercial Sales Manager at an 8-branch HVAC and plumbing distributor in Denver had a 6-person estimating team declining 30-40% of commercial RFQs during peak season because each mechanical takeof...
Order Assembly Intelligence
The Branch Operations Manager at a 5-branch HVAC and plumbing distributor in Montréal was watching the same pattern repeat on every commercial project: staged deliveries arrived at jobsites out of seq...

