This paper examines multiple contract design choices in the context of transaction and relational attributes and consequent ex ante and ex post transaction costs. It focuses on two understudied themes in the IT outsourcing literature. First, while the literature is predominantly concerned with opportunism and consequent ex post hazard costs that contracts can safeguard against, parties to a contract also economize on ex ante transaction costs by their choice of contract type and contract extensiveness. Second, the literature studies the aggregate extensiveness of contracts rather than of distinct contract functions: safeguarding, coordination, and adaptability. Against this backdrop, our research model portrays a nuanced picture that is anchored in the following theoretical interpretation: transaction and relational attributes have implications on specific ex ante and ex post transaction costs, and these implications can be balanced by respective choices in both contract type and the extensiveness of specific contract functions. These two contract design choices complement and substitute for each other in their ability to economize on specific transaction costs. Our analysis of 210 software development outsourcing contracts finds that explanatory power increases when analyzing the extensiveness of individual contract functions rather than the aggregate contract extensiveness, highlighting subtle competing influences that are otherwise masked by an aggregate measure. Our analysis also shows that a preference for time-and-material contracts counteracts the effect of certain transaction attributes on contract extensiveness, and even cancels it out in the case of transaction uncertainty.