In May 2014, I had the idea to build a small app from prototype to launch in 6-8 weeks, while simultaneously consulting as usual. The app I had been working one was too large and I needed a small success to keep me going.
Antwort Email Signature Generator
Although I dabble in many things, my unique proposition has always been Email design and development. Occassionally I helped designer and developer friends with email signatures. Why not save some time and make a generator?
And so Antwort Email Signature Generator was born.
Antwort Email Signature Generator with Live Preview
Frontend Prototype (4 weeks)
I met my goal of creating a working prototype in 4 weeks. I used Backbone.js to create the frontend with the following features that were important to me:
- live preview of the email signature
- ability to adjust colors, fonts, etc.
- dynamic generation of editor based on signature design.
I started with just two designs I currently use myself for my company Offsides and my freelancing business.
Backend (8 weeks)
I was totally off the mark here. About 4 weeks in, I lost interest and wanted to give up. But friends convinced me to follow through and ship.
I wanted to get my hands dirty in pure Ruby to generate the HTML to deliver to the customer based on their input values. This involved:
- generating HTML with ERB
- generating a readme text file
- zipping files together
- uploading to S3
This went more or less to plan, but took 2 weeks instead of 1 probably because I’m a perfectionist and refactored more than necessary.
I wanted some non-rails experience so I started the project as a Sinatra app using inspiration from Alex MacCaw’s trevi gem organisation.
While I learned a lot, this ultimately cost me several weeks. In the end, I did switch back to my comfort zone in Rails, because:
- debugging (for me) was more difficult in Sinatra
- I used the contrib library among others, which ultimately did not work as expected
- Rails routing is more robust
- I missed the rails console
Lesson learned here: my project is larger than inititally thought. Sinatra is great, but I’m much faster and more comfortable in Rails.
Payment - why I missed my deadline
What really cost me 4+ weeks was implementing payment. Integrating Stripe was super easy, from sign up to frontend to backend.
The difficult part was purchase form UI, which was complicated by the fact that my target audience would be global so USD would be ideal. But I needed to collect VAT from EU businesses and I figured that would be easier in EUR.
Antwort billing UI, more complicated than thought
Currenies and VAT are complicated
- Toggling currencies and VAT means keeping track of various pricing
- I need to validate VAT IDs and the Bundeszentralamt für Steuern API is terrible
- VAT exemptions for Germany is not allowed
- Force EUR and disable currency toggle for EU countries
- Allow non-EU countries any currency
- Map out all use cases from the beginning
- Start with Jasmine tests from the beginning to check internal pricing and UI.
I also learned later that Stripe does not have coupon functionality for one time charges, which makes sense since I tell Stripe how much to charge a user.
This meant I had to build this functionality from scratch so I could give my friends a discount.
Other things I forgot
When estimating time and cost of project I also did not take into account:
- setting up domains and SSL
- creating installation instructions, incl. screenshots
- creating receipt emails
- setting up support emails or service (I use Help Scout)
- setting up Google AdWords and basic SEO (todo)
I still have mixed feelings about whether this small app will bring in any sales. But I am glad that I shipped something. I don’t believe in regrets. So yes, I would do it all over again.
Lastly thank you to friends who motivated me to finish, especially Tobias Maier, Sven Read and Michael Zoidl.
And special thanks to my friend Tyler Duncan for helping me with Google AdWords setup.