Two months ago I was a 26 years old with a great job in the utility industry. I was respected as a leader in web development for electric utilities (NPPD). I spoke at conferences and I built mobile apps for people to pay their utility bills, report outages, and for our executive team to view how many megawatts Nebraska power plants were producing. It was a good gig. I had job security and I was promoted after two years of hard work, but after some reflecting and lots of drinking (they go hand in hand right?) I decided to leave my corporate job in the utility industry to work for a startup – Bulu Box.

First_OfficeIt’s funny how things work sometimes. For three solid months I lived directly above Bulu Box’s first office downtown Lincoln, NE. I follow the local startup scene and had heard of Bulu Box through some of the articles written by Silicon Praire News.  I had planned to venture down my stairs and introduce myself as their upstairs neighbor, but never actually got around to doing it. Before I had a chance they had outgrown the small space below my apartment and moved to a new office in the Haymarket.

Bulu Box’s Co-Founders are Paul and Stephanie Jarrett. Paul and I started talking about ecommerce solutions in October. He had known about my entrepreneurial ambitions with Footwork, a mobile political canvassing application I co-founded and had been building up until the presidential election season ended. Building Footwork helped me create relationships with other Entrepreneurs and taught me to look at things from a new perspective. It made me better.

My first task at Bulu Box was to identify a platform. We needed new features but the previous platform was limited. The first incarnation of Bulu Box was built using Shopify. Shopify provides a lot of the templating features that make it easy for people to get a nice e-commerce store up and running. Shopify was just one piece of our software stack, but it didn’t allow us to sell a combination of full size products and subscriptions together properly. In order to sell customers on their monthly supplement box service we needed a bolt-on service for handling recurring credit card payments. For this purpose we used Recurly. Shopify and Recurly worked great to get Bulu Box off the ground, but it created confusion for our customers.

The main Problem:

We had two separate logins. Customers who purchased full sized products on Shopify had a separate login than our customers with subscriptions managed by Recurly. This was super confusing! Take a look at this screenshot from our old website (would you know where to sign up?):

The old solution was implementing the API for Recurly and Shopify. In theory this was a crafty solution, but Shopify’s API was the hold up.

Here is an excerpt from an email I sent to Shopify.

Their response:

Basically, our idea to programmatically create Recurly and Shopify accounts at the same time was not possible.

The secondary problem:

Recurly had no way to store shipping information, it just held billing information associated with credit cards. In order for us to track shipping information, we hooked Recurly into Mailchimp. This was a dismal solution at best, and we frequently ran into situations where data was incorrect and not synched.

So whats the solution?

We needed to move our website and customers to a more flexible platform that allowed us to have access to the source code to make our own systems.

I have experience with multiple ecommerce platforms, building websites using OSCommerce, Cube Cart, Zen Cart, but after learning lots of things the hard way I finally settled on Magento. I took a 3 year break from building Magento sites (after leaving for NPPD) and when I got back in I realized it has come a long way. It is versatile and offers a wide variety of extensions and solutions to get a customized ecommerce system put in place. Most recently, as of version 1.4 (latest CE Edition as of writing), it offers a feature called Recurring Profiles. Magento still attaches the label “beta” to Recurring Profiles, but with a little bit of due diligence and proper tweaking it’s possible to create a custom subscription service and ecommerce website using the platform.

When we decided to move our website to Magento we had a few big hurdles to tackle.

Going live:

LateNightWe had lots of little things to figure before we decided to push the big red button. We needed a way to smoothly transition our Recurly subscriptions into Magento customers with recurring profiles. No big deal right? This was a daunting task.

Luckily, Recurly was able to provide us with the data to make this happen. They had been very good to us and I was sad to see them go, but we had just out grown the need for them and had the talent to build our own solutions with Magento.

Out of the box Magento Recurring Profiles only work with Paypal Payments, which means in order for them to work with Authorize.Net CIM we needed to find an extension or develop our own. I ended up settling on an Authorize.Net CIM – Payment model by Paradox Labs. In order to import our Recurly customers into Magento we needed to understand how Recurring Profiles work.

What we were able to do was piece together some code to programmatically create recurring profiles for a list of customers and their credit cards in a file. This was a big accomplishment that allowed us to seamlessly move our customers and their credit card information. We didn’t want our customers to have to re-enter their information for our new website.

I also modified the way the Magento Recurring Profile grids work. Here is a sample of some of that code:

Magento Recurring Grid Improvements

Lets put this sucker live

My first month at Bulu Box was spent working on the new website. It was our day and night and soon we began to see the light at the end of the tunnel. Our goal was to have it live the first week of December.



So we hunkered down, set goals, and did lots of white boarding. Finally, late one Sunday night it was ready to go. We flipped DNS from Shopify to our Amazon EC2 hosting Magento, turned off Recurly and prepared for our first customer on the new website. It happened at exactly 12:01am and it worked great!

The next week was spent fine tuning and fixing issues as they came up. This was our “silent launch” period for finding problems before we had a bunch of interested people flood the site and find them for us. Anytime you make a big change you are bound to have a few hiccups here and there, but we wanted to minimize them.

Overall the entire experience has been well worth it. The effort of our team and the fun times we had building it are part of the rush you get in a startup. In more ways than one, we taped together a solution that allows us to do what we do best. Get sample boxes in happy customers hands and have fun doing it!

With that being said, if you feel like discovering some new vitamins and supplements feel free to use my last name “Snyder” as a coupon code. Your first month is on me :)

Some Magento Hurdles:

Coupon Codes on Nominal Products
As of version CE Magento doesn’t do a good job of displaying the coupon code (discount code) used on nominal products (recurring profiles). That means if a customer entered a coupon code while checking out with a product, the front end didn’t do a good job of showing the correct totals. We had to override the cart controller files and the recurring sales order files to get a proper display setup.

Coupon Codes being reinstated
Magento recurring profiles also apply the discount code to a recurring product each time a new bill is issued. This is a big thing we had to overcome. A lot of our customers subscribe by using a coupon code to get their first box free. We want to make sure we charge them accordingly when their bill is due the next bill cycle.

Speed improvements
Magento is big beast of PHP resources. We are hosting our website over multiple EC2 instances, using Memcache, eAccelerator, Cloudfront (CDN), and Amazon RDS for Mysql DB instances. We still have some tweaks here and there to improve page loading. has been a good tool for load testing the website.

-p 1-25:60 -T 2000

This will ramp up from 1 to 25 simultaneous users over a 60 second period with a 2000 ms timeout, all trying to add that particular product to their cart. This is a fantastic way to begin triangulating how much traffic your store can handle.

Logging errors
For the time being we have silent error logging on. This allows us to monitor the log files Magento and Apache make and fix problems as they arise. I have been testing Papertrail for the past few weeks and it is working great, so great that we decided to get the dev team a Raspberry Pi which now displays the log files in realtime.

Raspberry Pi + Papertrail for logging
  • Pingback: Moving Ecommerce Platforms | c monitor()

  • Hal

    Nice! Tricky to move a working site to a better working site while keeping the business up. Thanks for sharing your experience.

  • Frank

    For all of the headaches we’ve had, I’m still a big believer in the power of Magento. Congrats on your successful migration!

  • Kalen

    Hey Tegan!

    This is a really interesting post, thanks for all of this. As you saw from my post, I decided not to go with recurring profiles for a few reasons. I was curious to know a bit more about some of the reasons you decided to go this route.

    – You described some of the complications of syncing shopify accounts up, but I’m not sure I understand what the problems with Recurly were?
    – You mentioned that you needed to get shipping information tied into Recurly – what were the features you were trying to support?

    While I really did want to be able to build off of Magento’s framework, I still feel pretty comfortable with my decision to work around it in this particular case for the reasons mentioned in my post:
    – Ability to checkout with both nominal and recurring products in the same cart
    – Ability to have a Buy Now and Subscribe option for a single product page (that may not be something you guys at all need for your biz model though)
    – Worked around some shipping method hiccups we were experiencing with Shipwire live shipping rates

    Also in response to some of the hiccups that you mentioned that you encountered:
    – Didn’t have any issues with using coupon codes
    – Not much effort needed to avoid coupon codes reinstating
    – No additional performance burden

    There are a couple of features that still need to be built though, but I’m not sure if Recurring Profiles would have helped:
    – Need to update subscription pricing with variable live shipping rates on an ongoing basis
    – Need to add support for coupon codes that *should* reinstate

    Also the entire effort probably took about a week or so worth of work, and there’s less code and more simplicity in general.