Building Plausible: March 2020 recap
March has been one of the weirdest months in my life. I had a week-long holiday in France just before most countries went into lockdown due to the coronavirus outbreak. I flew back to Estonia 2 days before the borders were closed. Having flown through Geneva airport, I had to strictly self-quarantine for 14 days.
Later it turned out that 3 people from my flight tested positive for the virus. I showed no symptoms so I never got tested, although it’s possible I had an asymptomatic case.
I’ve learned to enjoy the lockdown by now. My partner and I moved our stuff to a cabin my family has in Estonian wilderness. I’ve been processing firewood, pruning fruit trees, propagating berry bushes, and generally learned a lot about living in the country. We’re staying here with my brother and his family so at least there’s some sense of community.
I’m working on Plausible normally. Here’s what went down in March:
- 🍪 Plausible is now cookie-free by default. More information below.
- 🤜🤛 No longer a solo project More information below.
- 💵 MRR: $415 (+3%): Slow month for revenue growth. I think it’s too early to tell whether the virus situation is affecting our sales.
- 👩 2.4k visitors (+42%): Plausile got a big bump from the launch of opensource.builders
Cookie-free analytics by default
How does unique user counting work without cookies? To approximate the count, we can count the number of unique IP addresses instead of setting a user id in a cookie. Of course there are problems with this:
- IP addresses are considered personal data under GDPR
- Network Address Translation gives multiple people the same IP address
- On a mobile device you are constantly going through multiple IP addresses
I don’t want to store any personal data, so the only way I could store IP addresses is by scrambling them with a one-way hash function. Hashing makes it impossible to recover the raw data that went into it.
To deal with Network Address Translation, I add the
User-Agent string to the hash. When two visitors share an IP address, it’s quite rare for them to also share the exact same
User-Agent. As with the IP address, the raw string is discarded and only the hash is kept.
Unfortunately there’s nothing I can do about problem 3. When someone’s IP address changes, they will be counted as a new visitor with Plausible. This is a tradeoff I had to make to be able to provide analytics without cookies.
Finally, here’s what the derived user ids look like:
hash(ip_address + user_agent + website_domain)
I compared using this uniqueness key with numbers I got from cookie-based visitor counting and I have to say it’s remarkably accurate. Total unique visitor counts were within 10% error range with hash-based counting usually showing lower numbers. Overall, I’m happy with this approach because I expected a big loss in accuracy. Turns out, counting IP addresses is not much less accurate than using cookies.
For the last two weeks I’ve been working with Marko who is a professional marketer. He has already improved the onboarding email sequences, he wrote the new landing page copy as well as some articles we’re just putting up on the website. Keep your eyes peeled for some awesome content on the blog and social media going forward.
I believe that marketing is just as important, if not more important than the product itself. Marko’s experience will be crucial to the future of the project as it fills a big gap in my abilities. I’m very excited to see what we can accomplish together.
Plans for April
I believe we’ll stay in marketing mode for most of April. I have a long backlog of tasks to optimize the landing page for SEO and to improve the conversion rate.
Doing this work on Plausible itself will be an interesting case of eating our own dogfood. I’m sure there will be gaps in our analytics that we will miss. Marko and I will probably conduct a little workshop in April to figure out what stats we would like to see on the Plausible site itself and we’ll make sure to loop everyone in through our open roadmap.
Stay tuned for another update in a month. Meanwhile, take care of yourself in these trying times.