Building GroupMail, a group email service
I recently quit my hedge fund job to pursue entrepreneurship. My hypothesis is that in the long term entrepreneurship outperforms high paying jobs, and that most risk of failure can be minimized when starting a business by choosing conservative (easy) problems, and applying rational thinking as well as creativity to business problems. I started chronicling my success and failures here, this is article 2. It will cover idea formation, monetization, and the technical and design choices I made building the product.
I rented this Airbnb for 8 friends. Airbnb wanted the email addresses of my companions so they could forward the itinerary. Typing one address is ok, 8 is way too many, so like most programmers would do, I wrote a program to solve this minor problem.
There are a number of ways that this is solved right now. And by this I mean “handling email communications with groups of people”
- Reply-all. You can always type multiple addresses into emails. This mostly works, especially since gmail auto-completes really well. Unfortunately sometimes people forget to hit reply-all (and the response only goes to one person). There isn’t a good way to do things like forward a confirmation email, to the same group of people (without retyping all those addresses).
- Mail Client email groups — almost all clients have client side email groups. These are aliases; you type one address, it represents multiple people. However other people cannot send to your group.
- Google Groups, Yahoo Groups (and other things like this). These are fine but they’re more complicated, they are optimized for creating groups that people can join and leave whenever they want (think open source mailing list as opposed to the friends you hang out with on Thursday nights). There are also smaller competitors which are similar in functionality but probably better (Gaggle Mail, and eMailDoDo)
I believed that by making email groups as easy to use as option 1 people would start using email groups in more places.
This only counts as a business if I can monetize it. I had 2 possible approaches in mind — a paid version (more groups, larger groups), or advertising. This service is an incremental improvement on existing solutions (which are free) so my prior is that it would be difficult to charge for it. Email advertising gets you 5$ per 1000 emails sent (or 15$ per 1000 opened). Mailing list emails should have pretty high open rates (in this case it’s being sent by your friends). I would be reasonably happy if I could generate $2000 a month from a service this simple to build so that would require (assuming 80% open rate) 166,000 emails sent per month — not ridiculous.
One downside of this idea is it’s not a huge improvement over existing tools — I generally prefer businesses where there is an urgent customer need — but it was straightforward to put together (1.5 weeks development time) and I personally use it, so I was willing to give it a go. There is also a viral component which I like. I believed that group members who had been added would add their friends, and it would spread.
Building the Product
This section will be somewhat technical (but without code snippets). If technical stuff bores you, you can stop reading now.
The first thing I did was throw together a landing page. I’m terrible at design — I just needed something that looked somewhat professional and fun. I went to this page of free (and paid) themes, and chose this one. For someone like me, using a theme (or hiring a designer) is definitely the best way to go, there are too many design details that I get wrong when I try to do it myself. My only complaint is that most themes tend to be overly specific, and look strange when you try to adapt them to other content.
Traditional password based auth schemes are too cumbersome. I ask users for an email address, and, then I send them a one time login link (this is also how Medium works by the way). And it has the added benefit that the flow of registering a new account and logging in are exactly the same.
I threw together a web interface using Vue.js. I had originally started using React and abandoned it for a 2 reasons
- Straight HTML templates were much easier for me to understand than JSX.
The web application portion of GroupMail is simple. It’s unclear to me whether the templates of Vue.js are flexible enough to produce more complicated web applications without becoming too confusing. If I ever build another client side web application of sufficient complexity I’ll probably find out, but for now Vue.js is great, and React is too hard.
The web interface is a secondary way to create email groups. The easiest way to create groups is by forwarding email. If you forward an email to email@example.com, we’ll turn the subject of the email into the group name, and add all email addresses referenced in the email to the group. Every time I receive an email at firstname.lastname@example.org, My email service provider hits a webhook of mine with some metadata about the incoming event. I parse the creation email, then I send a message to the group creator, with a link so that they can confirm the group, or edit the group. When they are done, I send a welcome message to the original thread. Subsequent replies to the thread use the new email group. I’ve learned a few interesting things about email
- Email is terrible to parse. All mail clients represent the header of the forwarded or replied-to message as a blob in the message body — and they all do it differently. I only parse it properly sometimes, and I fall back on dumber approaches when I fail
- Email messages have a Message-Id header. They also have In-Reply-To or X-Forwarded-Message-Id (which is the Message-ID of another message). To make sure emails are threaded properly, I set my In-Reply-To to the original (In-Reply-To or X-Forwarded-Message-ID), since those point to Message-Ids which are already in the thread.
- Sending mail now is harder than it used to be. Because everyone is cracking down heavily on spam, it is very hard to get mail clients to treat your mail as not spam. Doing so requires setting a bunch of DNS configurations properly (DMARC, SPF, DKIM) which isn’t very hard, as well as building trust for your IP addresses and domains (this is the hard part) As a result, most people rely on third party email service providers. I looked into Sendgrid, Mailgun, and PostMark. Sendgrid is definitely the cheapest, but gmail kept flagging Sendgrid messages as Spam I didn’t take the time to work with customer support to resolve this, I suspect it would have been fine. I was going to signup for Postmark, but Postmark requires you to sign up with a non-free email address (and at the time I did not have one), so I went with Mailgun. Mailgun seems to work pretty well, and I have no complaints.
I’ve got a functional group email service now. I use it regularly for some permanent groups (my family, for example) As well as for some disposable groups (for trips that I’ve taken with friends). Building is the easy part — getting users and monetizing them is the hard part — which is up next.
Thanks for reading — my current projects are free email groups, and getting instant customer support sessions from open source developers.