First, a few disclaimers.
If I started today with a mission to build a $1mm/year e-commerce business, I probably wouldn’t start with WordPress – I’d probably go with a purpose-built e-commerce tool like Shopify. There are even folks out there who will tell you not to start a blog on it either, and that there are better static content generation tools that don’t require web hosting.
However, I’ve been powering BrentOzar.com with WordPress for over a decade, and it’s grown into one heck of a consulting and training business. I’m running over $1mm/year through it, so I should probably talk about the setup I’m using these days.
None of these links are affiliate links – I’m just sharing what I know. Everything in here, I’m using in production today.
WooCommerce adds e-commerce to WordPress.
WooCommerce is a free plugin that enables the core of e-commerce processing: products, customers, orders. Automattic (the company behind WordPress) bought WooCommerce a while back, so you can feel pretty confident that it’s got a future. If you’re going to run a store on WordPress, WooCommerce is a no-brainer.
Woo is free because they make a ton of money on plugins/extensions that add functionality you’re going to want.
Plugins to help you get paid
Stripe – so you can take credit card payments via the credit card processing company Stripe. We used to use Authorize.net, and it was alright, but just not nearly as intuitive. Stripe is easy to get started with: just get an account and start taking money. Wildly different from the big providers like Authorize.
EU VAT/IVA Compliance – if you sell digital goods online, you have to charge tax to EU members even if you don’t live in the EU. Then, you have to file taxes back in the EU and send the money back over. Plus, some customers are VAT exempt, and they’ll want to put in their tax exemption data at purchase time. This process is a giant pain in the rear for US sellers, and this plugin makes it way easier.
PDF Invoices & Packing Slips – before we installed this, tons of corporate buyers wanted us to send them a PDF receipt. Yes, you get a receipt during checkout, but they next-next-nexted their way past that and deleted the email, and then they’d remember about the receipt later. With this, they can generate their own receipt in their my-account page.
Plugins for live instructor-led classes
For live instructor-led classes, we use variable products: a single product with several variations, each one being a different class date/location (like August 22-25 Online vs Oct 24-27 in Chicago.) This way I can keep the same page URL for all class dates, getting me a little better SEO over time and easier linking. Plus, whenever I add a new SQLSaturday pre-con that I’ve already given once before, I can just add a date variation for that city/date, and my setup is done.
When I used GoToWebinar to host my online classes, then when an individual student registered for a class, I used the Zapier Integration plugin sends a webhook to Zapier, which is like integration glue for all kinds of different web services. I have a zap set up to register the student in the appropriate GoToWebinar series.
Leading up to a class, we use the Product Variation Reports plugin to generate a list of everybody who registered for a specific class (variation). We send ’em email reminders, ask them about meal restriction specifics, print out check-in lists for the door staff, etc.
Now that I use live streaming to host my classes, I embed the live stream on a WordPress page, and only people who have that particular class membership can see the live stream. (I talk about the Memberships plugin below.)
For information about my live video streaming setup, check out the BrentOzar.com posts in the home office category.
Plugins for self-paced online video classes
Until recently, we sold fixed-price, fixed-length video access: you bought a specific class for 18 months for, say, $299. As we built up a bigger library of videos and started offering bundles, we learned that most people wanted to just buy everything, and they wanted to be able to extend their access on a month-by-month basis.
So we switched over to a combination of monthly or annual subscriptions, and here’s the plugins we use to do it:
- Memberships – lets you set up levels of memberships, and then on any page, you can restrict access to content to people based on their membership level. For group sales, add the Teams plugin so corporate buyers can manage groups of members, doing their own enrollments.
- Subscriptions – so you can charge for memberships by the month or year.
I host the videos with Vimeo rather than YouTube because Vimeo doesn’t screw around with ads and has better handling for private videos. If you were only making the videos publicly available rather than charging for ’em, YouTube makes more sense.
Plugins for better marketing and conversion
Jilt – when people abandon their carts, Jilt sends them a reminder, and can even send them discount coupons to encourage them to check out. Same thing with when their subscriptions are approaching renewal.
Gravity Forms and the Woo Gravity Forms Product Add-Ons – in our live instructor-led classes, there’s a small form on the product to enter the student’s name, email address, food restrictions, and t-shirt size. We’ve learned over time that for a lot of live classes, someone in a purchasing department buys a seat for someone else. They want the receipt to go to the purchaser via email, but they want the class’s seat in the other person’s name. Gravity Forms integrates with Woo to make that happen.
MonsterInsights – Google Analytics integration so you can see sales inside your web analytics and figure out where buyers are coming from. This has become really helpful now that all of the course pages are public: I discovered that a few specific class pages are getting a lot of web hits, and when non-members see the message that “you have to be subscribed to watch this class,” they’re buying a membership. Well, hello there – that raises new keyword opportunities.
Users Insights – like a CRM tool built into WordPress that helps you segment your customers into groups, see what they have in common, find new customers, etc.
Whew. That’s a lot of plugins and configuration.
It’s been a ton of work over the years. We’ve always managed it ourselves (although we outsourced parts of it to a learning management system for a while.)
Today, I’m happy with the infrastructure, but there’s still things I want to do to continue taking it to the next level:
- Bring in a design team to improve the child theme’s looks (but still keep the underlying stock theme code to be flexible)
- Hire a conversion expert to simplify the browsing-to-purchasing process
- Empower companies to buy group subscriptions online (right now, we’re handling that process manually)
- Design an onboarding process so that new members are gradually coached through the content
- Help users track which content they’ve watched
It’s genuinely fun for me to work on this stuff, but as I look at the revenue numbers, it’s time for me to step back and let someone more qualified manage this infrastructure. The skills and work that got us to $1mm/year of online revenue won’t be the same stuff that gets us to $2mm.