A Short Background

by Mary Hipp, Developer at Cobble Hill

A little over a year ago, I started a 3-month bootcamp to learn how to code. It was General Assembly’s Web Development Immersive, and it was life-changing for me. Programming came pretty naturally to me, and I knew that I had found my niche. I moved to Charleston, SC after completing the course, and started working at a creative boutique agency here called Cobble Hill. I was terrified, primarily because this job was going to be focused mostly on building client-facing and design-heavy custom WordPress websites. CSS was not my forte, and I had never written one line of PHP. Still not really sure why they hired me….

Back in present day, I consider it a privilege to turn our designers’ beautiful designs into beautiful themes and websites, and am proud to say that CSS and JavaScript feel like second languages to me. I have also become very comfortable with creating a functional and structurally sound WordPress back-end customized to fit each client. That being said, I still know little PHP beyond the WordPress codex; I rely heavily upon plug-ins and reusable code snippets to solve my back-end roadblocks.

A month ago, I was assigned my first Rails app for work, and was chomping at the bit to get started.  I immediately felt like I was back in my comfort zone, and with a newfound appreciation for my first programming language, Ruby (my instructor at GA had always drawn PHP with devil horns attached, and now I know why). What follows is just a short lesson in the value of self-confidence, which is always important for programers, but all the more so for beginners. I have found that you have to trust in yourself that you can solve the problems that you face, and only then will you learn and grow.

Hopefully it can help someone out there emotionally, if not technically.

The App

The web app in questions is called Prelaunchr, modeled after Harry’s very successful campaign to expand their mailing list prior to launching their product. Essentially, users can sign up for the mailing list and receive a unique referral link to share via social media; they can then earn rewards based off of how many friends sign up using their unique link. A screenshot of Harry’s campaign is below, showing the different levels of rewards as a user’s referral number increases. We were building this as a project for a very exciting new client, Fireside Provisions (think Blue Apron for campers), who’s e-commerce site we were also building and has since launched.

1-fbcsOTQvnxGXb-R3jPMHbA

Harry’s Prelaunchr Campaign

It’s a pretty simple system, but seems to actually work. I was fortunate that the dev team at Harry’s decided to make their code open-source and share their successful campaign with others; most of the app’s skeleton was done for me. I cloned their repo and got to work.

Initially, it was all CSS and Rails templates. I never thought I would miss clown hats so much. Beyond that, however, I found myself feeling nervous and insecure; I hadn’t really worked in an unfamiliar Rails app in months, and that dry spell had shaken my confidence.

One feature that wasn’t included in Harry’s code that we needed involved detecting fraudulent emails. It would essentially prevent users (or bots, for that matter) from using fake email addresses to pad referral numbers. The client wanted to use SendGrid for this, which has many features; I was going to use it to send an initial transactional email upon a user signing up, and to then detect which of these emails bounced back. This would allow us to remove those fake referrals from users’ counts.

Sending The Transactional Email

My first instinct was to search the internet for a gem to do all of this for me. Again, I was so dependent on WordPress plugins, that I had almost forgotten my own self-sufficiency! Luckily, I was able to recognize that a lot of the resources out there really over-complicate this. I opted to follow these directions straight from the source; all I needed was an ActionMailer class, a simple HTML email, and some SendGrid configuration in my environment file. Call it each time a new user is created, and bam, Inbox(1).

Bounce Detection

I spent so much more time on this than I needed to. Once again, I wasted hours prowling the internet and trying different gems that had way too much magic under the hood to come close to working with my app. One had fancy configurations with hardly any documentation, another involved hooking up an intermittent post request from SendGrid that would that would include my app’s bounce report. I almost got that one working, but couldn’t quite get my gem’s endpoint synced up.

I was finally giving a go at a SendGrid gem that utilized HTTParty when it hit me like a brick! I know HTTParty! I understand API’s, and SendGrid has a pretty killer one built right in. Why was I wasting my time trying to use someone else’s code when I can write a handful of lines and accomplish it myself?

1-gIhUx-UjtlleSyivcDWzEw

My API call to get bounced & invalid email addresses from SendGrid.

I called my get_bounces method as each existing user visited the site, so that they would see an accurate referral number free of fakes. And this half of hour of work actually worked.


I love my job. It allows me to be creative and solve problems, while building a product I am proud of. It’s too easy, though, to get into the pattern of coming home from a day of working and not having that drive to keep working. This experience was a wake-up call for me, though, and frankly I’m a little freaked out that I have become so dependent on others’ solutions. I had forgotten that I can actually be really good at back-end code and logic; they used to be my bread and butter!

I can’t wait to integrate some of my new skills and sharpen some of my old skills with future projects, new and old, Rails and otherwise. More importantly, I now appreciate the importance of staying sharp in all realms of web development, not just the ones that you’re currently receiving a paycheck for.

Oh, and don’t forget to check out Fireside Provisons!

Screen Shot 2015-08-17 at 5.20.09 PM-min

Screen Shot 2015-08-17 at 5.21.44 PM-min