The story of A Web Whiteboard

Last month, after successful transition of our users to Miro, I shut down the public servers of A Web Whiteboard (AWW App), marking the end chapter of a decade long story.

Throughout, millions of users have collectively spent a millennia drawing, learning, collaborating, and just having fun with AWW. It's been used in schools, FAANGs and everywhere in between. Early in 2021 we joined forces with Miro, the world's leading online whiteboard platform.

The start of the story is much humbler. I never intended or even imagined it would be a success it has been.

Origins

Ten years ago, back in 2011, netbooks were all the craze. What started some six years earlier with EeePC turned into an entire product category with Cambrian explosion of options. I got my hands on one with a curious feature – a touchscreen. At the time, system UI wasn't at all suited for clumsy fingers instead of precision controlled mouse pointer.

So there I was, back in 2011, trying to find a simple, nice, drawing program for Linux that would work well, UI-wise, with touchscreens. I didn't find any so decided to write my own. I took this as an opportunity to learn HTML <canvas> and write it as a web app.

It was all pretty rudimentary. You had a pencil in a few colors, eraser, and ability to clean the entire canvas. This first version even lacked the ability to save the result – you could always screenshot the page if you wanted to save.

This wasn't even a side project at the time – just a fun experiment. For kicks, I decided to put it up online and, after thinking for a whole two seconds, named it A Web Whiteboard. Since aww.com was taken, I used awwapp.com for the domain (nameapp.com was a popular way of getting around the domain name squatters at the time).

Sharing

A few months in, someone mentioned it'd be cool if you could actually have multiple people drawing at the same time. I took the suggestion an opportunity to again dabble in new tech. At the time, websockets were just being entering mainstream use and Node was starting its meteoric rise, so I selected it for the synchronization backend and now all-but-forgotten RPC-over-sockets library called nowjs. Being primarily a Python developer, I kept to at least something familiar, using Flask for saving the board contents.

This is how it looked like:

First public version

I spread the word around, got some mention in the press and received positive feedback, including on Hacker News and Reddit. There weren't many users back then (the whole thing comfortably fit in RAM of a rather small VPS), but each time users gathered to draw together, or shared a saved drawing on social media, more people heard about AWW.

After the launch, I maintained AWW but treated it as a side hobby, and for a couple of years most of my focus was on other things.

Embedding

One thing I did from the start is organize AWW as whiteboard widget that could be embedded into other sites, with awwapp.com being just one of the sites that embedded it.

When I started getting requests to let people add it to their sites, it was easy to do. I set up a PayPal subscribe button and wrote up a simple doc on how to embed the widget. When someone subscribed, I'd add them to the accounts “database” (actually a JSON file) and gave them an unique API key to embed with.

To add whiteboard to their sites, my customers would include jQuery and add the following snippet:

<div id="wrapper" style="width: 800px; height: 600px;"></div>
<script src="http://static.awwapp.com/plugin/1.0/aww.min.js"></script>
<script>
    $('#wrapper').awwCanvas({apiKey: YOUR_API_KEY});
</script>

After a time, this netted me a few hundred bucks a month, which was nice but nothing I'd base my business on – or so I thought.

I also started getting more and more serious questions about using the whiteboard on awwapp.com for business, tutoring, etc, as well as feature requests. Most of my customers were tutors using it together with Skype to provide online lessons to their students. They often didn't have a site to embed the whiteboard on, were happy to use awwapp.com version and willing to pay for it.

The rewrite

As I started treating AWW as a viable business in its own right, I started thinking about rewriting it.

The old JSON file approach was getting unwieldy, as was the fact that all active board were being kept in memory, limiting growth. Finally, the old nowjs framework was unmaintained meaning we were stuck on an extremely old Node version (0.6 if I remember correctly).

I decided on a full rewrite with redesigned architecture and using modern (for the time!) JavaScript features – stuff like promises, the socket.io library and using code bundler tools. For database we selected MongoDB, primarily for ease of use and ease of clustering/failover. We also switched from a single server (and thus single-point-of-failure) to a load-balanced system with full failover (using haproxy for web server load balancing).

This was an explosion in ops complexity. Mostly warranted, but I definitely over-engineered some things, and hit many of the novice mistakes when scaling out.

We started the rewrite in the summer of 2014 and deployed the new version in spring of 2015. I say “we” because I had help – this was now a proper project internal to my dev agency with more people involved. However it still wasn't a priority and was done at off-times and between client projects.

The rewrite looked similar to the original

With the new version, we were finally able to sign up users directly on awwapp.com, again using PayPal subscriptions. We followed the freemium model, in which most of the functionality was free, but you could pay for some additionally useful features.

Ease of use

Throughout entire lifetime of AWW, I had one major focus, sometimes to the detriment of other aspects of the app: it had to be easy to use. Really easy to use. So easy a child could use it.

We did that successfully – in fact, many children did use it in kindergarten and preschool. It was great seeing pictures teachers shared of kids doing a collaborative class, or exploring maths using our whiteboard. “This is why I'm doing this”, I'd say.

For example, to start drawing on AWW you only had to click one button, labelled Start drawing, and less than a second later, you're drawing. And the only reason there was some text and a button to click first, was so people coming first time to AWW knew what the site was about! Before this, people coming up on an empty board were sometimes confusing what that was for.

Word of mouth

One thing we didn't do (except in a small experiment at the start with StumbleUpon) until much later, is promote or advertise AWW. In fact, I did hardly any outreach at all.

Virtually all of the (slow and steady) growth was entirely through word of mouth – our users telling others about us. This was helped by the fact that AWW is a collaboration platform, so users naturally wanted to share the drawing activity or results with others.

Combined with the ease of use and the fact most of the features were free, this made AWW a favorite whiteboard for many teachers and tutors. They were telling each other about it, featuring it in teacher seminars and doing video tutorials on it! This showed me how important and useful AWW was for a growing number of people and really warmed my heart.

Spinning off into a separate startup

Usage slowly but steadily grew over the years, to the point that there was simply too much to do on maintenance, customer support, inbound sales and further development, to treat AWW as a side-project.

I also realized that, as a technical person, I should get new people on board that will have “skin in the game”, a fresh perspective and complementary set of skills such as business development, sales.

I met Zvonimir at local startup event where he was just describing the challenges of his previous startup attempt. Zvonimir had tech chops and biz acumen in equal amount, combined with startup experience, but what I most liked was the levelheadedness when thinking about the realities of building (and selling!) a product in an uncertain environment.

We hit it off immediately and after some time I managed to convince him to join me as a cofounder. I consider this to be the best decision (and best sale!) I made throughout the development on AWW.

We spun off AWW as a separate startup in late 2016, incorporated it in the US using Stripe Atlas, brought several more people on board (a developer, a designer, and a marketing/support person) and set to work. We had three priorities:

The plan

First, to figure out who our users were, why they used us and what we can do to make us more useful to them. This involved identifying different markets we were playing in, such as EdTech, enterprise collaboration, etc. Up until that point we “lucked out” in that our product was useful – now we set to deliberately discover our customers and optimize our approach (feature set and messaging) towards them.

Secondly, to improve our user experience. AWW was simple and easy to use, but not so simple to figure out all the capabilities it had, or indeed why you'd want to pay for it. The more advanced “premium” functionality was hidden away unless you were a premium user, so many of our free users didn't even realize there was more to it.

The new UI

Also, as our features and supported use cases grew (and were expected to grow much further), bolting them onto the old interface made it more and more clunky over time. We set out to rethink the UI from scratch, still respecting our old imperatives (simplicity) but incorporating the lessons learned.

Third priority was to start working on our marketing, sales and business development, and to improve our customer support.

Up until then, customer support meant me answering email questions with a few days' delay. We aimed to lower the reply time to within a business day and to be active on more channels, such as Twitter and Facebook.

The online presence tied in to marketing. We didn't do any advertising, aside from a few experiments to test the waters and measure potential interest for various whiteboarding use cases. However, we did want to be present on Twitter, Facebook, LinkedIn, reaching out to blogs reviewing us, talk with teachers recommending us in workshops, and this tied in nicely with the customer relations part of the plan.

The funding

Now we were in business. We had several people and everyone worked exclusively on AWW, except me. I spent half my time on AWW and half managing my software development agency GoodCode.

Even though Croatian salaries are nowhere near US (and especially Silicon Valley) ones, having more people still meant more expenses. What was previously a profitable side project now turned into a startup that wasn't yet ramen profitable. I was funding the startup from the profits from my agency so we didn't need to worry about runway for the time being, but were still open to investments.

Our rough plan was to ramp up the product and get to profitability within twelwe months. Of course we hoped for much more – our valiant efforts will result in a hockey-stick growth and back to black in three months and then sky's the limit!

That, of course, didn't happen.

YC School

At that time we applied to several accelerators, including YC, but didn't get in. Though one of the reasons was for funding, our primary reason was the advice, learning experience, networking and fresh ideas.

We also applied to the first YC Startup School in 2017 and did get in! The online MOOC-style course combining online video lectures, weekly check-ins, discussions with mentors and our fellow founders were phenomenal. I imagine the intensity is nowhere near a “full” YC experience, but it was tremendously helpful for us.

YC Startup School Completion Certificate

First, the weekly check-ins did wonders for our accountability. We had metrics before and we did look at what we've achieved (or not) previously, but not in as critical and clear way we had to for Startup School. We soon found out our old non-actionable vanity metrics were pretty much worthless and that we didn't even have an easy way to get to the right numbers. Focusing on the real was like wiping your glasses (or the window) and actually seeing what was going on.

Weekly discussions were as valuable. We received (and gave out) thoughtful and probing questions which made us reflect on our implicit assumptions and ways of thinking. Here's an example: late in the batch, we were talking about monetization problem since the vast majority of our users were free users. We didn't want to turn cripple AWW free functionality but couldn't find a compelling reason for many of them to upgrade. Our mentor asked us point-blank: “I know you're against putting ads there, but why not give it a shot and see what happens?”

The ads

This wasn't new idea. This was pretty old idea that I shot down time and again because as a consumer I dislike ads, especially the creepy follow-you-around targeted kind, and I subscribe to the “if you're not paying for the product, you're the product” line of thought. I also thought ads would clutter useful screen estate – on a whiteboard, you want the whiteboard area to be as large as possible. So I always dismissed this idea without a second though, and even my cofounder didn't convince me otherwise.

But this question at the Startup School office hours got us thinking. Can we do it in a way that wouldn't screw up the experience? Perhaps. We didn't jump to it straight away but the idea kept simmering in the back of our minds.

Finally, in the spring of 2018, we gave it a go. The idea was simple: free users get ads. Subscribe and besides getting all the premium features, you also get rid of ads. The rationale was that a lot of people don't actually mind ads for free stuff and for those that do, well, there's an easy way to remove them. This sounds like such a simple concept but it took us a lot of time to internalize all the rationale and the consequences of this decision.

We implemented Google Adsense in early 2018 and after a few weeks of wildly erratic earnings, it settled down to a pretty low value, with a lot of traffic showing as invalid. To this day I'm not exactly sure what was the reason.

I suspect it was some combination of us testing the ads on only 10% of users to begin with, screwing up the ad placement implementation (there were initial app modal dialogs that were showing above the ads in the first few seconds), and ad rotation (our users were on the same page for extended period of time and showing the same ad for 15 minutes makes no sense).

One by one we fixed these perceived problems. It took very long time for the invalid traffic ratio to lower down (from 50% of ads shown to some 10% of total).

In the end, ads were bringing in about a fifth of our revenue, but they also increased our conversion rate (free to paying users), and haven't materially dented our growth (users leaving in frustration because of ads was my biggest fear).

Chasm

Late 2018 was a rough time for AWW. About two years of talking to customers, building, measuring, revamping the product and the UI didn't produce the hockey-stick we were aiming for. Not even the “reasonable” 4x-5x growth we expected at the least. We were growing – but very slowly.

What did we do wrong? Maybe we didn't focus narrowly enough (we still catered to EdTech, small business users, other apps embedding us and even had an on-premises enterprise offering). Maybe we weren't aggressive enough in customer acquisition (inbound sales only, no advertising). Me spending just half of my time on the startup certainly didn't help.

We had some tough decisions to make. After a lot of soul searching we decided to trim down, letting everyone go, with Zvonimir and me staying to work on it part-time. Most of our time we spent on customer relations, inbound sales and maintaining the service.

Without our noticing it, the service still grew, though. In retrospect, we did good work on a number of things back in 2017, it just took a lot more time for the effects to become visible. By the end of 2019 we approached triple the revenue numbers from 2017 (on a slower user growth).

Preparing to sell

Okay so it wasn't a rocket to the moon we hoped for, but AWW was still a nice little side business. Trouble was, both of us also had other businesses to attend to and couldn't keep up focus both on the new ventures and AWW indefinitely – something had to go. We also didn't want to shut it down, so we started thinking about selling it.

We researched and interviewed several online business brokers and decided to go with FE International, partly on the strength of patio11's recommendations.

Preparations for going to market involved us compiling detailed financials for the previous few years, as well as answering a questionnaire about the business itself, the customers, competition, reasons for selling, and so on.

After we provided this information, FEI prepared a go-to-market prospectus (a sales brochure), we okayed it and they started reaching to their network. This preparation took several months, so by the start of March 2020. we were on the market.

In two weeks, everything changed.

The world moves online

With the pandemic surging everywhere, much of the western world started shutting down or going online. Schools started adapting their curriculum for online, businesses went full work-from-home. Everyone was on Zoom, Teams, and Meet.

Every online productivity and collaboration tool imaginable started seeing their usage numbers surge. This also happened to us. Teachers, school district IT departments, businesses, started signing up in droves.

Our user numbers, customer numbers, number of shared whiteboards, revenue – basically every important metric – skyrocketed. We were up 6x (that's 600%) by end of April compared to mid-March, and the growth didn't stop there.

We were profiting from the situation, but also wanted to help. We set up a policy to give free premium access to any educational institution until the end of the school year. Besides being a decent thing to do, we figured (correctly) it would convince many schools to stay with us the next year.

The mad IT scramble

Our systems were woefully unprovisioned for the sudden increase in load. We started provisioning new servers left and right but soon found out there were bottlenecks in how the system was organized that prevented taking full advantage of horizontal scaling.

Examples were having many smaller (unsharded) MongoDB replicas in a set instead of using fewer larger-capacity servers, having database interconnect latencies that caused MongoDB queries to be dispatched unevenly across the servers.

Then there were the sloppy things that went unnoticed for years on a smaller load, such as not cleaning up Redis temporary keys quickly enough (leading to our Redis servers quickly using up any amount of memory we threw at them), using a few database queries where a single (complex) one might do the trick, or our indexes not matching the actual usage patterns.

And then there were the subtle bugs and edge cases. As the saying goes, if you have a million users, million-in-one bugs are a daily occurrence. Although AWW is designed to gracefully withstand shorter connection problems, this didn't always work flawlessly and sometimes even increased the problem by hammering the servers too much when they were already under heavy load.

Our platform providers had their own woes. With everyone buying or renting any capacity they could get their hands on, the platforms themselves become less stable. We were hosted on Digital Ocean and although they're in general great as a platform (and I have virtually all my other stuff there), we were plagued for months by strange intermittent issues where a system of ours would just lock up under moderate load.

Lots of investigation, together with the engineering team on Digital Ocean's side, yielded no specific results, except that issues were related to the “shared” type droplets (servers) we were mostly using at the time. Switching to “dedicated” droplets helped a bit, but didn't eliminate the issue. Whether it was something we did, or there was a just a capacity and noisy neighbor problem, we'll never know. In the end, we resulted to rebooting any droplets showing signs of being locked up.

Droplet rebooting

Growing the team

Everyone has their “what did you do when the pandemic hit” story. Mine was holed up in the attic-turned-home-office in front of a computer, madly trying to keep the system running, both excited and terrified. Days were a blur – I don't remember much of anything else until some time at the end of April.

When the pandemic hit, both Zvonimir and me had other work obligations. We couldn't just drop those at a moment's notice, so for weeks we put in required hours on those obligations and every other waking moment on AWW.

It still wasn't enough. Especially the support tickets (combining the questions about our service and signing up, and problem reports) were overwhelming. I remember powering through them late at night, going to sleep, waking up early morning (usually by some server alarm going off) and then seeing another few hours' worth of tickets already waiting.

It took us about a week to decide to grow the team, and then find, hire and onboard a dedicated support person. She was able to handle most of the questions from users while escalating to us stuff like bug reports, bizdev/sales questions and other more complex inquiries.

This finally gave us some breathing room and ability to focus on the business (Zvonimir) and tech (myself) matters. In the coming months we hired another support person, two developers and a part-time designer.

Growing the business

While I was busy scaling up our tech, Zvonimir spent most of his time on Zoom calls, talking to our customers and prospective customers. Whereas previously most of our users and customers were individuals, now organizations of varying sizes were knocking on our door.

We tweaked our bigger pricing plans to better match what people were asking us for. With bigger enterprises now knocking on our door, things like service-level agreements (SLAs) and standard operating procedure (SOP) documentation needed to be set up and addressed before bigger companies could roll us out to their teams.

All of this took enormous amount of time. Deals still took weeks or months from initial contact to implementation. All of it was inbound interest but there was a lot of work for every bigger deal. Had we had a dedicated smooth-running biz team, I'm sure we would have grown twice as fast or more.

No matter. Even with a small team, by end of 2020 we've grown 10x, and that includes lull summer months when most of the EdTech activity is subdued.

To sell or not to sell?

Our explosive growth started just as were about to put ourselves on the market. Almost immediately, the old numbers didn't make sense. Users, revenue, growth numbers were nothing like the ones used to calculate a (target) sale price.

In the next several weeks we did receive several offers that would've been interesting before the growth started, but didn't make sense in the new environment. We decided to put the sale on pause until the numbers became more predictable and for the next few months didn't think about it.

By mid-summer the growth stabilized – we were still growing, but at a bit more predictable pace – so we revisited the idea to sell, as we still had a (paused) contract with our brokers.

Based on our experience, selling via brokers is easier if there's a flat or consistent small growth where future can be easily extrapolated. Coming up with the price then involves tallying up income and expenses and multiplying with a factor you come up from experience and rules of thumb.

In our case, growth was triple-digit, virtually all of the expenses were investments into growth so this pricing model breaks down. We adapted the model, updated the numbers and went to market again. Zvonimir had by that time learned the nitty-gritty details of company valuation and had actually provided the final calculation himself.

Ultimately, we haven't received any credible offers for the updated price and since we weren't under any pressure to sell, we decided not to.

Miro

Earlier in 2020, Miro had raised $50M in a Series B funding round to fuel their growth. At some point their reached out to us to see if we could cooperate and by the autumn the topic turned to the possibility of them acquiring us.

In contrast to earlier potential buyers, Miro was in the same niche as we were, with a similar product and was also a technological company. We liked the team and their product and felt Miro could be a good home for AWW. Also, the price was right based on our revenue, users and growth numbers.

It took some time to negotiate the details of the deal and go through due dilligence process. We went over dozens of drafts for both LOI (Letter of Intent) and the actual purchase agreement – although we had a “gentleman's agreement” from the business perspective, there were still a lot of details to iron out.

While we obviously had our own lawyers, tax advisors and accountants (on both Croatian and US side!), we wanted to be hands-on and understand everything, so by the end of it both Zvonimir and me read cumulatively hundreds of pages of US contract legalese.

Due dilligence also got complicated: although AWW, Inc. was a US company, both Zvonimir and me were residents of Croatia and we had contractors from all over the place, not to mention the original intellectual property (IP) traced back to my development agency (Good Code) from the times it was just another project there. Although we had IP purchase paper trail, some of it was in Croatian and had to be translated, and the lawyers wanted to triple-check the rest.

Finally, the deal closed and on February 22nd, 2021. we publicly announced that AWW is joining Miro!

AWW joins Miro

Since both AWW and Miro use custom in-house built whiteboarding functionality, there wasn't much sense in continuing to develop both products, and Miro decided to wind the technology powering AWW down.

So we set out to migrate existing customers: for enterprise customers there was more work involved on our side, while smaller users received 1 year free equivalent subscription to Miro and guidance on how to export their AWW whiteboards and upload them to Miro. All users were given 5 months to do the transition, and we timed it such that education organizations were able to finish their school year on AWW.

Miro also took our experience and lessons learnt from AWW in designing and developing a free version, so although no AWW code is directly used, our focus on simplicity, immediacy and ease of use continues.

Looking back

If a time-traveler told me ten years ago how the story would unfold, I would laugh them off. What started as a hobby experiment evolved into one of the global leaders in its niche, was used by millions and changed our lives forever.

I like to think that in a tiny way we improved the lives of all our users – be it a kid doodling something in a collaborative drawing class, a roofing company making it easier for their customers to sketch what they need, or a developer being able to discuss software architecture on a confcall – we made those moments easier and more fun.

And hey, what more can you ask for.