At work they calculate how many hours the project is estimated to take considering certain more or less well-defined specifications, and calculate the project price based on that. But there are always changed during the probject, those changes are normally billed per hour or, for larger changes, estimated the same way the project is.
When you estimate don't forget to estimate project lead hours, testing, documentation and other time for the project. The customer should pay for all the time, not only the development.
When the project is finished support and updates are usually needed. I think the support should be either a monthly fee or on a per hour fee. Updates should be treated like changes during a project, in other words it depends on how big update it is.