In 2013, mostly just for laughs, I ran a Black Friday sale on BrentOzar.com. It did way better than I’d expected – turns out a lot of y’all love Black Friday shopping as much as I do – so I gradually put more work into it over time.
Here’s how it did over the years:
- 2013: $52,780
- 2014: $84,577
- 2015: $167,728
- 2016: $181,457
- 2017: $439,550 – a great jump upwards that I was really happy with, but ever-so-slightly disappointed because I’d set an Epic Life Quest task goal of $500K. That goal seemed bonkers, but I put a ton of prep work in.
- 2018: $514,033
I wrote about this year’s prep work, and now it’s time to look back to see what worked out well, what didn’t, and what changes I’m making based on what I learned.
A long sale helped, but accepting checks/POs/invoices didn’t.
Last year, we did a quantity-limited sale: the first X seats in each class were discounted. That drove a lot of sales in early, and then a separate small burst of sales on Black Friday itself. The dark line here is revenue:
But last year, we had (what seemed like) a lot of requests from DBAs at large shops who couldn’t get their purchasing departments to move quickly enough to act on a Black Friday sale. This year, we ran the same sale all month long to make it easier for them, and we even accepted check & wire payments.
This year, the sales were distributed through the month – and ended up peaking on the last day instead of the first!
Other than the last day panic, the peaks roughly align with targeted email campaigns to remind different segments of folks about the sale. So which one’s better, quantity-limited or all-month-long? I’m not sure yet, gotta think about that one and analyze the data.
We definitely got more sales from big shops – the team memberships paid off really well – but >99% of orders still came in via credit card, not check/invoice/PO. Even people who bought the big Team Memberships paid via card. With that in mind, I don’t think we’d hassle with check/invoice/PO payments again.
We did get a handful of last-minute, November 30th questions from people saying, “Hey, we just heard about the sale, and we want to pay via invoice/check/PO.” I can only hold the sale open so long, hahaha.
Bundles outsold the heck out of single products.
The Season Passes still dominate sales: the Live Class Season Pass was far and away the top seller with about $230K sold, and the re-added Recorded Class Season Pass was #2 with about $100K sold. (SQL Constant Care sold about $50K, but that blurs the lines a little – it’s a combination of the SaaS mentoring and recorded videos.)
The new Team Membership sold to a few companies, which I’d call a huge success because the price of entry was fairly high, and it wasn’t announced ahead of time. It’s hard for most companies to suddenly whip out the company card and ring up a $10K-$20K charge.
In fact, so many bundles sold (and so few guest instructor classes sold) that it made me step back and rethink my business plan for 2019. We’re going to simplify the site down, make it easier for people to choose between 3 things:
- An individual class (live or recorded)
- A season pass (live or recorded)
- A team membership
To do that, and to keep the accounting simple, we’re going to stop selling guest instructor classes. I love our guest instructors, and I loved their material – but I gotta pick my battles. I’m already stretched too thin trying to do my own training classes, build SQL ConstantCare®, and do consulting, so I had to make some tough choices. We’ll keep selling the existing class dates, but we won’t add new ones.
Europeans are determined to buy our stuff.
I announced last year that we were stopping selling stuff to the EU/EEA for now, and we put steps in to make sure EU/EEA customers couldn’t check out. Holy cow, though, they were determined to work around it: fake addresses, VPNs to other areas, trying to pay via wire transfer, you name it. It still wasn’t a financially significant amount, but it generated a lot of work for Erika, who had to refund these customers and explain that yes, we were serious about this.
I sure wish they paid more attention to their governments first – for example, they need to be aware of the train wreck that is the upcoming EU copyright directive. What an incredible hot mess.
So why don’t we just give in? Because it’s a relatively low portion of our revenue, the risks are really high, and I don’t have enough confidence in all of our third party partners yet. For example, I have zero faith in GoToWebinar’s ability to handle the right to be forgotten. From any given webinar invite you get, try figuring out how to request them to show you what data they hold on you, and ask for the right to be erased. It’s terrible, and it’s no easier from the webinar hosting side (they keep all data for 365 days, long after you really need it, and you can’t even ask NOT to see that data.) Their GDPR compliance page has a really hand-wavy answer, too:
For 2019, I’m going to start switching away from third party partners who don’t make it delightfully easy for customers to comply with the GDPR. I can’t promise anything yet, but I’d like to be in a position where we can open up EU/EEA sales for the next Black Friday. (Plus, I just want to ease Erika’s workload, hahaha.)
Google Pay & Apple Pay wasn’t quite smooth enough.
When people buy our live classes, a decent chunk of ’em buy for someone else – like big company training departments buying classes for their staff members. To facilitate that, we have a student name/email form on the class so you can put someone else in instead:
See the big dark “Buy now” button? That’s because I’m browsing with Google Chrome – it’s Google Pay. It’s easier to use – payment is integrated into the browser – but it has a dark side: it bypasses the required student name/email fields on the form.
Managers often bought for their employees, and you can guess how it went: they’d get so attracted to the “Buy now” button that they wouldn’t fill out the student name/email. Then, they would email us and say, “This class is for so-and-so, please enroll them instead.” That was more work for Erika. The related Github issue for the Stripe extension was closed back in 2017 with WooCommerce telling folks to hire their own developers. (Fair.)
It generated enough extra work that I ended up disabling Google Pay & Apple Pay, so now the form looks a lot cleaner, and we don’t have to worry about that:
I have a running list of things I’d like to get improved in WooCommerce and a couple of plugins, and 2019 is going to be the year that I sponsor a developer to get some of these things coded.
The learning curve for team setups was terrible.
I added team purchasing at the last minute, almost on a whim, and holy cow, did Erika and I pay the price all month. When team purchases went well, they went flawlessly – but when they went wrong, they went really wrong, taking hours of customer handholding and database changes.
Example: someone would buy a team membership for 3 people, think that their payment hadn’t gone through for some reason, then buy another team membership for 3 people, and then cancel the second subscription when they realized the first one had gone through. The teams plugin would look at their account, see that their most recent team subscription had been canceled – and not allow any of their teams to work.
I’ll put together a list of what we learned and share that with the authors of the teams plugins, and hopefully they’ll improve the functionality for other WooCommerce users over time. Ideally before next Black Friday, hahaha.
Now, what do we do for next year?
First, I don’t wanna raise the goal beyond $500K. I’d be happy enough (ecstatic, really) if we hit that goal two years in a row. I need to keep building on what I know, learning from others, and running experiments. Some of those experiments are gonna fail, and temporary setbacks are okay.
Second, I’ve already got a vacation planned with Erika – we’re going on a cruise for the first half of November, and then an onsite client engagement. That means I either have to do a “real” Black Friday/Cyber Monday sale, confined to those dates, or else I have to make sure the sale doesn’t need my involvement. (That could mean outsourcing the store management, or training/empowering other people on our team to do it.)
My gut hunch right now is that we switch to a “real” Black Friday sale:
- Contract a PHP/MySQL developer to do a round of performance tuning fixes
- Contract the plugin development companies to make some improvements specific to our sales processes
- Switch webcasts from GoToWebinar (where I don’t trust their GDPR handling) over to a more GDPR-savvy webcast company
- Enable sales to the EU/EEA again (not just for the added revenue, but also to cut down on the human intervention required)
- Migrate the site from WPengine to our own cloud hosting so we can temporarily scale up/down more easily in preparation for the big sales days
- Do a round of user experience tests, checking out as a customer, signing up their team members, etc, looking for problems that will pop up on Black Friday
That’s a non-trivial amount of work – but hey, it’s a non-trivial amount of sales income. It just comes down to figuring out how much to invest, and when.
But for now, a week in Vegas at SQLintersection, celebrating at é by José Andrés, and then off to Cabo with Erika for some rest and relaxation (which will check off another Epic Life Quest task: taking 2 weeks off with her each year for 5 straight years.)
Also, tequila. A lot of tequila.