Blog
all
business
feature
integration
interface
meta
programming
January 12, 2023
programming

Just use a monorepo

A before-and-after of my setup.

I wrote last month about having migrated Buttondown from a number of separate microrepositories to a single monorepo. I've since completed the migration, and the slight irritation I felt from having to unwind a bunch of technical choices with deployment + continuous integration has faded.

I am here to tell you: if you are running a software business and you aren't at, like, Google-tier scale, just throw it all in a monorepo. I am kicking myself for not having done this to begin with.

Read more

Q1 Planning

I took a break from the mistletoe chaos of the dead zone between Christmas and New Year's to do two things, both portrayed below:

  1. Triage Buttondown's roadmap from 325 items (at time of writing this; by the time this goes out, it'll likely be 330) to around half of that.
  2. Stack rank the top ten things I want to get done in Q1.

(Thank you, Haley, for cutting up all of these into tiny slivers for me.)

Read more

On monorepos

I wanted to write about annual planning, and how this year is going to differ from previous ones, but I have (in true fashion) procrastinated finalizing my annual plan a little bit. So that'll be next week, and this week I would like to write about... monorepos.

Buttondown is now in a monorepo. There's two big advantages of this approach (and these advantages are not particularly new to Buttondown):

Read more
October 26, 2022
programming

Generating a Typescript router in Django

(Nerd alert! This post is a small technical snippet for Python and Django programmers. If you don't know what those proper nouns mean, don't worry — feel free to skip this post.)

Buttondown has used django-js-reverse since its inception to route backend API urls from the Django backend to the Vue frontend.

This has been (not to damn with faint praise!) better than nothing: some kind of syncing mechanism certainly beats having to manually correlate backend routes with frontend definitions. But there are two nits I've had with the package:

Read more

All your emails, in one place

If you log on to Buttondown today (or, I suppose, any date in the foreseeable future), you'll notice that the sidebar is a little smaller. Gone are the three separate links to drafts, scheduled emails, and archive — in its stead is a combined link, emails, that has, well, all three of those things.

You'll notice that you can now actually sort this list by pretty much anything as well as filter it by status or audience.

Read more

Better logging in RQ

(Nerd alert! This post is a small technical snippet for Python and Django programmers. If you don't know what those proper nouns mean, don't worry — feel free to skip this post.)

I have been a fan of the asynchronous programming library RQ for a long time. It's been a classic "sweet spot" library: more powerful and futureproof than rolling my own solution from scratch, but more aggressively minimalist and ergonomic than something like Celery which has felt the accumulated weight of a decade of bloat and featureq requests.

And Buttondown uses RQ a lot. Every API request, Stripe event, email sent, or webhook event created (plus around seventeen dozen other things) goes through RQ in order to keep the interface nice and snappy and the concomitant backend requests short and stout.

Read more

Attach files to your emails

One of the delights in watching Buttondown take off over the past few years has been seeing the proliferation of use cases that, frankly, I never really imagined when I started building it. Teachers & faculty are using Buttondown to send lesson plans to their students; a peer group of poets uses Buttondown ("round robin style", as I've been informed) to send over drafts to edit & critique; a food truck sends out weekly locations & specials.

One common thread that I sort of intentionally didn't handle for a while was sending emails with files attached. This is not a particularly hard technical problem, nor is it a tricky UX problem — the core flow of dragging and dropping a file into an editing interface is all but solved!

The thing that gave me pause for so long was less the surface-level implementation and more the so-called "long tail" of choices and impacts that adding attachments would entail. Should Buttondown add tracking on downloads (so an author can see who's downloaded what?)? How many attachments are allowed for a given email? What happens to attachments after they've been removed from an email? And so on. At risk of turning this anodyne blog post into a bit of a therapy session — this is what building software is like. Even the "easy" things come with hundreds of little microdecisions along the way, and I want to make sure that I get as many of those microdecisions right.

Read more

A better Events view

(Nerd alert! This post is about a fairly nerdy part of Buttondown’s featureset — webhooks. If you’re a less technical user, this stuff probably doesn’t apply to you.)

I’ll be honest with you — it is hard to keep track of the myriad ways folks use Buttondown’s events & webhooks. There are the standard ones: listen to email.created events and then publish the email to the CMS, listen to subscriber.created and subscriber.deleted events to update tags in an internal database, and so on. But the long tail is where I find it hard to keep track: I know of one newsletter, for instance, that is listening to draft.created events to sync their Buttondown drafts with their local iPad storage in a way that I probably can’t advise as good engineering but I am still quite fascinated by.

Regardless of how you’re using webhooks [^1], there’s one piece of feedback that you’ve probably given me: that the dinky little “events” table in the Programming page is… let’s say lackluster.

Read more

Secure your account with multi-factor authentication

I suspect that there are two groups of people who read the title of this blog post: those who are saying "oh finally!" and those who are unfamiliar with the term 'multi-factor authentication'.

As you are likely aware, a strong password is necessary but inefficient in today's world to protect your account from malicious attackers. The most common family of approaches to defend your account is referred to as "multi-factor authentication", which is exactly what it sounds like: relying on additional pieces of evidence beyond just your username and password in order to authenticate that you are who you say you are. (Have you ever had to type in a six-digit code that was texted to you, or click a link sent to your email? That's multi-factor authentication, too!)

Buttondown now lets you protect your account with the help of a third-party authenticator app like Google Authenticator or Authy. These apps exist as a remote fingerprint with a rotating code; when you log into Buttondown, you'll be prompted for the code from one of these apps.

Read more

Get more premium subscribers by sending teasers of premium emails

My single favorite way to make Buttondown better is a simple two-step process:

  1. Find desire paths where folks are going through a lot of effort to accomplish a very reasonable task.
  2. Make that process better.

If you're an author of a premium newsletter, you might be familiar with what is a pretty annoying process every time you write a paid-subscribers-only email: first you write the paid-subscribers-only email filled with lovely writing and send it off to your loyal subscriber base, then you take a truncated version of it and add a little teaser to send to your non-paying subscribers in order to incentivize them to sign up.

Read more
June 8, 2022
programming

How I organize Buttondown's Django applications

Heads up!
This is a pretty technical post with absolutely no new information about Buttondown's features! If you're not interested in Django (or don't know what Django is), feel free to skip this one.

Wait, what's Buttondown?

I run Buttondown, a newsletter tool. It's a pretty nice tool, in my opinion! Please check it out if you get a chance.

Read more
May 13, 2022
business

Buttondown's new pricing system

First off — I've read a countless number of these posts before and they're all couched in evasive, annoying language. It's very annoying! So let me get a few things out of the way:

  1. Buttondown's shifting from a two-tiered pricing model (pay for your subscriber count, and then also pay $29/mo for fancy features) to a more traditional model (pay $9/mo, $29/mo, or $79/mo.)
  2. There's a very good likelihood you'll be paying less.
  3. If you're currently paying for Buttondown, you'll be migrated to the new billing system at your current price at a legacy discount.
  4. I'm doing this for three reasons: a) simplify the billing code b) simplify Buttondown's value proposition c) slightly shift Buttondown's clientele away from free users.

Okay! That's the spark notes version. Now let's get on to the meat of the matter, which I'll express — out of equal parts rhetorical laziness and a distaste for hackneyed marketing speak — in Q&A form.

Read more

Send archived emails to new subscribers

I’m getting tired of starting off all of these feature announcements with some variation of “this might have been the single most frequently requested feature of the past twenty-four months”, but… this might be the single most frequently requested feature of the past twenty-four months [^1]: you can now send previous emails to subscribers in your Subscribers page.

A screenshot of Buttondown's new "send email" modal.

First, though, a bit of background: Buttondown’s subscriber-email relationship has always been intentionally spartan. There are no clever knobs or automation sequences; I’ve intentionally optimized for ease of onboarding and conceptual simplicity over featureness, meaning that all you can really do with an email after sending it is set it to be your ‘welcome email’ that greets new subscribers or use it as scaffolding to build a new email.

Read more

Embed your subscribe form in the middle of your writing

A long-standing request that I’ve never quite got to is the ability to throw in subscription forms in the middle of your emails, so that folks who are scrolling through your web archives are prompted to subscribe before the end of the email itself.

This approach is something that I’m sure has vigorous and impressive scientific impacts on your conversion funnel, but moreover it for a long time was my favorite type of feature request, the one that hits two constraints:

  1. Is eminently reasonable
  2. Clearly slots into Buttondown’s architecture & surface
Read more

Granular tracking settings

It's been almost a year since I switched tracking & analytics over to be off by default, and the feedback has been unanimously positive, even for the folks who end up enabling it (by which, to be clear, I mean no shade — Buttondown's official newsletter has click tracking enabled!)

I've received a fairly common piece of feedback from privacy-conscious newsletters:

I love the commitment to less data collection. I wish I could just track open rates without actually tracking clicks, though: I don't personally care too much about either piece of data, but when I sell to advertisers they often request some rough percentage of opens. Would it be possible to just keep track of opens?

Read more
January 19, 2022
programming

Migrating Buttondown to mypy

What is Buttondown?

Buttondown is an application for writing, sending, and growing newsletters — though that part isn't quite applicable to this essay! The more important part: Buttondown has a Python & Django backend of around 38,000 lines and it's been around for around four years, so it has a good-but-not-excessive amount of cruft and abstractions that I wish I could take back.

What is mypy?

Read more

Better upselling for premium subscriptions

To be blunt, the upselling experience for paid subscribers has been…bad. This is entirely my fault!

When designing the paid subscriptions experience, I had a few blunders:

  1. I assumed the majority of paid subscribers would be new subscribers. The flow is optimized for individuals who start out completely unsubscribed, and so the desire path is for folks to immediately be upsold after subscribing.
  2. Buttondown is structured intentionally without much concept of a “subscriber-user”, meaning that subscribers interact with Buttondown entirely with their email address. This is good for portability reasons, but bad for state — meaning that the version of a newsletter that a subscriber views online is nigh-identical that which someone who isn’t subscribed views.
Read more

Support for Stripe Payment Links

A few months ago, Stripe launched Payment Links — the absolute easiest way to collect payments (both one-time and on a recurring basis) on the internet with absolutely no code required.

(A disclosure: I work for Stripe! We’re hiring.)

First, take a look at what one of these Payment Links look like (courtesy of a great Buttondown newsletter, Pain Science):

Read more

Pay-what-you-want subscriptions

Obligatory "this is not an April Fool's joke" disclaimer aside: excited to announce that support for pay-what-you-want [^0] subscriptions are now live! You can give it a test run on weeknotes.buttondown.email.

Setting it up is fairly easy; you go to your Paid Subscriptions page, hit the ol’ checkbox, choose a cadence, and you’re off to the races.

Read more

Spring 2021

It’s been a while since I’ve written a good old-fashioned updates post! I wrote in late December about my annual roadmap and I’m excited to say a lot of this work has already landed in the past three months: operational requests are way down, paid newsletters and subscribe management is improved (though not quite yet finished, as we’ll get to in a moment), and Buttondown’s performance metrics are the best they’ve been since launching in 2017.

I’ve received an influx of new users and customers this week (hi, new friends!) and wanted to provide some context as to what I’m working on now: but you can always check up on the public roadmap for a slightly-more-up-to-date view of things.

What’s coming up in April

Read more

Support for HTTPS tracking links

The single biggest pain point for me in 2020 was the fact that my email service provider did not support HTTPS tracking links. Discussion of tracking links aside and importance of HSTS aside, this resulted in a truly awful onboarding experience in which people would onboard and send emails through their HTTPS-only domain, discovering in their first newsletter that all of their links were broken in some browsers. The worst thing! You can’t take back emails, and if folks didn’t catch it when drafting (which was sadly often) it meant their first-ever experience with Buttondown was marred.

The solution

I’ve been a huge fan of the folks over at Postmark for a long time: Buttondown has been using them as a transactional email provider for years. When they launched support for non-transactional emails, I was itching for a reason to try them out — and lo and behold, here is the perfect one!

Read more

Email tracking is now off by default

Last week I blogged about investments in something that existing users will probably not appreciate and it appears that this week I am continuing the trend by announcing a change that only affects new accounts going forward:

Buttondown is turning off analytics by default. (This only applies to new accounts: I haven't changed any settings on existing accounts.)

This is something that a few folks have mentioned over the years: allowing newsletters to opt out of link and open tracking is nice but allowing an escape hatch is a little less opinionated than defaulting to do the right thing.

Read more

You can now integrate with Plausible!

Plausible is a simple, privacy-friendly alternative to Google Analytics. It's fully compliant with GDPR, CCPA, and PECR, and offers no cookie use whatsoever. It's a great way to learn more about your site and your subscribers & visitors while respecting their privacy.

I've been a huge fan of what Plausible has been doing, and I'm excited to partner with them and integrate our two services: their ethos is very well-aligned with Buttondown's.

Read more

A nicer subscriber importing experience

This is perhaps a strange and unhelpful blog post to write. You see, I have spent the past few weeks overhauling the subscriber import experience, and I am quite proud of this.

Why is this strange and unhelpful to write about? Because if you’re reading this blog you are either a Buttondown user already — and you have no need for importing — or you’re not a Buttondown user — and your decision to use Buttondown is likely not going to be swayed by its data onboarding capabilities.

Read more

Referencing subscriber tags in your newsletter

You've been able to reference subscriber metadata in your emails for a while now. This is a great way of creating a mail-merge-esque effect and customizing your newsletter for your recipients:


{% if subscriber.metadata.first_name %}
Hello {{ subscriber.metadata.first_name }}!
{% else %}
Hello friend!
{% endif %}
Read more

Accept whatever currency you want for your paid newsletter

For a long time (as in, up until today), Buttondown could only charge in dollars for paid newsletters. This is no longer the case!

I'm honestly not sure what else to write here. The code change was pretty boring (thanks, Stripe!). This was long overdue; the number of newsletters outside America outnumber the number of newsletters inside America. I'm happy I was able to make the change.

Read more

Slightly nicer Design settings

It is somewhat rare for me to be able to justify working on paying down some technical debt with a rewrite while also improving the user experience, especially for a little-loved part of the application like the various settings pages.

With the recent work to add the new Programming page, I found myself equipped with a host of new front-end components to replace the old way I designed settings. They're not much to look at now, but it means I can replace a bunch of bespoke HTML and CSS with something that looks consistent across all parts of the application.

The way I could justify retrofitting the new components into an existing page was simple: I wanted to start surfacing a lot of the necessary details you need to set up and customize the design of your newsletter in the application itself, rather than confining those details to documentation or Notion pages.

Read more

Webhooks and the Programming page

If you check your nav bar, you’ll notice a new little section entitled Programming. This is, as you might expect, a tab for programming your newsletter! Buttondown is getting more and more advanced at creating technical and advanced use cases for our authors, and I wanted a place to put all of these features without crowding out other parts of the dashboard.

So, if you’re not interested in supercharging your newsletter (and I don’t mean that in a bad way at all: none of my newsletters are using webhooks!) feel free to ignore this. But if you’re interested in seeing how to better integrate Buttondown into your stack, let’s dive in!

Read more

Buttondown in 2021

I haven’t written that much about Buttondown in 2020: scanning through the archives, it looks like a total of eight blog posts (including this one.) That’s not so great!

On the other hand, I have been very busy with doing things on Buttondown that don’t involve blogging. Buttondown has been growing steadily — did you know that newsletters are having a moment? — and my time spent on Buttondown is concomitant with that growth, meaning that my hours are spent more on customer service, onboarding, and scaling than on trying to build out new features or convince more people to write emails (the two ostensible goals of blogging about Buttondown.)

Still, I think it is worth taking a step back and talking about where Buttondown will be going in the next twelve months. As usual, don’t hold me too heavily to any of this stuff — and remember that the roadmap is the best source of truth out there.

Read more

Undo send

One of my favorite features in any app ever is Gmail’s “undo” feature. You are probably aware of this nicety if you’ve ever accidentally hit Send on something a few minutes too soon (or, if you are like me, you notice a typo literally right as you press the Send Button). What I find magic about this feature is that it transforms something that is a putatively immutable task (sending an email! Into the ether! where it can never be removed again!) into something significantly less so, over time deconditioning you (or at least me) from thinking sending email is something stressful and irreversible into something that doesn’t raise your blood pressure.

All of that is an overly verbose preamble to say something very simple: Buttondown now has an “undo send” feature. Buttondown already makes sure you really want to hit send by asking you to confirm your email, but now it goes the extra mile and lets you undo for up to two minutes.

Here's what it looks like. Unexciting, I know:

Read more

Navigation updates

Buttondown’s navigation has... not been ideal. For a long time.

The navigation itself has barely changed since it got set in stone in early 2017; you can see it in action (with slightly different CSS, and no dropdown menu) in a blog post from 2017!

I say it’s not ideal for a handful of reasons:

Read more

Open Beta: European mail servers

I am particularly excited to share that I am now forwarded some traffic through the EU. You may be wondering: uh, why?

Well, for starters, this means you can make sure your customer data and emails are processed without leaving the EU. There's increasing complexity in how to manage data, and also a healthy dose of better-safe-than-sorryism.

Plus, location matters. EU-borne emails are going to be faster and have better inbox placement rates than US-borne emails if the majority of your subscribers are European.

Read more

Set a custom unsubscription URL for your (sadly no-longer-subscribed) subscribers

I like building features that give you, the beloved customer, the power to customize Buttondown as you see fit.

Generally these are happy features: better analytics, smart scheduling, that sort of thing.

Sometimes, though, people unsubscribe. Buttondown gives them a curt and plain exit survey asking them why they unsubscribed, but you can now override that default with a link of your choice.

Read more

Compare analytics from multiple emails

It's nice to look at your deliver rates and open rates for a single email, but if you're trying to really understand its performance, it's important to understand it in the context of your other recent issues.

This is now much easier!

Just select a handful of emails in your Archive page:

Read more

Saved draft recipients

Many folks write newsletters with a friend or frequent collaborator. I write a personal letter, Letters to J, with a good friend, for instance, and I would be remiss if I didn't send any more official Buttondown emails without sending a draft to my partner and de facto copyeditor for a second pair of eyes.

Buttondown now makes this process slightly easier by keeping track of who you've sent drafts to in the past, so you don't have to go through the ever-so-onerous of retyping email addresses each time:

Read more

Buttondown's funding of open source software

Software sits on the shoulders of giants.

Buttondown is a tool that simply would not exist without the gargantuan effort of many, many open-source projects, the vast majority of which are drastically underfunded relative to the value they provide.

I've committed to donating at least 20% of Buttondown's profits to the software that enables it. This is a relatively low number in absolute terms — I'm certainly not changing anyone's life — but I think it's still important.

Read more

Why you need to include a physical address in your newsletter

A question I get surprisingly often in my inbox:

Hey Justin — do I really need to include a physical address in my email newsletter?

This is a reasonable question! Going from cyberspace into the physical world via an address (especially if it's your home address) sends all sorts of red flags, I'm sure.

Read more
November 6, 2019
integration

Adding a Buttondown subscription form to Weebly

Weebly is a great tool by Square that makes it free and easy to build out a website for your business.

Getting a Buttondown form onto Weebly is as quick and easy as everything else.

First, go to your share page and copy the HTML code under Your Buttondown subscribe form:

Read more

Annual subscriptions for paid newsletters

The "annual plan upsell" is a classic piece of software marketing advice. Take it from the folks at Profitwell:

But having that money up front means that you can make more investment in your business, growing your user base and boosting your revenue.

A lump sum payment into your bank account can be a lifesaver for a new SaaS business. It can help cover customer acquisition costs and allow you to invest in your company, paying for office space, key new hires, and great SaaS services yourself.

Read more

Reminding folks to confirm their subscription

Building an audience (or to use the slightly more concise, slightly more cynical term, list building) is mostly an art of navigating a spectrum between maximum conversions and maximum subscriber quality. [^1]

On one end of the spectrum, you can imagine a completely open sieve: a text input that sits on the internet, blessedly naive, ready for any enterprising individual to plop an email in and hit "submit". There are no barriers to entry: no validations, no typo checking, no spam detection, no CAPTCHA.

If you collect email addresses like this, well — you'll get a lot of email addresses! And a lot of garbage, too:

Read more
October 24, 2019
integration

Adding a Buttondown subscription form to Squarespace

Squarespace is a great tool that makes it easy to create beautiful websites. You can enhance your Squarespace site by connecting it with Buttondown — making it easy for site visitors to sign up for updates to your newsletter.

Prerequisites

This tutorial assumes that you have a:

Read more
October 11, 2019
integration

Adding a Buttondown subscription form to Webflow

You can create a subscription form in Webflow and connect it to your Buttondown newsletter to gather email addresses and segment them in two easy steps:

  1. Grabbing your subscription URL from Buttondown
  2. Configuring your Webflow form to forward emails to Buttondown

Requirements

Read more

Embedding Instagram photos into your emails

(I'm going to try really hard to not make some sort of doing it for the 'gram reference in this post.)

((Well, I guess I just upped and did it, huh?))

Okay.  Just like how you can embed tweets or gists into your email by dropping in a URL, you can now do the same thing with Instagram!

You don't need to enable anything or connect anything.  Just drop in a URL and, like everything (okay, most things) in Buttondown, it just works.  (The best part is that it's all HTML and CSS — no Javascript! — meaning that it works great in every single email client, and you don't have to worry about lazy loading or fallbacks or noscript.)

Interested in embedding anything else easily?  Let me know.

Read more

How to opt out of analytics and email tracking

It's as easy as clicking a button on your Account page.

Specifically, this button:

(Okay, and then "Update settings".  Two buttons, then.)

Additionally, we'll be launching support for letting subscribers opt out of tracking & analytics later this month — stay tuned for the announcement there.

Read more

Managing your drafts through the API

Creating or iterating through your Buttondown drafts is now even easier (well, if you're the type of person who thinks cURL and Requests is easy — at which point, like, don't worry, you're amongst friends.)

Drafts, of course, are emails that you're still working on or tinkering with, or things that you might want to flesh out later without commiting to an actual send.  You can access them through the API and, of course, through the Drafts page.

Because drafts are now accessible via the API, they're also accessible via Buttondown's Zapier integration, which is of course free and publicly available to use.

Read more

Open Beta: Multiple newsletters

Do you have multiple newsletters?  Or have you thought about starting a second newsletter, but it sounded like a massive pain that just would not be very fun at all?

Boy, do I have some news for you.

We've got support for multiple newsletters.  Instead of logging out and back in every time you want to switch things, it's accessible from a handy little dropdown in the top-right corner of the screen (the same way you get to, say, Settings) and in comes a handy lil modal letting you choose:

It's still in a little bit of a janky phase — for instance, I haven't built out a UI to add multiple newsletters, so I need to do it manually — but if you're interested in it send me an email.  So far there are a couple dozen folks using it and loving it — you should join us!

Read more

Easy subscriber filters

Here was a fun thing to work on: subscriber filters.

This is my favorite brand of Buttondown feature: solve an obvious problem with established interfaces.  As of now, you can answer a handful of important and pertinent questions with a mere two clicks:

  1. Who has unsubscribed from my newsletter? (Okay, you could have answered this one for a while, but now it's in a more semantically relevant part of the interface.)
  2. Who has subscribed to my newsletter that Buttondown has deemed is kinda spammy? (The obvious followup question to this is: "well if you thought they were spammy, why would you let them subscribe in the first place?", to which the answer is: "we don't, but sometimes you may import a spammy subscriber or an email address reveals itself later to be spammy")
  3. What subscribers have bounced from my newsletter? ("bounced" is email-speak for "we tried to send them an email and couldn't, so we won't try in the future.")
  4. Which subscribers haven't opened my emails in a while? (The cutoff here is fairly arbitrary — three emails — and I might expand it in the future.)

That's it!  Test it out.  Is there a filter you're dying for that doesn't exist? Send me an email and let me know.

Read more

Scheduling emails through the API

Scheduled emails has always been an important part of Buttondown’s platform.  I use it every time I send out a newsletter update, whether it’s a new feature or a weekly update.

And — without beating around the bush too much — you can now schedule emails through the API!  With a simple API request, you can now schedule an email to get sent out next Tuesday!

Or with just a handful lines of, say, Python code:

Read more

Sending newsletters that get delivered

This blog post will help you with the most important thing you care about if you're writing and sending a newsletter: making sure your newsletter ends up in your subscribers' inboxes, and not in the Spam folder.  If your newsletter isn't doing this, then no brilliant writing or incredible tactics matters — it's all going to waste.

So let's talk about the most important step in doing this: verifying your domain!

The biggest part of making sure your newsletter gets delivered is by making sure you're the one sending it; that, as far as your email address is concerned, you are who you say you are.

You see, spammers and malicious actors like to impersonate others (specifically, their email addresses) in order to trick folks into giving personal information or misreading an email — in order to solve this, email hosts like Gmail and Yahoo have developed the concepts of DKIM and SPF records, which are sort of optional drivers' licenses for emails: they sit on your domain and verify that you're giving your newsletter application the right to send emails on your behalf.

SPF and DKIM have gotten so prevalent, and so important, that Gmail now only shares images from domains that have valid SPF and DKIM messages:

And we only display images by default for authenticated messages (using SPF or DKIM).

It's important to choose a newsletter provider that lets you send your emails through SPF and DKIM.  Thankfully, with Buttondown it's easy:

  • Signup for a free account, if you don't already have one.
  • Next, navigate to your settings page and put in your desired domain into the "custom domain" setting.
  • Go to your DNS provider of choice and input the requested records.
  • Go back to your settings page and verify that the records are set up correctly (it can take some time for them to propagate)

That's it!  It should only take a couple minutes for you to get trustworthy, high-deliverability emails that end up in your subscribers' inboxes.

If you don't have a custom domain

If you aren't sending emails from a custom domain (and your main email is through Hotmail, ProtonMail, Gmail, or another common provider), another good tactic to ensure high deliverability is sending using Buttondown's email address for your account rather than your own.

Read more
May 4, 2019
business

May Updates

Welcome to May! I wrote this from two places:

  1. the lounge of Seattle’s Sorrento Hotel, counting down the minutes until Silent Reading Party (a truly insufferable city tradition that I love dearly) begins;
  2. the promenade of Cal Anderson Park, on a particularly sunny Saturday.

I wrote last month that April was going to be filled with small and necessary work, a nice step back before diving into some renewed projects.  It was exactly that!

Buttondown has been buggy the past few months.  It feels bad to admit that, but it's true; the "bugs" tag in my issue tracker has been growing wider and more bulbous, and it feels good (and, frankly, necessary) to dedicate some time tackling it.

Still, I was able to get some fun stuff done:

Email domains for all

I announced last month that I had added support for custom SPIF/DKM records for premium accounts, and I'm thrilled to announce that it's now available for everyone.  If you own your own domain, you can now use it to sign the emails you send from Buttondown, greatly improving deliverability:

There are a couple reasons why I decided to make this a free feature: but it really comes down to one thing: deliverability is important, and it feels gross to essentially gate high deliverability behind $29/month.

UTM sources

In what may be the most niche feature ever, you can now automatically apply UTM tags to all outgoing links from your newsletter.

Twitter support for meta tags

Sharing your newsletter on Twitter looks prettier!

What’s next

May is going to also be a heavy bug-squash-and-technical-debt month, but with a couple meatier things to handle:

  1. CAPTCHA support for embedded signup forms.  (Lots of folks have complained about getting spammy subscribers: I hear you, and this should help with that!)
  2. A nicer writing UI.  (The first major UI change since I launched Buttondown in 2017!)

Oh, and... introducing Weeknotes

I've launched Weeknotes, a weekly update newsletter for Buttondown.  Weeknotes will be more focused on the minutiae of building Buttondown, rather than feature announcements and updates.  Subscribe to it if:

  1. You want to learn more about what building Buttondown is like.
  2. You want to support Buttondown but do not want to pay $29/month for a premium account.  (Weeknotes costs $4/month — think of it as patronage!)

As such, I'll likely be shifting the blog's structure from monthly updates more towards blog posts for each major feature.  (Of course, I say that now, but who knows what happens five months from now.  I'm nothing if not consistently inconsistent!)

Read more

April Updates

Howdy, friends!  I'm writing this belated update having just arrived back in Seattle from a week of leisure and wine in Paris.  Apologies for the sluggishness in responding to emails and DMs; rest assured, I'll be spending the next few days getting back to folks.

What’s new

March was a big month for Buttondown.

I shipped three things that have folks have been pining for for months:

  1. You can now create and send emails through Buttondown’s API.
  2. Buttondown now has a Zapier integration, meaning that you can now do things like fire webhook events in response to new subscribers or send out emails in response to RSS items.
  3. Paid subscriptions are now in public beta.  (I’ve onboarded three folks and am in the process of onboarding three more; if you want in, just email me!)

I cannot be more excited about all of these new ships.  There’s a lot of work to be done still (especially on that last piece: paid subscriptions are barebone, and I need to flesh out analytics and reporting) but this represents the culmination of a lot of work and I am thrilled to have it across the line.

What’s next

April is going to be a languid month, filled with paying down some technical debt, solving myriad bugs, and getting my ducks in a row. I’m not promising anything too huge, but some small stuff you may enjoy:

  1. More work on enabling multiple newsletters for a given account.
  2. Supporting Firefox/Safari’s reading mode on archive pages.
  3. Nicer slug URLs for archived emails.
  4. Exposing subscriber events through the API.
  5. Seriously, lots of bug fixes.

Running costs

I've updated Buttondown's running costs for April.  Notable are the increased Clearbit costs and the ever-rising costs of Mailgun's email validation; if I have time, I'm going to work on ameliorating both.

Some other things you might find interesting.

I’ve been writing about Buttondown a fair bit on my personal blog:

  1. Buttondown's anti-roadmap
  2. Buttondown's solveable problems.
Read more

March Updates

Hi, friends!  This was a great month in Buttondownsville (Buttondownia?).  I was able to take care of a huge number of paper-cut issues and build out some exciting infrastructure for the next few months.

Even nicer analytics graphs

Look at these new graphs!  They're beautiful.  They're wonderful.  They're straight-up lovely.  And they are all thanks to the c3 package, which I'm slowly migrating our visualizations to.  (Sorry, Frappe.)

Notably, you can now see how many unconfirmed users you have, if you've enabled double opt-in on your account.

Ghost integration!

Our Ghost integration is now live!  Woop!

Support for sending from custom domains

Okay, no exciting GIF here, but.  You can set up SPF/DKIM records if you want to send stuff from your own domain.  Intrigued? Email me.

What's Next

Hoo boy I'm excited for March.  The plans:

  1. Zapier integration.
  2. Allow creating emails from the API.  Meant to get to this in February, but was unable to.
  3. Launching Premium subscribers.  Sorry for bailing on this for like six months, but I wanted to make sure the polish was there — and it almost is!

Thanks

Buttondown wouldn't be Buttondown if it weren't for the support of lots of kind folks who share it with others, report issues, suggest features, send emails, and — of course — pay me.  In particular, this month I'd like to thank:

  • Jack, for being a very patient guinea pig for testing custom domain routing
  • Mikkel, for suggesting a now-live SmartyPants integration
  • Craig, for sharing Buttondown
  • John and Kym for working with me to launch the Ghost integration

A GIF for your troubles

Have a good one, y'all, and always feel free to email me if you need anything!

Read more

February Updates

Welcome to February, y'all! Seattle saw its first snow of 2019 last night, which is always an event worth celebrating. I'm writing this from a friend's couch and watching a very slow Super Bowl (and a very mediocre Maroon Five performance.)

Some new stuff from January:

Rich text copy/paste

I'm super pumped about this one! You can now copy and paste HTML or rich text from sources like Google Docs, Microsoft Word, or random web pages and Buttondown will automatically convert it into Markdown.

A more prominent draft information pane

This looks small but is big — we've rearchitected the draft view to add this little information pane. Right now, there are just two things — the link checker and the word count — but it will get more helpful and complex over time.

(And yeah, okay, y'all win. There's a word counter now.)

Better introspection into incoming subscribers

We've enhanced the subscriber information chart in the Analytics page to show more information about where those subscribers are coming from!

Upcoming work

Some stuff I want to work on more in February:

  1. Continuing to clean up the new incoming subscribers analytics. (It's still very rough around the edges.)
  2. Allowing you to filter subscribers by source or referral URL.
  3. Allowing you to disable or enable various sharing integrations.
  4. More work towards enabling multiple newsletters for a single account. (This won't get done in February, but it needs refactoring. So much refactoring.)

Thanks

It is a wild understatement to say that Buttondown would not exist or thrive without the support of the folks that use it, pay for it, write about it, report bugs about it, suggest features for it... you get the idea.

In particular:

  1. Thanks to Ben for suggesting the rich text copy and paste.
  2. Thanks to Max for suggesting the improved introspection into subscriber sources.
  3. Thanks to Sonya for reporting an issue with subscriber confirmation.
  4. Thanks to Kai for sharing Buttondown on Dense Discovery.

A gif for your troubles

Have a good one, y'all, and always feel free to email me if you need anything!

Read more

Winter Update

Hello! How are you doing? That scarf looks great on you.

It’s been a while since I’ve checked in. That’s for a couple reasons:

  1. It has been a particularly hectic summer.
  2. And, I suppose, a particularly hectic autumn.
  3. Heck, the winter's been pretty busy too.
  4. Buttondown’s been growing — like, a lot — which means there have been more operational demands that keep me from building features and writing lovely monthly missives to you all.
  5. Writing is, like, difficult, and sometimes I am very lazy.

And, so, yeah — on the surface, not much has changed over the past six months. Below the surface, though, there have been lots of things:

  • Lots of “performance improvements and bug fixes”, to use the App Store parlance. There are slow endpoints and finicky modals that are slightly less slow and slightly less finicky now.
  • Operational scaling; figuring out how to scale my customer support to make sure folks get responses and help quickly and effectively.
  • Some infrastructural changes, including a new customer enrichment provider and a better queuing mechanism.

But as I send this out, it is December, and the Seattle air is suffused with a certain crispness and calm that steers a young man’s thoughts towards feature development. I’m excited to keep working in earnest on stuff that makes Buttondown, you know, better, in the new year:

  • Email templating
  • SoundCloud, Instagram, and CodePen embeds.
  • A better way to view your upcoming scheduled emails
  • Suggested schedule times.
  • Zapier support.
  • Multiple newsletters for a single user.
  • Integration with Google Analytics.
  • The finishing touches on paid subscriptions (sorry to those of you who have been pining for this! Just want to make sure it’s really, really polished.)

This is going to sound hackneyed, but it is a blessing and a joy to work on Buttondown. Y’all are the best.

(And, as always, if you ever have any questions, concerns, or suggestions — shoot me an email!

(And I promise, the monthly updates will come back in 2019. I missed them.)

Read more
July 4, 2018
business

June Updates

It's really, really summer here in Seattle; the past few days have been what we tend to call Juneuary (sixty-six and overcast), but it's starting to get back into the swing of things. I'm writing this (a couple days after the start of the month, as is tradition) and then heading off to bike up north to luxuriate in the sunshine.

Newsletter Icons

It's tricky to balance the minimalism of Buttondown with the fact that your newsletter is, well, yours. To that end, I've introduced nice little icons with which you can adorn your newsletter — they'll show up on your archive pages, in your favicon, and in your meta tags. Upload one in your settings page!

Sending Drafts

Sometimes you need another pair of eyes on your draft. Sending a draft to yourself and then forwarding it is a hassle — this makes it a little bit easier.

Gist embedding

Need to share code? Just drop in the URL for a gist and it'll get automagically embedded.

Giphy embedding

Need to share GIFs (just as important as code!)? Just drop in the URL for a Giphy GIF and you're good to go. (Regardless of how you choose to pronounce it. I don't care, I promise.)

Upcoming

You know the deal — roadmap in flux, I have the capriciousness of an old man, etc. etc. Still, I am pumped (as ever!) for what's coming out this month:

  1. More paid subscriptions stuff. (It's getting so close, y'all. Just making sure to dot my i's and cross my t's.)
  2. Take another stab at the settings page. This is boring work, but the number of settings has grown really large over time, and it's looking a bit like an overgrown jungle at the moment.
  3. Improvements to deliverability speed and reliability. (There have been some issues with the IP we're using that I'm looking to resolve permanently.)

A gif for your troubles

The snoot must be booped.
Read more
June 3, 2018
business

May Updates

Howdy!

It's a quiet Sunday here in Seattle; the sun hasn't quite imposed its will on the streets and shops yet, and I'm here wrapping up a couple small bugs. (Er, bug fixes, not bugs. But probably some bugs too.)

Here's what's new this month!

Analytics

The new analytics page is live! There are still a few edge cases that are rough around the edges, but I hope you enjoy it (and let me know if there's anything that explodes.)

Code handling

Code blocks now work, like, way better, as seen above. (Plus: built-in syntax highlighting! Check out the documentation for more details.)

Vimeo embeds

Adding a Vimeo video to your email is as easy as dropping in the link, as you see above. (More context: email clients don't support actual videos, so what we're doing here is generating a thumbnail of the video, adding a play button on top, and making it a link to the actual video!)

Upcoming

As always, my product backlog is somewhere between "flux" and "unmitigated" chaos, but here's whats on the docket for June:

  1. Launching the beta for paid subscriptions. (Does this sound interesting? Get in touch.)
  2. Support for newsletter icons.
  3. Sending drafts to folks besides yourself. (Meant to do this last month. I got...sidetracked.)

A gif for your troubles

Efficient and Appealing
Read more
May 4, 2018
business

April Updates

Howdy! April had a lot of stuff — 184 commits, to be exact! — and a lot of that was laying groundwork and paying off technical debt, as well as some general performance improvements and housecleaning. Still, we've got three exciting things to share:

YouTube embeds

Adding a YouTube video to your email is as easy as dropping in the link, as you see above. (More context: email clients don't support actual videos, so what we're doing here is generating a thumbnail of the video, adding a play button on top, and making it a link to the actual video!)

FAQ

Y'all got questions, and a lot of them are very similar! (Which is more a condemnation of how troublesome and unintuitive parts of the interface are — which is on me, of course.) So here is a central repository for all of that, lovingly hosted by Notion.

Autosaving

See that lil checkbox in the bottom-right corner? It will automatically save all your new drafts! Don't have to worry about accidentally refreshing or navigating away or any of that pesky stuff.

Upcoming updates

My product roadmap is, as ever, prone to flights of fancy, but here's what's on the docket for May:

  1. A standalone analytics page, filled with pretty graphs and big numbers (and a couple vanity metrics, just for good measure). This has been in the works for a while and I'm so excited to finally share it with y'all!
  2. Gist embedding and better code handling. I promised this last month and then promptly forgot about it.
  3. A very commonly requested feature — sending drafts to folks besides yourself! I need to bake out the experience of this a little bit more, but I'm pretty excited about it.

A gif for your troubles

Boop!
Read more

March Updates

Hey there! March has had a bunch of stuff arrive in the ol' Buttondown codebase, mostly on the smaller side of things. Here's the quick laundry list:

Sort your subscribers

Coming shortly after publishing this — sorting by tags, as well!

Redesigned archive pages

Easier on the eyes. (No changes to the actual emails being sent.)

Streamlined billing flow

Okay, yeah, you might not be too excited about this, but it's a big deal I promise.

Public API launch

Still in the process of baking out more documentation, but it's live! If you're curious about this, feel free to email me.

Upcoming updates

My product roadmap is, as ever, prone to flights of fancy, but here's what's on the docket for April:

  • Adding an FAQ page (or knowledge base or whatever we want to call the whole idea of enshrining knowledge someplace that is publicly accessible.)
  • Nicer display of code in emails and archives.
  • Some boring technical debt stuff.

A gif for your troubles

Imgurians on the camp now.
Read more

Nicer archive pages!

Listen. I've never claimed to be a great designer. (If we're being honest, I've never claimed to be a designer at all.) . And for a long time, the email detail pages left a certain something to be desired: the text was small and wide and almost actively disincentivized the act of reading.

Well, uh, that was bad. And now it's less bad! Text is larger, narrower, and altogether more pleasant to read. Let's take a look at the before and after:

Isn't that nicer?

You don't need to do anything to enable this — it's automatic. If you ever have feedback on the look and feel of your newsletter, please reach out: I'd love to hear it!

Read more

Markdown is easier than ever

Listen, I love Markdown. It's 50% of the reason why I started Buttondown: I wanted to be able to draft emails easily with as little markup as possible.

But not everyone does! It's weird, and if you're not technical you probably haven't had too much exposure to it.

Which is why I'm happy to announce one of the most heavily requested features of all time: a simple, elegant toolbar to assist with marking up your email if you're not comfortable with writing Markdown by hand.

It pops right up, just hit the ol' "Show toolbar" toggle and feast your eyes!

Read more

January Updates

Howdy and Happy New Year! We had a quiet but productive start to 2018; I'm pumped to share what we've been up to.

Link analytics

You can now gain insight into exactly what links folks are clicking on and reading!

Embedded tweets

You can now paste Tweet URLs and they'll automatically get converted into embedded tweets, saving you time and energy.

Nicer scheduling

The scheduling mechanism has been replaced with something a little less janky and confusing. (Everyone hated UTC. Myself included.)

On next week's episode...

My product roadmap is, as ever, prone to flights of fancy, but here's what's on the docket for February:

  • Continuing to refine and improve tweet embedding. (It handles embedded links sort of oddly, amongst other things.)
  • Getting the API ready for public consumption. (If you have strong feelings on this, let me know!)
  • A stand-alone analytics page.

Spread the word!

If you've enjoyed using Buttondown, share it with a friend! More people using Buttondown means more time and energy I can justify working on it.

A gif for your troubles

Joey doesn't share food



Read more

2017: In Review

I tweeted about my desire for Buttondown in January. That was before it was Buttondown, just a hope that a tool that I used could be slightly better in a bunch of different ways.

And then again in February.

In late April, I finally decided to build it.

By the end of May, it was functional enough to send emails.

By the end of June, it was officially launched.

By July, I had a few paying customers.

Now it's December, and Buttondown continues to grow in ways that legitimately surprise me:

  • Thousands of users reach tens of thousands of subscribers every week
  • Features and polish continue to accumulate
  • I've been lucky enough to talk with lots of cool people who were very chill with my answer to feature requests being “uhh, maybe later.”
  • I've been lucky enough to talk with lots of cool people who were very chill with my answer to bugs being “oh no oh no oh no”.
  • I'm genuinely proud of this thing! This is the most ambitious project I've started and I am thrilled that so many people find value in it.

What went poorly?

  • Bugs due to poor testing. This is slowly getting better, and thankfully most of the bugs were cosmetic and/or had tiny surface areas. (Still: if you run into anything, email or DM me.)
  • Didn’t market things enough, which isn't a product failure so much as a growth failure. This is mostly a result of triage; I cared more about making sure the product was as strong as possible than making sure it was in the hands of as many people as possible.
  • Some technical debt things, largely sourcing from poor planning — implementing custom domains would have been much easier if I had given it more thought, for instance. Same with analytics.

What’s in store for next year

  • Increased stability. Most of Buttondown’s core features are completed: everything else is gravy, and there’s no excuse for any room for error. TweetDeck exposes me to many horror stories of peoples’ emails getting swallowed in other platforms, and I shudder at the thought of that happening in mine.
  • Improved analytics. A lot of the plumbing has been done with the new subscriber events support, but I want to build out a nicer universal interface for this data.
  • Full-throated API support. There’s some janky stuff for POSTing to create subscribers and most of our data is available via JSON, but an API’s not public until its publicly documented, and I’d like to canonize that sooner rather than later.
  • Getting a little more social: integration with Twitter, Facebook, and allowing imports of contacts from Gmail.

Cheers

I mentioned this already, but it has been a blast working on Buttondown. I am indebted to the help of so many: everyone who has tested, used, evangelized, or even clicked around. You all have been very kind, and I can't wait to build more stuff for y'all.

Here's to 2018. (And here's to the enduring power of newsletters, too.)

Read more

Introducing subscriber events

We've offered analytics for your emails for a while now, which is great: it's awesome to see what emails are really resonating with your subscribers and which ones, uh, aren't.

But often it's important to get even more introspection into how folks interact with your emails. We want you to be able to use Buttondown to answer questions like:

  • Do people click on links about Python more than they click on links about software development as a whole?
  • Who keeps my emails kicking around in their inbox for weeks before finally diving in?
  • Which of my subscribers are forwarding my emails to friends and colleagues?

Today we're launching the first step of that: subscriber events. Now you can see exactly how a given subscriber interacts with your emails over time: when they open them, what they click on, and so on.

This is the first step in a series of changes we're planning for revamping Buttondown's analytics, and its something we're super excited about.

As always, if you have any questions or thoughts, feel free to email me!

Read more

Learning about unsubscribed users

I'll be honest. I hate learning about unsubscribed folks. It stresses me out.

But many of you do not feel that way, and want a way to keep track of folks who have unsubscribed from your newsletter. I've been meaning to surface this information for a while, and now Buttondown offers a unsubscribers page so you can learn more about folks who have moved on to greener pastures.

(Unsubscribers are prompted for the reason why they unsubscribed. If they fill it out, that information will be surfaced here as well!)

If you're especially masochistic, I've also added a setting sending you email notifications whenever someone unsubscribes. It is rife with sad gifs.

Hope you find this useful! Or, if you are terrified by the possibility of rejection, then just ignore it. Either one is completely rational to me.

Read more

A new blog

Previously, Buttondown's changes were in the form of a changelog, hosted generously by the fine folks over at Headway.

Headway is great, but as Buttondown matures there's a lot more content and writing that needs to develop around it, stuff like:

  1. API documentation
  2. a knowledge base
  3. content marketing

This stuff requires a level of sophistication (or, if not sophistication, etymological complexity) that connotes my favorite three-letter word: CMS.

Choosing a CMS these days is just as fraught and hairy of a decision as choosing a tech stack (hell, it is choosing a tech stack), and I batted around a number of options:

  1. I love static site generators, but I wanted an easier deployment process than what they offer. Specifically, I wanted an admin interface that made drafting and publishing easy (especially when I'm away from my laptop.)
  2. I looked at Craft, which had a lot of praise from friends and peers, but the hosting story seemed murky and developing a theme locally seemed painful (I do not want to have to run MySQL just to write some templates!)
  3. Wordpress is, as always, an elephant in every room: but I didn't think I needed the complex ecosystem behind it and wasn't thrilled about the concept of writing PHP.

Meanwhile, I've had Ghost bookmarked for ages. It offers a lot of great quality-of-life stuff out of the gate:

  1. A beautiful admin interface (as seen above).
  2. Built-in support for Handlebars, a great and functional templating interface
  3. A reasonably priced managed hosting offering.

And so, yeah! Buttondown's blog runs on Ghost. I'm excited to explore Ghost's ecosystem more — it's been a delight to work with thus far — and as always, feel free to email me if you have any questions about the platform.

Read more

Learn more about your subscribers!

I'm excited to announce that our integration with FullContact is now live, giving you more insight into your subscribers.

It scans the internet for information about new emails, annotating it with names, websites, and social media presences. Here's an example!

FC.png

(There's nothing you need to enable or change. Enjoy the new feature!)

Read more

Send emails to certain tags!

Tags are great on their own, but there's no fun segmenting your subscribers if you can't actually do anything with those segments, right?

Well, um. Now there is something you can do with them. And it's exactly what you'd expect! In a good way. If you have tags, you can now send a newsletter to a specific tag (or list of tags).

tag-send.gif

Read more

Gravatar support

Subscribers who have Gravatars will now be annotated with their faces!

Screen Shot 2017-08-12 at 7.13.26 PM.png

Read more

Subscriber sources

Whether you're just curious or want to optimize your pages for subscription, it's important to find out where folks are subscribing from. For that end, we've built out some basic referral tracking to see what page brought subscribers to your site:

Screen Shot 2017-08-11 at 8.55.04 AM.png

This is the first step towards a more comprehensive understanding of subscriber analytics. Some stuff down the pipeline in the semi-near future:

  1. Support for UTM tracking as well.
  2. Visualization of referrals by source.
  3. Digests of new subscribers.
Read more

Embeddable subscription widget

We've released an iFrame that lets you embed a tiny snippet of HTML in your blog or web page to collect subscribers without having visitors leave that page at all! Find it in your share page.

Screen Shot 2017-08-06 at 9.40.03 AM.png

Read more

Creating drafts via email

One of our most-requested features is the ability to send an email and have it transform into a draft.

That's now a thing!

You can go to your drafts page to find your personal email address: send something there and the subject + body of the email are automatically converted into the draft. This can be super handy if you want to jot down some thoughts on the go!

Screen Shot 2017-07-22 at 11.37.44 AM.png

Read more

Subscriber and archive search

Managing a bunch of emails and subscribers can be, uh, a chore.

Now it's less so! There's a handy lil search bar at the top right of both pages. Type stuff in and we'll find what you're looking for.!

Read more