Julie Ng

Julie Ng

I Shipped Something

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.

The idea

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 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.

HTML Generator

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 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

Lessons learned

  • 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:

  • writing Terms and privacy policy
  • 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)

Thank you

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.