Stripe Data vs. Open‐Source Alternatives: A MRR Example
github.com
github.com
https://docs.google.com/spreadsheets/d/1wqs3LHNPZsKymxszsmSa...
For my current project, I pay nearly 5-7% on each transaction to Stripe. For my next project, I'm implementing custom billing and using Stripe just as a payment processor.
I'm about to work on payments for a new product, would like to try something new!
If you have a single type of pricing(eg, variable, or tiered) its very easy rolling your own.
The issues happen when you change from variable to tiered(or vice versa), change from anniversary to calendary dates, add coupons, per user custom pricing, credits, etc etc.
I don't recommend building your own if you aren't familiar with Stripe or any other billing system. Once you understand how billing works, feel free to make a custom billing solution.
We support all the edge cases you mentioned around variable/tiered pricing, coupons, etc all part of our solution
- Chargebacks
- Global tax compliance
- Billing support
- Fraud
- Subscription management
Their API is... worse... and it is expensive... but mathing it out it is like 1% for all that peace of mind. Feels worth it.
MoR solutions are a good idea; the tax (F*K VATMOSS Europe) / accounting overhead is likely not worth it. Having a single B2B transaction whenever you want is much easier to deal with.
When your income is large enough that the % you'd be saving let you afford developer time to implement and maintain taxes / billing and extra for accounting of thousands of transactions, then go for it and switch to a cheaper solution.
Let's say you make 100k per year: the 2-3k you save on pure stripe won't pay for the extra developer / accounting time to maintain all that.
Currently we use a processor agnostic billing engine - sticky.io - but they were purchased by private equity and are doing private equity things. Raising prices, charging per transaction fees, etc. Plus, their software and api is downright terrible but it's what we decided on 12 years ago so here we are.
Vendor lock-in sucks. Open to payment stack suggestions.
I previously bootstrapped a business to 30M ARR and was sick of paying the "subscription tax"
We give you all the tools you need to build and run your subscription business without having to integrate a dozen different tools together and tear your hair out (and also break the bank). Feel free to reach out to us via the contact form–we're giving people on HN one year free
Obviously you need to use some third party services, but as soon as your business is viable, always be preparing the ability to switch to competitors.
https://alternativeto.net/software/stripe/
I don’t run any commerce sites, myself, but is there a big difference in using stripe vs a more traditional processor, like working with CardPointe or something?
Feel free to reach out to us and we'll hook you up
It's great to want to charge only a small amount, but this is easily fixed by billing annually and allowing payments through lower-fee payment methods like ACH.
I was in your shoes when I started my business, charging $5/mo. I increased my prices to $10/mo and enabled annual billing (with a $10 discount) and saw MRR grow, both through added sales and increased retention (fewer payments means fewer opportunities for failed payments). And increased revenue on volume, since I pay less in fees.
Scroll down Stripe's pricing page, they will charge you for literally everything.
We have annual pricing and that definitely results in lower fees and other stuff. But only a small percentage of our users are on the annual plan.
I ran into the same issues / frustrations as you when I bootstrapped my previous business to 30M ARR. I hated paying the "Stripe tax" and having vendor lock in with Stripe
Feel free to reach out to us on the website and we'll take care of you with free subscription management for a year
The issue is whether one needs a battleship sized, super flexible, yet expensive billing solution for much smaller problems.
I’m used to store raw data I receive back from payment processing in my own database as transactional events (e.g. renew, cancel, successful and failed payments ) ends up as single events. I do the same for all application events and it is then rather easy for me to get the data as I need it for whatever KPI I want (activity, retention, usage) and for very little overhead while building products.
So I’m wondering, is this a result of all the low-/no-code stuff going on?
And when you get into cohort analysis, it gets a bit messier. Your cohort calculations might be cheap on one user but not across your entire system.
This is often just a question of some very simple data engineering. But you get queries that are "good enough" and "basically are right". So you use them. And they get slower and slower until they take like 10 minutes to run because you're calculating historical app usage data for your bespoke cohort. And then they start taking hours. And then they're just timing out constantly. And then you start fundraising and you do "MRR/ARR vs actual money in/out", and find weird discrepencies (yes you included one-time purchases. Or did you? And your rebates done through the stripe dashboard definitely were captured in your app database right?)
Oh and of course your top sales person has been giving people discount coupons but they were doing it in Stripe instead of in your bespoke system and you weren't properly flowing the data back into your system because of webhooks and now you realize that your MRR is 5% less than it actually is (and it's been like this for 2 years so now you have lied to investors consistently for 2 years).
Nothing is really hard, but it's too easy to get a "close enough" answer and the activation energy to doing this stuff right is just high enough to where people put it off for way too long.
Retrieving the metrics you want from raw data.
The reason it always seemed weird to me is that billing data is just one small portion of a company's data. We had all sorts of data about our users – preferences, demographics, data from marketing campaigns, how they browsed our site, etc, all of which was much more insightful than data about how they paid. Now we didn't have recurring subscriptions which perhaps adds a little value, but Stripe still delivers data via webhook back to your application, and companies still need to keep their application records up to date, so surely most details to compute MRR, churn, etc are already being delivered. Why would you analyse this in Stripe which doesn't have any of your other data?
If a company uses the very high-level Stripe products, and is (or almost) a no-code implementation, perhaps just a Stripe plugin in a Wordpress site, then I can sort of understand it, but what's the value for a company with any sort of custom integration or using any of the lower level products like billing?
The other kind of business that benefits from Sigma is much lower tech than yours, and most likely doesnt have a database or something that can accept webhooks.
Lower tech businesses perhaps, but most of them probably aren't doing data analysis anyway.
Sure you could get and store all of this data from webhooks and into the database, but most product teams don’t want to spend the time implementing this. Keep in mind it’s usually the finance/revenue team that needs this data. They’d rather pay Stripe a couple hundred/thousand dollars and get the data instantly, rather than bugging the product team only to find out the ticket got back burnered.
I have an external script over their API that calculates MRR, and every single tool that calculates MRR has had a different number.
It's actually a huge PITA, although my custom script works well enough.
"I've checked in with our engineering teams, and we unfortunately don't yet have a fix or timeline to share here, though we have made additional progress on scoping a path forward. It's extremely complex on our end, as existing data models don't have the required information in place to make the change here, and we'd need to scope how to add that and backfill data (which we're approaching, but again, no timeline to share as of now)."
Obviously I don't know anything about them internally, but if I can export the data as a CSV-file, and then calculate the MRR myself in GSheets, then what data needs to be backfilled? The data is already available to properly calculate it.
As far as I know, Lago starts in the low thousands per month.
If you go with the self hosted route, you might also just process Stripe's API (backfill using API or data export, use webhooks to keep it up to date). It's actually much easier than onboarding with Lago I would say.
Payment provider lock-in in a scary thing, when they can cancel your account at moment's notice.
MRR = monthly recurring revenue
This is a metric relevant to subscription businesses.
What about the case where recurring transactions fall on the 30th and 31st of each month? They'll be processed on the last day of the month, including February 28. But depending on your time zone, they might actually happen on the first of the subsequent month in _your_ time zone.
You could instead sum up recurring subscription amounts. Do you count trials? What about users who have credit or a balance on their customer object? Are you counting users whose subscription is set to expire at the end of the billing period, but who have already paid for the month?
If you ask 20 people how they should be calculating MRR, you'll probably get at least 10 different answers that produce 10 different numbers. That's why Stripe doesn't offer this as an API.
You usually track MRR based on users who are currently paying for your service (summing recurring subscription amounts, as you put it). Whether their payment falls at the end of the month or is delayed a day to the next month doesn't affect MRR. Most subscriptions must be paid before the billing period begins.
Things like cancellations or chargebacks are counted separately and would not affect past MRR calculations. No you never count free trials. Yes, you count people who have a credit or balance assuming they overpaid to get that balance. If it was just given as a comp, then no.
Yes, you count people who are set to expire until they actually expire and don't renew.
We sync your Stripe data to a data warehouse and give you an MRR by customer by day table. You can use this table in our data connected spreadsheet to report on your business.
The article is correct that calculating MRR is difficult and requires access to your billing data.
I am very skeptical that working with data provided by Lago makes it any easier than working with the data you can get from Sigma or from data pipeline exports.
I don’t have a lot of love for Stripe by any means, but this is poorly argued.
Then Stripe should provide the metric as an API and precalculate it. (They already have as it powers their dashboards, it's just inaccessible via API access.)
It's extremely frustrating that external metrics dashboards report MRR as significantly higher than it actually is.
It makes me distrust and dislike Stripe that such a core figure is absent in their API. There should be zero excuse for not providing it. It's a ridiculous omission.
I've spent too much time trying to solve this and it disappoints me.
It really sucks if you want to have Stripe metrics in front of your team.
If you think it’s easier to calculate MRR with Lago than with data derived from Sigma or the reporting data exports, I suggest showing how it’s done in each case and explaining why Lago’s schema makes it easier.
Arguing that it’s harder on Stripe because if you’re DoorDash you would have to pay a lot of money for Sigma is not honest.
Disclaimer: the example (for the sake of the article) is relatively simple, as it's our first article on this topic, but we're willing to go much deeper, so feedback/inputs are welcome.
Who has subscriptions and when they are charged is now handled in your Lago code.
You can also then mix in other payment processors and regain control of your data.