I'm not sure exactly what to call this fairly common pattern, but there are a bunch of strings in Buttondown that I want to be able to pretty-print in a fallback-friendly way.
UTM campaigns are a great example: 95% of the time this value is facebook
or twitter
or blog
or email
but it technically can be anything. So you round up
the most common keys and throw them in a map that you can reference down the line:
const UTM_CAMPAIGN_TO_LABEL = {
'facebook': "Facebook",
'reddit': "Reddit",
'linkedin': "LinkedIn"
// ... and so on
};
I am a sucker for a good list of running costs, dating back to seeing Cushion's, back in 2015. I think it lends an earnest and unglamorous look as to what it really takes to a business in the way that "hustle porn"-type essays rarely do.
I've done a poor job of keeping my own such running cost document (though I'd like to do a better job!), but in lieu of a beautiful chart like Cushion's I'll try and offer something sloppier: a screenshot of my finances table!
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.
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:
(Thank you, Haley, for cutting up all of these into tiny slivers for me.)
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):
(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:
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.
(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.
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.
(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.
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.
My single favorite way to make Buttondown better is a simple two-step process:
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.
I run Buttondown, a newsletter tool. It's a pretty nice tool, in my opinion! Please check it out if you get a chance.
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:
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.
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.
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.
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:
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?
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.
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:
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):
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.
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.
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.
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!
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.
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.
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.
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 %}
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.
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.
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!
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.
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:
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:
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.
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.
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:
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:
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.
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.
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:
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.
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:
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.
This tutorial assumes that you have a:
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:
(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.
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.
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.
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!
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:
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.
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:
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:
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 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.
Welcome to May! I wrote this from two places:
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:
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.
In what may be the most niche feature ever, you can now automatically apply UTM tags to all outgoing links from your newsletter.
Sharing your newsletter on Twitter looks prettier!
May is going to also be a heavy bug-squash-and-technical-debt month, but with a couple meatier things to handle:
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:
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!)
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.
March was a big month for Buttondown.
I shipped three things that have folks have been pining for for months:
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.
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:
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.
I’ve been writing about Buttondown a fair bit on my personal blog:
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.
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.
Our Ghost integration is now live! Woop!
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.
Hoo boy I'm excited for March. The plans:
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:
Have a good one, y'all, and always feel free to email me if you need anything!
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:
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.
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.)
We've enhanced the subscriber information chart in the Analytics page to show more information about where those subscribers are coming from!
Some stuff I want to work on more in February:
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:
Have a good one, y'all, and always feel free to email me if you need anything!
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:
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:
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:
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.)
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.
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!
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.
Need to share code? Just drop in the URL for a gist and it'll get automagically embedded.
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.)
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:
The snoot must be booped.
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!
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 blocks now work, like, way better, as seen above. (Plus: built-in syntax highlighting! Check out the documentation for more details.)
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!)
As always, my product backlog is somewhere between "flux" and "unmitigated" chaos, but here's whats on the docket for June:
Efficient and Appealing
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:
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!)
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.
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.
My product roadmap is, as ever, prone to flights of fancy, but here's what's on the docket for May:
Boop!
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:
Coming shortly after publishing this — sorting by tags, as well!
Easier on the eyes. (No changes to the actual emails being sent.)
Okay, yeah, you might not be too excited about this, but it's a big deal I promise.
Still in the process of baking out more documentation, but it's live! If you're curious about this, feel free to email me.
My product roadmap is, as ever, prone to flights of fancy, but here's what's on the docket for April:
Imgurians on the camp now.
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!
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!
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.
You can now gain insight into exactly what links folks are clicking on and reading!
You can now paste Tweet URLs and they'll automatically get converted into embedded tweets, saving you time and energy.
The scheduling mechanism has been replaced with something a little less janky and confusing. (Everyone hated UTC. Myself included.)
My product roadmap is, as ever, prone to flights of fancy, but here's what's on the docket for February:
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.
Joey doesn't share food
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:
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.)
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:
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!
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.
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:
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:
Meanwhile, I've had Ghost bookmarked for ages. It offers a lot of great quality-of-life stuff out of the gate:
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.
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!
(There's nothing you need to enable or change. Enjoy the new feature!)
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).
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:
This is the first step towards a more comprehensive understanding of subscriber analytics. Some stuff down the pipeline in the semi-near future:
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.
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!
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.!