I have a well equipped home office where I do the bulk of my work. I prefer to communicate by email or by Skype, but will occasionally travel to a customer sight if necessary.
I use rapid development techniques, where the job is divided into discreet deliveries of desired features. I will provide an estimate of the project cost before starting. Together with my client, we will determine the next unit of work to be delivered. I expect to get paid for each delivery installed. If the client is not satisfied with the functionality or cost of the software delivered, they can cancel further development. (I have never had a customer cancel the project before completion.)