How we built EgyptianVoices

Trouble in Egypt

Early this week I was listening to NPR and it was reported that the Egyptian government had shut off the internet in Egypt.  This prevented most people in the country from communicating with the outside world via Twitter, email and Facebook among other things but they could still make phone calls.

Google tried to help

Google created a service that would take recorded messages and tweet them out but I don’t think it transcribed them and if it did then it wasn’t handling Arabic as well.

I knew there were companies out there that did transcription quickly and much more accurately than Google…

Enter VoiceCloud

The VoiceCloud team found me originally because  I’ve been developing a reputation as a phone XaaS hacker guru the past couple of years.  After talking to them about their service a long time ago I wrote an OpenVBX Plugin that used their API to do transcription.  It didn’t take long because I had already written similar things for my (now defunkt) startup OtherNum.  The plugin turned out awesome and I used it for own personal voicemail system I set up on OpenVBX.

What We Built

So,  the next thing I know, I have an email from VoiceCloud asking me to collaborate with them to build a better solution to this problem.  I was stoked!

I decided to get some phone numbers from Twilio (UK and Bahrain numbers – it’s an early beta feature and I’m special ) for this project and took some code snippets out of about 6 different projects I’ve worked on and built a system that takes recordings off the phone, passes them to VoiceCloud to be transcribed and then takes the transcription and posts it to Twitter.

So in total, I used Twilio, VoiceCloud, Bit.Ly and Twitter APIs (and I’m working on integrating as well).  That’s quite a mashup if you ask me.

Taking it up a notch

Then the VoiceCloud team decided to add another feature – They routed all the transcription requests to a team that could translate Arabic to English and then transcribe it!  So now people who only speak Arabic can use it too!  I didn’t even know they were going to do that but it works VERY well.  Now you can read the English text in the tweet and click the link and hear the original Arabic recorded message.

How to use it

People in troubled areas can call Bahrain +97316199857, the UK +441524488013 or the US +16199004859.

and leave a message in English or Arabic and then their message will be published here:

The Point

Neither I or VoiceCloud are making any money off this.  The idea was just to build something that might help people out.  Some people have used it but we’ve had trouble getting the word out about it because, well, it’s a little hard to reach people there.  Maybe the situation there will be resolved peacefully and nobody will need what we built.  That would be just fine with me.  We can hook it back up again next time a crisis erupts.

Published in: on February 3, 2011 at 23:45  Comments (1)  

Get Tweets as WebHooks with Notifo and

Image representing Twitter as depicted in Crun...

Image via CrunchBase

I’ve been using two awesome tools recently to connect my applications to Twitter events.  If you want to hook up your application to incoming Tweets without having to get access to the firehose then you should consider using this setup.


Published in: on January 22, 2011 at 00:31  Comments (5)  

Engage Your Web Users in Real Time with Notifo

Image representing Notifo as depicted in Crunc...
Image via CrunchBase

For the most part your web application engages the people using it (you should call them customers) directly as they navigate the application.  That works fine while they’re actually using your application but what do you do when you need to tell them something and they’re off doing something else?

There’s a few things you can do and each has it benefits and drawbacks.  You can send emails to you them but you might end up in their spam box.  You can SMS them if they’re willing to give you their cell phone number.

The problem with both of those methods is that once the user gives you their contact info they can’t really stop you from contacting them or giving away that information.  There’s a little bit they can do to filter things out but it’s not easy and it’s a pain.  And with SMS you and your users have to pay per message (yeah yeah, unlimited plans, I know but their still paying for it).

If only there was a way to get a message to them through a system that allowed them to modify their subscription later?  What if they could choose where and when to receive messages from you?

That’s where Notifo comes in.  Once your users have Notifo installed you can send them notifications that they can get as push notifications on their iPhone or Android phone.  They can also choose to get them on their Mac as Growl notifications.  They can set quiet hours, change the notification behaviors, set up their own WebHooks  and unsubscribe at any time.

The API is great and very easy to use.  For an example of something I built using it check out my Notifo plugin for OpenVBX and this presentation I created about it.

Enhanced by Zemanta
Published in: on January 17, 2011 at 03:16  Leave a Comment  

Convert More Perusers into Users with A/B testing and KissMetrics

KISSmetrics Sticker
Image by teamstickergiant via Flickr

One of the keys to success for a Startup company is keeping down the cost of acquiring new customers.  One way to do that is to convert a higher percentage of your visitors into paying customers.  I’ve been doing some work on this for my Startup OtherNumber with great results.  Hopefully you can apply this to your own Startup!

Getting Traffic isn’t enough

If you have a web application then I’m sure you’ve built a way for people to register for an account.  I mean, unless you’re a freak or something.

So you write some snazzy copy, extol the virtues of your app and explain why people would have to be crazy not to sign up for it.  Maybe you write too much copy.  Maybe Leo Tolstoy would balk at the copy on your homepage.  Maybe you just wrote the wrong thing.  Your customers need a voicemail platform but you’re blabbering on and on about SMS.

In any case, people aren’t signing up.  You get traffic to your site by running across the field in the middle of the super bowl with a URL on your ass chest but your conversion rate is terrible. (For the record, I don’t recommend doing that.)

So what do you do?

Experimentation is not just for college students

What you need is a way to test different versions of your “Call to Action” phraseology.  Maybe it’s your wording, your comparison charts or even the color of the button!

You need to build multiple variations of the page and choose randomly which one to display. (Well, random is not always best but for now we’ll go with that…)  My app is written in PHP so if yours is written in something else then you’ll have to translate it.

$body = "one";
if ( rand() % 2 == 1) { $body = "two"; }
$_SESSION['layout'] = $body;

Simple right? No.  That will randomly present the users with two (2) different versions of your page but you’ll have no idea which one is the most effective.  That’s where the KISSMetrics comes in…

Measure Everything

Reblog this post [with Zemanta]With KissMetrics, you get the ability to record events that happen on your site and these events can be tied to page loads but they don’t have to be.  The Javascript API is very straightforward and that’s what I’m going to use in this example.  There are other APIs including PHP but I’m saving that for another post…

So you put this code in your PHP page…

<script type="text/javascript">
  if (document.location.pathname.toLowerCase() == "/" )
    KM.record("Home Page", { "Version": "<?php echo $_SESSION['layout']; ?>"})
  if (document.location.pathname.toLowerCase() == "/account/register.php" )
    KM.record("Self Register", { "Version": "<?php echo $_SESSION['layout']; ?>"})

And what you get as output in your browser is this:

<script type="text/javascript">
  if (document.location.pathname.toLowerCase() == "/" )
    KM.record("Home Page", { "Version": "two"})
  if (document.location.pathname.toLowerCase() == "/account/register.php" )
    KM.record("Self Register", { "Version": "two"})

So with this block of code added to the head of my html document the KM.record verb gets called on both the root of the site and on the page that processes the signup form.  The data you pass in with this function is where the magic happens.  Use easy to read descriptions as your page names because that’s what will show up in your report.  The { “Version”: “two” } is the real secret sauce.  Now you know not only that a certain user went from / to /account/register.php but you know which version of the home page they saw!

What you end up with in KISSMetrics is some awesome visualization.  Here’s an example from my usage of this technique on

So here I can see that the “two” version of the homepage was twice as effective at convincing people to fill out the signup form!  The next step is to make two new homepages that are slight variations of the “two” version that worked so much better.

Other Next Steps:

  1. Explore the PHP API
  2. Use three or more test cases at once…
  3. do micro tests by performing variations on button text or color
Published in: on February 21, 2010 at 05:21  Comments (2)  

I’m eating Dog Food.

Image representing OtherNum as depicted in Cru...
Image via CrunchBase

Ok, not literally.  It’s a phrase that has made the rounds and, while it’s an unappetizing image, it makes sense.

So what do I mean?  I mean that I use myself.  I have my cell phone setup to forward unanswered calls to my OtherNumber.

That number is 404.939.3968 by the way.

I used to forward those calls to Google Voice but I thought the best way to make sure my product works consistently and meets the needs of its user base is for me to be one of those users!

I have transcription enabled on my mailbox so I get a transcription included in the email containing my messages.  I also have more than just a mailbox attached to that number…

I can give that number out directly (like I just did…) and when people call it they hear a few options for things like leaving me a message, learning more about OtherNumber and then there is a special menu which contains things like the Conferencing system and will hold a great deal of future functionality.

If I call that number from my cell phone, I’m prompted to provide a PIN code so that I can listen to my own messages.

I could also add an option for someone to be connected to one of my other phone numbers.  In the future, I’ll be able to control that behavior with filters for things like Date/Time, Caller ID, call patterns (put certain frequent callers straight through to voicemail etc…) .

The best part is, since I’m using the system I’ll be the first person to get to use all the exciting new features!

There is some risk, in that if our system has issues or our new features don’t work as intended that I’ll feel that in a very real way by not getting messages or phone calls but that’s GREAT.  That helps me keep in touch with the actual experiences of our users and it motivates me to develop new features faster and build a more reliable service.

Other Examples of OtherNumber (the company) using OtherNum (the product) include our own company OtherNumber 404.631.6869
us using our own conferencing system to be hosting “Office Hours” and many more to come.

Reblog this post [with Zemanta]
Published in: on January 8, 2010 at 04:30  Leave a Comment