A blog about productivity, workflow best practices, company building and how to get things done with less work.

 

Archives for October 2012

We use SQLAlchemy at Zapier to handle external database connections to things like MySQL, MSSQL, PostgreSQL, and others. For example, you could set up a Zap to add a new row into your database table every time someone tweets a specific word. Or archive tickets from JIRA into your in-house database.

We ran into a problem with our MSSQL connector recently. If you were using a username or password with a plus sign (+) in it, you could not connect. A quick search leads us to this solution. This works well to properly URL encode the plus sign when you are using standard built in SQLAlchemy connection strings (to MySQL, for example).

In our case, we are running SQLAlchemy on Ubuntu and need to rig up FreeTDS and PyODBC. You must use a special SQLAlchemy connection string to pass along extra variables, shown here:

mssql+pyodbc:///?odbc_connect=dsn%3Dmydsn%3BDatabase%3Ddb

Notice that the actual variables are encoded into the odbc_connect query parameter. Naturally, I encoded my username and password into the odbc_connect parameter. The problem is that the odbc_connect parameter gets decoded twice. Normally SQLAlchemy connection strings get decoded once. The "quick answer" article above alludes to this. The second decode happens because the odbc_connect parameter has its own data structure (dsn=mydsn;Database=db). Presumably the odbc_connect parameter was added at a later time without consider how odd it is to double URL encode things.

About that plus sign... A plus sign "+" is encoded as "%2B". Decoded gives you back "+". Decoding a second time gives you a space " " (by definition of the URL encoding scheme for plus signs which are treated specially). So the proper way to handle this it to URL encode the odbc_connect parameter twice! Plus signs "+" end up as "%252B". This results in an incorrect password being sent to the server.

Here is the proper, working code to generate a mssql+pyodbc SQLAlchemy connection:

fields = {
  'host': 'database.host.com'
  'username': 'myusername'
  'password': 'password+with+a+plus!'
  'port': '1433'
}
db_url = 'mssql+pyodbc:///?odbc_connect=' + urllib.quote_plus(urllib.quote_plus('DRIVER={{FreeTDS}};SERVER={host};DATABASE={database};UID={username};PWD={password};port={port};TDS_Version=8.0;'.format(fields)
connection = create_engine(db_url, connect_args={'convert_unicode': True})


About the "API Quirks" Blog Series

Everyone at Zapier has to deal with API Quirks. We deal with so many APIs each day, we have become almost immune to the often bizarre, undocumented, frustrating behavior exhibited by web APIs. You can see all the posts in this series here. No API or documentation is static. Take any quirks published before "today" with a grain of salt.

Don't want to worry about this? Connect to MSSQL with Zapier

About the Author

Mike Knoop is a Co-founder at Zapier. He helps run product and love the color orange.

Today we're excited to announce that Zapier now supports more than 100 public applications on the platform. That's making no mention of the hundreds of other apps used privately on the developer platform.

Today Zapier automates millions of tasks every month and helps thousands of people all over the world. That's with just a tiny portion of all the major applications used for business around the world supported. 116 to be precise. But working efficiently is hard. And there's still a huge demand for helping you connect the tools you use everyday.

To help you understand where we are going I thought it'd be interesting to show where we've been.

September 2011 - An Idea is Born

The Dude Chat

As my co-founder Bryan and I tend to do, on September 8th of 2011, we found ourself chatting ideas back and forth during our day gigs. And thus the original idea for Zapier was born. A way to connect paid services.

October 2011 - The First Ever Columbia Startup Weekend

From September 30th to October 2nd we took the idea to Startup Weekend in our home town of Columbia, Missouri. The original name from Bryan? API Mixer. (Yeah, he doesn't have naming privileges anymore).

The funny thing about Startup Weekend is the participants pick the ideas and the top 10 or so ideas get selected. API Mixer was dangerously close to not getting picked but the voting happened with sticky notes. Luckily we found an extra pack of sticky notes and like any good startup founders would do, we made sure API Mixer participated in the weekend.

Startup Weekend

By Sunday night with a nearly failed demo, Zapier was the winner of the first Startup Weekend in Columbia, Missouri. And by mid-week we'd setup an LLC and were already talking to some of you about how your work can be done more efficiently.

November 2011 - Bootstrapping Our Way to Our Sale

Being born and raised in the Midwest definitely instills in you certain life lessons. Phrases like "A penny saved is a penny earned" and "Pulling yourself up by your own bootstraps" aren't just silly colloquialisms, but a real way of life.

So for us, we knew growing Zapier in a way that could help customers over the long haul meant that at the end of the day we needed to be making more money than we were spending. Basic finance 101.

That's why on November 30, 2011 we were beyond stoked to sell our first Zapier beta invite to Andrew Warner for $100. And by a week later we'd sold a dozen more. That's when we really knew that we were building something that could really help a lot of people.

Andrew Warner

January 2011 - Going Full Time

Knowing when to take the leap from nights and weekends to full time is something a lot of entrepreneurs struggle with. For some it's easy, but for some it's really hard. Even Mark Zuckerberg never intended to dropout of college.

By January we were gaining enough traction that it was clear someone needed to go full time on Zapier to help with support. With a helpful nudge from my then boss and after some long night discussions with my wife and family I went full time on Zapier at the beginning of January.

Zapier for several months had been one of the main things in my life. Outside of my wife and family, it was now the only thing.

It wasn't too much longer that Bryan and Mike both followed suite.

Zapier Sign

March 2012 - Product/Market Fit

Figuring out the right thing to build and the things customers care about is always challenging. By March we'd heard loud and clear from our beta customers. Custom fields, filters, a better UI, and a never ending suggestion of new apps were things we heard all day long.

We experimented with pricing by charing $1, $5, $100, whatever for access to the beta. What dollar amount attracted customers that cared? What users needed the most support? What apps attracted the highest quality customers?

Each day we found ourselves pushing some small piece of the product forward. Never with overnight success, but we tried to make one small thing better everyday in hopes that lots of small improvements would add up over time.

But on April 2nd we broke the mold and made a big change; we launched a brand new interface. An interface that nearly tripled engagement with our beta customers.

New Interface

April 2012 - Y Combinator and A Change of Pace

Over the last few months we'd been approached by a number of accelerators, angels, and venture capitalists about raising money and relocating the now small but growing company. Raising money is something we had no experience with so we knew we'd waste a lot of time and not be giving our customers features, support, and help they need. Accelerators are quite the fad and seem to be dime a dozen these days, but as far as accelerators go no one matches Y Combinator. After talking to mentors, customers, and YC alum we decided YC would be a good thing for Zapier and so we went for it.

We scoured our network and our userbase and asked every YC company we had warm intros to for help. At the end of April we were accepted into YC which meant a major move from Missouri to California.

Zapier in YC

June 2012 - Launch, Growth and Support

In mid-June we launched. For many startups launching is a big ordeal. It's the make or break day. Sink or swim. For us, it drove a lot of traffic and attention, but we kept growing at a strong steady pace. It wasn't sink or swim. It was another tick mark in a long line of tick marks we'd been making as we grew the product with your feedback.

The support load kept growing. We implemented systems to make sure we could provide high quality support. We listened to the features customers were asking for. We built the most important ones.

August 2012 - Catering to Vendors

In August we launched the developer platform. An easy way for vendors and app developers to add new services to Zapier.

It was an extension of our philosophy of good support. The best way to give users what they need and want is to enable them to do it for themselves and others which leads us to today...

Developer Platform Launch

October 2012 - 100 Apps and Funding the Future

In early October we crossed 100 apps supported on Zapier. We now support the best-of-breed SaaS applications on Zapier. The model is proven. Revenue continues to grow. We have a good sense of the path forward. Where once we would have thought funding risky, now it feels natural. A way to help grow the product in the way it should grow and helping revenue grow alongside it.

We've partnered with the teams at Bessemer Venture Partners, DFJ and a handful of angels that know SaaS products, know companies, know product, know support, know marketing and can help ensure that Zapier will stay around for many, many years to come.

Funding isn't success and it's not the finish line. In many ways, funding is like a nice power up you find in Mario. Funding will let us move faster without sacrificing quality along the way.

To November and Beyond!

We never know 100% what the future may hold, but for Zapier we know that helping businesses run more efficiently and doing it with fun will always be center.

Expect to see more services supported, key features added, better support, and a slowly growing team that cares about helping you run your businesses the way you want.

Zapier Team and Tuna

About the Author

Wade Foster is a Co-founder and CEO at Zapier. He likes to write about process, productivity, startups and how to do awesome work.

In the tradition of recapping YC experiences, especially around the acceptance process during the beginning of a new YC batch, I thought it would be fun to quickly recap what we did prior to our YC S12 funding.

It all started at Startup Weekend where we combined our own prior needs for integrations with the recent explosion of web APIs. We spun together a quick demo and ended up winning, but the real work was just beginning.

First Swing, First Miss

We actually submitted an app for W12, but were understandably turned down with no interview. We were very green, and to be honest, we didn't have any traction or that good of a product. It was still just an idea and 54 hours of labor coming off Startup Weekend.

But, we pressed on and continued to work on the product. We found our first paying customers by sleuthing support forums chock full of integration requests. We would email them and explain the product we wanted to build, and then build it (if they agreed to sign up for a paid plan).

That is how we bootstrapped the product: one paying customer, one feature at a time.

Second Swing, Making Contact

Once we had a product that worked and real, paying customers (not to mention, a much more nuanced understanding of what customers wanted), we submitted once more to YC for the S12 batch. We got an interview. We were pumped.

Once we had the interview, we pestered every single YC company or alumni we had in our already sizable userbase for help and advice. We probably did 12+ mock interviews with the cofounders of Wufoo, Sendhub, Science Exchange, and many more.

We probably over prepared, but each and every interview helped us feel more comfortable. I remember our first mock interview: it was with Ash Rust at Sendhub and we. were. horrible. I don't think we answered a single question with a logical response: "that is the worst answer you could give". It got better though. By the end of our mock interviews, we had 1-2 sentence replies for all the obvious questions and got the patter down between myself, Wade, and Mike.

Interview Day

While getting the interview alone was exciting, flying out to the valley and standing outside the YC in Mountain View building was a bit surreal. The nerves definitely came out, but luckily lots of alum were milling around giving advice on pitches and calming us down (thanks again, Ash)!

We selected the very last interview slot on Saturday. Our reasoning: we will be fresh in their minds and we won't have to wait long to find out an answer. The PG, Trevor and Robert interview track we had was running behind, so we kind of stood around nervously waiting all sporting our blazing orange Zapier t-shirts. We were the only group I saw wearing matching t-shirts. Finally, we walked in, shook hands, and PG immediately broke into discussion: "So, you guys are doing something with APIs?"

The rest was a blur. I remember three things:

  1. PG telling me to stop trying to get to the demo and just answer the questions instead.
  2. The partners starting to brainstorm around the product/platform we wanted to build.
  3. A way more casual conversation than expected. I even recall moments of awkward silence.

Finally the buzzer goes off and PG says: "Alright guys, time is up" and we get shuttled out. It felt 2 minutes long.

Waiting

What followed was about an hour or two of waiting for the wonderful phone call of acceptance or the dreaded email of rejection. Mike was optimistic. Wade and I had mixed feelings. Sitting on the patio at Steak Out with an empty beer, we were delighted to experience the former. If I recall correctly:

"Hey Bryan, its Paul. We loved you guys, we'd like to fund you."

About the Author

Bryan Helmig is a co-founder and developer at Zapier, self-taught hacker, jazz/blues musician and fine beer and whiskey lover.

Hey there friends of Zapier, If you've seen a new face answering your emails and chat questions, odds are it was me. I'm Micah Bennett, and I'm super stoked to be joining the team at Zapier!

For a quick intro, I'm Chicago born, Ohio raised, and Missouri educated; a true child of the midwest. I enjoy spending time supporting Tigers and Bears (but no lions), as well as travelling with my lovely wife. I’m also very passionate about efficiency, and am ever searching for ways to improve my workflow. This is what makes Zapier such a perfect match. What better way for an efficiency junkie to spend his days than working to save users untold hours and dollars in productivity?

I also appreciate Pandas.

So what does that mean for you guys? Well, if I'm doing my job right, it means better support. Better and quicker responses, improved documentation, and a constantly improving user experience. We’re working on some great tools to get you to solutions faster and easier than ever, as well as improving how we work on things internally. Efficiency inside and out!

In short, I’m excited to get started working to improve the Zapier experience for all of you users. So hello, and stay tuned!

About the Author

Micah Bennett is the Support Lead at Zapier. He loves his wife Trinity, dessert, and the Chicago Cubs. He has never been to Boston in the fall.

Get help