Kill Bill – Open-Source Subscription Billing and Payments Platform
github.com
github.com
While it is very nice to own our data, we have had a huge lot of issues with it too.
Beware that this is an "industrial" tool, meaning that it is very complex, written in Java, with a lot of quirks and sharp edges. The core team also seems to mainly work on some closed-source version of it, for some not-very-clear-what big corp(s). They let you know sometimes that there exists a more feature-full closed-source version when asking questions in the support google group or on github issues, but it's not very transparent.
If you are a startup with a small team or small budget and no real Java development skills, you'll probably want to be careful in considering to use it: many custom things you'll want to do will require contracting with one of their partners because it's too complicated to do yourself, and support will be limited, and debugging issues will be hugely complicated if you are not used to that tech stack...
Just this week, we have had a major issue with it: after doing an `apt upgrade`, docker was updated and restarted. It restarted KillBill's docker images fine but KillBill itself restarted only the Stripe plugin, not the Avatax one, for an unknown reason. So the tool happily generated invoices and payments for a few hours without any taxes (!), until we noticed and started the plugin manually from the interface. This is the kind of issues we regularly have to deal with, and while the tool does a good job most of the time, it is mindblowingly annoying sometimes.
> Kill Bill does not support taxes. Instead, we partner with Avalara to outsource tax compliance. Our AvaTax connector provides real-time and on-demand calculationsto prevent overcharging or undercharging tax.
I expected as much. Handling taxes internationally is a major PITA and it changes all the time as politicians get new ideas how to make things even more complicated. I'm pretty sure that many SaaS companies are unknowingly not compliant with all the rules.
Another approach would be to have a programming competition to see who can write the best in-browser, privacy respecting 2022 1040EZ application using nothing but html, css, svg, and javascript[0]. The end product should be capable of saving its state as a single json object, and producing a usable PDF. One might host such an application as a public utility. A good test suite would model the 1040 historically to make sure the app can reach all states characteristic of the problem, and produce the correct result. On macos you might want to bundle it all in an app, include Chrome, the resources, the data and any generated PDFs.
This would be relatively low-effort and could have real impact on, e.g., TurboTax. Heck, I'd use it. I bet a lot of people here would. Here (https://github.com/b-k/1040.js) is one person who took a serious stab at a part of this, the calculations themselves!
0 - Someone is also taking a stab at this: https://github.com/Free1040/Free1040
Now, the obvious answer then is that for most online stores, somebody picks a product classification at random or relies on a third-party service that matches a product description to a classification. Most of the time, getting it wrong has few consequences unless you’ve been informed of the problematic item and the same government sees a misclassification more than once, or wants to make a point with your shipment vs others. After all, saying others get away with it doesn’t absolve your need to try and get declarations and duties correct.
Now, I’m not going to say that there isn’t room for open source here, I could totally see how making, for example, an AI that can look at product description and product appearance and try to classify it for duties would be amazing work if done in open source. I’m just pointing out that the topic is complicated, especially when considering that the same item might have different duties if manufactured in different locations or sold under different circumstances.
Governments are unbelievably complicated even as their systems still don’t mirror or match the real world correctly.
As for the classification, it gets complicated. Sometimes it goes beyond what the product is at the moment of the importation. Say you're shipping fruits, well depending on whether they're for eating as-is, or for juicing once imported, the classification (and thus the import duties) will be different. It's also hard to classify a product that's hybrid (like a ceiling fan with a LED light, is it a fan or a pendant light ?) or a brand new kind of product.
If you have a doubt, you can ask the customs to find the right origin or classification for you, though you might not be happy with the duties they apply. But mostly, it takes weeks to get one and I've seen companies doing their declaration just the day before their shipment arrives.
And even then, different customs officers might classify the same products differently even though they work in the same economic union.
> Companies often pick the lowest duty or tax rating they can get away with
I've seen companies picking the highest duty when they have a doubt, thinking they might get less in trouble or at least don't have to pay the difference if they get caught. Because when they do, the customs can audit your whole import history, and make you pay the difference for every product misclassified (iirc they can go back up to five years) and that can be devastating.
In general, from what I've seen, the task of product classification is so hard that no time is spent trying to optimize sourcing or the nature of the product to pay less duties. In a company the department in charge of customs declarations is always seen as a cost center. The only example I know is Converse importing their sneakers as slippers[1].
And not only is the problem complicated, but some of the most important documentation is only available on subscription. The EU has an open-data policy and a most data on duties can be found[2]. But the World Customs Organization makes you pay for a lot of essential information that can't be reproduced[3].
[1] https://www.businessinsider.com/heres-why-converse-sneakers-...
[2] https://circabc.europa.eu/ui/group/0e5f18c2-4b2f-42e9-aed4-d...
There is no open RSS/XML/API feed you can subscribe to from each country to get an update of their accounting rules. You have to constantly monitor all news from all over the world. This is labor intensive. The only solution is a network of local tax specialists. Like the big-4 accounting firms have.
At least I tried to compile the VAT rates: https://github.com/kdeldycke/vat-rates
You just gave the answer. Gov tax agencies need to provide an API that devs can use.
The US lobbying situation is I think more of an outlier.
Hell, even if an open source project _did_ successfully create and set up a community to maintain that, I bet you could make a profitable business on top of it just by insuring/indemnifying enterprise customers who use your version of it as a SaaS offering. (Something Amazon could easily do...)
I'm pretty sure quite a few industries make money by simply assuming responsibility.
99.9% correct is better than what 75% of us have now.
The problem is not that Avalara costs money. The real issue is that most companies that claim to "deal with tax compliance issues" actually don't. I tried using some in the past, and none worked correctly for my region (EU/Poland).
The second problem is that you can't really "outsource tax compliance", because there is no clear cutoff line that you can point to. Taking my region as an example, I need invoicing with not just correct rates, but also compliant SAF-T export (JPK Faktura) and soon an interface to the electronic invoicing system that is being built by the government (KSeF), and an export to some of the formats used by accounting companies. And compliant invoicing here (especially on VAT issues) is no joke. You really need this to be perfect.
I run a B2B SaaS and I wish I could outsource all of my subscription billing and invoicing. It's causing me tons of pain. But I haven't found a way to do that.
On a side note, I don't even consider doing B2C sales, because VAT compliance on those in the EU is such a nightmare.
And.. this is just the tip of the iceburg.
Also, we've deprecated JRuby support. Plugins are either written in Java or in other languages through grpc shims (e.g. Go).
1. Started at the homepage, clicked "Start Now" at the top right. It lands on a page called /download/.
2. The word download is nowhere to be seen on that page, but, the third box in the row is "On premise", and has a "Select plan" which redirects to https://github.com/sponsors/killbill.
3. We land on the Github sponsors page for the org. The repository is listed below.
Yeesh, that was a trip of obfuscation.
But yeah, not emphasizing their GitHub page is an interesting choice, maybe they figure that their audience isn’t developers? Although many of the reviews are from technical people, so that doesn’t make sense either.
The trouble was finding a processor that actually knew what it meant to import the raw credit card numbers (because stripe wouldn't send it to me). But I found one and it all worked out.
Who?
Good name as well. Catchy!
It moved away from 0.x around 6 years ago
React Native is still 0.x, since 2015!
> Major version X (X.y.z | X > 0) MUST be incremented if any backwards incompatible changes are introduced to the public API. It MAY also include minor and patch level changes. Patch and minor versions MUST be reset to 0 when major version is incremented.
> Major version zero (0.y.z) is for initial development. Anything MAY change at any time. The public API SHOULD NOT be considered stable.
We use even minor versions for LTS releases (e.g. 0.22.x) and odd versions for dev releases (e.g. 0.23.x). Kill Bill is very much stable now :-)
Apache Kafka was named after Franz Kafka, who lived as an author in turn-of-the-20th-century Austria. Like the project named after him, he was slow to start, inconsistent in delivery, and left a mess of unpublished work after a tragically early death.
Competition breeds innovation
For now there are ONLY 2 (non stupid) alternatives that do that dirty work for you:
- itch.io for one time products. (you could make manual subscriptions here redirecting your users every month/year)
- gumroad.com for subscriptions.
itch takes down to card fees only. gumroad takes more but it scales down as you earn more reaching parity at 30 cents + 2.9% per transaction if your lifetime earnings are $1+ million.
I doubt any of the integrations this open-source project offers will be so much better that it makes it worth the global VAT overhead?
https://docs.killbill.io/latest/plugin_introduction.html#_li...
oh I see it uses docker, noice https://docs.killbill.io/latest/getting_started.html#_docker
https://docs.killbill.io/latest/userguide_payment.html
No thanks - I'll just use a payment processor that has a good API for subscription billing, and a flag on my users table that the subscription is up to date.
I know of ~20 integrations with more advanced gateways/processors: these are closed-source plugins, but the overall community wouldn't benefit much from accessing them (e.g. it doesn't make sense for many companies to directly integrate with mastercard APIs).
tl;dr: there is no easy part
I do agree this would be something a fully commercial project would/should focus on.
But I think people shouldn't hold back criticism either just because something is free or open source. Stability AI (Stable Diffusion) just sold out and took $100 million from investors after being open source. Even if they're providing something altruistically now you never know if that will change after VC, buyout offer, or some other event.
Not a lot of products can do this, which means we're going to use redis (or it's ilk) as a cache for subscription information. However, there doesn't seem to be a supported way to subscribe to changes to subscriptions. Is that a roadmap feature or is something that "we should do ourselves?"
https://feedback.equinixmetal.com/changelog/new-kill-bill-bi...
As for Killbill being overkill.. I think that running/managing your own payment/subscription service behind the scenes probably isn't something you want to spend your time doing, nor would your customers want you spending your time on. Search google for "SaaS billing" and you'll find plenty of options to choose from.
It takes 1 or 2 days to integrate into your app [1] and you more or less never have to deal with it again (i.e. very low maintenance/administration).
I also think it's worth learning just to have an understanding of how online payment works.
--
[1]: 1 day for a basic subscription model, with granting or removing access when the payment succeeded or failed or the period is over and a new payment hasn't been done.
Maybe 2 days if you want to handle different plans (e.g. free, basic, pro) giving access to different features, and also like a 14 days free trial.
Other competitors in that space include Fastspring and Revin.
You also get to manage the data and where it resides, if that is important to you.
Stripe billing is .5%, Invoicing .4%, Tax .5%, Rev Rec .25%, etc.
Products like Checkout are included in your prevailing rate (2.9% or whatever).
My experience with the product has been that it has made very clear attempts to provide the user ID for SaaS implementations of the payments system.
I first heard of someone who was using stripe to store all user data on the Running in Production podcast, I thought they were nuts.
But then I went to reimplement the services this year due to the deprecation the "legacy" popover modal on Checkoit.
The new version seems more about locking builders to stripe than it is about anti-fraud, checkout UX or developer experience.
It’s subtle but can be discerned from the implementation details and docs or lack thereof. In that way I would suggest the company has made some insidious decisions about the product.
On one hand, it’s hard to blame them, because before their API could be replicated and swapped out like S3.
They love this project and what they do.
I actually just ran into the need to bypass Stripe rebill recently. Ultimately a workaround was found, yet sometimes you really just need more control.
* Lower cost (just pay for payment processing, not the subscription features) * Ability to integrate with multiple gateways (to lower cost, support more payment instruments, higher resiliency, etc.) * More advanced subscription features * Ability to customize the system through custom code (plugins) * Data ownership (easier to run analytics reports, since you own the subscription data)
Lots of marketing and no substantial information
Thanks!
Also, to be fair, a big part of the slowness is also the tooling, Spring Boot, Hibernate etc. You can mitigate that by using micronaut or exposed/krush, but we only have a microservice running on that. The main business logic is the classic java web stack. Tests, running the app, building takes forever.
I don't have any empirical evidence, just experience. As such I'm very biased against it.
W/ Graal as well, the AOT compilation comes 90% of JIT performance.
I really think the JVM is an exciting eco-system that has a very bright future if it keeps going the way it is. Brian Goetz' "Paving the on-ramp" discusses how to reduce the boilerplate even further. So these things are definitely a priority for the Java/JVM team[0].
[0]: https://openjdk.org/projects/amber/design-notes/on-ramp
edit: IIRC the official Java runtime auto-update happily upgraded to not-even-free-as-in-beer pretty nonchalantly.
[0]: https://www.mend.io/resources/blog/top-9-gpl-with-the-classp...
Actually, here's a small contribution: I do not work with web apps or nowhere near this kind of development (yeah, I also wonder why I'm a regular at HN), or have a use to the end product, but the name and logo grabbed my attention enough to click the link, see the discussion and read the front page. There's power to clever branding.
Perhaps "ironic" would be a better word. :-)
ironic: adjective, happening in the opposite way to what is expected, and typically causing wry amusement because of this.
a name that makes people go "hmm that's a bit odd" is actually a very efficient way to get people to remember it next time they need them.