63

The whole situation seems bullshit to me, but I want a second opinion because it's going too far.

A bit of context... I'm a freelancer, I write in VBA or c#. 75% of the projects are microprojects in Excel.

In the years I built my own library and a code generator. The code generator writes some semi-standard class and methods. Stuff that has a structure but often needs manual adjustment for the final version. In order to have modular code where I can manually modify some parts and still regenerate other parts without losing the changes, the generator uses tags to wrap each "part" and when I deliver the work I don't delete them.

The client was genuinely happy after I deliver the project (all the set phrases, "now we'll do this other ..." etc.). Some days later I receive an email where he asks what these <Sometag> lines were. I replied with the truth. Tags used by a code generator to find specific parts of the code. He was interested in VBA so I thought that an insightful explanation was appreciated.

A week later I send him the invoice and the next day he replied that since I've not actually written the work the price agreed was no longer valid. Now he wants to pay less than half of the agreed price. (???)

But the worksheet still does what it's supposed to do. The code generator is mine. I wrote every line and there are hundreds of hours of work in it.

What should I do? Is it unfair to use such a tool? Does the client have any point? On this project, there are 9.5k lines of code approx. 3k from my library, approx. 4k from the generator and the remaining handwritten. I agree that this is not a very descriptive code, but it's neither so bad code IMO. In the contract, (but also via email and voice call) we never agreed or even spoken on anything about the form of code. He told me that he and his employees tried to do something like this and the result was not working.

My biggest concern in pushing back too hard is that he could write a negative review on Google MyBusiness. I've never been in a situation like this and I don't want my reputation be compromised for a relatively small project. The compensation involved isn't high enough to warrant legal action either.

7
  • 2
    Comments are not for extended discussion; this conversation has been moved to chat.
    – Neo
    Aug 16, 2020 at 16:10
  • 1
    Belated welcome to the site Davide. I've modified your question for length and removed the code. This is The Workplace not Software Engineering. :) Can you clarify what you mean by "he and his employees tried to do something like this"? Do they have issue modifying/reusing the product you delivered when they might expect to be able to? Or is it your client actively undermining his point that you "put less real effort in"? Would you have any recourse for a negative review if he posted one? (replying, getting the review removed, counter-reviewing him)
    – Lilienthal
    Aug 18, 2020 at 7:15
  • What was your contract/agreement? Did the client pay you for your time, or pay you for a product? To put it another way, were you in an arrangement where even if you didn't finish on time, as long as your butt was in a chair for X hours, you would have been paid 100%?
    – Mars
    Aug 18, 2020 at 7:58
  • 1
    @CaptainEmacs You always need to though. By definition we only get one side of the story here. :) It's just not relevant information when it comes to answering the question which is already long enough.
    – Lilienthal
    Aug 18, 2020 at 9:37
  • 1
    @Lilienthal That's why the code was useful. Even as a non-domain expert and an outsider, it looked like I would be able to edit it after a bit of introspection. Aug 18, 2020 at 9:40

12 Answers 12

145

Collection Agency. He is not a client but a problem, and those "clients" basically are not worth your effort. Invoice, proceed this to a collection agency ASAP to get rid of it mentally. He has no point. How you do something is YOUR decision, not his.

14
  • 25
    Indeed. Using a code generator to write code, is analogous to writing code instead of doing the calculations on a calculator; or using a calculator instead of an abacus. It's just a more efficient way to get the job done. The job has been done, and the client must pay in full. Aug 15, 2020 at 18:09
  • 15
    I use an editor with code completion capability. I like long, descriptive identifiers for maintenance, but often use a short nickname during coding and then replace it. I write scripts for any repetition I cannot refactor away. I don't see any difference between those strategies and your generator. They all make coding more efficient by not typing every character. Aug 15, 2020 at 18:41
  • 25
    He's looking for any reason not to pay. I've had clients like this in the past. There a number of ways to deal with them. They all take a lot of effort and energy. Aug 15, 2020 at 19:48
  • 5
    This is why I say collection agency. Write it off and just get it out of your mind. Especially when doing mini projects, no sense in wasting time on it. Rather earn more money. Little hint: Make LARGE projects. Mine go between 9 and 36 months.
    – TomTom
    Aug 15, 2020 at 19:52
  • 13
    This should be referred to as "firing a client."
    – emory
    Aug 15, 2020 at 20:31
61

What should I do? Do you think it's unfair to use such a tool?

If I were you, I'd explain to the client how using the code generator you crafted allows you to deliver great, but inexpensive, solutions that meet customers' needs. And I'd point out that the solution provided clearly meets this client's needs, given how happy they were initially.

I might offer to tear up the invoice if the client doesn't want the solution at the current price, and promises in writing to discard it and lose their license to use it. That's a particularly effective remedy if you expect that the client would need maintenance from you at some point down the road. You don't want to keep servicing an unhappy client.

Does the client have any point?

No, the client doesn't have a valid point. Since the client got what they contracted for, they should pay the agreed-upon price. It shouldn't matter how the code came to be constructed.

That said, you might avoid future problems if you discuss your process with future clients before signing the contract.

the generator uses tags to wrap each "part" and when I deliver the work I don't delete them.

You might want to reconsider the "don't delete them" part.

My biggest concern for a "hard" solution is that he writes a negative review. I've never been in a situation like this and I don't want my reputation be compromised for a relatively small project.

You get to decide how much a potential negative review is worth to you.

9
  • 10
    @DavideTonin You can scramble your tags [and declare them "for internal/debugging purposes"]. It's also not the clients business to know how to do your work. Aug 15, 2020 at 23:43
  • 1
    A note to add because I can't turn this into a legitimate answer of its own – think like a big corporation with a customer service department. Would they treat Google this way "I heard you added new tools that make it easier to serve ads, so now I want to pay less than I used to" – Time for the old "We strive to innovate new ways of delivering you maximum value! Smart service with a smile, that's our motto here at ToninCorp!!"
    – Toadfish
    Aug 16, 2020 at 5:37
  • 2
    Great answer. I would focus on the aspects "fast" and "quality" when talking about the reasons for using the code generator, since the client seems to think he can pay less since it is so easy to generate code.
    – Helena
    Aug 16, 2020 at 6:47
  • 1
    @DavideTonin Keep an internal version of the clients code with the tags. But before delivery to the client, strip them. If you need future changes, you make those to the internal version that still has the tags, and then ship the changes version again with stripped tags.
    – Polygnome
    Aug 16, 2020 at 8:26
  • 3
    The tags make the code better and more maintainable even without OP's tool. They should stay. @DavideTonin just say that those are comments for ease of reading and omit the fact that you are talking about machine reading.
    – Džuris
    Aug 16, 2020 at 9:47
33

Tell the client that if the project was written from scratch, it would have taken much longer, had more bugs, and never be delivered on time. Now, how would he like to pay? Credit card or Check?

And, that's your last communication with him. The contract was to produce a solution to a problem he had, within a budget and a timescale. You did that - your mistake was being courteous enough to explain your process.

You don't need clients like this. If you have a contract, go for small claims court, and get paid. If you don't, then you may have to write this off - next time get a contract (note: if you write it off, make sure that your attorney tells the client that they do not have any license to use the software you wrote for them)

25

For some reason people have this notion that only marginal costs are real, not capital costs. You see this attitude everywhere from pharmaceuticals to retention and recruitment. It’s a strange attitude, but a common one.

And it is consistently wrong.

Have a lawyer friend? Legal action could simply be a demand letter.

3
  • 4
    Probably I'll try to ask my lawyer, hoping that there is a cheap and fast solution
    – DT1
    Aug 15, 2020 at 18:47
  • 9
    The main issue isn't what costs count, but that costs count in the first place. If I tell you I charge $100, and you agree to $100, then you owe me $100. How much it cost me is completely irrelevant. That fact that you are willing to pay $100 shows that I am producing at least $100 of value for you. The value to you minus my cost is what economists call "consumer surplus". The client has no more right to the consumer surplus than the worker. Aug 16, 2020 at 4:21
  • 3
    @Acccumulation What you say is true of a fixed price contract (which it sounds like this was), but this is not universally true. There are some kinds of contracts (e.g., Time & Materials) where the costs do matter. Also, the consumer surplus is the difference between the value to the consumer and the sale price. The difference between the sale price and the producer's costs is the producer surplus. Together they sum to the total economic surplus, which is the quantity you described.
    – Nobody
    Aug 16, 2020 at 13:51
22

As a Freelancer you don't give any wiggle room to these sorts of thing. Keep it short and professional and demand payment. Don't get into a discourse over it. Just re-send the invoice with a short note that it's already been negotiated, you have fulfilled your side and expect payment, and if they just flat refuse to pay you for the work done, please let you know.

Then give it some time, if no payment within a reasonable timeframe, then you can look at what steps to take.

Don't get frustrated and don't jump in guns blazing, do this first before anything else. Many people try to dodge paying, you get used to it as a freelancer.

1
  • 6
    +1 for not discussing why the code generator is a good idea and a legitimate programming technique. All that matters is that the OP delivered what the contract required, and should get the payment the contract specifies for doing so. Aug 18, 2020 at 7:14
18

If he thinks you've "cheated", perhaps rather than a "code generator", a better description would be that you "compiled from a custom description language" or "compiled from a graphical tool". When you use an electric plane or a CNC machine, you hardly call it a "woodwork generator".

Is his real grievance perhaps that you haven't turned over the real source code for future maintenance? It's possible the client is just being unreasonable, but a much more credible (and reasonable) commercial concern could be that you have tied the work to your proprietary tool, without letting the client have the tool for maintenance.

A good analogy would be if the client asked you to design a combustion engine, but rather than using metric standard bolts and threads, you used some obscure system entirely of your own devising which makes it prohibitively expensive to maintain the engine in future without the client referring back to you.

You may have had no underhand intention in using your custom tool and it was simply a device to improve your productivity, but it is not unusual that tool-generated code is more complex or less idiomatic than hand-crafted code.

The client may well take the view that unless you make the generating tool available to him, then whatever time you saved creating the code with this tool, is going to cost him in future in lock-in costs for maintenance, or the cost of rewriting the application from scratch when he wants someone else to modify it. Is it possible that this is the real nature of the grievance?

7
  • 1
    "he replied that since I've not actually written the work the price agreed was no longer valid." [OP's citation] There is nothing about tooling or lack of maintainability in the statement. If they wanted maintainability, that should have been in the contract, if they wanted tooling, they'd have to pay for a licence to use the tool (as I doubt the OP would want to sell it off). Very unlikely, given the appearances. Aug 15, 2020 at 23:48
  • 1
    @CaptainEmacs, if you took the attitude with me that you do, I'd just refuse to pay and slam you with negative feedback as the OP's client threatens, because I wouldn't have contractors arguing with me saying "you should have specified maintainability" (as if anyone paying for the production of code expects spaghetti or something fixed in lucite) or "I'm charging extra for the tools I've used". If you wanted the code to be unmaintainable, or to charge me extra later, you should have drawn that to my attention beforehand, or just written it by hand in VBA like you were being paid to do.
    – Steve
    Aug 16, 2020 at 1:22
  • @Steve We do not know whether the code is unmaintainable. And certainly there may be some question of cooperativity and finding a joint solution to the problem. But if I read the question closely, OP creates microsolutions - these are interpreted by me as solutions for someone who does not know how to code, or they could develop them themselves, it's not a major system development where maintainability is implicit. If OP's knowhow/experience includes a self-built code generator, why should they give it out for the pittance cost of a code snippet? Cont'd. Aug 16, 2020 at 9:48
  • @Steve Furthermore, I have built code via code generators which was maintainable, with a little bit of effort. There is no statement to whether or not this is the case (which, BTW, my comment states). So, you jump to conclusions. I merely stated that there were no specific requirements about maintainability. It does not mean it's not the case. OP states that their tool took years to be developed. Do you really think that the client would have been prepared to pay the actual cost/licence of such a tool, rather than a microproject? All signs are they are just trying to get out of paying. Aug 16, 2020 at 9:57
  • @Steve Final comment: I just noticed the code example by OP above, and it looks pretty readable. Had the client not seen the tags, they may not even have noticed that there was a code generator involved. Which supports my point in the last comment. Aug 16, 2020 at 10:01
11

No, the customer does not have a point, and no, you haven't done anything wrong. You delivered the product the customer requested at the price that the customer thought was reasonable. How you accomplished creating the product is utterly irrelevant.

What you could do to smooth the customer over is explain that all software is developed using tools... compilers, libraries, code generators, etc. All tools to make creating software more efficient, just as a carpenter who does home remodeling has tools that makes his work more efficient. The fact that you use tools has already been factored in the price you quoted the customer. If you did not use a code generator, you'd have to charge more to cover the increased cost.

0
8

Keep it short and honest....

The price I quoted included using the code generator. Had I not used the code generator I would have had to charge more for the project. If there is something not satisfactory with the result let me know and we can discuss a resolution.

Also consider the possibility that he has a legitimate beef with generated code. For instance, perhaps the code is not easy to change.

1
  • 7
    I would avoid heavy use of the phrase "code generator", and use words like "my tools" and "my equipment" which emphasise the true centrality of the artificer and his skill in making or using such things. A civil engineer wouldn't talk of his digger as a "hole generator", nor a printer talk of his press as a "text generator", nor a blacksmith talk of his anvil or his jig as an "ironwork generator". To talk of a "code generator", when you are being paid good money to code, unreasonably casts the computer and the tools as the active agents.
    – Steve
    Aug 16, 2020 at 12:06
5

As the client (and knowing how software development works), I would want to be able to hand your delivery to another company next year, and let that company make changes or additions, at a normal price.

So if what you deliver makes that unusually hard, then the customer has a point. If it is not much harder because of your tools then no. And that you used tools to develop more efficiently is not a reason not to pay.

But what really matters is what the contract says. If you delivered what the contract says, the client needs to pay.

2
  • 1
    He didn't talk at all about maintainability or tooling support. For the latter, they may have licenced the tool and support. Probably too expensive for this cheapskate of a client. Most probably they just thought that they'd get away by paying only for the marginal cost. Aug 15, 2020 at 23:50
  • 1
    That sounds like something to discuss before giving someone the assignment, though.
    – Erik
    Aug 17, 2020 at 7:59
5

There seems to be a lack of communication at the start. If the customer wanted an easily editable base code to change to his choosing, and to learn a bit of VB for himself, then he and you were both in ignorance of each other's intentions.

Some code generators give very verbose and illegible code, so i don't know why people comment without even seeing the code, or the work request... if he said "because i am designing my own code / project integrated with your work" for example... We don't know the sum agreed and the volume of work. He may have signed the agreement and price based on coding his own work manually, i.e. he expected more work done and a manual result. Personally I would warn a client the details of a code generator if he is a junior programmer without much money who need editable code.

There are too many variables and unknowns in this question to write off the client as a faceless mischievous entity, we dont even have a transcript of the complaint reason, or the code request. What was the number of lines and the price? 100 or 10000? I was surprised that nobody considers if the client has a human side to tell or if he has emotions or is a junior individual or a group, else this is a one sided judgement.

4
  • 5
    The client has refused to pay the full amount invoiced. That tells you everything you need to know. They're not objecting to what was delivered on the basis of being "easily editable" or anything else you guess at here. They just don't want to pay. Happens all the time because there's lots of bad clients out there. youtube.com/watch?v=oEa6PdOG2ts Aug 16, 2020 at 8:47
  • 1
    This answer raises important questions - a private code generator is fine, if it is agreed upfront the code can be unmaintainable. The OP here seems to have possibly delivered unmaintainable code, and that is something to be considered. However without seeing the actual contract it is impossible to tell, and this answer correctly points that out. I agree this sounds like a client who is trying it on - but there are legitimate concerns here; the default assumption of professional devs should be that code delivered that is intended to be maintained will be of reasonable quality. Aug 16, 2020 at 13:08
  • 1
    @StackerLee There was a code sample by OP which had been removed by the moderators. It was perfectly readable. Aug 18, 2020 at 8:39
  • 1
    yeah, to be clear, I'm not intending to question the OP's general code quality (outside of the generator) or professionalism, just the "private code generator" sets off my spidey-sense a bit having dealt with similar stuff before. Aug 18, 2020 at 15:06
0

I will not attempt a direct answer at the question since you already have plenty of good advice here (personally I see a client grabbing at any reason they can think of to not paying. Had it not been the code generator, he'd find some other excuse).

My advice for the future, however, is, to employ a "Free trial for 30 days, then you have to enter a license key to continue to use" scheme in your code products.
By 30 days I, of course, mean "The time it takes to get paid", not exactly 30 days.

Now, if the client complains... they have no point!
You get a full-functioning trial to do user-acceptance testing on and verify fit for duty.
When, if, you pay up, the contract obliges me to give you a license key... which I will, of course.
You don't pay up and try to shill me?! Hope you enjoyed seeing how useful my application is to you, how much you could benefit from it... had you only paid.

If you can, technically, I would say go one step further and, when the trial is over and no license has been provided, wait, say 3 days, and then trigger a complete uninstall/delete of your product's code from target machine.
You don't want the client reverse-engineering their way to a valid license and not paying you what you're owed.

Just make sure your lawyer makes all this legal in the contract.
You know, "legalise" to "The coded product is the sole property of ToninCorp, up to the point where agreed-upon compensation has been delivered by the client to ToninCorp, at which point ownership of product transfers automatically to the client.
This does not entitle the client to maintenance services by ToninCorp without further compensation".

I'm sorry you got swindled. It's shit and it happens to each of us, even the most guarded ones.
Get what you're owed at all costs.
One bad review is bad, true. Getting a name for being a push-over is a career-ender!
There's a reason the mob doesn't let anyone off the hook, even if they stole a stick of gum! If you get the name of someone that can be bullied and taken advantage of... those will be the only clients coming your way.
It's a spiral of career demise.
Just don't!

-1

This question is unanswerable

Why? Because we haven't seen the contract. If we don't know what the contract was (names redacted of course), we cannot possibly know whether you met its requirements.

For example:

  1. What was the maintenance agreement?

  2. What access to the code was agreed upon?

  3. What free support over what period of time did you offer?


If you fulfilled the contract to the letter, then they are bound to pay. If you didn't then you must provide that extra service or expect them to pay less.



He told me that he and his employees tried to do something like this and the result was not working

You don't say whether this should work, or whether you have tried to support them in getting it to work. If new code written by the customer is supposed to work according to the terms of the contract, and it doesn't because of a fault in your code, or lack of documentation, then you need to fix it. If you merely provided the code as a package to be used purely as-is, then they have no right to complain that they can't modify it. They can however complain if it doesn't do the job specified.

2
  • 1
    Even if - a big if - what was delivered was not what was agreed, the client is still in the wrong. They don't get to decide their own price after delivery. They either point out what was not to spec and seek to get it fixed, or reject it entirely and lose all right to benefit from the work. They can't keep what was done but choose not to pay (in full) for it. That's never acceptable. Aug 16, 2020 at 21:32
  • @BittermanAndy - Agreed 100%. It is however very difficult to recover something that is not a solid object. Can you prove they have deleted every trace of the software off their server and aren't using it? I'm certainly not saying the OP should not sue for the money. For software, the contract needs special clauses. Otherwise Microsoft would have been bankrupted a thousand times over for not delivering. In his situation the written contract and any written agreed changes to it is everything. It's what is on oaer that counts. Aug 16, 2020 at 21:48

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .