A Bit of SaaS Weekly: Value Pricing
This is a weekly newsletter on the Software as a Service world. Learning, building, and shipping. Written by Ethan Mick.
A small note and a humble victory – today, I had to pay for the larger plan on Ghost because my newsletter has too many members. I totally forgot this was even a thing when I set it up originally, I never expected to have over 500 people subscribed.
Thank you, each and every one of you. It means the world to me.
The Best Bits
- Supabase had its launch week and released some goodies, including an updated integration with Vercel and database branching.
- Atlas Icons, another icon library. And you thought I was done.
- Backstage.io is a SaaS product that helps internal teams catalog and manage their services. There's literally a SaaS for everything.
- HTMX is a small library that lets you code interactivity right in your HTML. I wouldn't recommend it for serious projects yet, but it is cool.
Thoughts on Pricing Your Product
It came up on stream on how I was planning on charging for Recast, a flat subscription vs a usage-based system. This brought up a couple of good points that I thought were important.
The price you charge is related to the value you provide, not the cost.
Well, at least it should be. Usage-based systems can easily be turned into charging just enough money to cover how much the service costs to run. For example, charging per GB of storage or per conversion a user runs.
The problem with this is that with optimizations, you can get this cost pretty low, so you won't be charging a lot of money. AWS' S3 storage is incredibly cheap, allowing you to store vast amounts of data. But what you are storing might be incredibly valuable, such that if the service were to disappear, you would suffer greatly.
What you are paying for isn't the storage; it's the service. It's the value you provide.
So if you are going to consider usage-based pricing, ensure you are not just covering your costs. Price accordingly to the value your service is delivering.
Usage-based pricing is complicated.
Stay away from complexity as long as you can. And usage-based pricing is more complex than a simple subscription. There is more to keep track of to ensure the billing is accurate.
Not only is it complicated for the developer, but it's complicated for the user. They don't know how much they are going to pay month to month. And having a consistent number is very helpful for accounting and selling into the enterprise. Imagine this conversation both ways:
Them: How much does this cost?
Recast: It's $1,000/mo for the enterprise plan.
Or
Them: How much does this cost?
Recast: Well, it's a flat fee of $200 a month, and then depending on how many conversions you do it'll cost $0.05 per conversion, unless they are videos, then it's $0.1 per minute of footage, or if you use a "premium" API which costs $1 per usage...
You get the point. Wrap it all up, give them an upper limit, and call it a day. It's a win-win.
Learn to Build SaaS
This week I've run two live streams as I build out Recast. There are always a few people who show up, so it's a lot of fun!
Recast is a file conversion SaaS that lets you convert quickly and easily. As I've been working through the project, I've been talking and thinking about the bigger play. Instead of just converting files, the service will start letting you change and mutate the data within the files. Users will be able to build complex flows that can be shared that'll transform their data with no code.
I think there's something in there that could be worth something. It's worth exploring.
Tech Tip
I was playing around with gm
, which is a Node.js library that uses Image Magick to manipulate images. It has an easy-to-use API which is nice. If you're looking to manipulate images from Node, this is a good way to do it. I didn't end up using the library in Recast, so here's what I did:
import GM from 'gm'
const gm = GM.subClass({ imageMagick: '7+' })
gm('example.png')
.stroke('#171717')
.fill('#171717')
.font('inter.ttf', 100)
.gravity('Center')
.drawText(0, 0, 'magick!')
.write('drawing.png', function (err) {
console.log('DONE', err)
if (!err) console.log('done')
})
This snippet reads in an image and then writes "magick!" in the center of it in the Inter font.
Cloud Chronicles
- YouTube Subscribers: 2,627 (+488 🎉🎉🎉 in the last 7 days)
- Newsletter Members: 517 (+38 in the last 7 days)
Okay, this is getting ridiculous. I mean, great! I mean, what. In the last 7 days, I've almost gotten 500 new subscribers. YouTube appears to have rewarded my consistent live stream, even if my video posting is... less than consistent. A majority of my new subs came from the live streams rather than videos.
The algorithm is also showing my content to more people, almost twice as many. That's helping to bring in more people.
It's awesome! And fun. And wild. You all are great; thanks for sticking around.
Last Byte
- Firefox Finally Outperforming Google Chrome In SunSpider. I guess it's time to switch.
- A video game where you are the operating system.
- How to bypass YouTube video download throttling.