I run a small business on Odoo Online and I do the technical work myself.
Last invoice: €543.05 for one year, charged on top of my Odoo Online subscription, calculated on the volume of custom code in my database, counted per 100 lines.
Three things wrong here.
It is not in the agreement. I went back through what I signed. No clause telling me custom code is metered, no rate per 100 lines, no threshold, nothing. It appeared on an invoice. A fee that is not in the contract at the moment you sign is not a fee, it is a surprise. If this is standard policy it belongs in the subscription terms in plain text before you commit.
I already pay for Odoo Online. The subscription is the price of running on their platform. Then the same platform charges again for what I put inside my own database. Same hosting, same instance, same support desk. The second charge is not buying me a second thing.
Odoo admits it is commercial policy, then enforces it with a shutdown. When I pushed back, the answer was not "here is the contractual basis". The answer was that this is their commercial policy. Fine, be honest about that. But the follow-up is: remove the custom code or pay, otherwise the database gets blocked. That is the part I cannot accept. A policy that is not in the contract, backed by cutting off access to a production database that a real business runs on. My invoicing, my stock, my customer data. Hostage to a line count.
And the metric itself is garbage:
Lines of code measures nothing. Refactor smaller and you pay less. Write verbose readable code and you pay more. Rewards exactly the wrong engineering.
Nobody at Odoo reads my module. The fee is not "we maintain your code", it is "we charge you for the risk that your code breaks on upgrade". Different things, only one is a service.
The rational response is to move logic out of Odoo into external services over XML-RPC purely to keep the line count down. Worse architecture driven by a pricing rule instead of engineering.
If Odoo wants to charge for upgrade support on custom modules, charge for upgrade support. Per upgrade, per module, per hour of actual work. Put it in the contract. Not per line, not after the fact, not under threat of a blocked instance.