No seu contrato, especifique uma taxa por hora e acompanhe seu tempo. Ao fornecer o preço ao cliente, especifique que essa é uma estimativa e o resultado real pode ser menor ou mais.
Mantenha o cliente atualizado sobre o progresso e, quando ele inevitavelmente fizer sugestões, você pode simplesmente dizer a ele quanto tempo levará (se a alteração estiver fora das especificações originais) e ele poderá decidir se a alteração vale o dinheiro. Portanto, apenas alterações importantes para ele serão adicionadas.
Pessoalmente, eu cobriria erros aceitáveis ou inaceitáveis (suporte pago versus suporte gratuito) no contrato e, dessa forma, você terá pelo menos alguma coisa por escrito desde o início. Ele, sem dúvida, se perguntará por que você deve precisar dessa cláusula; portanto, seja franco e explique que, se uma nova atualização do sistema operacional quebrar algo, isso não será um suporte gratuito. No entanto, os erros no seu código, de acordo com a especificação original nas plataformas especificadas, seriam cobertos.
No entanto, devo mencionar que apenas fiz trabalhos freelancers de TI em vez de programar. Isso pode assustar os clientes, mas apenas certifique-se de que seu trabalho se venda, seja mais profissional, extrovertido e útil que o resto, e mostre suas razões para ter um contrato mais rigoroso.
Além disso, um cliente que não aceita essa cláusula provavelmente é um cliente ruim.