Launch Sale: 20% off all plugins. Limited time only.

Selling Digital Products

How to Sell WordPress Plugins and Themes Through WooCommerce

I’ve been selling WordPress plugins for years. I’ve used EDD. I’ve looked hard at Freemius. I’ve built custom licensing systems from scratch. And after all of that, I ended up selling through WooCommerce.

Not because it was trendy. Because it was the only option that didn’t make me give up control of my own business.

If you’re a plugin or theme developer trying to figure out how to sell your work, this is the guide I wish I had 3 years ago. The honest comparison. The full setup. The parts nobody talks about.

The Three Licensing Options (Honest Assessment)

You’ve got 3 realistic paths in 2026. Each one works. Each one has trade-offs that will affect your business for years.

EDD Software Licensing

Easy Digital Downloads was the default answer for a long time. Install the plugin, add the Software Licensing extension, and you’ve got license keys and update delivery.

Here’s the thing: it works. I’m not going to trash it. But it feels like a product that peaked around 2018 and has been coasting since.

The admin UI looks dated. If you’ve spent any time in modern SaaS tools, going back to EDD’s dashboard feels like a time machine. Software Licensing isn’t in EDD’s entry plan. You need one of the higher tiers, which start at $209.65 in year one and renew at $599. There’s no native GitHub sync for deployments, so you’re either uploading ZIPs manually or writing custom scripts to automate releases.

The checkout experience is bare. No one-click upsells. No modern cart optimization. No recovery flows that actually work. You can bolt things on, but you’re fighting the architecture.

EDD isn’t dead. But it’s also not going anywhere interesting.

Freemius

Freemius is the SaaS play. Integrate their SDK, configure your plans, and they handle licensing, checkout, updates, analytics, everything.

Setup is fast. Their checkout handles taxes, VAT, multi-currency. The analytics dashboard shows installs, activations, churn, trial conversions. If you want to write code and not think about commerce infrastructure, Freemius removes a lot of friction.

But you pay for that convenience.

7% of every transaction once you add the WordPress-product surcharge, plus gateway fees. On $5K/month in plugin revenue, that’s $350/month. $4,200/year. On $10K/month, it doubles to $8,400/year. Over 5 years at $10K/month, you’ve handed Freemius $42,000. For infrastructure you could own outright.

Your customers check out on Freemius’s domain. Not yours. They see Freemius branding during the purchase. The customer relationship isn’t fully yours.

And if you ever want to leave? Migrating existing customers and license keys off Freemius is painful. The SDK is baked into your plugin. Your license data lives on their servers. You’re locked in, and the lock gets tighter the longer you stay.

The SDK also adds weight to your plugin. It’s not massive, but it shows up in performance audits and code reviews. Some developers notice. Some reviewers notice.

Freemius is convenient. I get why people choose it. But convenience at 7% is expensive, and you’re renting your entire sales infrastructure from someone else.

WooCommerce-Native Licensing

This is the path I chose. Use WooCommerce as the storefront (which you already know, because you’re a WordPress developer) and run licensing, updates, and activation management through your own system.

I built Refinery Licensing to solve this exact problem. License key generation, automatic update delivery, GitHub sync for deployments, activation management, staging site detection, a white-label SDK, and a customer self-service portal. All running on your WooCommerce store.

0% revenue share. Your domain. Your checkout. Your customer data. Full access to the entire WooCommerce ecosystem: subscriptions, cart recovery, upsells, cross-sells, any payment gateway, any email integration.

The trade-off is setup time. You’re running your own WooCommerce store. That means hosting, SSL, WordPress maintenance. Taxes need a plugin like WooCommerce Tax or TaxJar. You configure the update pipeline once, and after that it’s automatic, but that first configuration takes a couple hours.

More setup upfront. Full ownership forever.

The Math Nobody Wants to Do

Let me run the numbers on a plugin earning $5,000/month. That’s not a massive business. That’s a solid side product or an early-stage plugin company.

EDD + Software LicensingFreemiusWooCommerce + Refinery Licensing
Year 1 cost~$210 (licenses)$4,200 (7% of $60K)~$99-149 (plugin license)
Year 2 cost~$250 (renewal)$4,200~$99-149 (renewal)
5-year total~$1,250$21,000~$495-745
Customer ownershipFullPartialFull
Migration difficultyMediumHardEasy

At $10K/month, the Freemius cost doubles. At $20K/month, you’re paying them $16,800 a year. That’s a full-time contractor’s salary going to a licensing middleman.

I don’t care how good their analytics dashboard is. That math doesn’t work.

Full Setup: WooCommerce + Refinery Licensing

Here’s exactly how I set this up. Budget 2 to 3 hours for the initial configuration. After that, it runs itself.

Step 1: Your WooCommerce Store

If you don’t have a WooCommerce store, set one up. A basic hosting plan ($10-30/month) handles a plugin business fine. You don’t need enterprise hosting until you’re processing thousands of orders monthly.

Install WooCommerce. Configure Stripe as your payment gateway (it’s the obvious choice for developer products). Set up your tax plugin. Configure email notifications.

If you’re already selling through WooCommerce for anything else, you can use the same store. One storefront, multiple product types.

Step 2: Install Refinery Licensing

Install the Refinery Licensing plugin on your store. The setup wizard walks you through initial configuration: license key format, default activation limits, expiration settings, and API endpoint setup.

The plugin adds REST API endpoints to your WordPress site that your plugins and themes will use to validate licenses, check for updates, and manage activations. Your store becomes the licensing server.

Step 3: Create Your Plugin Product

Create a WooCommerce product for your plugin. Refinery Licensing adds a “Licensing” tab to the product editor. Here’s what you configure:

License key generation. Keys generate automatically on purchase. You set the format (alphanumeric, UUID, or custom pattern) and the prefix. I use a brand prefix so customers can immediately identify which product a key belongs to.

Activation limits. How many sites can use one license. I run 3 tiers: Personal (1 site), Business (5 sites), Agency (unlimited). Each tier is a WooCommerce variation with its own activation limit.

Expiration. Annual renewal, lifetime, or custom duration. Annual is the most common model for plugins. WooCommerce Subscriptions handles the recurring billing if you want automatic renewals.

Update source. This is where it gets good. Connect your GitHub or Bitbucket repository. When you push a tagged release (v1.2.0, v2.0.0, whatever your convention is), Refinery Licensing automatically packages it as an update and makes it available to active installations.

No manual ZIP uploads. No deployment scripts. Push to GitHub, and your customers get the update.

Step 4: GitHub Sync for Deployments

The GitHub integration deserves its own section because it changes how you think about releases.

Set up a webhook from your GitHub repo to your WooCommerce store. When you push a tagged release, the webhook fires. Refinery Licensing pulls the release asset, validates it, and registers it as the latest version.

Your deployment process becomes: write code, test, tag a release, push. That’s it. The licensing system handles everything else.

I tag releases following semver (v1.0.0, v1.1.0, v2.0.0). The version in the tag maps to the version customers see in their WordPress update notifications. Clean and predictable.

For private repos (which most premium plugins use), you configure a GitHub personal access token. The licensing system uses it to pull release assets from private repositories. Your source code stays private. Only the packaged release gets distributed.

Step 5: Integrate the Updater in Your Plugin

Add the Refinery Licensing updater SDK to your plugin. It’s a single PHP file that handles:

  • License key validation on activation
  • Checking for updates against your WooCommerce store’s API
  • Delivering updates through the standard WordPress update mechanism
  • Deactivation and domain tracking

Your customers see updates in their WordPress dashboard, identical to any WordPress.org plugin. They click “Update,” and it works. No special process. No separate updater plugin. Just the standard WordPress update flow.

Step 6: Staging Site Detection

This is something most licensing systems get wrong, and it drives customers crazy.

A developer buys your plugin, activates it on their production site, and then spins up a staging environment to test a new feature. The staging site tries to activate the license. Now they’ve used 2 of their 3 activations, and one of them is a throwaway staging site.

Refinery Licensing detects staging environments automatically. Common patterns like .staging, .dev, .local, .test subdomains, and known staging hosting patterns (WP Engine staging, Flywheel staging, Cloudways staging) get flagged as staging sites. They can activate without counting against the limit.

You can also add custom staging patterns for hosting providers your customers use. One setting, and an entire category of support tickets disappears.

Step 7: White-Label SDK

If your customers are agencies or developers building client sites, they don’t want your branding showing up in their client’s WordPress admin. The white-label SDK lets you strip all Refinery branding from the license activation UI, update notifications, and admin screens.

Your agency customers activate the license, and their clients never see your brand. Just a clean “Licensed” status. This is a selling point for agency-tier plans that most licensing systems completely ignore.

Step 8: Customer Self-Service Portal

Refinery Licensing adds a “Licenses” section to the WooCommerce My Account page. Your customers can:

  • View all their license keys
  • See which domains are activated on each key
  • Deactivate sites they no longer use
  • Download the latest version of your plugin
  • Check expiration dates and renewal status

This eliminates the most common support tickets: “What’s my license key?” “How do I move my license to a new domain?” “Where do I download the latest version?” Customers handle it themselves. You handle zero of it.

The Free-to-Pro Funnel Through WordPress.org

If you’re not distributing a free version on WordPress.org, you’re leaving the best acquisition channel in WordPress on the table.

Here’s how the funnel works.

Your free plugin lives on WordPress.org. It does real work. Not a crippled demo with every useful feature locked behind a paywall. A genuinely useful plugin that solves a real problem with real features.

When a user wants more (advanced features, priority support, additional integrations), they purchase from your WooCommerce store. They enter their license key in the free plugin’s settings. The plugin validates the key against your store’s API, and pro features activate.

The free plugin handles the upgrade prompt. The WooCommerce store handles the transaction. Refinery Licensing handles the key validation and feature gating. The customer never leaves the WordPress ecosystem.

I run this exact model with several of my plugins. The free versions on WordPress.org generate installs, reviews, and support forum visibility. A percentage of those users upgrade to pro. The conversion rate varies by plugin, but even a small percentage of a large install base adds up.

WordPress.org is still the biggest distribution channel for WordPress plugins. It’s free. It’s trusted. And it sends you qualified buyers who already use WordPress. Ignoring it is leaving money on the table.

Managing Your Developer Customers

Here’s something nobody talks about when discussing plugin licensing: your customers aren’t just customers. They’re developers, agency owners, and store operators. They have different needs, different budgets, and different lifecycle patterns.

A one-size-fits-all customer list doesn’t cut it.

I use Refinery CRM to manage the customer side of my plugin business. Every WooCommerce order creates or updates a contact. License purchases get tagged automatically. I can segment customers by plan tier, by activation count, by renewal date, by total spend.

This matters when you’re running a plugin business because the conversations are different. A customer on a Personal plan who just activated on their first site needs onboarding help. A customer on an Agency plan with 15 active sites needs to know about your bulk licensing options. A customer whose license expired 30 days ago needs a different email than one who expired yesterday.

Refinery CRM gives you that segmentation inside WordPress. No external SaaS. No per-contact pricing that punishes you for growing. You can build segments like “Agency customers with 10+ activations whose renewal is in the next 30 days” and run targeted outreach.

If you’re tracking customers in a spreadsheet or relying on WooCommerce’s built-in order list, you’re flying blind. A real customer relationship system changes how you think about your plugin business. You stop seeing transactions and start seeing relationships.

Tracking What Matters

License activations, renewal rates, and free-to-pro conversion are the 3 numbers that tell you if your plugin business is healthy.

Activations tell you how many people are actually using what they bought. If you sell 100 licenses and only 40 are activated, you have an onboarding problem. Those 60 inactive licenses are future churn.

Renewal rates tell you if your plugin delivers ongoing value. A 70% renewal rate means 30% of your customers decided your plugin wasn’t worth paying for again. That’s feedback. Expensive feedback.

Free-to-pro conversion tells you if your upgrade path works. If you have 5,000 free installs and 20 pro customers, your free version either gives away too much or your pro upgrade isn’t compelling enough.

Refinery Analytics tracks these metrics natively. Activation rates by product, renewal rates by plan tier, conversion rates from free to pro, churn patterns over time. The numbers live in your WordPress dashboard, right next to your WooCommerce orders.

You don’t need a separate analytics SaaS to understand your plugin business. You need the right data in the right place, and you need to actually look at it.

I check 3 dashboards every Monday morning: WooCommerce orders (revenue), Refinery CRM (customer health), and Refinery Analytics (product health). That’s it. Three screens. Ten minutes. I know exactly where my plugin business stands.

Handling Subscriptions and Renewals

Most plugin businesses run on annual licenses. That means WooCommerce Subscriptions.

Refinery Licensing integrates with WooCommerce Subscriptions out of the box. When a subscription renews, the license key automatically extends. When a subscription lapses, the license deactivates. When a customer resubscribes, the license reactivates.

No manual intervention. No custom code. The subscription status and the license status stay in sync.

This also means you get all of WooCommerce Subscriptions’ built-in tooling: dunning emails for failed payments, upgrade/downgrade flows, subscription switching between tiers. If a customer wants to move from Personal to Agency mid-cycle, WooCommerce handles the proration. Refinery Licensing updates the activation limit.

For subscription retention, the renewal rate is everything. Every failed payment you recover and every cancellation you prevent goes straight to your bottom line. The tooling around subscription management matters more than most plugin developers realize.

What This Looks Like Day-to-Day

Once everything is set up, here’s what a normal week looks like for me:

Monday: Check dashboards (orders, CRM, analytics). Review any license support tickets. Almost always zero, because the self-service portal handles most of it.

Development days: Write code. Test. When a release is ready, tag it and push to GitHub. Refinery Licensing picks it up and delivers it to customers. I don’t touch the deployment process.

Marketing days: Check free-to-pro conversion rates. If they’re dropping, look at the upgrade prompt copy or the feature gap between free and pro. Use CRM segments to send targeted emails to customers approaching renewal.

That’s it. The licensing infrastructure runs itself. The deployment pipeline runs itself. The customer portal runs itself. I spend my time on code and marketing, not on licensing administration.

Getting Started

If you’re currently on EDD or Freemius and considering a switch, start by setting up your WooCommerce store alongside your existing system. Run them in parallel. Move new customers to WooCommerce first, then migrate existing customers when you’re confident.

If you’re starting fresh, skip the middle steps. Set up WooCommerce, install Refinery Licensing, connect your GitHub repo, and start selling with full ownership from day 1.

The whole Refinery suite (Licensing, CRM, Analytics, and 7 other WooCommerce growth plugins) is available at refinerywp.com. Each plugin works standalone. You don’t need the bundle to use Licensing. But once you see how they work together, the bundle starts making a lot of sense.


Mike Valera builds WooCommerce growth tools at RefineryWP.

Related reading

Leave a Comment

Grow Your Store Smarter

One email a week with plugin updates, revenue tactics, and strategies top WooCommerce stores use to scale.

By subscribing, you agree to our Privacy Policy. Unsubscribe anytime.

Item added to cart.
0 items - $0.00