Buying stamps is painful, or, philately will get you nowhere

February 22, 2015

Buying stamps is… painful.

My local post office is rather poorly reviewed: long lines, broken machines, etc. Sometimes e.g. grocery stores will carry stamps, but there’s no way to know in advance. So how do I get stamps and get on with my life?

Ominously, the “Easy Ways to Buy Stamps” section on is… blank.

Well, in today’s era of instant gratification, I’m sure I can buy some stamps online somewhere, right?

Yes! There are a few options. All not great!

Buy stamps on

This is the least terrible option of the three. Here’s the best deal I could find, 20 stamps for $14.10, a 44% markup!

Amazingly, the markup increases if you buy more. 100 stamps will set you back $72.95, which is a 49% markup.

Buy stamps on

Oh, awesome, I can just buy stamps and print them at home! This is the promise of

I have to sign up for an account? Well, that’s annoying, but I guess I’d have to do that anyway. These “security questions” are serious business. For stamps. But there are a couple here that are innocuous.

Fortunately, they also opt you in to promotional mailings.

Oh, there’s more. What’s a Postage Account Credit Card Authorization? Ah, a quick Google reveals an application that I need to make to the government.

And… costs $16 a month. Hm.

Buy stamps on

USPS has a not-extremely-horrible storefront that you can use to buy stamps. And they’re all priced appropriately.

Great! I’ll just add these Charlton Heston stamps to my cart, and click Checkout.

OK, I need to create an account. That’s fair. The password requirements are insane, though. And they’re coupled with incredibly easy-to-solve security questions.

It does work, in the end. But how many people are making up a one-time-use password to fit with these requirements? And then never coming back? And why isn’t there a much simpler checkout process for getting stamps, especially since the USPS should be able to match the name on the card to your address using its own database?

How this could work

Buying stamps online should be really simple.

A one-page checkout form should be sufficient. Offer a limited selection of stamps, perhaps even just one type, along with quantity options. Allow payment by credit card, but only ship to the billing address on the card, to reduce the potential for fraud. Do this all on the same page, without requiring someone to set up an account.

In fact, shipping should be free on any order from the USPS. The marginal cost for the USPS to do that is almost zero, more stamps means more revenue, and offering the product at cost, with free shipping, means almost everyone should want to buy direct.


Bringing an old project (Kitify) back to life

February 18, 2015

Kitify is a project I built a few years ago; it was my first web app using a modern framework (Ruby on Rails). I had written web stuff before, but never something using MVC.

It was an extremely valuable experience to build Kitify; I still remember most of what I learned about the architecture of modern web applications, and the knowledge comes in handy pretty frequently since managing web development is part of my job, now.

However, Heroku has been deprecating their Bamboo stack over the past year or two, which meant that the Kitify app had been slowly degrading. It stopped running at all a few months ago.

In keeping with some beliefs I’m developing about what marketers will need five years from now (the subject of a separate post to come), I’ve decided I need to commit regular time to writing code. Getting Kitify fixed up, migrated to Rails 4, and relaunched, seemed like a good way of starting that process.

This post details some of the steps I took to get it running again. Here’s the set of commits, as well.

Setting up a convenient local environment

The local environment for the first version of Kitify was a virtual machine. Why? I didn’t feel comfortable dealing with tools Homebrew and RVM, which are standard tools for developing natively on Mac OS X.

I don’t know why this was. One major problem was that RVM had some problems dealing with the local Ruby installed as part of previous versions of Mac OS X, but that seems to be easily fixable now.

Updating gems

When I originally buit Kitify, it was necessary to have specific versions of the dozen or so gems I was using, for compatibility.

As a first step in updating Kitify, I tried removing all of those version specifications, and everything worked surprisingly well, except for Jammit, which doesn’t like the way routes work in Rails 4.

Fortunately, there’s a recent commit that fixes this problem. So I used:

gem 'jammit', :git => 'git://'

Switching over to Postgres from MySQL

For some reason, the old version of Kitify ran on MySQL. I don’t know why I did this, since Heroku natively supports Postgres.

This actually was surprisingly easy to fix - I updated the gem, ran a schema migration, and updated the Heroku environment variables specifying the database location - and there’s a great GUI for Mac OS X Postgres that helps with seeing what’s in the database.

Adding back bin/bundle, bin/rails and bin/rake

You have to copy these files into the correct location, or you can run rake rails:update:bin as the Rails upgrade documentation suggests.

Dealing with static assets

Since Heroku is read-only, you can’t generate assets (e.g. JS and CSS) once your site has been deployed there. The way around this is to generate your assets before deploying, then commit them to the repo that you deploy to Heroku.

In order for this to work, there are a couple other small changes you need to make, specifically adding:

config.assets.compile = true
config.assets.digest = true

config.action_dispatch.x_sendfile_header = nil

Failing to set x_sendfile_header to nil will cause Heroku to serve blank files for all your assets.


Young warrior

February 18, 2015
Once there was a young warrior. Her teacher told her that she had to do battle with fear. She didn’t want to do that. It seemed too aggressive; it was scary; it seemed unfriendly. But the teacher said she had to do it and gave instructions for the battle.

The day arrived. The student warrior stood on one side, and fear stood on the other. The warrior was feeling very small, and fear was looking big and wrathful.

The young warrior roused herself and went toward fear, prostrated three times, and asked, "May I have permission to go into battle with you?"

Fear said, "Thank you for showing me so much respect that you ask permission."

Then the young warrior said, "How can I defeat you?"

Fear replied, "My weapons are that I talk fast, and I get very close to your face. Then you get completely unnerved, and you do whatever I say. If you don’t do what I tell you, I have no power. You can listen to me, and you can have respect for me. You can even be convinced by me.

But if you don’t do what I say, I have no power."

-- Pema Chodron, Start Where You Are


Historicism and psychohistory

February 16, 2015

Isaac Asimov’s Foundation series is about the fall of the future Galactic Empire. 30,000 years of barbarism are expected, but a man named Hari Seldon invents a new science that allows future events to be predicted with a high degree of statistical accuracy.

The name of this science is “psychohistory”, and the quality of its predictions allow for a plan to be developed and followed that shortens the dark age from 30,000 years to 1,000.

I remember being truly in awe of this idea when I heard about it as a kid. Predicting the future! With math! And reading the books now is still fun and interesting.

But I also realized that psychohistory is a fascinating and bizarre literary device to use, since you can be fairly sure about what will eventually happen.

In fact, because psychohistory’s predictions are viewed as ironclad within the novel’s universe, the protagonists don’t really take individual action, and they don’t think about choosing between several risk paths.

In fact, they wait to act until only path is available to them, because then they have been forced into their decision but what we are meant to presume is the operation of psychohistorical laws.

"Each successive crisis in our history is mapped and each depends in a measure on the successful conclusion fo the ones previous. This is only the second crisis and Space knows what effect even a trifling deviation would have in the end."

"That's rather empty speculation."

"No! Hari Seldon said in the Time Vault, that at each crisis our freedom of action would become circumscribed to the point where only one course of ction was possible... as long as more than one course of action is possible, the crisis has not been reached. We must let things drift so long as we possibly can, and by space, that's what I intend doing."

-- Isaac Asmiov, Foundation

Psychohistory has another interesting implication in that it’s very similar to Historicism, and it particularly reminds me of Marx’ historical materialism, in its prediction of an inevitable breakdown of capitalism and replacement with communism.

Psychohistory, of course, predicts events and not social conditions, but it follows a similar logic of historical inevitability.

This causes me to wonder why the developers, and acolytes, of psychohistory are heroes. In general, a prediction of strong determinism, or of historical inevitability, tends to lead to bad outcomes (as was the case in almost every Communist society in the 20th century). I’ve seen the opposite in the novels so far. But what is it about psychohistory that allows its outcome to be different?

And, what is it about psychohistory that allowed Seldon to stand outside it in order to formulate its rules?



February 16, 2015
And then there's good old Mortimer, that person who is sitting next to you in the meditation hall, or perhaps someone who works in your office.

- Pema Chodron, Start Where You Are

Who’s Mortimer?

Some people are lusting when they see Mortimer. He looks wonderful to them... A certain number of people hate him. They haven't even talked to him yet, but the minute they saw him, they felt loathing. Some of us haven't noticed him, and may never notice him. In fact, a few years from now he'll tell us he was here, and we'll be surprised."

Think about all the people around you. Those who you really love, those who drive you crazy, and those who you know nothing about.

The most interesting part of this passage for me is the people who drive you crazy. I only know a couple of people like that, and after interacting with them, even if only very briefly, I think about that interaction for a while. I’ll be standing in the shower, trying to relax, and I’ll go back to my interaction with that person.

You must know people like that. Right?

I’m working hard to look at this sort of person as a teacher, rather than as an annoyance. Because the presence of someone who can really irritate you, maybe means you have something to learn.

This is also true of people you put on a pedestal, and people you don’t notice. They have something to teach you. (I suppose the remaining category is people you are just fine with.)

"When you feel craving, you could be sitting on the edge of the Grand Canyon, but all you can see is this piece of chocolate cake you're craving. With aversion, you're sitting on the edge of the Grand Canyon, and all you can hear is the angry words someone said to you ten years ago. With ignorance, you're sitting on the edge of the Grand Canyon with a paper bag over your head."

Migrating a blog (yes, this one!) from Wordpress to Hugo

February 13, 2015

I had been meaning to move this blog from Wordpress to a static site generator for a while.

Why? Mostly, I like having control and access to my blog posts in a standard raw form; Wordpress (and most other CMSes) store posts in a database, but a static site generator lets you use a bunch of Markdown files.

Also, I wanted an easier way to write posts offline. With a static site generator, I can just save everything locally and publish it all together, very easily, once I’m ready. I can also very reliably see a local copy of exactly what my site will look like, before I publish.

Hugo caught my eye. It’s written in Go, which I’ve been hearing a lot about, and it’s new, and therefore really, really simple. Installation is incredibly easy. It’s probably one of the easiest things I’ve ever installed on a computer, and it’s certainly the easiest-to-configure local environment I’ve ever run into, even for someone like me who doesn’t spend all day in the terminal. Lastly, it’s written and the project is led by my friend Steve Francia.

Since the migration was of moderate difficulty, this post documents the problems I ran into, and how I solved them. You can also check out my blog repo, which shows some of the steps I took.

I don’t cover installation here, since the instructions are accurate and worked well for me.

Getting data out of Wordpress

The first step was to export all of my posts. This thread gives some ideas, specifically the Wordpress to Hugo exporter. I couldn’t get this to work.

The Wordpress plugin did indeed timeout, and the command line version kept generating an empty .zip. (I may not have followed the instructions correctly.)

Fortunately, there is another tool, called ExitWP, that worked well. Really well. Thank you, Thomas Frössman.

I think this is because it takes advantage of the native Wordpress export, and is a script that then runs locally on those files, rather than depending on the server configuration.

This got me to a starting point, an archive of exported files with usable front matter indicating the date, slug, tags, and other metadata.

Cleaning up ExitWP output

However, the output from ExitWP had a few problems that prevented it from being publishable:

1) Images were still linked to their Wordpress URLs, e.g. Obviously these would all break once I removed Wordpress from my server, so I had to rewrite all these URLs. Not a huge deal; I used find/replace in Sublime Text to fix these. A more sophisticated user could use the shell.

2) Wordpress uses shortcodes. Helpful when you are publishing a post, extremely unhelpful when you are trying to move your writing to a standardized format. Here is an example:

[caption id=“attachment_841” align=“alignleft” width=“300” caption=“5: Coq au vin!“][![(/images/uploads/201007/IMG_24621-300x225.jpg)](/?attachment_id=841)[/caption]

(No, 201007 shouldn’t be a fraction, but I can’t figure out how to turn that off in Hugo’s Markdown engine.)

Every single one of these had to be turned into standard HTML. This was by far the most time-consuming part of the migration. I took an approach that had 2 parts. First, I ran all of these snippets (hundreds of them) through a Markdown to HTML converter. This caused them all to have one of two consistent structures, depending on whether or not Wordpress put the caption itself within the [ caption ] tag.

That then allowed me to write Javascript that takes these shortcodes, which are still present in the Markdown, and converts them into actual proper HTML elements. It is a hack to be sure. Again, a more sophisticated user could probably fix this with sed.

3) The Markdown that ExitWP generates can sometimes be a little messy or incorrect. For example, the underscore (_) will sometimes have a space inserted before or after it, which causes problems for emphasized text. Or lots of extra line breaks. I fixed these where I saw them.


Once I had all that cleaned up, it was time to start on the theme. Aaaah. I love theming in Hugo! The /indexes directory is a little confusing, but otherwise, it is really nice.

I picked the theme I liked most, Simple A, and ripped out huge pieces, rearranged things, and changed styling until I got something nice and neat. I consolidated all of the various /chrome files into three partials, header.html, footer.html, and disqus.html (since you want disqus on some pages but not others).

I also reduced the amount of metadata that’s displayed, and the number of posts on the front page. Hugo makes these changes very, very easy.

Archives and Pagination

Hugo is very young, and one feature it lacks is pagination, although a recent pull request seems to have added this (though I didn’t feel comfortable trying that until it is actually part of Hugo officially.)

That means that you can’t have, for example, a front page that gives links to the previous ten posts, and then that page gives links to the next ten posts, and so on. You can have archives by month, but only by actually setting this up as a taxonomy item, which is not an ideal solution.

Nobody clicks through to the monthly archives on my site, except for me, so that wasn’t an issue. However, I did want to make sure all the posts were linked somewhere, so that (a) an interested visitor could easily see them, and mostly (b) so Google could find them.

I followed the suggestion of someone on the forums, and solved this problem by creating a taxonomy item called “Archives”, and setting all posts to have “blog”.

- blog

I then added an archive.html file to the indexes directory. Lastly, I added a link to the template, on all pages, to /archives/blog. This actually worked really well, and while it’s a simpler solution than many might want, a big part of my reason for migrating off Wordpress is simplicity, so this was fine.


After all this, I had a local copy of my site that was working pretty well. Mostly good-looking posts, properly placed and captioned images, all Javascript in place, templates, archives, etc.

However, one other thing Hugo doesn’t do is automatically generate URLs in the form Instead, all posts have URLs that look like

Update: This is wrong. Actually, Hugo can do this, I just didn’t understand how. More detail at I’m leaving this seciton in anyway, as it is an alternative solution to this problem if you don’t feel like changing the default permalink format.

The ExitWP script did preserve all the slugs in the post metadata, which was incredibly useful, but there’s no way to get Hugo to parse the date information into the URLs, at least not automatically. I suppose I could have re-parented all the Markdown files into the correct directories, but this again makes the system much more complex than I wanted.

“Well”, I thought to myself, “I’ll just change the URLs of the posts in Wordpress to the format that Hugo will use, wait a little while for Google to reindex, and it will be fine!”

Unfortunately, Wordpress isn’t smart enough to put in redirects from your old posts when their URLs change. So you end up breaking all Google search results, and all internal links, anyway. There are a few plugins out there that claim to fix this, but none of them seemed to work for me (or at least, I wasn’t confident enough that any would, to take the risk of trying them.)

The solution was in .htaccess. I needed something that would basically remove things like 201502/ from the request URL, and forward to the URL without that extra piece. So I put this in, and it seems to be working well:

Options -Indexes
RewriteEngine on
RewriteBase /
RewriteRule ^[0-9]{4}/[0-9]{2}/(.*)$ /$1 [L,R=302,QSA]

If you’re not deeply familiar with .htaccess, basically what this says is, “for a string that has 4 digits, then a slash, then 2 digits, then a bunch of other stuff, just keep the other stuff.”

I use a 302 (temporary) redirect for now, but eventually I’ll make this a 301.

You can also add this to forward Wordpress /tag/ URLs to /tags/: RewriteRule ^tag/(.*)$ tags/$1


There are a few ways to deploy your Hugo site.

A theme of this post is that, while I’m pretty comfortable dealing with .htaccess files and Git and other stuff like that, I’m not very sophisticated. So the idea of writing a Git post-commit hook, though I’m sure I could figure it out, was not exciting. And it wouldn’t have been quick. Ditto for figuring out how to deploy to GitHub Pages.

I also wanted something that would work across a variety of host servers, since configuring the host was something I wanted to avoid. But you can always count on rsync! Here’s what I ended up with:

rsync -avzP –delete –exclude ‘.htaccess’ /local/blog/directory user@host:remote/directory/

a syncs files recursively and preserves file metadata, v gives detailed output, z compresses, P enables progress montioring and partial file transfers. –delete deletes remote files that don’t exist locally, but I have to exclude .htaccess since I need it but it doesn’t exist locally.

One issue is that permissions on new local images aren’t set to be world-readable when they’re transferred. This needs to be fixed since it prevents images from showing up. I think there’s an option for rsync that will do this.

Another issue is that, depending on how your site is configured, all of your canonical URLs may end up containing localhost, since you’re not regenerating the site on your remote server. I couldn’t get Hugo to consistently pay attention to baseUrl while building pages, so I modified my header.html as follows:

{{if .IsPage}}
<link rel="canonical" href="{{ .RelPermalink }}">

The {{if .isPage}} is necessary to prevent Hugo throwing a lot of errors when this header shows up on nodes, which are distinct from pages, and which do not have a .RelPermalink attribute.

Update: Hugo wasn’t paying attention to baseUrl because I was running it exclusively in live-rebuild (watch) mode. Running it so that it does one-time generation fixes this problem. I submitted a PR to update the docs.


Hugo’s working really well so far.

The only major quirk remaining is that the Markdown engine seems to be very aggressive, for example, rendering (a), (b), (d) and (e), but © (the copyright symbol) and rendering 2015-02 with a slash as 201502.

Some new features would definitely be useful, but it’s really enjoyable to have a very clean, simple static site generator that parses highly-accessible Markdown files instead of database records, and to have complete and very simple control over the way my blog looks and works.


Using Agile concepts to manage Marketing work

January 28, 2015

Here is a process for managing marketing work that I’ve found to be very successful. In fact, based on my estimates, it lets us get at least 30% more work done. It incorporates some Agile concepts.

Everything we have to do is in a ticket management system, as a ticket.

Well, what’s a ticket? Tickets are little chunks of work, like “Design a banner”, or “Fix this bug on the website.” They could also be “Produce this email”, for example. They’re stored and displayed in a format that lets us easily track comments and other stuff that’s related. We use Jira, but a lot of people swear by Trello.

When we open each ticket, we first make sure we understand what it is, then we assign it a number of Story Points. Story Points, for us, roughtly correspond to the number of hours the ticket is expected to take. (Other teams use Story Points to mean other things.)

Ideally, a ticket is the smallest possible useful chunk of work. That helps us deliver useful things faster, rather than waiting until any particular set of interdependencies is resolved. Figuring out how to break big projects into useful pieces also helps us work more efficiently in general, by prioritizing the separate parts of each large project that have the highest ROI.

Every two weeks, we set out what work we’re doing for the following two weeks. This is a “sprint period”. You can use other periods, like one, or three weeks. The sprint planning meeting is useful, because, in conjunction with our Story Point (hour) estimates, we know how much we can plan to get done with the time that we have. And in the planning, we have to think ahead, and we have to force-rank work; some things make it into a sprint, and some don’t. That:

  1. Forces us to have an explicit conversation about priorities, and tradeoffs
  2. Reduces the amount of unneccessary work, because we don’t start on things that aren’t ready to be started on
  3. Makes it easier for problems and dependencies to be exposed before work starts, because everyone starts thinking about the work in advance
  4. Reduces the amount of low-value, high-urgency work that we do, since (a) it is known that adding work to a sprint is expensive, and (b) something has to be explicitly dropped in order for the new work to be done

Within the two-week period encompassing the sprint period, we retain flexibility by working on a small number of things at a time, which means that, if necessary, we can swap out tasks that have not yet been started for other ones that have come up.

We also build in a buffer of unallocated points. This is actually a really bad idea, since buffers hide problems. For example, if we are building in a buffer because one particular team tends to wait until the last minute to submit requests, we should be trying to fix that actual problem. But a buffer is what we do for now.

During the sprint planning meetings, we also review the previous two weeks of work. This gives us an opportunity to make improvements in our process, so that work takes less time. A nice thing about having Story Points be equal to something objective, like complexity or effort, rather than hours, is that this lets you show an increasing number of Story Points completed, in the same amount of time, across sprints.

This in turn lets you track improvements that you’ve made to your process, to make things more efficient.

Finally, during the two-week period, we have several meetings to discuss how tickets in the sprint are going. Because we are discussing a very small number of tickets, these meetings are often very short or can be canceled altogether. We track progress on a public board that shows exactly where each ticket is, which gives visibility to everyone who asks us for work, and reduces the need to meet even further.

Jira lets you set these boards up easily and drag things across as they’re completed, as do other ticketing systems, like Trello.

A common objection I’ve heard to this system, from marketers, is that Marketing work is somehow special in that it’s more iterative and therefore can’t be planned as easily. (For example, you aren’t building toward a giant, complex piece of software). So this sort of system shouldn’t work. But I’ve found that most of the practices developed for engineers also work for thoughtful marketers. If want to deliver good marketing, fast, you should want to build an assembly line for it. That’s essentially what this does for you.


Carl Linnaeus

January 26, 2015

Last fall, I found myself very moved by visiting the residence and garden of Carl Linnaeus, in Uppsala, Sweden. As you may (or may not!) remember from your high school biology classes, Linnaeus developed the system of binomial nomenclature, i.e. the system by which we label an avocado, for example, Persea americana.

Linnaeus did much of his work in Scandinavia, which is not exactly the most biodiverse or fertile part of the world; compare Africa, Asia, or even mainland Europe. And yet even viewing the world through this tiny lens, through his constant explorations and the expeditions of his students, he was able to understand some of the order behind a massive, completely organic, non-guided system (i.e. all life on the planet).

While a lot has changed in our understanding since Linnaeus did his work, the fundamental ideas that he had and, through hard work, popularized, remain the basis of biological classification today.

And the theoretical insight he had was not, actually, the result of a flash of inspiration or a set of equations. His major accomplishment was developing the binomial nomenclature system, but he couldn’t have done this without actually cataloging, and considering the relationships between, the many thousands of plant and animal species that were available to him. In doing so, he proved and developed his system.

Linnaeus’ work is an incredibly unique combination of the organic (life on Earth, in all its diversity) with the logical (a system for classifying them). It’s also a combination of the intellectual (theories about how life can be divided into groups), together with the practical (going out and actually classifying huge numbers of species into those groups, in order to prove the theory).

Even the botanical garden at Linnaeus’ house reflected this. It’s constructed in such a way that it displays specimens of high education value, that illustrate the way the system works. At the same time, it is indeed a garden, with all the practical maintenance a garden requires, all the constant biological activity, and all the infinite complexity and beauty of its specimens. And in addition to being a great scientist, Linnaeus was also a great teacher, walking his students through the garden, for example, during his lectures.

It’s this balance that I find so admirable in Linnaeus; excellence that bridges a few different areas, and especially achievement in both purely theoretical, and then highly practical, areas. Gustav Mahler is someone else I admire for these reasons (great composer, and also great conductor), but that’s for another post.


Marketing as craft

January 24, 2015

What does it mean for something to be a craft? I guess it means that it’s something that done with care and attention, and that’s done at least in part for the sake of the activity itself, rather than to achieve external results. It also suggests manual work, and small batches.

Some of these things definitely apply to what I think is important about marketing.

Care and attention, for sure. Thoughtful marketing doesn’t just work, it’s also respectful of your potential and actual customers. There’s a big difference between, for example, throwing an interesting, relevant piece of content in front of someone who’s interested in your service, and throwing whatever you can think of. It’s the difference between seeing an obnoxious YouTube ad for the tenth time, and a friend calling you to recommend a product that’s made a difference in their life. (The latter, believe or not, is marketing!)

Doing it for the sake of the activity itself? I’m not sure if that’s possible. Marketing is interesting partly because, unlike building a product, much of it literally cannot be done without involving other people. Its whole purpose is to bring together people who need something, with people who can satisfy that need, either directly or through a product. But maybe “craft marketing” could mean caring about marketing as a way of making the world better, regardless of what it happens to be applied to.

And small batches? Who wants to do small-batch marketing? You really want to reach as many people as you possibly can, provided that your offer is relevant to them. But maybe small-batch marketing means using your power as a marketer to help small, good ideas reach many, many people? Or maybe it’s just really great segmentation? Or maybe it’s focusing on a smaller number of very high-quality marketing activities, rather than a lot of mediocre ones. (But what does high-quality mean, in this case?)

Maybe a better term for “marketing as craft”, is “thoughtful marketing”, but with a capital T. Or “intent-driven marketing”. But maybe “marketing as craft” is right after all.


Help your customers unsubscribe

January 23, 2015

Once you go to the effort of getting someone on your email list, of course you want them to stay there.

And in most cases, you’re emailing when you have something interesting to say, and you’re producing compelling content that means that your subscribers will never, ever, want to leave.

But there are a bunch of reasons why you should make it really easy for them to do that, anyway.

1) Some subscribers will mark you as spam instead of unsubscribing.

The more people who mark you as spam, the higher risk that GMail (for example) will mark your email as spam for all of its users. Avoid this by letting people tell you, with very little effort, when they’re not interested.

2) It looks good.

Even if I’m not planning to unsubscribe from your email, providing the option shows respect and consideration for your users. It also prevents them from complaining on social media.

3) The difficulty of your unsubscribe process shouldn’t be what keeps people on your list.

Amazon offers its warehouse associates $5,000 every year to quit the company. Why? They don’t want people onboard who don’t want to be there.

In the same way, in most cases you don’t want email subscribers who don’t want to be there. Yes, there’s room for convincing people, but your marketing process at every other step of the funnel is about generating the right leads, not just leads in general.

If someone tells you they’re not the right person, take their word for it.

4) It lets you focus your efforts better.

Database segmentation can be tricky, but at least part of the “people who are very unlikely to buy from you” segment can be delineated very quickly. Your understanding of your database, and your marketing efforts, will be much better if you can reduce that segment to zero or almost zero members.

Also, allowing people to unsubscribe easily, especially if you provide the option to tell you why they unsubscribed, can give you valuable data to increase your emails’ effectiveness.