Startup Idea: User Retention as a Service

It was the middle of our Y Combinator batch this summer. Akshay and I had a decently functioning version of Picplum that we were continuing to test and polish up. At the end of our office hours that day, Paul Graham said our product was good enough and that we should stop coding and start selling & marketing. I think about this quite often.

Office Hours with Paul Graham, Aaron Iba and Picplum at Y Combinator
Picplum at YC office hours in July. Photo Credit: Garry Tan

tl;dr Trying to draw attention to the importance of lifecycle marketing. I build up the case, talk about where lifecycle marketing makes sense, show an amateur first attempt at it, then proceed to layout a grand idea for a lifecycle email marketing service I want to see someone build. Please share this post.

I was in that mindset when I decided to sit down a few weeks ago and hammer out some code that would help with that (typical engineer approach.. get code to do it for you). One of my perpetual to-do items in the few months following our launch was converting users that signed up but never did anything into users that sent out their first batch of prints. The latter is more or less our definition of an activated user. You can find more info about Picplum in my lengthy post-launch article, Thoughts on Picplum Automatic Photo Prints.

New users see a simplified onboarding UI; a simple 3-step flow for adding photos, recipients and then sending their first batch. But how many people signed up and never got around to adding photos? Maybe they just didn't have any photos at the moment and wanted to wait until after the holidays to add them.. and then they forgot. The same might be the case for people that have used Picplum in the past but haven't engaged recently.

Dragging and dropping photos from iPhoto into Picplum
somewhat unrelated but here's our onboarding UI

Enter lifecycle or drip email marketing. This is not the same as your traditional newsletter blast that goes to every registered user, nor a transactional/trigger email (such as instantly emailing individual users a welcome email when they signup or sending a notification that their package has shipped). Lifecycle email marketing depends on various factors that describe the state of their account. Let's say you have a complex web app involving a hairy 10 step onboarding process. You would write several different emails for each possible place a user could stop engaging. Say they fell out at step 4 of 10. You would send an email after some amount of time that is indicative of where they left off and what they did in the last steps. Not just a "finish setting up your account" email.

That's just one use case that happens to deal with getting a user onboarded. There are many more. I go a bit more in-depth down below.

Why lifecycle email marketing?

You're probably familiar with Dave McClure's Startup Metrics for Pirates: AARRR — Acquisition, Activation, Retention, Referral, Revenue

Startups spend gobs of time and money on user acquisition and then they just let those hard-earned new users slip through the cracks by failing to engage them and carry on with proper retention tactics. You might have happier users if you spent nearly as much time on user retention as you spent on that fancy user invite module that comes up before the user has even tried out your service.

Mcclure pirate lifecycle
This blog post is all about step 3!

Startups en masse are failing at this. I'm a curious person. I signup for new startups all the time, even if it's not exactly interesting to me. I want to see how they approach email marketing, what kind of design and UX choices they make (if you've read my design post, you know I take lots of LittleSnapper screenshots), et cetera. But guess what? I rarely hear back from any of these startups. At best I receive some generic "we have a new feature" newsletter that is a copy and paste of their company blog.

Startups, PLEASE EMAIL ME MORE. It's not a biggie. If I don't like your emails or service, I'll simply unsubscribe. No harm done.

lifecycle email marketing infographic
Which are you?

So who's doing it right? I'm having a hard time coming up with examples of companies that do a great job of such lifecycle marketing but if you think of any please mention in the comments. AppSumo emails me a ton and I haven't unsubscribed yet. While their emails aren't indicative of lifecycle marketing and are more along the lines of daily deal updates, they are way up there there in terms of copywriting. Their emails do a great job of getting my attention and keeping it as I open the emails.

For the most part the startups that do email me a lot don't seem personal. The copy doesn't address whether I've been a long-time user well versed in everything about their offering, if I just signed up or if I'm somewhere in the middle. Lifecycle email marketing fills in these gaps by being informed about each user before reaching out. While it's outside the scope of this article, great copywriting for emails is just as important. I'm not an expert on that so I can't comment, but I'm looking to learn more if you can suggest any great web/email-targeted copywriting blogs or resources.

Lifecycle email marketing is for helping your users engage with your product or service in the intended manner. It's not simply sending reminder emails. It's offering useful help when you notice they haven't done a certain task yet. Maybe it was too hard? Offer them help and tips. Reward them on their last successful actions and offer positive reinforcement for continuining.

The Numbers

Alright, time for napkin numbers. You work hard all day and put up a Show HN post. You get 2,000 visitors to your startup's homepage. You get a decent signup conversion rate. Let's say 10%. You have 200 new users! Another 10% of those end up activating. Your definition of activating will vary, but let's say this startup is Greplin. They want people to link up data sources they can begin to index. Only 20 people activate right on the spot. That leaves a lot of unactivated people. I'll stop the numbers there but you can imagine that while some will come back when they remember or when Greplin sends out a regular newsletter, there's a lot being left on the table.

Now imagine if you were in a different business and you paid a lot to AdWords to acquire all of those users. You just lost a lot of money on paid users that did nothing.

Now here's the great thing about lifecycle email marketing: set it up once and it keeps on giving. The effects just keep on compounding forever and ever (until you change your product and your outdated email copy doesn't quite correlate anymore).

Fisher Price: My First Lifecycle Mailers

Now that you're sold on lifecycle marketing, back to my story.

I wrote three different mailers with varying copy. Then there's some logic that is informed about the following:

  • number of photo batches user has sent
  • time since last batch shipped
  • time since account registration
  • time since last retention mailer sent
  • what retention mailer was last sent

And it's all hooked up on a cron'd resque job, delivered by Mailgun with send events also tracked by Kissmetrics. This is done so we can see in Kissmetrics any flurry of activity following a retention email delivery.

For example, if a user signed up just over 2 weeks ago and hasn't done anything, they'll get a simple "We've missed you" email with some tips for getting started. If another user has sent one batch but it has been 40 days since, they will receive a different email. Users that have not done anything at all and already received that first email, we'll send them different retention email. As for users that have sent several batches with Picplum, I mark them as activated and don't send them any more retention emails (though I will be changing this shortly to add another mailer for such active users, maybe even prompting them to invite others -- going onto the second R in AARRR).

After I committed this first stab at user retention, Akshay offered up some scenarios. What about users that have recently logged in? This logic doesn't take into account those events. Should those users still get the retention email? What about new users that have added photos, but not recipients? Should we make the email more personal and send a different mailer with "add some recipients" helper copy?

Akshay Dodeja telling animals about Picplum
Co-founder @Dodeja in Jabalpur for the holidays, converting farm animals into paying Picplum users.

Ah, a logic nightmare! Keep going down this rabbit hole and it's easy to see that a good lifecycle email marketing strategy will have lots of different email types for specific user lifecycles. Lifecycle email marketing is a bitch to do right. That's where the impetus for this blog post comes.

I want a startup to do this for other startups.

The Startup Idea (BUILD THIS)

While lifecycle email marketing is a part of many enterprise marketing automation products such as Pardot, SilverPop, eTrigue, StrongMail, Marketo, Eloqua and HubSpot (née Performable), I have yet to see any such products that directly address my startup needs. By that I mean that I don't want to use a complete marketing automation SaaS offering. I don't care about integrating with Salesforce right now. I want something that simply takes care of the lifecycle email mayhem I started talking about above and I'm sure I am not the only one.

How it would work

I would setup the service ('RETENTIONIZER') to track lots of events about each user. It could even piggyback onto our Kissmetrics reports and 85 different events we already have in place through their data export feature.

The RETENTIONIZER would then allow me to wire up a bunch of triggers, not unlike setting up a GMail filter or Kissmetrics report. They could simply be per-user based purely on events with some delay, or even per-cohort. It would even have it's own events — how the user responded to a past retention mailer. Only send this if they didn't open the last email, et cetera.

I would supply the marketing copy for as many mailers as I want and it would hook into my email service provider API and set the proper campaign tags when delivering. It would integrate closely with Mailgun/SendGrid/SES/Postmark so that it could receive all tracking data. The RETENTIONIZER would report back on whether or not the user engaged with the email in the desired manner for which you had set the success conditions. This would make it easy to correlate on-site user activity with retention mailers.

For example, if the RETENTIONIZER sent a relatively new, unactivated user an email about TASK X, it would know if the user opened the email, clicked through and then actually did the specified task on the site, or if the user just logged in but then unexpectedly clicked some button for unrelated TASK Y. The RETENTIONIZER would inform you if your marketing copy was failing to achieve the desired result (and let you A/B test different copy for the same mailer of course), or if something else on-site diverted users. It would use this data to automatically adjust delays for best engagement as well.

Acquired user, User Stuck Around Can you tell this stuff is getting me really excited? I could go on for tons of use cases but the idea is simple. Keep users engaged by uniquely offering them a gentle reminder or tip that is exactly relevant to them. Nothing is more annoying than a retention email telling me to buy or do TASK X when I just did it the day before. Mailers need to be data-informed too.

This stuff really gets interesting if you have everything setup to automagically create cohorts for paid advertising campaigns. Say you run a Reddit promoted ad, Stumbleupon Paid Discover campaign, Facebook Ad, AdWords campaign and/or Kiip campaign. I'll leave that for another blog post..

Email marketers will tell you about some common segments for users: interested recipients, engaged customers, lapsed customers. But the product idea described above would make it easier to dive even deeper. Cohorts are magical. Dan Martell agrees.

In a nutshell

the RETENTIONIZER (mini) in action I send the RETENTIONIZER user events and tell it under which conditions it should send out one of the mailers I provide, and then it delivers the respective user retention email when appropriate. The service begins with smart defaults for delays and then learns as it sends out more and more and tracks user engagement with each.

Such an offering wouldn't be for everyone. At some point in a company's growth, they'll end up building this in-house or find themselves needing a miscellany of other features that those enterprise companies listed earlier are all about. I'm convinced that this will be a no-brainer for many, many startups. What do you think? Drop me a comment below.

Isn't there an easier option Stammy??

Your argument is invalid Or you can continue cutting into your customer's LTV and blow that cash on user acquisition with Google AdWords all day only to have those users forget about your service the next week. Getting user retention right is no easy task. It may not be your priority at the moment; finding product/market fit should come first. But then again, having more (retained) users to help you find that fit is good too. Chicken & egg.

This is a full-time job and not many startups can afford to do that. But they really need to get smarter with their email marketing. Which is why I want some startup to build this product! Take this blog post as a glorified letter of intent for me paying for this product when it emerges.

Email Template Dev Workflow

After being asked about how we did our emails by Ridejoy, Parse, and Hacker Newsletter, I wanted to share a bit about our process.

We got started with one of MailChimp's free Email Blueprints — a great, well-tested starting point that just needs your design. As the name implies they are really for use with MailChimp and we're going to be using them for every email including our transactional and retention emails sent by Mailgun. So we're going to need to strip out the merge tags and included <style> block.

MailChimp has a great article that provides some rules of thumb for working with HTML emails. Skim through it and come back. If you've really got some time to kill, MailChimp even has a massive Field Guide To Email Marketing. I'm just going to make a cappuccino over here.

Okay so the main things you need to know: you need to inline your CSS, tables are your friend, don't use too many images and don't expect any fancy CSS3 to work. For the latter, checkout this guide that shows what CSS each email client doesn't support, which should just be renamed "Why Outlook Sucks." If you avoid CSS3 and pseudo-selectors you're mostly there.

The hard part is working with an HTML email template where all the styles must be inlined. Fortunately there's Premailer (and the Rails wrapper of it). Premailer does a few things, but of note it'll automatically inline CSS styles from an email.css file you create and generate nicely formatted plaintext version of emails on the fly. Though there are a few cases where I still write my own plaintext emails. For example, an issue with premailer where it ignores alt/title tags on linked images, which we use for certain large call to action buttons.

As an aside, premailer hasn't been updated in a while, most likely as the author is working on the next major version. Be sure to stray away from the premailer default of ASCII-8BIT or you'll be subject to emails from some of your users saying they didn't like all the odd characters in their name. Premailer also has issues with certain CSS shorthands such as the following.

border: 1px solid #d4d6d7;
border-left-color: #c9cccd;
border-right-color: #c9cccd;
border-bottom: 2px solid #b1b7b9;

Akshay found a slick gem called letter opener that lets you preview emails locally instead of delivering them. I used to use for this but find letter opener easier. It opens up email previews in a browser tab and lets you toggle between plain text and HTML versions. But it's purely for basic testing; it might look great in there and still be horribly broken in GMail. When it's time to do some real testing, turn off letter opener and send emails to yourself in Gmail and a few other clients. Tweak as necessary.

Getting email templates right is still a pain in the ass. But if you have a pinch of patience and a nice beverage by your side you can get it done. The last thing to do is hook up the all important unsubscribe link. Make it easy for people to unsubscribe if they want to people are less inclined to report as spam.

You can either just link to your user settings page or take advantage of Mailgun's unsubscribe feature. Just include %tag_unsubscribe_url% (if you use campaign tags and only want them to unsubscribe from that kind of campaign) and Mailgun will replace that with their own unsubscribe URL and never let an email get sent to that person again, even if you accidentally do it on your end. However, I'm a bit paranoid and want those unsubscribe settings synced on our end too. (And I once ran into an issue where the incorrect email address was unsubscribed — I only use one email account in Google Apps, with about 7 other accounts either getting forwarded or imported in).

Time for webhooks! Little bit o' this

# in the webhooks controller. please sign your webhooks
  def verify(api_key, token, timestamp, signature)
	# from
    return signature == OpenSSL::HMAC.hexdigest('sha256'),api_key, '%s%s' % [timestamp, token])

email_type provided in X-Mailgun-Variables header; if you have various types of things to unsub

def unsubscribe User.find(params['user_id']).email_unsubscribe(params['email_type']) if verify(APP_CONFIG['mailgun_key'], params["token"], params["timestamp"], params["signature"]) render nothing: true end

Little bit o' that

# from mailer
  # notice the X-Mailgun-Variables header where we provide some JSON
  # user id to verify correct user, avoids wrong email unsub issue explained above
  # be careful with JSON spacing or it wont work
  def retention_second_batch_reminder(user)
    @user = user
    tag('Retention: Second batch, first reminder')
      :to =>,
      :subject => "We've missed you! Send some Picplum Prints today",
      'X-Mailgun-Variables' => "{\"user_id\": #{}, \"email_type\": \"retention\"}"

def tag(title, campaign = nil)

helps with setting campaign tags

headers[&#39;X-Mailgun-Tag&#39;] = title
headers[&#39;X-Campaign-Id&#39;] = campaign || title


And there's a lot more you can do for tracking other Mailgun events. Of course Mailgun has their new HTTP sending API (faster than SMTP + no more MIME!), so I'll need to migrate to that in the near future.

Here's an example of one of our Picplum gift emails (though this trigger email doesn't have an unsubscribe link):

Picplum gift template email

This particular HTML layout has the nice benefit of being Mailgun Approved:

Hey guys, very nicely done with design of your emails.

Not only they look great and don't abuse images, they're also very friendly on spam filters as well. Will take a screenshot and keep sharing with our users if you don't mind.
Ev Kontsevoy

If you read this far, you've won a Picplum account! Click below to signup.

Picplum Prints

We're hiring at Picplum!

We're hiring our first engineer! Want to work on a product that actually puts smiles on people's faces? We are a design-minded and data-informed team based in San Francisco working on problems that really affect people. Read more about Picplum and the team.

Want to hear more? Send us an email at Be sure to link us to something funny on reddit too. Then we can tell you about our buzzwords like backbone, coffeescript and rails.

Special Thanks to Noah Kagan of AppSumo for reading a draft of this post. This post made possible by several seemingly endless blocks of time, Sennheiser HD 650 headphones, many Above & Beyond Trance Around the World sets and level 32 in Modern Warfare 3 (gamertag StammyHD). Follow @Stammy and @picplum on Twitter.

This was a long blog post and I no doubt made some errors in here. Please drop me a comment below for any you spot. Thank you and happy holidays.