TransFS DevBlog RSS Feed

By josh

We’ve recently started using HighRise as our key CRM tool, and so far it looks like it will work very well for our needs. However, hooking our existing processes and our customer data into the web service takes a little bit of time & effort.

First of all, while HighRise has an excellent API… the “official” ruby code on the developers’ site is pretty minimal. Fortunately, some community efforts on GitHub have cleaned up this code and improved it dramatically. I’ve picked up this work and updated it slightly, and hopefully the lessons I learn can be rolled back into my GitHub repository.

One particularly tricky problem, even with a nice ActiveResource library like the one hosted on GitHub, is creating/updating contacts with associated “contact-data”. This includes adding email addresses, phone numbers, etc to contacts. I looked around on the developers forum, and there seem to be a number of people who have had questions about how to accomplish this… but no solid answers. After fiddling around with it for a while, I came up with the following solution:

Highrise::Person.create 'first-name'=>'Test', 
                                    'last-name'=>'API', 
                                    'contact_data'=>{ 
                                         'email_addresses'=>[ {
                                              'address'=>'test@test.com', 
                                              'location'=>'Work' } ]
                                    }

This code creates the following POST xml:

<?xml version="1.0" encoding="UTF-8"?>
<person>
  <contact-data>
    <email-addresses type="array">
      <email-address>
        <address>test@test.com</address>
        <location>Work</location>
      </email-address>
    </email-addresses>
  </contact-data>
  <last-name>API</last-name>
  <first-name>Test</first-name>
</person>

… And it works great! So hopefully this will help anyone out there who is struggling to get the HighRise API to do what they want via Ruby.

By josh

Rails 2.3 was released a few months ago with some great features. Perhaps chief among them was an “official” solution to nested models in forms. This is something that the community has been arguing about for some time, and has been solved in various ways.

With the Rails 2.3 solution, we finally have direct support for updating nested attributes in our models. This allows us to add a simple directive to our model that specifies which associations can be mass-assigned. For instance, in our app, we have the following (simplified) model:

class Iso < ActiveRecord::Base
  has_many :emails
  has_many :phones
  accepts_nested_attributes_for :emails, :allow_destroy => true
  accepts_nested_attributes_for :phones, :allow_destroy => true
end

Read the rest of this entry »

By josh

That’s right… as you can’t help but to notice… we have a new look here at TransFS.com!

We embarked on the process of redesigning the site because it was clear that we had outgrown our previous look. We had some serious usability problems, and most importantly, our old site just didn’t convey the level of professionalism and legitimacy that we needed.

Though we had worked with a different design freelancers in the past, we wanted to start fresh this time and get some new ideas. One of the hottest trends in design (and everything else) right now is crowdsourcing… so we naturally looked at 99Designs.com and CrowdSpring.com. We ended up going with CrowdSpring, because they had some interesting projects on their site and were known to us as members of the Chicago startup community.

CrowdSpring works like a “contest”. You post your project spec, set a dollar “award” and a timeframe for the project, and then the thousands of designers in the CrowdSpring community submit ideas and mockups for your project. If you receive more than 25 entries, then you must pick a design as the winner (otherwise, you get your money back). So, right off the bat, this seemed like an excellent way to get a lot of ideas at once from a wide range of designers… which is exactly what we wanted.

I wanted to take a moment to write about our experience with CrowdSpring.com, and to give our readers some general tips about crowdsourcing a redesign.

Read the rest of this entry »

By josh

One feature that is lacking from Github is the ability to get a unique RSS feed of your project updates. They offer a firehose feed of all project updates that you follow/fork… but this isn’t very useful for keeping track of a specific project. The signal-to-noise ratio is just too high.

However, I was browsing the Github support site to log a ticket… and I came across this gem from the Github devs: FeedSifter.

FeedSifter is one of those extremely simple little web apps that is tremendously useful in the right circumstances. You can put in your firehose feed, and some filtering parameters, and FeedSifter will give you a new feed url with only those posts that match your filters.

Pretty cool! This is especially useful if you are using Github’s new Issue Tracking functionality… since they don’t yet offer a good way to keep up-to-date on issue changes.

At the rate Github moves… I’m sure it won’t be long until we have built-in, better ways to track project information. But in the meantime, Feedsifter does the trick.

By josh

I recently completely overhauled our background task processing for TransFS.com.  For the past 6 months, we’ve been running BackgroundRb… and I’ve been fairly satisfied with its performance.  There are a lot of BackgroundRb haters out there, which I gather comes from some vicious problems with its usage of Drb in an earlier version.  However, by the time I found and installed BackgroundRb… it had been rewritten from the ground up using Packet, and it was both stable and quite powerful.

I started to get anxious about the amount of RAM being taken up by my backgroundrb workers.

Nonetheless, as I’ve continued to create new background processing tasks… I started to get anxious about the amount of RAM being taken up by my backgroundrb workers.  In addition, the BackgroundRb “style” has always seemed rather awkward to me.  It offers some nice features, for sure, that are hard to find in a single background processing package elsewhere.  But, at the end of the day, I started to wish that we were using something that was both lighter and easier to code against.

Finally, over the weekend… the final straw: I need to set up a new process on our Joyent server, and I didn’t have the RAM available.  So, after reading a bunch of documentation and evaluating several solutions, it was “Goodbye BackgroundRb, Hello Workling & Starling”.

Read the rest of this entry »

By josh

One of the biggest problems we face at TransFS.com is that we have a fairly complicated customer conversion process.  This is something that we have been struggling with since we launched, and we are always looking for ways to improve and streamline the user experience.  We want to make it as easy as possible for visitors to become users, and for users to become converted customers.  More broadly: we want to make it as easy as possible for business owners to start an auction and save money on their credit card processing services.

With that goal in mind, we are constantly making improvements to various points in our “sales funnel”.  Removing steps in the process, cleaning up the UI, providing better information, or adding reminder emails… all of these are tremendously important in improving our conversion rates.

Equally important, however, is measuring the impact of the changes we make.  Most web analytics tools have some basic functionality for tracking “goals”, and Google Analytics even offers a funnel view of your data.  However, we have yet to see a web analytics solution that really offers us the granularity and control that we want.  It can be tricky to track events that are not tied to actual user pageviews, for one thing.  But more importantly, Google Analytics (and the others as well) don’t provide very good tools for diagramming the whole customer experience funnel, from beginning to end.

So, after months of wishing that we had a better solution for this problem… I finally bit the bullet and developed one in-house:  FunnelCake.  FunnelCake is a Rails 2.3 “engine” plugin, designed to drop seamlessly into an existing app and provide visitor & user tracking, analysis, and visualization.

It is very new… and we’re just beginning to test it out on our site, but I think that it has the potential to give us the data that we want, the way we want it.

There’s a ton of information in the FunnelCake ReadMe on Github, so I won’t go into the technical details here… but check it out and let me know if you like what you see.  I would love to get some opinions on how to make it better.  Even better… fork away and send me your changes!

An example of a sales funnel visualization with FunnelCake

An example of a sales funnel visualization with FunnelCake

By josh

I recently began a new effort at TransFS that involves a good amount of Objective-C coding. Yes, we are working on an iPhone application… more on that soon, should be exciting.

As part of this new project, we need to be able to process transactions via Authorize.Net. In the rails world, there is an excellent plugin for processing credit card sales called ActiveMerchant. It is very mature and has support for nearly every kind of authorization gateway you could imagine. The plugin is open-source (of course), and is used by hundreds of production websites.

You can find the source repo here on Github via Shopify, who created it as an extraction from their in-house code. What an superb contribution they made to the community!

Unfortunately, the Objective-C and iPhone development community is still relatively young, and no such plugin (or Framework, as they are called in XCode-land) exists.

Enter ObjectiveMerchant

Today I’m announcing a new open source project, sponsored by TransFS.com, to port ActiveMerchant over to Objective-C. The project is already underway, and about a quarter of the code has been ported so far… but there is a long way to go still.

The goal is to create a reasonable facsimile of the ActiveMerchant code, replicating as much of the class structure and patterns as possible. If we succeed, then it should be very easy for someone who is familiar with the ActiveMerchant plugin to move over to iPhone development and get started with ObjectiveMerchant. Initially we’ll probably try to support the Authorize.Net and Paypal gateways, but it should be relatively easily to fill in the full list over time.

A key challenge in this project will be to develop good unit tests for the ObjectiveMerchant framework. I am hoping that I can write OCUnit tests based on the existing tests in ActiveMerchant, but the differences between the two testing frameworks might make that difficult. TDD is not nearly as prevalent in the XCode world, so this is trickier than I would like. Any suggestions on how to improve the testing of this new library would be greatly appreciated.

If you are interested in helping out with this effort… fork the repo and contribute!

I’ll be posting more info here as the project matures, and hopefully within a week or so it will be at a stage where I can show off some working payment authorizations. Until then, spread the word if you find this interesting… Thanks for reading!

By josh

We at TransFS use git for our source control… and we love it.

Why? I could list a bunch of great reasons here, but you should visit whygitisbetterthanx.com instead.

However, if you aren’t using GitHub… then you aren’t really tapping into the power of open source git goodness. GitHub has changed the way open source software evolves, making collaboration and participation MUCH easier. Check out my profile if you like!

Lastly… I just discovered a handy git trick that I thought I’d share. Found on this nice cheatsheet:

Add the following to your ~/.gitconfig to get colored diffs and git status output in the console:

[color]
branch = auto
diff = auto
status = auto
[color "branch"]
current = yellow reverse
local = yellow
remote = green
[color "diff"]
meta = yellow bold
frag = magenta bold
old = red bold
new = green bold
[color "status"]
added = yellow
changed = green
untracked = cyan

Pretty cool!

By josh

Here are TransFS.com, we are preparing to make a major infrastructure move.  We are changing hosting providers… moving out of our shared hosting to something that will give us a lot more room to grow.

Exciting times for us, but these changes come with some challenges.  How do we switchover to the new hosting service without:

  • Getting out old and new databases out of sync
  • Suffering excessive downtime while the DNS records update

Obviously, we don’t expect the DNS records to take very long… but in the worst case scenario we could be down for several hours, or even a full day, while waiting for everyone to be directed to the new site.

Why do we care if people find the old site during this period? The problem is that if we have users who use the old site during the transition, when do we clone this data over to our new database? How can we ensure that the new database has ALL of the most recent data?

As far as we can tell, it is a chicken and egg problem and there is no great solution. So, I’ve come up with a band-aid that should help us make the transition as smoothly as possible.

Enter a new rails plugin: has_maintenance_mode
Read the rest of this entry »

By josh

Not long ago, we decided to create an additional domain for a new tool on our website. This tool was sufficiently unique that we wanted to give it its own identity… while still tying it into the TransFS.com branding. Obviously, we could have just created a new Rails app and coded up a website with links back to TransFS… but why do all that extra work? We wanted a way to host this new domain directly from our existing rails app.

Some of our reasons for doing this:

  • Simplify the backend: server maintenance, releases, and hosting costs
  • Repurpose existing CSS, images, javascript, etc
  • Repurpose existing code (avoid complications of git submodules keeping shared code in sync between separate Rails apps)

However, we quickly realized that Rail’s doesn’t really support hosting a separate domain from the same app… at least, not out of the box. What we needed was the ability to use routing rules to specify that requests coming from our new domain, truecostofcredit.com, be directed to specific a Controller.
Read the rest of this entry »