A contract is a contract: if the terms of the contract are clear, they have to honor them and, if they don't, you could sue for breach of contract to enforce the contract and get the money. Of course, lawsuits themselves take time and cost money and can be stressful; if the difference is comparatively small (say, a roofer quoted you $4,300, so it's $700 at stake), it may not be worth suing--in that case, it may be best to give them what they want.