Archive for the ‘IM’ Category

Customer Spotlight: Zapier

Friday, December 16th, 2011

We are excited to feature Zapier on this week’s Tropo Customer Spotlight! Today I sat down with Wade Foster, one of the co-founders of Zapier, to discuss their business and learn more about how they are using Tropo for their Instant Messaging services.

What is Zapier?

Zapier allows you to “zap your apps!” You can build unique integrations between your favorite applications, one mouse click at a time without writing a single line of code!

  • Own Your Data: Zapier makes it easy to import and export data automagically with your favorite web apps. Don’t get locked in.
  • No Data Entry: Quit filling out the same information between different applications, and let Zapier do the heavy lifting for you.
  • Fill-in Missing Features: Never be at the mercy of vendors to build features or integrations. Use Zapier to add missing functionality.

Zapier uses Python, Django, and the Tropo Scripting API to deliver Instant Messaging services to users on AIM, GTalk, MSN, and Yahoo!

To learn more about Zapier, visit their website at http://zapier.com!

Here is a screencast of Zapier using Tropo for their Instant Messaging services:

Tropo + Ushahidi = Awesome

Friday, December 9th, 2011

Ushahidi is a platform for crowdsourcing information. Members of the public submit reports that are geo-located and then put on a map. The platform is used in disaster relief, election monitoring and just about any other situation where people need to learn things from one another quickly and concisely. Out of the box, Ushahidi allows people to submit reports via the web, mobile applications, Twitter, Facebook with support for a few SMS APIs as well.

We have created an easy-to-use application that lets people use Tropo to input data into Ushahidi via SMS. We’ve put the code up on Github and you’re welcome to submit pull requests if you find bugs or add features.

To use the code, you don’t have to install anything on Ushahidi. Here are the steps:

  1. In Ushahidi, create a user with “Admin” privileges.
  2. check out the code from Github
  3. edit the configuration lines at the top with your Ushahidi credentials and URL
  4. create a new Scripting API Application on Tropo.com.
  5. Once your Tropo app is created, you can add an SMS-enabled number (US and Canada currently) and optionally configure it to talk on any IM networks or Twitter.

Now, when you send a message to any of your configured numbers the application will attempt to geo-locate the message based on its contents. The app then submits a report via the Ushahidi API in an unverified state. Admins of the site can then verify the reports and publish them to the web.

In our example here, we simulated a flood in Milwaukee. The instance pulls in feeds from local media and disaster response community, accepts reports via the web and accepts reports from a Tropo app I created. We sent a message to the number configured in the app with the following content:

 

Columbia St. Mary’s Hospital Milwaukee WI is flooded. Power is out.

This was submitted to Ushahidi in an unverified state. The reviewer then added text to flush out the report based on other incoming data and then published the report:

Columbia hospital has been without power for the past 16 hours. Two of the three emergency diesel generators are operating normally. Generator number 2 is scheduled to be functional within the next 6 hours. Fuel supplies are at nominal levels with an estimated 48 hours remaining. Inundation levels are currently low but may begin rising at high tide.

This sort of crowdsourced data, gathered at the source, is valuable for many reasons. It gets the word to responders and the public more quickly so that people can act appropriately (e.g. by not going to that hospital, go to another one.) First responders become aware of the weight of a problem when more people report the same thing or when the first report comes in of a very big event.

Watervoices.ca, developed this past weekend at RHoK, will be going live with this application soon and we hope to see others using it to help the world soon. Over time, we will be adding support for Voice, PhoneGap within Ushahidi and many other features.

LA .NET Hackathon 2011

Monday, December 5th, 2011

Tropo is partnering with the LA .NET Developers Group and Outlook Amusements to sponsor this weekend’s LA (Burbank) Hackathon at Outlook Amusements on Saturday, December 10, 2011 from 9:00 AM to 6:30 PM (PT).

Here’s the address: Outlook Amusements 2900 W. Alameda Ave suite 400 Burbank, CA 91505

The theme of the LA Hackathon is “Build Voice/SMS apps for Holidays”! Here are a few ideas to get you thinking:

  • Santa Caller (similar to http://santacall.us) – Build a website that allows a parent to schedule a call to their kids from Santa. Have Santa ask the kid what they would like for Christmas and then email the parents their kid’s recorded message and/or transcribe the message for the email.
  • Santa Tag (similar to http://www.bloggingbistro.com/jc-penney-comes-up-with-a-new-use-for-qr-codes-video/) – Build a website that calls someone to record a message then associates the message with a QR code that plays when scanned.
  • Holiday Greetings Hotline – Build a holiday greetings hot line where user can leave a voice message that will be transcribed into text and posted to “Holiday Greetings” twitter account.

Even though this event is sponsored by the .NET Developers Group, we will be supporting all development languages and will have Tropo expertise onsite in .NET, PHP, Ruby/Rails, and Javascript, and Node.JS!

Register today!

Customer Spotlight: FetchNotes

Friday, November 4th, 2011

We finally got a chance to catch up with the guys (@_chaselee and @alexschiff) behind the popular new notes service called FetchNotes!

What makes FetchNotes so cool? For one, it has a super simple web UI. The entire site behaves like an app and leverages Python’s Tornado Webserver and AJAX to add and tag notes without lifting your fingers from the keyboard. Tags are basically hashtagged keywords in the note that allow the app to categorize notes by topic.

Secondly, FetchNotes leverages Tropo to deliver a truly multichannel communications experience. Today FetchNotes extensively leverages Tropo’s SMS services but the team has already started working on adding Tropo’s Voice with transcription service as well as Tropo’s Instant Messaging services on all of the IM networks including: GTalk, Yahoo!, MSN, AOL, and Jabber! We may even see support in the near future for in-browser, voice-powered note taking using Tropo’s Javascript Phone API, Phono.

Thirdly, Chase and Alex are working to add groups and third-party integration into other services such as GitHub or Google Calendar. This would allow developers, testers, and users to take a note about a #feature or #bug and tag it accordingly and watch the note get pushed to other services as GitHub issues or even calendar entries on Google!

The FetchNotes service is still in private beta but the first 50 new subscribers that click on fetchnotes.com/invite/tropo will be allowed to register for the service and check out the new coolness first hand!

No More Coworking Lockouts with Tropo and CouchDB

Monday, February 28th, 2011

Has this ever happened to you?

You’re feeling a bit randy so you decide to head over to your local coworking facility or hacker dojo to get some work done. Although it’s a bit of an odd hour, the caffeine is pumping in your veins and you’re raring to code up the next big thing. CloudKnock in action Unfortunately, when you get to your coworking site your realize that the door is locked, and you don’t know who is inside to call or send a message to so they may come and let you in. Bummer!

I’ve create a simple Tropo Scripting application that uses CouchDB that can prevent this from ever happening to you or your coworkers. It’s called CloudKnock. You can get the source code for this application over on GitHub.

The screencast below demonstrates how you can use CloudKnock to get into your coworking site quickly and easily.

Some of the really nice features of CloudKnock:

  • There is no special hardware required to unlock the door at your facility.
  • You don’t need to advertise that you are at your local hacker dojo (and not at home) on a social networking site.
  • Coworking members get notified on the channel they choose to utilize, which makes them more likely to get your message and come let you in. ;-)

I’d love to hear feedback on this application from anyone who ha a chance to test it out.

Happy coworking!

Tropo DTMF to XMPP IM Relay

Friday, November 19th, 2010

Are you building real-time gaming applications that use the phone (Voice or DTMF touch-tone) and require immediate response to your application?  Ever wondered how to get input from a caller at the speed of light – rather than traditional AJAX API calls?

Tropo’s Scripting API allows you to do all sorts of interesting hacks to make this possible!  Earlier, Jason Geocke demonstrated how to do this using real-time TCP sockets in the following blog post: Using Persistent Sockets in Tropo Applications.  I recently had a customer asking about a similar request but using XMPP Instant Messaging to relay the DTMF touch-tones to any IM client.

I’m always up for a new challenge but was disappointed to find that this request wasn’t challenging at all.  Tropo is ideal for building multi-modal communications apps like this going from Voice to IM in the same application.

Here is a video that demonstrates how this works.

Here is the Tropo Scripting that I used to make this demo possible.

answer
sleep 2

keeprunning = true
while keeprunning

  ask "press a key or zero to end", {
    :choices => "[1 DIGITS]",
    :onChoice => lambda { |event|
    message event.value, {
      :to => "christoffe@jabber.org",
      :network => "JABBER"}
      if event.value == "0"
        keeprunning = false
      end
    }
  }

end

The only thing left to do is connect your IM bot to your Tropo application by simply creating one dynamically like cmtest@tropo.im.  See below:

That’s all she wrote :)

Saving the World with Tropo and Phono

Friday, November 12th, 2010

Without taking sides in the climate debate, I think most people would agree that the world would be a better place if our roads and highways were less crowded.

Everyone benefits when more people avail themselves of public transit options – less crowded roadways, cleaner air, shorter commutes…

Savvy transit agencies are starting to realize the potential of leveraging the growing ranks of civic coders to build helpful applications by releasing all of their fare, schedule and route information in open formats like GTFS. This let’s developers use public transit data to build sophisticated applications that give transit riders more options in how the consume transit services.

Tropo

On my personal blog – Vox Populi – I recently wrote a series of posts going step-by-step through the process of building a transit application using GTFS data released by my home state of Delaware, and using Apache, PHP and MySQL. That series culminated in a post on how to build an IM application for searching transit locations and route times using Tropo.

You can test out this Tropo application by adding findthebus@tropo.im to your contact list in any Jabber client and sending an address or stop number.

After completing my Tropo application, I wanted to take it a step further and give people the ability to query transit information with a tie back to a map. I also wanted to give people the ability to call the state transit agency with questions they might have about a particular transit stop (for example, some bus stops have a shelter and some don’t – some might be more conducive to handicapped access than others, etc.)

Ideally, I wanted to do this all within the context of a browser.

Enter Phono!

Phono is a jQuery plugin that makes it simple to add phone or IM functionality to a web page. It’s incredibly easy to use, open source, and is very powerful when paired with a complimentary Tropo application. Phono

My cross between Tropo, Phono and Google Maps is now working and can be viewed at findthebus.com.

This app is a mashup of Google Maps, my already existing Tropo application for Delaware transit locations and Phono. Since all of the Phono, Google Maps and jQuery pieces run in the client, there is no server-side logic need to make this application work. It’s all JavaScript.

The IM functionality added via Phono uses the same Tropo application I built in my previous series of blog posts. That piece is all PHP running on Apache with MySQL – 100% open source, 100% awesome!

If you want to give findthebus.com a try, keep in mind that the app is built using transit information specific to the State of Delaware. (However, if you want to build your own Tropo/Phono based transit apps with PHP, Apache and MySQL you can simply read my series and use the example code I provide.)

Give it a whirl with some notable Delaware addresses:

  • George Read House: 42 The Strand New Castle, DE 19720
  • Woodburn, the official residence of Delaware’s Governor: 151 Kings Highway, Dover, DE 19901
  • Dogfish Head Brewpub and Restaurant: 320 Rehoboth Avenue Rehoboth Beach, DE 19971

(For aspiring history buffs, George Read was one of the signers of the Declaration of Independence.)

One of the godfathers of the open data movement – Vivek Kundra, the CIO of the United States – has described the release of government data in open formats as the “democratization of public data.”

Tools like Tropo and Phono are examples of the democratization of application development – they make it easy for developers to do things that used to be very hard, and they add significant value to the apps that use them.

With tools like these and open data from forward looking governments and transit agencies, we truly can make the world a better place.

Or at least find the closest transit location to our favorite brewpub. ;-)

How to Add Phono and Tropo to CCXML

Thursday, November 4th, 2010

Dan York recently posted a really nice example of how to combine Phono – the new hotness in cloud telephony that turns any web browser into a phone – and good old fashioned enterprise-grade CCXML.

Dan’s piece inspired me to think about new ways to combine cloud telephony tools like Tropo and Phono with the bedrock of enterprise telephony – CCXML. Turns out, there are some very interesting and powerful combinations possible when you merge these different ways of building phone applications.

Connecting Phono to CCXML

Dan’s piece provided a nice summary of how use Phono as a web front-end to a CCXML application. The approach he describes is a great way to extend the reach of a CCXML application to a whole new group of users – those who are viewing your web site in a browser.

There is an equally exciting way of combining CCXML with the Tropo platform – using Tropo to send IM-based “screen pops” to service agents or others within your organization when a call comes in.

In the call center and customer service industries, screen pops are a way of providing notice to a customer service agent that a call is coming in. The actual content of a screen pop can range from simply displaying the caller ID of the incoming call, to actually pulling information out of a Customer Relationship Management (CRM) system about the caller to display it to the agent before they answer.

In this post, I want to show a simple example of how Tropo can be used to compliment CCXML applications to quickly and easily add screen pop capability. After we run through the details, I want to provide some additional insights on how both Phono and Tropo can be used to significantly enhance the power of enterprise CCXML.

A Simple Tropo Screen Pop Application

The first step in our example is to set up a very simple Tropo script that will send a screen pop message to the IM network and user of our choice. To keep things simple, we’ll use PHP for this example (but you could use any of the languages supported in Tropo Scripting to do this).

Here is the code for our example script:

<?php
message($screenPopMessage, 
	array( 'network'=>$network,'to'=>$sendTo));
?>

As you can see, this is a simple Tropo scripting application that does one thing – it sends an IM message to a user on a specified network. All of the variables in this script (everything preceded by a ‘$’) will be populated when we invoke it from CCXML.

For now, go to your Tropo account and set up a new Tropo Scripting application. Give your application a name, and when filling in the field “What URL powers your app?” select “Hosted File” and opt to create a new hosted file. Click “Create Application” when done.

Once this is done, you will notice your app has several different numbers automatically provisioned. Directly beneath that, you will see the Outbound Tokens provisioned for your new application. Make note of the token for messaging, as later you will need to copy it and paste it into your CCXML script.

The last step is to provision an instant messaging network for the application. This is the IM user that will send the screen pop when an incoming call is received in CCXML (i.e., the IM message will come appear to come from this user). To keep things simple, you can just set up a Jabber account using the tropo.im domain. If you do this, you can add the user you assign to your application to your buddy list in any Jabber client, including Google Chat.

Connecting Tropo to CCXML

In order to invoke our simple Tropo screen pop application, we need to make some changes to the CCXML introduced in the Dan’s post. Our revised CCXML looks like this:

<?xml version="1.0" encoding="UTF-8"?> 
<ccxml version="1.0" xmlns:voxeo="http://community.voxeo.com/xmlns/ccxml">

  <var name="inboundID"/> 
  <var name="outboundID"/> 
  <var name="initState" expr="'state1'" />

  <!-- Tropo API information -->
  <var name="tropoAPIToken" expr="'your-tropo-session-token'"/>
  <var name="tropoAPIEndPoint" expr="'http://api-internal.tropo.com/1.0/sessions?action=create&amp;token=' + tropoAPIToken"/>
  <var name="TropoSendURL"/>

  <var name="screenPopMessage" expr="encodeURIComponent('This is a screen pop!')"/>
  <!-- Any valid IM network name such as AIM, GTALK, MSN, JABBER, TWITTER and YAHOO. -->
  <var name="network" expr="'JABBER'"/>
  <var name="sendTo" expr="'your-im-user-name'"/>

  <eventprocessor statevariable="initState">

    <transition state="state1" event="connection.alerting"> 
      <log expr="'*** INBOUND CONNECTION ALERTING ***'"/> 
      <assign name="inboundID" expr="event$.connectionid" /> 
      <assign name="initState" expr="'state2'"/> 
      <assign name="TropoSendURL" expr="tropoAPIEndPoint + '&amp;screenPopMessage=' + screenPopMessage"/>
      <assign name="TropoSendURL" expr="TropoSendURL + '&amp;network=' + network"/>
      <assign name="TropoSendURL" expr="TropoSendURL + '&amp;sendTo=' + sendTo"/>
      <send name="'http.get'" target="TropoSendURL" targettype="'basichttp'"/>
    </transition>

    <transition event="send.successful" state="state2">
      <log expr="'*** Screen pop information sent to Tropo. Accept inbound call. ***'"/>   
      <assign name="initState" expr="'state3'"/>
      <accept connectionid="inboundID" /> 
    </transition>

    <transition event="error.send.failed" state="state2">
      <log expr="'*** ERROR: Could not send screen pop information. ***'"/>
      <assign name="initState" expr="'state3'"/>
      <accept connectionid="inboundID" /> 
    </transition>

    <transition state="state3" event="connection.connected"> 
      <assign name="initState" expr="'state4'"/> 
      <!-- 4079651112 is Voxeo Sales line -->
      <createcall dest="'tel:4079651112'" callerid="'1112223333'" connectionid="outboundID" timeout="'30s'"/> 
    </transition> 

    <transition state="state4" event="connection.progressing"> 
      <log expr="'*** CONNECTION.PROGRESSING ***'"/>  
      <assign name="initState" expr="'state5'"/> 
    </transition> 

    <transition state="state5" event="connection.connected"> 
      <assign name="initState" expr="'state6'"/> 
      <log expr="'*** CONNECTION.CONNECTED: INBOUND ***'"/>  
      <join id1="inboundID" id2="outboundID" duplex="'full'"/> 
    </transition> 

    <transition state="state6" event="conference.joined"> 
      <log expr="'*** CONFERENCE JOINED: INBOUND LEG TO OUTBOUND LEG ***'"/>  
    </transition> 

    <transition event="connection.disconnected"> 
      <log expr="'*** CONNECTION.DISCONNECTED ***'"/>  
      <exit/> 
    </transition> 

    <transition event="error.*">
      <log expr="'*** AN ERROR HAS OCCURED: ' + event$.reason  + ' ***'"/>
      <exit/>
    </transition>

  </eventprocessor> 
</ccxml>

You’ll notice a few differences from the CCXML example used in Dan’s piece. It includes a variable to hold a special URL to the Tropo Session API. There are also variables to hold the IM network and user that you want to send a screen pop to when a call comes into CCXML. Make sure you enter the details of the network on line 15 and the username on line 16 to whom you want to send the screen pop. Also, enter the messaging token from your Tropo application on line 9 in this CCXML script.

Set this script up in your Evolution account (as described in Dan’s post). Now, when a call comes into CCXML from Phono, the user that you have designated gets a screen pop with the value of the screenPopMessage variable in the CCXML script.

You can obviously change this message to anything you want, but it must be URL encoded before sending to the Tropo Session API.

<var name="screenPopMessage" 
       expr="encodeURIComponent('This is a screen pop!')"/>

Icing on the Cake!

Although this example is admittedly simple, coupled with Dan’s previous piece on connecting Phono to CCXML, it demonstrates how easy it is to augment CCXML with both Phono and Tropo. But that’s not all, it gets even better…

Phono allows developers to append information to a phone call, via the Phone API. in other words, before making a Phono call from your web page, you could add information to it via a header collection – this information could be obtained from prompting the user and getting input that way, or by examining what they did on a page (i.e., clicking a link). When the call connects to CCXML, this information is then available in standard SIP headers.

What this would let you do is to add inforamtion to a Phono call via client-side jQuery, and then use that inforamtion to craft the screen pop message in CCXML. This would allow you to customize the screen pop message to a customer service agent for each caller. You could even route calls differently based on the iformation added via Phono headers.

In addition, Tropo allows for the easy creation of IM applications (and other types of communication applications). In our simple example, we are just sending a message one way, from a CCXML script to a customer service agent through an instant message. But Tropo allows developers to build interactive IM applications. So with a little more work, we could create a screen pop application that asks an agent if they want to take an incoming call, send the call to another agent, or even send it to voice mail.

Because it’s possible to inject events into a running CCXML session, a Tropo application could control how a call is routed in CCXML based on an interaction with an agent. In this way it is possible to create more sophisticated, interactive screen pops using Tropo.

Hopefully, this post and the one it was inspired by give you a sense of how Phono and Tropo can compliment standards-based CCXML.

When it comes to getting more out of your CCXML applications, Phono and Tropo are the icing on the cake!

Heroku and Tropo Like Peanut Butter and Chocolate!

Tuesday, September 28th, 2010

Peanut butter and chocolate!

Who doesn’t love peanut butter and chocolate? By themselves, they are equally delicious but together, they are irresistible!

The same can now be said about Heroku and Tropo.  Heroku is the super simple cloud hosting platform for Ruby and Ruby on Rails web applications.  While Tropo is the super simple cloud hosting platform for communications applications including Voice, SMS, IM, and Twitter.

While Tropo works with any web programming language, we have been seeing more and more Ruby applications being developed using Tropo’s WebAPI. Traditionally deploying an application took just about as much time as actually writing the application.  This is no longer true with Heroku’s cloud hosting platform.

Deploying a Ruby application to Heroku is as simple as issuing the following commands from your terminal window:

> heroku create

> git push heroku master

Equally as simple to deploying your application to Heroku is writing your multi-channel communications application using Tropo like this hello world application that can be accessed via the telephone using Voice or SMS or via Instant Message or Twitter:

answer

say “Yes, Tropo is this easy!”

hangup

Now on to the how-to video and Heroku deployment instructions located at http://tropo.heroku.com!

Heroku & TropoTo demonstrate this yummy combination of technologies (Heroku and Tropo), Mark Silverberg (student and talented freelance Tropo developer) built a powerful Voice and IM application using Ruby and the Sinatra Framework and walks us through his 3.5 minute start-to-finish deployment of this application on the Heroku platform!

Mark’s multi-channel application is a volunteer finder service that provides information on volunteer opportunities in your zipcode.  The application can be accessed by calling +99000936 9991456957 via Skype or by IMing volunteer1234@tropo.im.  Mark’s Ruby code can be found on GitHub along with deployment instructions hosted on Heroku at http://warm-spring-38.heroku.com/

Now follow along with this video at http://tropo.heroku.com to learn how to build and deploy your next billion dollar idea using Heroku and Tropo!  Leveraging Heroku and Tropo gives you the best of advancements in cloud technology available today.  Heroku’s cloud technology allows you to scale your web application while Tropo’s cloud technology allows you to scale your communications applications.  These hybrid cloud technologies provide you, the web developer, with peace of mind and assurance that when your new application goes viral, we can easily scale to meet your demand.  Best of all, both cloud platforms offer free entry points to kick our tires and try us out.

So what are you waiting for?  Taste our peanut butter and chocolate now at Heroku and Tropo!

What is Multi-modal?

Tuesday, May 18th, 2010

We’ve talked a bit about how text communications are on the rise, replacing a lot of the voice self service that companies have traditionally offered. Text doesn’t always replace voice, however. With platforms that can work over both voice and text, it’s possible for text to augment the voice channel.

Take the example of directory assistance. Back when I was a kid, you called directory assistance, gave a business name (to a real human!) and they gave you the phone number. You wrote down the number and gave the business a call. Over time, companies started offering a service where they’d transfer you to the number, letting you skip writing it down and dialing yourself. With mobile phones, this service became even more important, as you’re often calling for assistance when you can’t stop and write something down.

An issue sometimes arises, however, when the number is busy. Or you get disconnected and have to call back. Since you didn’t pick up the number from the directory assistance but were transferred by them, you end up having to call back, ask for the business again, and get transferred again.

Multi-modal to the rescue.

Imagine if your phone company didn’t just transfer you to the number, but also sent you a text message with the business name, number, and address. That’s a multimodal conversation. You start out communicating in one channel (voice) and end up finishing the conversation or getting supplementary information via another (text).

As an example of multimodal applications, I’ve updated our Tropo Local Search demo. If you call from a mobile phone and look up a restaurant, you’ll get a text message containing the contact information of the listing you selected. Give it a try by calling (415) 894-9965 and finding coffee, pizza, or some other type of food in your neighborhood. And of course, the code is available in our documentation or on Github.