I outsourced more than 300 IT projects of all sizes over the past 10 years. I've been the outsourced developer myself.
Here are the most problematic problems I encountered multiple times and the suggestions to avoid them (I learn the hard way). Those mistakes cost me hundred of thousands dollars, so I hope you will save as much thanks to the suggestions so I'm even and can rest in piece :)
- require access to the repository. If not possible, request to be sent the full source every week for review.
You don't want to discover at the end of the project the code did not meet your quality standards such as missing comments, documentation, poor coding practices, etc. Reviewing the work frequently will allow you to give feedback early in the development phase.
- ensure that they signed appropriate NDA and IP assignment documents.
That's one of the common mistakes. Things went bad the company you outsourced the project to claim full ownership of their work. Or worse, they decide to use what you paid for for their own business. Ensure that a proper NDA and intellectual property rights assignment is signed.
- they often use custom framework of libraries that comes without source code. Verify it is acceptable to you.
Sometimes the developers or company you hired decide to use custom framework or library they wrote. This may be a problem if you are so dependent to them changing your developer is almost impossible. Sometimes the development shop will give you full right on the code they wrote specifically for you but not their libraries. It's as problematic. Ensuring that you will have the possibility to continue your project without them is a really important possibility you want to keep.
- ensure that they use standards in the technology of choice.
Even if they doesn't use specific custom libraries, you may face another problem: specific way of coding that don't meet industry standards. In the worst case, you have to rewrite everything to make any maintenance possible without them.
- if deadline is important, request penalties in case they miss it.
This is one is sometimes not specified explicitly. What happens if they miss the deadline? Let's say they face a strong internal problem preventing them to deliver on time? Will you have the budget to develop in another dev shop in urgency?
As a general rule, I would add that the specification is very important in that kind of work. So you have lot of responsibilities there. With time, I learnt that it's preferable to propose a first small project to a company to test it first, and reserve bigger projects to trusted providers you work with before.