A short list:
- Trying to making small payments is terrible; the only way to tell whether a transaction requires fees is to try it, see it fail, and parse the error message to figure out the fee amount.
- The "order" abstraction is bad because it assumes customers will always pay the exact order amount, which is false because users make mistakes (especially since the order page instructs the customer to add miner's fees, and if they do, the amount will be wrong and the order gets reported to us as "mispaid"). I had to put a lot of time into writing our own documentation about how order statuses work, particularly mispaid orders - from trial-and-error that unfortunately had to include some bad customer experiences. Perhaps the worst problem is that when a customer makes multiple payments on an order, they show up in the web interface, but not in the API.
- When you request an email address on the payment page, Coinbase doesn't check that it's a valid address.
- choose_price on orders doesn't work.
- The API just needs more consistency. There are entities with statuses named "complete", "completed", and "Complete". There are things called "hash" and "hsh". The order API gives a number of confirmations for a transaction, but the transaction API doesn't.