With the failures, they always seem to occur when requirements are not outlined completely. Also, keeping an open line of communication at all times with the developers is essential. This will mean being available during their work hours and if possible negotiating with them to have someone available during yours. Never assume that the developer will get or understand what you are talking about or describing.
If you are looking to outsource, my advice is to talk to others you know who have outsourced and get their recommendations on individuals or companies. Don't just do a web search and go with the first, or even second, company that pops up. Research, ask for references, look at their portfolio, just like you were hiring someone to work for your company. Try to find developers who have extensive experience working with US based companies (assuming you are in the US).
Go with project based pricing over hourly.