It always amazes me how difficult it is to transfer a domain. I suppose it is hard for a few reasons; but still it astonishes me. Why is it so hard? Is it human error? Is it hard to prevent human error? Is it a technically difficult process? Why, in this day in age, when you can execute complex systems and do so many things with a push of a button, is it so hard to transfer a domain. The simple answer is that it is hard because it requires orchestration between parties that can be hard to talk to.
I briefly stated that there might be reason for it being so hard. The most obvious reason is they (being registrars) don't want people to transfer their domains away without reason; it isn't something you want to have happen accidentally. Another reason for it being so hard is you don't want hackers and thieves to be able to hijack or steal a domain away - therefore there are many steps that require both parties to authorize the transaction. This reason, to stop deception, is probably the true cornerstone of this transaction process.
Let's discuss the transaction processes. There are effectively two ways to transfer a domain: account to account and registrar to registrar.
This is probably the easiest method to transfer; just make an account at the existing registrar and transfer the domain between two users. An example of that would be John Doe has a domain registered at Godaddy.com and Jane Doe is trying to get the domain from John. Jane creates an account at Godaddy.com and then contacts Godaddy.com to facilitate the account transfer. The steps for moving the domain might be different depending on the registrar, but this is by far easier than the steps to exchange a domain between two registrars. This method usually is free and just requires the domain not be in an expired state. For this transacation to happen the domain must be in an unlocked state, then the registrar will have a series of steps to authenticate the transfer. Godaddy, for example, has a section called "Begin Account Change". For this you will need the email address of the recipient (The one they used to start their account) their account number, and potentially other important info about the domain - like it's contact information and server settings.
When a domain owner wants to transfer a domain to another registrar there are a series of steps that are required in order for the domain to pass from one account at one registrar to another account on another registrar. This is different than just transfering the domain to another user within the same registrar. In this example John Doe has a domain at Godaddy.com. Jane Doe has an account at Cheap-domainregistration.com. In order for John to transfer his domain to Jane he will have to unlock his domain, the create a series of EPP or Authorization codes. Jane will have to purchase a transfer fee for the domain - usually this will add on a year of domain registration onto the account. At that point Jane will have to specify the name of the domain being transfered. Inside of her account there should be a section for incoming transfer domains. The domain being transfered will show its contact details along with the email of the domain admin. Jane will then need to initiate the transfer; this will email the admin on the domain. John Doe should receive the email which will contain the transaction id for the transfer an the authorization codes. John will then have to email those details for Jane. She will then take the transaction id and authorization codes and enter them into her transfering domain accounts. If the codes are correct then the transfer can be processed - this can be very fast - in a matter of minutes - or very slow, taking up to a week. If John didn't unlock his domain or handle any of the process properly the transfer can fail. So to recap
There are plenty of ways a transfer can fail. The hardest part is just the orchestration of the transfer process. In our example if John didn't understand what was going on, or if he isn't paying attention to his email then the process drops. What could take a few hours turns into days or weeks. Also if the admin email on the domain are incorrect - like if John had used an old email address that was the admin email for the domain then how could he receive the transaction ids that Jane needed to transfer the domain? What if John had just ignored the email asking him to authorize the transfer? That would just stop the process dead. In many cases the individuals transfering the domains are technically savy, or aren't motivated to facilitate the transacation. In our example John was responsive, but what if he was instead bitter that he was losing his client or sad he had to shut down a domain? Those could even hinder the process more.
Transferring a domain is hard. It is hard because it involves people, and it revolves around a process that can be complicated and confusing. It is way easier to transfer a domain between accounts than it is to switch between registrars, but with enough communication, grit, determination, and time a domain can be transfered anywhere.