В вашем контракте укажите почасовую ставку и следите за своим временем. Когда вы даете своему клиенту цену, укажите, что это приблизительная оценка, и фактический результат может быть меньше или больше.
Держите клиента в курсе прогресса, и когда он неизбежно вносит предложения, вы можете просто сообщить ему время, которое потребуется вам (если изменение выходит за рамки оригинальных спецификаций), и он может решить, стоит ли изменение денег. Поэтому будут добавлены только важные для него изменения.
Я бы лично рассмотрел в контракте приемлемые и недопустимые (платная поддержка против бесплатной поддержки) ошибки, и таким образом у вас по крайней мере есть что-то письменное с самого начала. Он, несомненно, задастся вопросом, зачем вам нужно это предложение, так что будьте искренними и объясните, что если выходит новое обновление ОС, которое что-то ломает, это не бесплатная поддержка. Однако ошибки в вашем коде в соответствии с исходной спецификацией на указанных платформах будут устранены.
Тем не менее, я должен отметить, что я занимался фрилансом, а не программированием. Это может отпугнуть клиентов, но просто убедитесь, что ваша работа продает себя, будьте более профессиональны, общительны и полезны, чем остальные, и будьте откровенны с причинами заключения более строгого контракта.
Кроме того, клиент, который не примет это предложение, скорее всего, плохой клиент.