Producteev as user support

Handling support and feedback is probably one of the most important things software developer teams face after releasing a product. The simplest way many of us use at the start is e-mail, but that soon becomes too difficult to manage. There are several online solutions available - FogBugz, Lighthouse or it’s “bigger” sister Tender are just few of those most often mentioned by developers.

We were testing out some of the systems for Gentle Bytes support and finally settled with FogBugz. Although the interface wasn’t as clear as we wanted, it made the job done and it was free for starters. To integrate support and feedback into our apps, we used a simple PHP script on our server that relayed any support request from our apps (Startupizer) to an email which was checked by FogBugz which finally converted it into a ticket. The system simultaneously notified us through email so we could attend the ticket immediately.

We’re always alert

So although visually a bit disorienting, FogBugz provided nice way of handling support tickets. It even offers online repository which matches any ticket (a bug report for example) with the code that fixes it. It you’re working on Mercurial that is. Anyway, it was fine and we were happy with it for the moment. And here’s where the story becomes interesting :)

We use The Hit List app for our daily work. We got it through Macheist bundle a while ago. We absolutely love it and use it for our daily GTD stuff. Among other uses, we use it for our ideas and todo items for various projects we’re working on. But there’s one thing with it: from the time we got they’re promising iPhone companion app. As we’re quite mobile, that’s one of our much desired additions. But it’s now almost two years and still no iPhone app in sight and the Mac app itself is still in beta (it’s probably going to see 1.0 release with the iPhone companion release).

As much as we were reluctant to, we slowly started looking for an alternative. Our minimum requirements were Mac application and iPhone companion with two way synching of data between them. An option of storing data on Dropbox (this link is our referral, if you register through it, we’ll get some more online space, thank you :)) is also high priority. Oh, it should also handle nested lists, so this one alone ruled out many existing solutions. The obvious candidate was Things, but it’s quite costly, so at the end we couldn’t find a solution and stick to The Hit List hoping it’s iPhone app would finally come. Months passed by and update after update came, and the first thing we did for each was going to preferences and checking the iPhone Sync tab, but every time we were disappointed with same old message:

The Hit List Preferences with promised iPhone Sync

Whatever we give attention to, that comes to our lives

What a great title, but no panic, we’re not starting esoteric discussions and we certainly didn’t do any kind of voodoo (no offense to anyone). Sometimes it just pays being subscribed to various RSS feeds. One of the posts from iPhone AppStorm was about Producteev, GTD app living in the cloud with iPhone app. It looked great, so we decided to gave it a try. We signed up for a free account, downloaded iPhone app and tried re-creating some of our The Hit List lists to see how it would work.

The first thing we noticed was - no nested lists support. Also they don’t have Mac application, just the web interface and iPhone. So we were just about to give up just because of that but something kept us trying. And that was various options for adding new items: you can do it from web interface, from iPhone app and get them synched. Then you can simply send an email to task@producteev.com and it’ll get converted to an item for you. Hmm, this immediately rang the bells and it’s here that our two stories finally meet…

Using Producteev as support system

So, Producteev can’t replace our GTD app (just yet as it turns out - read below), but it can surely be used for ticketing system! It has priorities, tags and notes attached to any item. And it can add items by simply emailing or forwarding to above mentioned email. Further more, you can do all that by using special formatting of the email messages!

Remember above mentioned PHP script we used for relaying feedback from our apps to FogBugz? We started updating it to have it work with Producteev. It turned out this was a breeze, so here it is for anyone interested (we’ll explain afterwards):

<?PHP
    $headers = "From: your@email.com";

    $appname = $_POST['appname'];
    $type = $_POST['type'];
    
    $email = $_POST['email'];
    if (strlen($email) == 0) $email = "unknown";
    
    $priority = "";
    $title = "In-app feedback";
    if ($type === "bug") {
        $priority = "5*";
        $title = "Bug report";
        $critical = $_POST['critical'];
        if ($critical === "1") $title = "Critical bug report";
    } elseif ($type === "support") {
        $priority = "4*";
        $title = "Support question";
    } elseif ($type === "feature") {
        $priority = "3*";
        $importance = $_POST['importance'];
        $title = "Feature request";
        if (strlen($importance) > 0) $title = $importance . " feature";
    }

    $subject = $appname . ": " . $title . " from " . $email . " #" . $appname . " ##" . $type;
    if (strlen($priority) > 0) $subject = $subject . " " . $priority;

    $body = "";
    foreach($_POST as $key => $val) {
        $body = $body . "[" . $key . "]n" . stripslashes($val) . "nn";
    }
    $body = trim($body);
    
    if (!mail("task@producteev.com", $subject, $body, $headers)) {
        error_log("Failed sending, trying second attempt!");
        if (!mail("your-backup@email.com", "Sending to support failed, add ticket manually!", $body)) {
            error_log("Failed sending, bailing out:n" . $body . "----------");
            die("Failed sending support email! " . print_r($_POST, true));
        }
    }
?>

To have it work for you, save the script as an PHP file (support.php for example), and replace two email addresses:

  • your@email.com at the top with one of emails connected to the Producteev workspace associated with your application.
  • your-backup@email.com at the bottom with an email you check often (it’s probably going to be the same email used for sending message from). This address used in case emailing task@produceev.com fails and prevents you from loosing support ticket - just forward the mail yourself or add new task manually!

If even sending to backup mail fails, an error is logged to the server (in the same dir as the PHP file itself). The log contains full message, so you can use it for adding tasks manually, just check the server often enough.

Save the PHP file to your server, we suggest to keep it in it’s own directory or at least keep it away from other PHP files to keep errors log file clean.

If you’re on Mac, you can use OpenFeedback framework for sending feedback directly from within the app - this will work natively, so you don’t have to deal with app side a bit, just setup proper address in Info.plist! The framework is freely available on GitHub. We have updated it to support sending crash reports - see this post, though it’s already included in the GitHub… If you’re using different in-app feedback framework, you might need to change the PHP file to use different variables; you might need to experiment a bit, but shouldn’t take you more than a couple of minutes.

So how does it work?

Whenever PHP post request is received, the script checks post data for variables. It expects the following variables:

  • appname: The name of the application for which feedback was sent. This defines Producteev workspace in which the task is created.
  • type: Type of feedback: bug, support or feature. This is used for automatically assigning labels and priority. Your workspace must have above labels matching these names. Priority of the task is set to 5 for bug, 4 for support and 3 for feature.
  • importance: Importance if type if feature.

The script composes an email using the above variables and sends it to task@producteev.com. Subject is prepared from above mentioned vars. The email body lists all variables from the PHP post request, so if you have additional data, it’ll come through as well - this is going to be converted to a note attached to the task by the Producteev!

We’re no PHP wizards (actually we’re on the opposite side of the scale :), so above script is by no means fit-all solution - for example we haven’t tested it for apps with spaces in names - we don’t know if having Producteev workspace with matching name would work or not. But it’s a nice start for integrating it in your workflow! Feel free to modify it whatever way you see fit!

Conclusion

So we can live happily and have our customers support working, but remember - we’re still in the hunt for out killer GTD app… So Producteev only covers part of our needs. Or does it? As they say in TV commercials: but wait, there’s more. And that can’t be more true for Producteev! They are already working on having subtasks and a proper Mac app among other things! Now, that clears all remaining requirements we have! And even though it’s not here yet, based on their continuous support and upgrading pace, we’re willing to wait…



Want to reach us? Fill in the contact form, or poke us on Twitter.