But that's the future. For now, you made an offer. I'd honor it for the current list, and then send them a note saying, in fancier language, "Hey, I've spent 8 hours running down issues that turned out to not be my bugs. I am happy to stand behind my work, but I can't afford to do that for other people's code. If you folks would like a support contract for your system, I'm glad to do that at $XXX per hour with a monthly retainer of $YYYY. I'm still glad to fix any bugs in my code for free, but in the future, time spent on issues that aren't caused by a bug in my code will be billed at my normal rate, $ZZZ per hour with a 1-hour minimum per incident."
Most clients are great, but few think through the economics of freelance software development. And some people are just greedy. The best thing I even learned about client pricing was to structure deals so that no matter what happened, I was ok with the outcome.
1. You offer support (problem analysis) for $X per hour.
2. If analysis reveals a bug in your software, you will fully refund the support cost and offer the fix for free.
Still, the "free bug support" idea is a really powerful selling point, as it show confidence. Perhaps offer 2 or 3-months of "free bug fixes" with a flexible ending date so you can't ride out the clock. After which, @ashearer's suggestion could kick in.
Start tracking bug reports carefully. Log all the details of the report, investigation, and resolution. Make these available to your client where possible.
Also, consider that inadvertent misuse of software may constitute a UX defect :-)
I don't know, I feel like if you build something, and it's defective, that you should fix it free. I would expect the same from a car mechanic. I get that software is a hard thing and bugs are inevitable. I'm curious what other people do.
Recurring revenue and the client is happy: they are now able to budget their costs.
I can understand why you feel this way, but I don't think it applies to software as much as it would tangible goods or service.
Also, i've noticed in my own work that people are always eager to blame problems on whatever component is the cheapest/easiest to solve. If you charge $50/hr for application support and the guy they contract to do virus scans and run disk defragger costs $40/hr, their first call will always be to him, not you, no matter where the actual problem lies. Somebody at their office has figured out that whenever a user has a problem, it's cheaper to pawn the problem off to you and let you do the triage than it is to triage it themselves before calling you. Even if you don't start charging for bug fixes, you need to start charging for wasted time.
One is to cap your hours/cost. Just build in 40 hours (or whatever) of bug fixing for the first month into the price. Line item it, so the customer knows what he's getting and what it costs. Often customers will complain about this cost, and say they'd rather pay a la carte. Bingo. But if they don't, you have now set clear expectations about what is being provided.
Another is to make bug reports consumable. For reference, Apple has a bug fix consumable called a DTS Incident where you pay in advance to have N bugs investigated. Something you may want to consider if the bugs are all invalid is requiring somebody to pay to file a report, and if it turns out valid you refund their money. This may lead to more disputes though it's unclear if disputes are a problem in your situation. In that case you may want 2 hours of your time no refundable for every report.
The third thing is technical, and it works even if you don't have a good contract in place. Become omniscient. Log really detailed, invasive things and phone them home. Every user action, all the user's data, etc. Then when the bug comes in you cross-check against the logs and can verify quickly. "No you pressed the delete button, that's why you don't have any data. Not because a bug in the app destroyed it." Make it clear that you are doing this and make it clear that you will disable it, but disabling it voids the warranty.
Having all their business data logged doesn't sound like a condition that any reasonable customer should agree to. In some cases, such as healthcare related data covered under HIPAA, it would be outright illegal. Asking for this kind of arrangement tells your customer that you don't understand the importance of confidentiality and security, and also tells them that you think they're so stupid that they don't know the difference between a bug and a user error. If a contractor suggested this condition to me, I'd show them the door immediately.
You'd also be taking on a serious risk. Even if it was legal for you to have the data, it could open you to legal liability if through some error of yours the data was compromised, costing the client money. And if you had possession of the data, you might get blamed even if the data leak wasn't your fault.
Even if you logged the data on the customer's own machines, bad things might still happen, like a bug in your logging code logging confidential data in plain text when it was supposed to be encrypted. It could then fall into the hands of an employee who wasn't authorized to see it.
Any business that uses SaaS or externally-hosted software agrees to this. The question is whether your vendor has a reasonable access policy for that data, and what "reasonable" means hinges a lot on your vertical and the kind of data you're storing. PCI is a completely different ballgame than button clicks for example.
Increasingly, plenty of non-SaaS products work this way (e.g. Tesla cars, OnStar, your iPhone, apps in the Windows Store, etc.) Again the question isn't so much about "whether" to collect usage and bug reporting data, it's about getting the defaults right and educating concerned users to tweak them to a level where they are more comfortable.
> also tells them that you think they're so stupid that they don't know the difference between a bug and a user error
This is literally the case that OP came to us to solve
Make it entirely clear and transparent what you're working on, including time spent bugfixing, and if they're unhappy they can take their business elsewhere.
This of course puts great incentive on you to write high-quality code, because your failings in that area will be visible as bugs to the client.
Super bitter about it and thinking about giving up on self-employment altogether because of that guy.
- I ignored a great big warning sign up-front ("our previous developer abandoned the project, refusing to work with us again")
- I offered fixed-price (a horrible mistake for a variety of reasons, including that it was explicitly a 'learning project' for all of us)
- I didn't mitigate scope creep ("I know we said we'd hire a designer, but can you style the UI as well?")
- when we ran into obvious deadline and quality issues, I should have fixed it by re-evaluating things with the client; instead, I tried to "work harder"
- finally, when everything went south and the client refused to pay (and in fact demanded their deposit back!) I didn't take them to court for the money they owed me
All in all it was a horrible engagement for everyone involved, but a great learning experience for me at least. I hope the clients (quite reasonable people I think, just as domain-clueless as I was at the time) learned from it too.
Don't give up though. I continued contracting, and used those experiences to build a simple set of practices that made future engagements a lot more pleasant and productive for everyone involved. One of these is to be super-explicit up-front about how bugs are tracked, resolved and billed.
Something to consider: as a software professional, part of your job is to help your clients learn how to engage software professionals. Many clients are either new to the field, try to bring odd expectations from other fields into it, or have been burned by bad engagements in the past and are 100% in CYA mode. Help them get past that :)
Another suggestion: do a thorough post-mortem with each client. Go over what you did, what you learned, what you'd improve and so forth. I.e. not a retrospective of the work you did (which is also important and worth doing), but a retrospective of your business relationship with your client.
Invoices unpaid for more than 30 days, get a 10% late fee. Late for more than 60 days, no more work of any kind untill all invoices are paid.i work to make a living and expecting prompt payment is reasonable, not a favor
After last invoice paid, 30 days of free bug fixes. After that, the client had enoug time to report any problems, so anything else is goes into maintenaince fee.
If a potential client does not agree with this terms, then it will be a client that is more expensive than what i can afford, so i reject the work and move on. Specially the manipulative ones that try to guilt trip into fixing for free whatever they want, i don't need those.
So te question is, are you into freelancing to make money or to do favors?
Some customers will whine and moan about late fees and try to weasel out even if they're in the contract, but if you offer discounts for quicker payment, suddenly they're running after you to pay right away. At least in my experience.
This is the reason (among others, such as lack of benefits) that hourly rates as a consultant/freelancer are so much higher than that of an employee.
That being said, if you do fixes like this for free, they'll bug you (hey, it's free -- why not?) rather than spending half a second figuring it out themselves.
I've seen this sort of thing too, and while it's frustrating when my code is blamed for user error or other people not reading the API I give them, I feel like it's more trouble than it's worth to stress out about it. Just give it a low priority, and do it when you have some down time in the interest of keeping future potential customers happy.
Granted, I'm not some pro freelancer, but doing this has let me cultivate many long term positive relationships, learn new skills on someone else's dime, and get new work with (potentially better) clients based on the recommendation.
You may have to explain to them why code \might\ need bug fixes etc but that generally leads to the client having a better overall understanding of the work required which never hurts :)
Offer a 90 day code warranty period. Over those 90 days you'll fix (For free) defects in your application.
However, wild goose-chases like you're mentioning above will result in an invoice. Only problems originating from YOUR code will be covered.
IE: You spend 2 hours finding the issue they mentioned.
1) Problem exists in your code. a) You fix it, and you don't invoice them.
2) Problem is in another part of the system a) You invoice for the time spent.
This is by far the most far and reasonable way to look at this problem I reckon..
You should stop doing this. The way to fix it is to use a project manager like pivotal tracker that allows the client to "accept" a feature. Then, in your contract, it states that the client must test features and that you are not responsible for bugs after acceptance.
Bugs in software happen. If you write tests, they happen less. All projects should expect some amount of bugs and these should be paid for as any other normal development work.
Theoretically, an immoral dev could take advantage of this and create a lot of bugs but they wouldn't be in business long, so they disappear. A bad dev who honestly creates too many bugs suffers the same fate.
Get paid for your work. Period.
Why? If I take my laptop into the shop, and after 2 hours of work they determine it's because I spilled coffee into the USB ports, don't you think they're going to charge me for the evaluation, let alone the repair?
There are types of business that can offer free support, even of problems not related to their product. A 1-person freelancer is not that type of business.
There's lots of great suggestions in this thread for getting your time paid for. These have the dual advantages of earning you more money, and ensuring you get better, more savvy customers. This is because the ones who understand the value of support and care about long-term success instead of penny-pinching will self-select themselves as part of your contract negotiation process.
I would speak to them and explain that the issues investigated so far are out of scope, why and how they can identify for future issues. Let them know that you will need to bill for time on out of scope work but that you will waive the fees to this point as a goodwill gesture (let them know the time/cost of time spent so far). Send them the list of bugs with you findings so far with an invoice totalling zero after discount and ask them to let you know which issues they still want you to investigate.
Is there further business that you could offer them in fixing or replacing the other (broken) components.
Meet them, too. For a coffee, tea, beer, whatever. I say this because by accepting and taking responsibility for what you have created, it is likely the developers of other components have included no support / feedback channel. This is both a risk and opportunity: the opportunity is an on-going chance to bill for services or future development; the risk is being seen as blaming others for your mistakes.
Modify your software so that issues caused by outside systems or user input errors are loudly and clearly announced as being externally caused.
Until this if your software fails, its your bug even if it is caused by bad input.
Even though the
Nothing free at that point.