(This post is inspired by a question I received on producthunt.co (original link). A few people found it valuable, so I thought I might repost it with more context.)
Edit: some conversation on hacker news
Sendwithus is a startup, 11 months in, and (like any startup), our primary challenge is growth (read: user acquisition) – how do we let more people know about the massive pain we solve for them. It boggles my mind that some people still put HTML emails in their source code, or build email A/B testing in house… but that’s a whole post into itself.
Back on topic, @dshan (an early customer of ours and all around smart guy) asked what our user acquisition strategy is. Below is my cleaned up response, with additions.
We started with a strong partnership with @SendGrid, which sent us a steady stream of (unpaid) referrals from day 1. As we started growing, we added additional partners (Mailgun, MailChimp/Mandrill, soon Dyn) who did the same. Fun growth hack here is posting on the Uservoice/support forum for partners, answering questions, helping out the support team :)
Once we launched with Stripe, we saw a good jump in organic signups, especially around some of the blogging we were doing. The HackerNews post on our Stripe integration https://www.sendwithus.com/stripe STILL sends us zero touch paid signups, weekly.
All along we’ve been doing really targeted cold emailing – if we are using a service and notice that the transactional/triggered emails could be better, we’d reach out. This has brought us some of our highest value customers, never overlook the power of just reaching out to people.
We’ve evolved to a point where organic signups are eclipsing both referrals and cold emails in volume, so we’re putting an extra focus there (much much better blog content, releasing some really cool case studies). My hypothesis is that a lot of our early work on message board/support forums has lead to great SEO, but it’s hard to conclusive numbers here.
Looking to the future, Sendwithus has many natural partners that operate tangentially to transactional messaging; additional partnerships will create value for even more businesses, and additionally give us greater spread in our content. Anecdotally, we’ve been told that partnerships don’t work for startups. Investors have told us that repeatedly. I think if they’re PART of your strategy, and the values are truly aligned, it can be pretty powerful.
Something we’re playing with now, SEO wise, we’ve been using targeted Slideshare presentations, combined with keyword-rich short Youtube videos (45s), adwords, and matching landing pages has been (ex: Drip campaigns for Mailgun). Results TBD. (So far, pretty good!)
This is not presence. This is a list that I will never look at, that is hidden, and does a very poor job of representing where that person is. In slack, I have to @mention someone in order to see if they are around.
Faces blurred because it’s polite
This is presence. If someone is not online, they don’t show in the list or their desk is empty. Coworkers can set a funny photo if they don’t want a snapshot taken every 5 minutes. This is great for snapping a funny photo and expressing yourself. Combined with useful status messages it creates the best environment for working with a team.
2: Talking to people
Slack has a really great support for Google Hangouts via the /hangouts command. Unfortunately it takes 3 clicks to actually start a hangout, and then the people you’re inviting have to go through 3 clicks on their end to join. Inviting multiple people multiplies how long this process takes.
Sqwiggle meetings take one click (per person, to be fair). Just watch a video on how easy it is:
sqwiggle start a chat
3: Away
Not very helpful away
Slack has a built in status. You can use it to set yourself away. And then you can set yourself as “back”. All it does is change a green icon in the ‘presence’ indicator. Effectively useless. What if you want to mute notifications from Slack while you’re in a meeting?
Set yourself away in the top left, with an optional message
When you set yourself away on Sqwiggle, Sqwiggle gets out of your fucking way and let’s you get back to work. There’s no monkeying with settings in order to suppress notifications.
Bonus: One way Sqwiggle is awesome
Adding an icon and color to each chat channel is awesome.
Here are the options:
Bonus: One way Sqwiggle is %$#&ing stupid
The name. Sqwiggle is impossibly hard to remember, Google, or mention casually in conversation to a friend. Despite that I’m still using it.
Working in the transactional email industry with sendwithus, I often get asked why we don’t just whitelabel an email delivery solution, and provide the integrated service as a value add. This typically comes from people embedded in the email world, who see it as though we’re leaving money on the table.
These people might be right, but I have to trust what I know. I come from a background in building web products, and this results in me seeing the email landscape in a very different light than most. I really see the delivery as something ancillary to the problems with content ownership and optimization. The marketer that’s frustrated with going through layers of designers and developers just to make content changes doesn’t want to have to think about deliverability as well.
From a founder perspective, why would we tackle two big problems, one of which has established companies doing amazing things (email delivery)?
For a startup, riding the growth curve, brand recognition, and social proof of another company is so valuable, why give that all away?
Fundamentally, I don’t think of sendwithus as an “email company”. We’re solving problems in user messaging and content, and that’s where we’ll focus.
*I originally wrote this post while travelling in **2010** but forgot to publish it. Here it is, unedited.*
## Long overdue Burma (Myanmar) Update
This update is severely delayed as we have been back from Burma for quite some time (even packed in a trip to Nepal!), but I promised myself I would post some text about our trip in Burma.
We arrived in Burma (now technically Myanmar, but hell, it’s Burma) bleary eyed and anxious to see if we could actually get a (announced this May?) visa on arrival. After being herded through a counter and dropping some American cash, we were indeed issued a visa upon arrival. Woohoo!
We queued up with the some other foreigners and took a free taxi/bus to one of Yangon’s best guest houses, the Motherland Inn (2). First impressions driving into Yangon (also known as Rangoon, former capitol city of Burma) were that it was green, lot’s of old and new buildings, but everything looked quite worn down. Road conditions in Burma are … interesting, to say the least. After spending a few days adjusting to the filth of Yangon (people defecate on the streets) and visiting the largest pagoda in Burma (Shwedagon Pagoda), we bought bus tickets to visit Hpa-An, in the southern Kayin State of Burma.
Lucky for us, on the night of our 10 hour bus ride, both Jillian and I got an extreme case of food poisoning and had one of the worst bus rides … ever. We ended up spending the next 3 days in Hpa-An lying in bed, but we saved quite a bit of money because we didn’t eat any food! Truly lucky, the manager of the Soe Brothers Guest House (we did their day long tuktuk tour, well worth it) took good care of us and checked up on us regularly. We managed to do a tour of the surrounding area the next day, including a 3 hour hike up a local hill (see picture), but we were still feeling the food poisoning and we needed a full days recovery afterwords.
Next up was the touristy Inle Lake, which we had to spend a full 24 hours on busses to get to. The final bus dropped us off an hour away from Inle Lake, at 4am (!). Some quick negotiations and we hired a motorcycle to take both of us, and our huge packs, to the lake itself. We stayed at the Queen Inn, which is situated on the outskirts of the actual town, and is an awesome little place. We rented bicycles one day, and did a tour down one side of the lake, and another we did the “everyone must do it” day long boat trip on Inle Lake. For the boat trip they take you to several “authentic” villages along the lake, take you to their little stores, don’t force you to buy anything … and then take you to several touristy attractions (like a floating monastery where they have trained cats to jump through a hoop). See below for a picture of the lake.
After Inle Lake we started feeling like we wanted something a little different, and started making our way to the town Hsipaw, in the north east of Burma’s Shan State. Getting to Hsipaw was made difficult in that the local Shan people pronounce it “sheepaw”, but most Burmese people pronounce it “teepaw”, and we also ran into some people pronouncing it “deepaw”. After a very grizzly 4am morning at (one of the four!) Mandalay bus terminal, we finally got on a bus destined for Hsipaw. Hsipaw was a welcome break, and we found Mr Charles Guest House to be relaxing despite the construction that was going on. After spending a day exploring the nearby countryside we decided the best way to get away a bit was to hire a guide and do a trek to some of the nearby villages. We set off in our Chacos and spent three days visiting villages. Aside from acquiring bed bugs, we had an awesome time taking pictures, exploring the villages, and eating some freaking tasty local food. The bed bugs got the worst of us though, and we were happy to return to Hsipaw and wash all of our clothes.
After Hsipaw we were nearly out of time in Burma, but we decided to make a quick run to the historic city Bagan, famous for its numerous pagodas and stupas. We had to go through Mandalay, which was a bit of an adventure. Our 6am bus from Hsipaw arrived at around 2pm in Mandalay, but, as the lonely planet fails to tell you, Mandalay has several different bus terminals. We were at the wrong terminal to go to Bagan, but were getting a little fed up with the pestering of taxi drivers, so we decided to walk (at least part of the way) to the other bus terminal (one of four …). After struggling in the heat with our huge packs for a half hour, we jumped on the back of a truck (literally, we have a blurry photo here somewhere), and the driver assured us he knew where we wanted to go. After five minutes winding through the streets, he pulled over at some motorcycle taxis and had them ask us “where you go?” … after some more winding through streets (on the back of motorcycles now) we arrived at the tiniest bus station imaginable.
Tired and disgustingly sweaty we decided that we were sick of running around town having no idea where we were supposed to go and slightly worried about making it to Bagan by the next morning so we settled on this cargo bus for a real backpack asia experience. The guys proudly showed Jillian the bus with a big smile on his face showing all the room and that the chairs reclined… By the size of his smile it looked as though the chair was going to fall back 3 feet not 2 inches, then he gave it a big proud pat resulting in a huge poof of dust. Laughing at the situation we gave in and bummed around Mandalay until 7 pm. At the tea house we visited there were some stealthy burmese girls taking pictures of us in the mirror.
At first the bus ride seemed like it wouldn’t be so bad because it was so spacious… but by 7 pm you can see in the picture that the floor of the bus was at the level of the seats and there were about 9 people to be crammed in. We were lucky that we had seats but it was still really hot. It took forever to get out of town so there wasn’t much wind coming through the windows for the first hour. Soon though it was dinner time and the Burmese people with us made sure that we got some food in us and the bus assistant guy gave us some pineapple. About 15 minutes after dinner the bus pulled over again and we weren’t sure of what to do. The bus guys and some of the people started unpacking some of the boxes in the back moving them onto the seats and some of the passengers got off the bus. We figured that people were already getting dropped off until the watermelons started getting passed through the back window and loaded into the spot where the boxes were. I don’t know where the people were supposed to go but somehow everyone fit in hanging out on the floor of boxes. The last stop before we really got going was the gas station, but when we first got shooed off we didn’t know what was happening and thinking it was only for a minute we left all of our stuff (all our valuables) on our seats and then the bus drove off… but it was all good.
Finally we were on the road again, due to arrive at about 4:30 am. The wind was blowing nicely through the window until about 11 pm when we had a nice 4-6 hour pit stop called “breakdown”. Luckily there was a breeze but it started with us waking up in the middle of the night to the bus guys rummaging under the tarp under our feet.
Hit a neat little gotcha while adding a new authentication backend to django 1.3.
The default authentication backend checks the “username” field in the User model. In an app I am working on, we create new users with the username and email fields to both be the email. This works fine, until you realize that the django User.username field is limited to 30 characters, and it’s a pain to change. Django maintainers have marked this as a “wontfix” because they want to maintain backwards compatibility.
Where does that leave us? A few weeks into production, and we’ve already had a few users who e-mail address are “cut off” by the User model.
Implementing your own backend is fairly straightforward; you just need a class that has an authenticate and a get_user method. Add the backend to AUTHENTICATION_BACKENDS in settings and django will automagically check that backend when trying to authenticate a user.
backends.py
from django.contrib.auth.models import User, check_password
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.backends import ModelBackend
class EmailBackend(ModelBackend):
def authenticate(self, username=None, password=None):
"""username is the email is the username is the email is the ..."""
try:
user = User.objects.get(email=username)
if not check_password(password, user.password):
user = None
except ObjectDoesNotExist:
user = None
return user
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
But what happens when you’re using the built in django.contrib.auth.views.login to authenticate users? The username field in the form is limited to 30 characters! You’ll need to change your login template so the username field is now 255 characters (same as User.email), and you’ll also have to overload the authentication_form kwarg that is passed to django.contrib.auth.views.login.
This is fairly straightforward:
forms.py
from django.contrib.auth.forms import AuthenticationForm
from django import forms
from django.utils.translation import ugettext as _
class EmailAuthenticationForm(AuthenticationForm):
username = forms.CharField(label=_("Username"), max_length=255)
Next you’ll have to change the route to the login method:
I recently decided to migrate from subversion to git for all my code work. This came about for a number of reasons, but one of the main reasons was I was tired of managing a subversion repository for a project, and then try to migrate that code into my github account. Using git-svn was a possibility, but I decided it would be easiest to go 100% git.
After a quick Google search to ensure that it was possible to setup multiple repositories for a single project with git, I went ahead.
First, the number one hit on google for “migrate subversion to git” is a blog post by Jon Maddox.
Following those instructions seemed pretty straight forward, but I ran into a known issue with git on OSX; I couldn’t authenticate with my subversion repository (I was accessing it through Apache2). After a few minutes trying to fix authentication I just opened up the repository to the public and then put the permissions back in place when the checkout was complete. Not ideal, but it was the quickest solution.
From there, I used these instructions to setup multiple repositories, so I could chose to push to my personal server, to my github account, to both… or really to anywhere.
While I am constantly in and out of the Terminal, I decided to explore the available GUI’s for git on OSX. A thread on stackoverflow had some options, and after looking at some screenshots I settled on Gity by Aaron (Gingrwzrd). Gity seems to fill my need for a (basic) git GUI, and includes a Textmate bundle that I’ll have to check out later.
A few more repositories to migrate and then I’ll be subversion free! I’m using gitolite, which seems very promising, and I am looking forward to having password-less ssh access to my repositories. This is the last nail in the coffin for Apache on my development server.
We are in Pai now, where we will hang out for a few days before making our way back to Bangkok. There is light at the end of the traveling tunnel, but I’m not sure we are ready to go.