Reporting for Paid Plugins  General

Reporting for Paid Plugins

This post introduces a software tool, which generates reports for paid plugins on the JetBrains marketplace. See the monthly churn of your customers, the recurring annual revenue (ARR), the number of active customers you have, and more.

Introduction

Here’s a PDF with randomly generated data to show what the report contains.

I took a longer break from writing articles because I was working on BashSupport Pro. This is a paid plugin on the JetBrains marketplace. It’s the successor of the legacy BashSupport plugin. This post is probably only useful if you’re working on a paid plugin.

Lessons Learned

It’s taking a LOT of time, the debugger is your friend, and write tests!

So far, I’ve spent more than 1,200 hours on BashSupport Pro. I didn’t track how many hours I’ve lost due to my own stupidity ;-)

The biggest chunk is, obviously, feature development. The most time–consuming features were:

  1. Resolving.
    Shell scripts have a rather complex model. For me, adding references and the related features like rename and usage search, has always has been time–consuming. Doing it right and good enough for production takes a lot of time.
    Writing tests for each new issue is one of the best things you can do here – regressions always try to sneak back into your code.
  2. Debugger integration.
    This was my first debugger integration – the first time always seems to need a lot of extra time. The API is pretty much undocumented and writing this needed a lot of digging into the intellij-community sources and hours spent with the debugger.
  3. Run configurations.
    This wasn’t my first time implementing run configurations. BashSupport Pro supports its own configurations and also supports the legacy BashSupport run configurations. JetBrains Shell’s configurations are supported, too. This is a rather complex approach and needed quite some time to get this right.
    Hooray for tests!
  4. Test runner integration.
    This is similar to the debugger: my first time implementing this, and a complex, pretty much undocumented API. The debugger is now a close friend of mine ;-)
  5. Language injection.
    I had to rewrite this several times until the fragment editor worked with the rather complex escaping rules of Bash. Language injection is very powerful, but feels complex and fragile.
    In the end, the Kotlin plugin’s implementation helped to get this right. Its use of empty injection ranges was very helpful to me.

All the topics above are great candidates for followup articles – send me now which topic you’d like to see covered first.

Reporting

You’ll want to know how your plugin is doing, after you’ve published it.

The JetBrains marketplace displays basic information: total downloads, unique downloads, and sales. Downloads can be grouped by day, week, year, and product. Sales can be grouped by day, week, month, and country.

This isn’t enough for what I need. I wanted to know the following:

  • Which subscriptions are bought the most?
  • Which customers buy the most?
  • How many active customers do I have?
  • How many customers have I lost along the way (i.e. monthly churn)?
  • Which fees have I already paid to JetBrains?
  • What’s my annual revenue (i.e. ARR)?
  • Is there a relation between downloads and sales?

All of this is very hard to tell from the marketplace pages.

I decided to write a small tool, which generates reports to answer my questions.

The marketplace-stats Tool

You can find the software at github.com/jansorg/marketplace-stats. It’s written in Golang – sorry, no Java/Kotlin, I prefer Golang for small, self–contained tools.

Pre—built binaries are available on the releases page. They should work, but I haven’t tested them extensively.

The tool is using the marketplace REST api. Please note, that it’s using requests, which are part of a temporary API. The tool may break in the future, but should be easy to fix.

I hope that this will help everyone else, too. In the end, a flourishing marketplace is good for my and your paid plugins. I’m not planning to implement features for others, which aren’t useful to me. But, please, feel free to submit pull requests with your changes.

Limitations

My design skills are limited, so the report isn’t pretty. It should render and print well, though. I only have limited time for tools like this, so there’s no full test coverage. The graph should’ve been a bar chart, but that’s for later. Monthly churn and ARR should be reasonable, but at last for ARR there are different ways to come up with that number.

Random Facts on BashSupport Pro

Personally, I’m using both the JetBrains sales page and this report.

Some random facts from the report on BashSupport Pro:

  • The top 3 countries are the United States (37%), Germany (14%), and Canada (4%).
  • 96% of total sales come from annual subscriptions.
  • 73% of total sales are by individuals. But organizations dominate the list of “Total Sales By Customer”.
  • The oldest customer has an id lower than 11,000. This hopefully means that I’m not totally wrong, when a very early customer of JetBrains buys a license ;)

Summary

I hope that this helps with your development. I’d be glad for feedback and how you’re tracking the progress of your own paid plugins.