Tuesday, January 3, 2012

About Subscriptions

In early September, we launched a compulsory survey about charging subscriptions for 2cloud. We spent much of September and October gathering responses, analysing feedback, and continuing the conversation with the responders who gave us email addresses to contact them at. We sent over 400 emails, by hand, trying to get a feel for the needs of our users and trying to communicate clearly with them.

Then we went quiet.

A lot has been happening, and we hope to share some of it with you in the coming days or weeks, but we wanted to take a moment and give an update on the subscriptions front. There are two parts to this: what we’re doing, and why we’re doing it. We’ll try to explain them both in full.

What We’re Doing

We’re going ahead with the subscription plan. When subscriptions go active, we’ll be requiring everyone to pay the subscription fee or lose access to our server. A couple of fine points:

  • This only affects our server. All the software will still be licensed under the MIT License, and we’ll still be more than happy to help you set up your own server installation that you can run without paying us a dime.
  • New users will receive a free trial month to evaluate the service. This will only be extended to those who do not already use 2cloud, whose Google accounts have never existed in our systems.
  • Subscriptions are not active yet. We’ll be turning them on when the newest iteration leaves beta mode and we’re confident in its quality, reliability, and performance. Rest assured, there will be a sufficient period in which anyone who wants to can try the new beta before subscriptions go active.

You’re probably wondering how much a subscription is by now. We’re pretty pleased to announce we’ve brought the cost down to $1 if you want to buy a month at a time, or $8 if you buy a full year at a time. When we conducted the poll, we got a pretty good reaction to the $2/month or $24/year price point, but we wanted to do better.

Why We're Doing It

There are a lot of factors that influenced our decision. The over-arching reason, really, is user experience. We can simply offer a far superior user experience for a minimal cost. So just like we had to make the tough decision to discontinue supporting Android devices below Froyo, we’ve had to make the tough decision to discontinue supporting free users. It wasn’t a decision we arrived at easily, but we feel it’s the best choice considering the circumstances.

A lot of people have been sharing this post with us recently, and it’s a pretty good overview of why we arrived at the subscription model. We’re not here to be bought out. We’re not looking for a multi-million dollar exit. We’re looking to build a sustainable, viable service that offers real value to users. Sadly, we need users to pay for that value, or it just can’t work.

There is a bright side to this, though; we’re committed to you. We’re committed to building the best service we can, creating the best experience we can, and making our users as happy as we can. At the end of the day, that’s what this is all about, to us: we want you to walk away from an interaction with us saying “Wow. That was awesome.” It doesn’t matter whether that interaction is using 2cloud, or dealing with our support team, or even just saying hi on Twitter. We’re here to be remarkable.

We’ve learned not to deal with absolutes or make promises we can’t keep. We’ll be more conservative about our “never”s and “forever”s. But the mindset and spirit of 2cloud has not changed since August 2010, when the project started: build something awesome for awesome people, and do the right thing.

We’re going to continue to be honest and open with you, and try to give you every insight possible into what we’re thinking and what we’re planning. We hope you’ll stay part of the conversation with us.

Tuesday, December 6, 2011

Engaging Real People

Last Friday, as you may or may not have heard, we had our first Google+ Hangout with the team. It was, I feel, a success. Google+ says 14 people showed up—2 of those are us, and there were some people who were confused when they showed up and clearly were just joining random Hangouts. Which is cool, we had fun. We talked about the next version of 2cloud, I demoed it a little bit, we talked about monetisation and about the subscription plan (I realise I have not blogged about the subscription plan yet; I will, I promise). We even had one visitor to the Hangout who had never heard of 2cloud and became a user while talking to us. That was really cool.

It was really great to meet all of you. I was talking with Tino after the event, and I asked how he thought it went. This is what he said:

Our service depends on engaging real people, and I'm happy to be a part of our work because that is precisely what we do. And yesterday's hangout is a wonderful example of that. These people, whose only connection to us is software, gave up their time (which we know is the most valuable resource there is) just to meet with and talk to us about the software they enjoy. That is an amazing thing.

It really is an amazing thing. Thanks for setting aside some time to meet with us and chat. We had a Hangout for about 3 hours, and it was an absolute blast. We hope to do one again real soon.

As a closing note, I know I haven't updated this blog since (*cringe*) early September. We've been really busy getting Bessie ready, and haven't had much time to blog. We'll be updating shortly with some information on the subscription model and the next update. We'll also be doing a (*cringe*) mass email when we can't put it off any longer to tell everyone about the new version and the subscription model. We'll keep it short and it won't be until late January, so don't worry too much about it.

Sunday, September 11, 2011

Upcoming Poll, Again About Money

TL;DR version: There will be a poll. It will guide whether or not this app remains free. Please vote if you care at all.

I'm a very opinionated person. I believe in a lot of things, and I believe them very strongly. I believe that software should be open source. I believe that everybody should have access to it. But just because I believe things does not make them true; nor does it mean I'm not willing to change my beliefs. It just means I haven't heard any ideas that are better or evidence that is convincing enough to unseat my beliefs.

I've had a hard time with this project, recently. It stems from a few reasons: my own inadequacies as a developer, limitations of certain platforms, the refusal of device manufacturers to conform to a standard Android experience, the lack of certain standards in Android apps.. I could list things until I turn blue in the face. But the main thing is really that I've been floundering on the business side of this project recently. I'm not a business man, I'm an idealist. When I started this project, I just wanted to learn Android and Chrome development; that's why we have no business plan, why we are so informal about this: it all grew up very, very quickly.

Today, I had a revelation. It came from a user. Now, Michel is a very active user; he runs his own server, he talks with me a lot (we're chatting as I write this, actually), and he's always interested in what's going on with the project. He offers ideas, feedback, and support. I wish Michel were the average user, because the tech world would be a vastly more enjoyable place were that the case. I was lamenting the poor performance of our quota on Google+, and it kicked off a brainstorming session as to why things are the way they are, and how they can be fixed. I love social media.

The revelation Michel prompted in me is simple: "The main problem I see with the quota current model is that it is 'too free'". The idea of "too free" is an interesting one. It suggests that offering something for free devalues the product in the eyes of its users, which shields the fact that it costs money to run from them. So when you have to do things like introduce a quota, they get upset; to them, something that was free is being charged for, which smacks of profiteering. In reality, something that was being run at-cost is trying to get sustainable. We try to communicate that, but it's hard without spamming everyone.

Now, Tino is going to get upset with me over this, because I have a habit of realising things he tried to tell me long after he tells me, and sometimes I forget he told me about them in the first place. I think this is one of those times. He's told me for forever that making it free makes people feel more entitled, but I've never really given much credence to it. Because he's long been advocating for more pressing policies of monetisation, and for good reason: he's been right. But it took a user, someone who would not profit at all, telling me that not only would he pay for the app if we charged a subscription, it's wrong of us to not charge a subscription, before I really heard the argument. Which is a shortcoming of mine that I'm trying to overcome.

I think part of my reluctance to accept the idea was due to one of the most debilitating shortcomings I have: a lack of self-confidence. When we release buggy builds (which happens with unacceptable frequency and is something we're working on), I feel like it's just another reason we shouldn't charge for the app. And I won't be implementing the new subscription model, if there is one, until the current bug count is brought way down and the app's stability is much, much better. But the number of users who have told me the solution lies in charging for the app is helping to overcome my fears that the software isn't good enough.

So what's going to happen is simple. I'll update the app in the Android Market. When you run it, you'll get a popup that will ask you if you would pay a monthly fee for the app. Please vote; it's very important. And please be honest with us; we try so hard to be honest with you.

Thursday, September 8, 2011


I was going to limit this to my personal blog. I wasn't going to make the fatigue I was feeling over the constant struggles this project provides an issue for the project at large. And then something happened; we got a particularly nasty support request from a user. I'm going to go ahead and reproduce it below.

I am getting a message that the server is over quota and my link will be stored until tomorrow unless I want to pay $1 ? What good is the link going to do me tomorrow and if the server really is over quota why will;l $1 free it up? Is this a new fee or something? If it is this app is dead to me and I'm sure many others. If this isn't a bug then it down right wrong to hold my link hostage for $$

Tino gave a pretty detailed response as to why this reaction is insulting and outrageous. I tried to give a more level response, but we're both pretty much on the same level as to how we feel about this. It's a betrayal. It's nothing more than us bending over backwards, trying to provide a service, and it seems like the nicer we try to be about it, the more we're told we're "malicous" or holding links hostage or some other absurd assertion about how us providing a free service by paying for it ourselves is really an evil move on our part.

The project is still going strong. I'm still responding to bug reports. I've found the cause of an issue and will be issuing a fix in the next day or two to try and address it. Another issue is in Google's code, not ours, and we're working with the Engineer behind the API to fix it. He says it's fixed, but is waiting on a rollout. All we can do is wait, sorry. We'll keep working on the bugs that we can fix. But it's getting hard to pour my sweat, blood, tears, and money into a project and not only not get compensated for it, but get verbally abused at every turn. I'm 21 years old, guys. I'm a college student, taking a full course load and working at the same time. I try to provide the best service I can, and try to apologise when I fall short. My shortcomings are many and varied, and the community has borne the brunt of all of them at one point or another. And I'm sorry for that, I am. But malice is not among my shortcomings. And when I go to bed with a heavy heart already, it's hard for me to wake up to people telling me that I'm not being fair to them because I expect even a modicum of engagement from them.

This isn't a post looking for sympathy. This isn't a post looking for donations. This isn't a call to action at all. The sole purpose behind this post, if I'm to be 100% honest with you, is to remind you that there are people behind this project. That people will be reading your support requests. That people worked hard on this and die a little inside watching you talk about how badly it sucks.

This is breaking me down, guys. In my phone call with Tino tonight, I mentioned that writing software for this wasn't even fun right now. It almost brought me to tears to say that, because I purposefully did not pursue an education in programming because I wanted it to remain something pure and fun.

Since the start of this project, I've been banging on about how it's our project. How the community is in control and calls the shots. Well, the community needs to take some responsibility, too. We can't do this alone. This needs to be a partnership, or the project will have to be shut down. We're reaching out to you, desperately flailing in the dark. Please meet us halfway.

Monday, August 22, 2011

Development Cycles

I don't know how many of you have noticed this, but we tend to go through development cycles with this project. We release an update, there's a flurry of activity as we polish it and fix any lingering issues, and then... silence. We don't issue updates until the next large iteration.

This isn't something I'm proud of, or something I'd like to continue, but I'm afraid it has to be the case. I'm still doing the majority of software writing for this project, and I'm still a student working a few jobs to pay the bills. I still can only engage this project in my "free time", such as it is. That means that the development pushes tend to be around when I can clear out some time in my schedule to knuckle down and focus on this project. We're in one of those times now (summer is awesome, isn't it?).

The impetus for writing this post was because we're coming to the end of this little push. I'll be fixing up the major issues that remain (things that prevent people from using the app), but minor inconveniences may or may not get done. A week from today, I start classes at my college again, and those will be taking up a good portion of my time. Development will continue, but it will be slow, and updates won't be as frequent.

I'd love to say this is a temporary problem, but the future is uncertain. When I graduate, I'll need to take a look at my financial situation and see what my options are. If I can, I'd like to continue writing software. I'd like to be able to devote myself to this every single day. I doubt that's going to be the case (this project is still in the red in terms of money) but it's nice to dream. If I can't do this full-time (which, really, is absurdly unlikely), I'll probably have to continue this cycle.

All I know is that the project has grown in leaps and bounds since last year. I'd like to see similar growth this year. I'm going to work hard on it whenever I can, and hopefully I can get it to the point where other people will start working on it, too.

Thanks for your support over the last year, and I hope you'll stick with us as we stumble our way through this one.

Paddy Foran
2cloud Lead Developer

Friday, August 5, 2011

About the Quota

Seeing as we just started rolling out 2.1, I thought I'd take a moment and try to expound a bit on our quota system, our thoughts about administering it, and the plans we have in regards to it.

Anyone who is not new to this project knows we've been fighting with monetisation since the very beginning. We haven't found a way to make the project sustain itself yet, and so far we've just been burning holes in the pockets of our developers and our community members, trying to keep this service online. When you think about it, it's a bit silly. We have over 12,000 active installs, according to the Android Market. That number's a bit low based on our metrics (doesn't cover custom builds, people using non-Market apks, etc.), but we'll use it as a minimum number we can rely on for accuracy.

We have 12,000 users with the app installed. The server costs $31/month, give or take, to maintain. This app should be sustainable if even one half of a percent of our users donated one dollar a day (keeping in mind that Google takes a cut). Put another way, if every user donated a dollar once every 23 years (again, keeping in mind we get seventy cents of that dollar), the app would pay for itself.

We've tried a couple things. The donations model seemed promising, but there wasn't enough of a steady flow of cash to keep things paid for. We tried ads, but... well, that was a bad idea. Our app wants to get out of your way and not be noticed. Hard to implement display monetisation on something that tries not to display. Our efforts were... well, failures. Since the launch of our ads, we've made four whole dollars. Actually, we've made nothing; we don't get a payout until we make fifty dollars. Which seems unlikely to happen, so we literally got nothing from ads.

Tino (our project manager) and I sat down to think a bit on this and how to make it work. The first important breakthrough we had was that users didn't realise this costs money to run. A lot of you read this blog, subscribe to the mailing list, and follow us on Twitter. And really, thanks for that. We appreciate it, and hope you enjoy hearing from us as much as we enjoy hearing from you. But you're a tiny percentage. Probably less than a percent. Being overly generous and assuming there are no duplicates, we have almost 330 followers on Twitter. Out of over 12,000. So 97% of our users never see our money struggles. Not good.

The second realisation we had was that it's not easy to give us money. Yes, you can run across a donation link. If you use PayPal, that's fairly simple. But if you don't use PayPal or don't run across the link, the barrier is too high. You can buy the donation version from the Market, but you can only buy that once. And if you don't have the Market/can't buy apps on the Market in your country/want to donate more, you're out of luck.

The third realisation we had was that we can't keep this up forever. I'm too busy with classes, my jobs, and iterating on 2cloud to devote myself to writing entirely new software for Second Bit, software that will bring in money to support this. So we're a company whose only product is burning through money like it's that Yule log you see on TV. That leads to bankruptcy and/or server shutdowns pretty quickly. Neither of which is really what we want.

The fourth realisation was that downtime sucks, but some types of downtime suck less than others. For example, if we can fail gracefully and explain that the server is down, that's better than the app just... not working. If we can explain why the server is down, so much the better. And if we can offer a way to keep the app working anyways, then that's probably the best situation we can hope for.

So we came up with a quota. Normally, I hate quota systems, but I am actually pretty excited about this one. I'll get to why in a moment. First, let me explain how it works. One particular piece of our app is the expensive part: the connection between the server and Chrome. As long as Chrome is open, we need to keep that connection alive; that takes some CPU power, and CPU can get pricey. So what we're doing is keeping track of how many of those connections we make. Based on that, we can calculate our CPU usage. Based on that, we can create a "soft quota" to limit how much CPU we use in a day to be something we can reasonably support for a little while with our current funds. That quota is variable; we have an interface to set it based on our available cash on hand and the statistics we have on how many connections/day we're averaging. Our goal is to keep the number of times we exceed that quota a month to one or two, but still be able to pay for everything.

When the quota is exceeded, your links won't open. At all. But we will still store them for you, and open them when the quota resets the next day. Because it's our own imposed quota, we can do that. If that gets too CPU intensive, we may have to turn that off—but rest assured, we'll let you guys know when we're reaching that stage.

This is the cool part, though: you can pay to get around the quota. When you try to send a link and the server is over quota, you'll get a popup explaining that the server is over quota and offering a way to pay. By paying roughly $1 (depending on your country; it's calibrated to be the lowest round number the Market will accept), you gain immunity to the quota. For now, we're saying you get the rest of the day immune. In the future, we may toy with that; you may be able to buy, say, immunity for the next three times we're over quota, as opposed to immunity for a certain amount of time. You may get an entire week for your $1. We're still figuring out that part of this, and hope you'll bear with us and offer feedback. What your immunity buys you is pretty simple: as long as you're immune, you get to use the app, regardless of its quota.

This brings me to our fifth and final realisation, and the reason I'm pretty excited about this quota, instead of dragging my feet. Ready for this? You are not our enemies. We are not here to work against you. You are not trying to take things from us. You don't want us to go bankrupt or shut down the server any more than we want those things. And we know that. And we respect that; we respect our relationship with you. We've worked hard and made a lot of tough decisions about this system to ensure that it would never harm someone by accident. Our payment verification system is less secure than we'd like because we'd rather have ten people slip around the quota than one person get denied on accident, or have the user base jump through hoops. In the end, it's pretty easy to cheat our quota system; the caveat is, we'll know. We just need to manually catch cheaters, which is more desirable than automatically catching cheaters and accidentally catching a couple honest users. We're extending our trust to you guys in the spirit of cooperation; please don't abuse it.

We're also going to be doing a few things to try and mitigate the impact this will have on our users' lives. Our friend Eva has helped out quite a bit on this end. At her suggestion, we'll be randomly choosing one active user a month to be exempt from quotas that month. We're going to take it a step further though; we want to reward people who are consistently paying to get around the quotas. So we're also going to select one user a month who paid to escape the quotas in the previous month (e.g., for October, we'll choose someone who paid in September) and we'll give them immunity for the month. Finally, I'm working on a way to make the cost of immunity go down the more you buy it. Think of it as the bagel card; buy ten, get one free. It's possible that, in future versions, every fourth quota exemption you buy will last a week, and every tenth quota exemption you buy will last a month.

As you can tell, we're trying pretty hard to come up with ways to reward you guys for paying. We're not trying to separate you from your hard-earned money by deception, coercion, or trickery. We just want to keep the server online, possibly recoup some of the cash we've invested in this project over the last year, and maybe even make a modest profit on our hard work. But we want to do it the right way, and we want to do it honestly. We don't want your money unless we've earned it and you're willing to give it to us.

I know there has been a lot of money talk on this blog. You've all been amazing about accepting it on faith. For those of you interested or who doubt the financial claims we've been making, I'm going to release the financial records from the start of the project. All project-related expenditures and project-related income is reported here. I can't promise one of these reports frequently (they take some time to put together, and we'd rather be working on software than compiling financial reports), I'll make a public announcement next time I update it, and will do my best to make it some reasonable frequency, but I can't promise anything.

Thanks for all your support in the last year. If you have questions, comments, concerns, ideas, or cool ways we could reward loyal users, we'd love to hear them!

Thursday, August 4, 2011

2.1: In With The New, Out With The Old

I'm pleased to say that 2cloud 2.1 is nearing the end of its beta phase. Our beta testers have worked hard and deserve a big round of applause for all the testing they've done on such short notice. Really, this project owes a lot to them (especially after the 2.0 debacle—we're pretty sure that won't be happening again).

Here's the important bit: we're going to be rolling out the update to the Android Market and the Chrome webstore at 11pm, EST Friday the fifth. Saturday the sixth at noon (again, EST), the android2cloud.appspot.com server will begin returning errors. In an attempt to shake off some legacy users who never updated and are costing us some CPU, we've moved hosts. The new extension and Android app default to the new public server: 2cloudapp.appspot.com. All data from android2cloud.appspot.com will be ported over to the new server. This doesn't mean much now, but it hopefully will in the future.

I'm really embarrassed about the lack of new features in this version, but hopefully you can forgive that for the other improvements. We're pretty proud of the work we did in the short time we had, and feel pretty good about the base we have to build off of now. We already announced that we're deprecating support for Android 1.5, 1.6, and 2.0 to focus on providing a better experience for the 2.1+ crowd. But we've also done a bit of reworking in our software:

  • We've also gotten a lot more robust. Now our errors actually talk to you! Not literally (though that would be kind of cool.. or annoying), but through dialog boxes. If the app runs into a problem it won't crash or fail silently, leaving you with no idea what's going on (except in very rare cases, and we're trying to remove those one by one). Instead, the app throws up an error with some options. If it thinks an error log will help, it offers to send an error report to us as an email. You can click a button, check the information it will send (it just opens your default mail client), and send it off as a bug report. We'll get back to you with more information and a fix, because it's hooked right into our lovely help system (graciously provided by Tender).
  • We've implemented a quota. I'm not going to talk too much about that here because we've got an entire blog post about it set up for a bit later, but suffice to say it's a bit nicer and more verbose than the server just shutting off and the app ceasing to function with no explanation.
  • The Chrome extension has gotten its icon back! But this is a new, improved icon-on-steroids. It has a status indicator (green for connected, white for disconnected, red for error, blank for connecting) and context-aware clicking. Click when connected to disconnect. Click when disconnected to connect. Click when there's an error for more information.
  • The Chrome extension also has a much prettier install experience. Dylan put his design genius to work again, creating an aesthetic install flow that puts my old hacked-together wizard to shame.
  • This probably doesn't matter to most of you, but we have much better documentation now. Information on the project, on contributing, on the license, on installing or building your own clients... all this and more is available in our lovely README file and our website.
  • All our source is on Github, and is much more structured and readable than it was. We have a long way to go yet—we swear, unit testing is at the top of our priorities! (right next to Firefox...)—but this is a marked improvement over where we were just six months ago. We're going to keep learning and improving, and hope you guys will bear with us. Fork us! We ♥ pull requests!
  • This one's for the developers out there: we're ready to commit to endpoints! We've got the 2cloud-dev mailing list set up for people who want to build this functionality into their applications, and we've got documentation on how to create a client or server on each of the Github repos' wikis (Android, App Engine, Chrome) coming very soon.

As you can see, we've kept busy. We've got a lot of stuff we're looking at for our next versions, too:

  • Chrome In-App Payments
  • Link history in Android and Chrome
  • Device dropdown
  • Native account support
  • C2DM
  • Firefox support
  • iOS support
  • Tablet-friendly!
  • Sending links to friends
  • Binary content (images, videos)

Of course, we're going to try to keep improving our code, fixing bugs, and improving our administration at the same time. Also note, we can't promise any of those features. They're just things that have caught our eye and appended to our wishlist.

We hope you enjoy 2.1, and we hope you'll give us feedback on what we're doing right and what we're doing wrong. Both are useful in their own way.