don't know how everyone else does it...but my outfit always bills out by the hour...ALWAYS.
We'll estimate a project in man hours, and the client is required to buy "prepaid" chunks of developer time in various increments...e.g. we estimate a task will take 4 hours, you can buy 4 1 hour chunks at $x per hour or one 5 hour chunk at $y per hour.
if we miss our estimate, it's critical to inform the client as to why we're off as soon as possible. If this happens, its usually the customer wanting additional features or functionality that were not present in the original bid request...They only thing we don't charge for is fixing our own bugs and mistakes. Well, we sort of price that into the hourly charge...but it doesn't count against their time.
they can either use the rest of their time with us and leave...or buy more time.
We've been screwed so many times on the estimate/flat rate to "complete" a project crap...