I think it's a combination of:
- Build assumptions about down time into your pricing model - Aim for big projects where adding or removing 1 developer to smooth your resourcing isn't a problem - Always be taking on more projects than you can staff, and use freelancers to fill the gap - Use the down time to to reskill your developers - Have a homegrown product that gets worked on in down time