I’m 16 months into my language learning startup, Readlang. So far I’ve been working completely alone, learning a lot about web development, design and marketing as I go. I’d like to say that I’m learning about running a business too, but calling it a business sounds like a stretch, since it’s still only making pocket change.
This is going to be brutally honest, I’m not afraid to share numbers. For starters, here’s the performance of the site over its entire lifetime so far, from Nov 2012 to mid March 2014:
|Signups:||4,667 (19% of visitors)|
|Paying Subscribers:||126 (3.1% of signups, excluding the first 600 users who have free lifetime membership)|
And this is how I arrived here, month by month…
I’d been spending a lot of time in Madrid, yet my Spanish was progressing slowly. I wanted to read a novel on my iPad and couldn’t find a method I liked. I wanted these features:
At the same time, I was looking for an idea that had the potential to turn into a small software business, and so the idea for Readlang was born.
I googled for similar projects and didn’t find anything exactly matching my needs (although I’ve since found many in this general area). The closest was a site called LingQ but the interface was too cluttered for my tastes, especially to read long form content like a novel, and the free plan is very crippled allowing a total of just 20 words, so you need to pay $10 / month to use it. If LingQ were making a business from this, I figured I had a chance by making a freemium app with a useable free plan, and geared towards reading long form content in a distraction free environment.
I created a static HTML page prototype in a few hours. A single page of text, where clicking on any word would trigger a Google Translate API call and replace the original word with an in-line translation. I’d never seen a reading tool do inline translation like this, it was simple, fast, and worked surprisingly well. Even where the translations weren’t perfect they were good enough to understand the meaning of the text almost all the time, and it felt less distracting and faster to read with than a typical popup dictionary.
I was encouraged enough to continue.
My first decision was to choose a technology stack. This was my first project with a backend so my choice was wide open, and I decided upon:
In a couple of weeks I had a simple version working which let me ditch my paperback copy of Intervencion and start reading it on Readlang. Everything was very ugly and buggy but it worked, and I was using it religiously every night.
Continued laying the foundations with more core features and bug fixing. It’s very exciting to iterate on such a young product you’re using yourself. Every night I would find bugs or come up with improvements that I would implement the following day. The only problem – reading before sleep was no longer so relaxing!
I created accounts for a few friends and family to try out. Almost nobody did, and I can’t blame them given that:
With no marketing effort, predictably few users turned up. This was intentional, I was still hashing out the core feature set, and adding more bugs than I was fixing.
To close the month, I created my first screencast video, which took hours of stops and starts to try to get right.
I put on my designer hat and spruced up the look of the site, and landed on the white Georgia font on a green background (Readlang) that’s still used today.
The old video was already out of date so I made a new one less than two weeks later, which would stay on the homepage for the next 6 months.
The first public call for feedback was this How To Learn Any Language post. I got 38 new visitors in March from this post, which is small but very well targeted. The forum is frequented by some hard core language geeks and polyglots, who discuss techniques like the Gold List Method, the 10,000 Sentences Method, and Massive Cloze Deletion. The response to Readlang was encouraging and they gave me a lot of great feedback, in fact all of the features listed this month were in response to their suggestions.
It was from this forum I learned about the existence of LWT (Learning With Texts), an open source clone of LingQ with very similar goals to Readlang. It’s creator hangs out there too and gave me some nice feedback and this ominous warning:
It gave me pause for thought, but buoyed by the rest of the feedback I carried on regardless.
The second call for feedback was this post on the /r/LanguageLearning subreddit. It sent a more healthy 183 visitors my way. Again the feedback was encouraging.
I was very excited to see an unsolicited blog post about Readlang here on Page F30. I added some social sharing buttons to the footer to try to capitalise on the new influx of users. Things were going well.
This month marked a minor turning point – the site was finally working well for my needs. There was plenty of room for improvement but I wasn’t lacking any essential features. So when prioritising tasks my mantra started shifting from “what do I want?” to “what do users want?” and most of all, “what will attract more users?”
I may have made a mistake at this point. I should have put effort on polishing and marketing the current feature set. Instead, seduced by feature-itis, I decided the site needed audio support to compete with LingQ and LWT.
I spent a couple of weeks on an embedded audio player which the user could synchronize with the text. I planned to store uploaded audio files on Amazon S3 but after taking a look at the YouTube API I realised that would be simpler to implement and would allow access to a huge library of free audio and video content.
The feature has since proved popular, with users syncing and sharing many videos, most commonly music videos. But I feel it’s made the site less focussed on it’s primary use case of reading long form content so I’m not convinced it was a the best idea, and that I should have abandoned it, or stuck to pure audio which would better suit listening to podcasts or audiobooks.
I had basic Google Analytics set up but didn’t have a good handle on what users were doing with the site. I rectified this by storing all my API calls in the database and creating with a custom page showing the daily and weekly usage of various features. I realised many signed up users hadn’t even translated a single word, so I added a modal dialog the first time they see the reader page and tell them to “Click on any word to translate it”.
I put $20 into Google Adwords campaign and spent half of it over a few days. It was useless - I paid about $0.40 per click and got an 89% bounce rate from these visitors, when my average bounce rate at the time was 45%. Granted, there were many optimisations I could make, but even so, AdWords looked unlikely to ever make sense.
A big problem for new users was the lack of content ready to read on the site. They needed to either upload or import a text first. I tried to solve this by allowing users to share texts in a public library. Sharing didn’t take off at first because:
Despite this, the sharing feature it allowed me to seed content for newcomers to read, without need for importing.
(To date, over 900 texts have been shared, and to avoid copyright issues I’ve had to remove Harry Potter 20 times in various languages!)
I was happy to discover that a guy called Tom Tabaxzynski had created this YouTube screencast of Readlang. It was disturbing to see the way he translated a whole sentence as if that was the normal way to use Readlang. I would normally translate single words and occasionally phrases of up to 4 words or so. I dug into my usage logs and found that some users were routinely translating very long phrases. This had me spooked since:
"not", "not my", "not my cup", "not my cup of", "not my cup of tea"
My Google Translate expenses had quadrupled from $4 to $16 in one month, which wasn’t a lot but the trend was alarming. For this reason, I finally got around to implementing drag/swipe to translate, which was better for my bank account and a nicer experience for users. I also limited the length of phrases to 6 words each (and later upped it to 8 words after some user feedback).
It was time to think about charging users. Since translations would be the largest per-user expense if the site grew, I based pricing around these. I chose to limit phrase translations to only 5 per day for free users, and offer unlimited phrases (up to 6 words each) for paying users. I chose an initial price of $10 per year, which was low, but I figured it should easily cover the Google translate costs and would test the waters to see if people would pay, after all the product was still in beta (and still is!). As appreciation for using the early beta, existing users were not charged, but soon I started asking for payment from new users…
On July 1st I switched on payments. New users were presented with the basic looking dialog to the right after translating 5 phrases in a single day.
Amazingly, only 2 days later, I woke up to see an email from PayPal - I had my first paying customer! Actually, not just one, there were 2 on the same morning, while I was sleeping! It’s crazy but that $20 gave me a great boost, a feeling that this might actually work.
A disturbing story appeared on the front page of Hacker News at this time: Shutting Down a Dream. It’s the story of the web site Word Champ that includes a web reading interface, translation, and spaced repetition flashcards (sound familiar?) that was earning so little money it needed to be shut down. Language learning websites seem to be a tough niche to crack, was it possible to make a business with Readlang? This knocked my enthusiasm down a notch, but I was still optimistic. I commented thanking the author for the story and linked to Readlang.
Something that bothered me about the flashcard scheduling was the feeling of guilt that would take hold when you have a backlog waiting for you. It plagues Anki and other SRS (spaced repetition system) software too. I gave it some thought and decided to remove the guilt-inducing backlog count, and allow you to practise your flashcards in smaller batches as suited you. Read more here. I’m still very happy with this modification.
It was encouraging to be getting most of my traffic from word of mouth and referrals, but I felt I was missing out on search engine traffic, which was very low. In fact, most of the traffic from Google was from people specifically searching for “Readlang”. I wanted people who were searching for things like “read Spanish”, “learn French”, “learn Italian from stories”. I auto-generated landing pages for each of the supported languages, which were all identical except for the title and a short list of links to public texts if they existed. These pages never attracted many visitors, and I removed them months later just in case Google may penalise me for duplicating content.
I took my hard earned riches ($140 in revenue!) and went on holiday. I kitted myself out with an iPad, a bluetooth keyboard, and a copy of Prompt so that I could ssh to my server if needed, and headed to Croatia.
I’d been thinking – it doesn’t make sense to have so many different language learning websites and apps, all of which are unaware of your general learning progress. Surely it would be better if there was an open platform that all learning tools would use.
I took a small step in that direction. I implemented OAuth to allow anyone to create an app or game that could read and edit user’s Readlang words. I created a pretty crappy game based on this and put the source code on github. I emailed a few people but didn’t publicise it. I’ll probably return to this in one of the following cases:
Almost immediately after creating the promo video, I added a feature that made it out of date – the Web Reader. The impetus for this was the feedback I saw in the comments to Shutting Down a Dream, a common theme was that users really wanted to find a replacement for it’s Web Reader feature. To implement this I improved the translator bookmarklet created way back in February. The old translator bookmarklet worked by doing some RegExp string substitution on the entire page HTML to fill it up with span tags. The new approach was to traverse the DOM and perform more selective replacement of each text node with span nodes, and worked more reliably than the old one.
This month I sent my first feature update newsletter to the site’s first 500 users and got a respectable 8% click through rate.
I got very excited on 4th October to see 20 people using the site concurrently! The pattern suggested a school was using it in their classes throughout the day. I’ve since noticed other schools using it. This was pleasantly surprising since it was designed purely as a self study tool.
I followed up last months successful Mail Chimp newsletter with this failed one, which I’m almost embarrased to link to. The copy at the top provides no value to users and is written completely from my point of view. The interesting parts are buried at the bottom. This performed predictably worse, with a 4% click through and 1.8% unsubscribe rate, yikes! I haven’t sent another email via MailChimp, not because I don’t like it, but because it’s too expensive now that I’ve outgrown the free plan.
Being a single page app, Readlang was almost completely invisible to Google and other search engines. The only part they could see was the landing page. This seemed like a waste since I could potentially be generating a long tail of search engine traffic based on the growing library of public content on the site. To this end, I tried to serve static versions of many pages in <noscript> tags, pregenerated using Zombie.js. This has been in production off and on for a while but is a hacky solution and I’ve yet to solve this nicely.
The most exciting thing that happened this month was an influx of new visitors from this blog post on esl.about.com. Typical traffic at the time was about 50 new, and 70 returning visits per day. The largest spike of traffic from that blog post came on the 16th October (curiously, 6 days after it was posted) when I got a whopping 935 new visitors, of whom 158 signed up for accounts!
I had a couple of requests for an alternative payment option to PayPal. Stripe had just launched in the UK and I’d heard good things, so I added it. Integration was fairly simple, and the modal checkout dialog they provide is very nice, in theory allowing you to pay without leaving the page. In practise I needed to redirect to a https page in order to show the dialog, but still, it was nice. Of the payments this month, 15 (65%) came via Stripe. Since then, 42% have chosen to pay with Stripe, the rest with PayPal.
(You may wonder why I don’t just make the whole site https. It’s because I need to support http iFrames. There’s a few things I could write about the hassles of using both http and https, but that can wait for another blog post, this one’s long enough!)
I wanted to inject some life into the public library, so I added Reddit style voting and spruced up the UI with thumbnail images. Ideally, I would have liked to add commenting too. I considered using Disqus as a stop-gap solution, but in the end decided to wait and one day implement a more integrated solution. I also added the Reddit style voting to the Web Reader bookmarklet/extension, so that users could recommend any web page without importing it to Readlang first.
I was worried about potential copyright issues with people sharing imported versions of articles. It’s the same issue I imagine read-it-later services like Instapaper, Readability and Pocket worry about. My solution was that any shared text that came via the importer would be shared as a link to the original article. Any user who follows the link would then need to open the Web Reader manually to translate, which they may not have installed yet. This sucks in terms of UX, ideally the Web Reader toolbar would be loaded automatically, but this isn’t technically possible (at least not for the bookmarklet, it probably is for the Chrome Extension) and the best solution I came up with was to present a dialog saying “You are leaving Readlang, please install the Web Reader bookmarklet or extension to read this article…”.
Up until then, I’d often been working from the lounge of my girlfriend’s flat in Madrid. I wasn’t getting much exercise or interaction with people. In the evenings my girlfriend would want to relax, whereas I wanted to go out for a walk since I’d been stuck indoors all day! That’s why I jumped at the chance to get set up at the Madrid International Lab, a free co-working space for international entrepreneurs. I have a much healthier routine now that I come to work here every day. It’s great and I almost don’t want to recommend it in case it becomes too crowded!
I was planning to raise the price, but since it was approaching Readlang’s one year anniversary, to celebrate I created a special offer – for a few days I halved the price from $9.99 / year to $4.99 / year, and announced it via email to all users who had reached the free limit and not yet upgraded. It succeed – I received 16 new payments over 3 days. It wasn’t much money, but for people to pay anything shows they value the service.
December got off to a slow start in terms of payments. No one was buying at the new $19.99 price point. I begun to regret the special offer, since it meant I couldn’t answer any of the following questions:
By the 11th there were still no payments, and I changed the pricing to be tri-monthly at $4.99. The orders finally started trickling in again, but whether this is due to the new pricing, or just the build up of new users after the offer, is unclear. In retrospect, I should have held out longer at the $19.99 / year price before changing my mind.
By the start of 2014, December had brought only 7 payments at $4.99, one of which from my mum! Things were starting to look bleak. After working over a year with no pay, and the prospect of earning anything like a salary still distant, I was questioning how much longer I should continue. There was still huge potential to grow, but there was also lots of competition, more that I realised when I started. Over the year I seemed to find a new competitor every couple of weeks and had to maintain a spreadsheet to keep track of them all!
I was entertaining thoughts of open-sourcing the whole thing like Samuel Clay did for Newsblur, in the hope that it may spur some interest and publicity, and that if I ever did move on, at least other developers would be able to continue it. I abandoned this idea since I reasoned that open source works best for libraries and infrastructure used by other coders, and not for monolithic consumer products, which are more likely to languish, unloved, on github. I still think it would nice to break off parts of Readlang to release as open source, but it’s tough to find the time to do the refactoring and documentation needed when you’re in the trenches trying to get a struggling startup off the ground.
A glimmer of hope surfaced in an email from a College professor in New York asking for a teacher console to help him use Readlang with his classes. I’d received similar requests previously but always resisted since I foresaw a danger of getting lost down the rabbit hole, complicating the product by implementing lots of features of no interest to my current core user base of motivated independent learners, people like me! This time though, I was warming to the idea since he indicated that this would be something he would pay perhaps $89 / year for as an instructor, with the students paying about $10 / year. They aren’t huge numbers but if the appeal was wide enough this would be worth pursuing. Perhaps this was how to turn Readlang into a viable business. I reasoned I could create an MVP of some class management features in a couple of weeks, invite a bunch of teachers into a closed trial, and see what happened.
So despite my doubts, I geared up to continue in earnest in the new year, and welcome the teachers.
Every now and then, I like to do some informal user testing, meaning I sit down with someone who has never used Readlang before and watch them try to use the site. As a developer this is one of the most painful things imaginable. I had one of these encounters with a fellow entrepreneur at the lab, Teun of NuezWeb, who was impressed with the site but was brutally honest about it’s shortcomings from a UX perspective. He couldn’t tell what it did from the landing page, he didn’t know what to do once he was within the site, he didn’t realise you needed to install the Chrome Extension to see the links in the public library. That night he sent me a present – a quickly mocked up .pdf of a new landing page design emphasising the Chrome Extension for new users. It was just what I needed to motivate me to improve the first experience for new users.
The main changes were:
And looking at my analytics I see that this changed… not much. The bounce rate remained similar, as did the visit duration of new users. Onboarding still has room to improve.
One thing that did make a difference was incorporating the new Shutterstock image in my Chrome webstore promo image:
After this, hits to the webstore page immediately jumped from ~130 / week to ~480 / week, and installs via the webstore increased from about 60 per week to 220 per week. (Note to self: most of these app installs don’t result in signups, why not?)
The big new feature this month was a pilot programme allowing teachers to create classes. After getting the boring admin panels out of the way, I was excited to work on a stats page for a text that showed the teacher the most commonly translated words and phrases. The New York Professor liked it, and asked if WordReference definitions could be displayed when he clicked on a word so that he could present it in front of his class. This use case had never occurred to me and to support it I created a whole new Presentation Page allowing him to step one by one through the top 20 words in each text. This was well received so I geared up to invite more teachers to the trial in February.
I polished up the teacher stuff, and set off in search of teachers.
I noticed that Nik Peachey, who originally shared Readlang on scoop.it back in June, was giving a talk here at the British Council in Madrid. It was on digital tools for English teachers, a perfect opportunity to get out and meet some potential customers! I quickly designed and printed a bunch of tri-fold brochures and went along, timidly handing them out after the talk, and chatting with a few teachers about their methods, and about the new features I was now adding to Readlang especially for them.
I announced the features publicly, and emailed the 15 or so teachers who had contacted me over the past year to let them know.
While waiting for a response from the teachers I took a break from the main Readlang code base, to hack together a simple game using the open API.
The response from the teachers was underwhelming. In total, 9 teachers requested access to the trial, but my analytics show that aside from the New York Professor, only one has actually used it with a real class. It would obviously take more effort to get teachers to buy into this, and it was effort I couldn’t afford. If teachers weren’t eager to use these additional features for free, it certainly didn’t seem like it would be an easy route to more revenue. So I decided to re-double my efforts on the original goal of making Readlang an awesome tool for individuals.
Phew! I didn’t expect this to be so long, I hope you didn’t skip anything!
While writing this, it really hit home how much work I’ve put in and how little I’ve got back financially. I earned $1045, before processing fees for 16 months of full time work. On the other hand, I’ve built up a small but enthusiastic user base, have a cool product, which has a shot at becoming a sustainable business and helping many more people around the world to read and learn. So I’m not giving up just yet!
On the contrary I’m on the lookout for someone else who might like to join me on this adventure and make Readlang even more awesome. If that might be you, get in touch. If you think you know someone suitable, please let them know. (EDIT: Sorry, I’m no longer looking. I’ve concluded that if I do take on a partner it should be someone I already know and trust.)
If this post was interesting and you’d like to read more, or if you have any advice for me, or if you’d like to get in touch for whatever reason, please email me at: firstname.lastname@example.org.