Selling software without a licensing system is like selling concert tickets without a scanner at the door. Anyone can walk in, share their copy, and your revenue disappears. If you sell WordPress plugins, themes, SaaS tools, or digital templates, you need a way to generate license keys, limit activations, deliver updates, and manage renewals. Easy Digital Downloads and its official Software Licensing extension handle all of this natively inside WordPress.
This guide walks through the complete process of building an EDD software licensing system from scratch. You will set up the extension, configure license keys with activation limits, implement license verification in your code, deliver automatic updates to customers, and manage the full license lifecycle. Every code snippet and configuration step references the official EDD Software Licensing documentation so you can verify each detail.
The EDD Software Licensing extension adds a complete license management layer on top of Easy Digital Downloads. When a customer purchases your software product, EDD automatically generates a unique license key and associates it with their account. That license key controls everything: how many sites can activate the software, whether the customer receives automatic updates, when the license expires, and what happens at renewal time.
Here is what the extension handles out of the box, according to the official documentation:
- Automatic license key generation on purchase — each transaction creates a unique key tied to the customer’s email and payment record
- Site activation limits — restrict how many WordPress installations (or other environments) can use a single license (1 site, 5 sites, unlimited)
- Automatic update delivery — push new versions of your plugin or theme directly to customers through the WordPress update mechanism
- Version management — track stable releases, changelogs, and optionally offer beta channels
- License expiration and renewal — set annual or lifetime licenses with automated renewal reminders
- Upgrade paths — let customers upgrade from a lower tier to a higher tier and pay only the difference
The extension integrates with EDD’s existing payment, customer, and reporting systems. License data appears in the WordPress admin under Downloads > Licenses, and customers can manage their licenses from the purchase history page on your storefront.
Before you configure software licensing, you need a working EDD store. If you have not set one up yet, follow our complete guide to setting up Easy Digital Downloads first. That covers installation, store configuration, and creating your first product.
Here is what you need in place:
- WordPress 5.8+ with a current version of Easy Digital Downloads installed and activated
- EDD Professional Pass ($299/year) or All Access Pass ($499/year) — Software Licensing is included in these tiers. It is not available in the Personal or Extended passes. You can verify current pricing at easydigitaldownloads.com/pricing.
- A payment gateway configured — Stripe or PayPal, both included free with EDD. See our EDD payment gateway configuration guide for setup details.
- Your software product ready for distribution — a WordPress plugin ZIP, theme ZIP, or other downloadable software package
Log in to your EDD account at easydigitaldownloads.com and navigate to your account downloads. Download the Software Licensing extension ZIP file. In your WordPress admin, go to Plugins > Add New > Upload Plugin, select the ZIP file, and click Install Now. Activate the plugin after installation completes.
After activation, you will see new options appear in your EDD product editor and a new Licenses submenu under the Downloads menu. The extension also adds license-related columns to your payment history and customer screens.
Verify the Installation
Navigate to Downloads > Settings > Extensions and confirm that Software Licensing appears as active. You should also see a new “Licensing” tab in the EDD settings where you can configure global defaults for license behavior.
Go to Downloads > Add New to create your software product. Fill in the title, description, and pricing as you would for any EDD product. The licensing configuration happens in a dedicated section below the main editor.
Configure the Download Files
In the Download Files section, upload your software ZIP package. This is the file customers will download after purchase, and the file that will be delivered as an update when you release new versions.
Enable Licensing
Scroll to the Licensing section in the product editor. Check the box labeled “Check to enable license creation”. This tells EDD to generate a license key for every purchase of this product.
Configure these fields:
| Setting | Purpose | Recommended Value |
|---|---|---|
| Version | Current stable version of your software | Match your plugin/theme header (e.g., 1.0.0) |
| Activation Limit | How many sites can activate one license | Depends on your pricing tier (1, 5, or unlimited) |
| License Length | How long a license is valid before renewal | 1 year is standard for most software products |
| Changelog | Release notes for the current version | What changed, what was fixed, what is new |
Set Up Pricing Tiers with Different Activation Limits
Most software products use tiered pricing where higher-priced plans allow more site activations. EDD supports this through variable pricing. Enable “Variable Pricing” in the product editor and create your tiers:
- Single Site — $49/year, activation limit: 1
- 5 Sites — $99/year, activation limit: 5
- Unlimited — $199/year, activation limit: 0 (0 means unlimited in EDD)
Each variable pricing option can have its own activation limit. When a customer purchases a specific tier, their license key inherits the activation limit assigned to that tier.
Generating license keys is only half the equation. Your software needs to communicate with your EDD store to verify that a license is valid, activate it on the customer’s site, and check for updates. EDD Software Licensing provides a REST API that your plugin or theme calls to handle all of this.
The EDD Software Licensing API Endpoints
Your EDD store exposes these API actions at your store URL. All requests go to your site’s root URL with query parameters. The four core API actions are:
- activate_license — registers a site URL against a license key
- deactivate_license — removes a site URL from an active license
- check_license — returns the current status of a license (valid, expired, disabled, inactive)
- get_version — returns the latest version info for update checks
License Activation Code Example
Add this function to your WordPress plugin to activate a license key against your EDD store. This sends a request to the activate_license endpoint and stores the response:
function yourprefix_activate_license() {
$license = trim( get_option( 'yourprefix_license_key' ) );
$api_params = array(
'edd_action' => 'activate_license',
'license' => $license,
'item_name' => urlencode( 'Your Product Name' ),
'url' => home_url(),
);
$response = wp_remote_post(
'https://yourstore.com',
array(
'timeout' => 15,
'sslverify' => true,
'body' => $api_params,
)
);
if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
return false;
}
$license_data = json_decode( wp_remote_retrieve_body( $response ) );
update_option( 'yourprefix_license_status', $license_data->license );
return $license_data;
}
The API response includes the license status (valid, invalid, expired, disabled, site_inactive), the activation count, the activation limit, and the expiration date. Store the status locally so you do not need to call the API on every page load.
License Deactivation Code Example
Provide a deactivation option so customers can move their license to a different site without contacting support:
function yourprefix_deactivate_license() {
$license = trim( get_option( 'yourprefix_license_key' ) );
$api_params = array(
'edd_action' => 'deactivate_license',
'license' => $license,
'item_name' => urlencode( 'Your Product Name' ),
'url' => home_url(),
);
$response = wp_remote_post(
'https://yourstore.com',
array(
'timeout' => 15,
'sslverify' => true,
'body' => $api_params,
)
);
if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
return false;
}
$license_data = json_decode( wp_remote_retrieve_body( $response ) );
if ( 'deactivated' === $license_data->license ) {
delete_option( 'yourprefix_license_status' );
}
return $license_data;
}
License Status Check
Run a periodic license check (once per day using WordPress transients) to catch expired or revoked licenses:
function yourprefix_check_license() {
$license = trim( get_option( 'yourprefix_license_key' ) );
$api_params = array(
'edd_action' => 'check_license',
'license' => $license,
'item_name' => urlencode( 'Your Product Name' ),
'url' => home_url(),
);
$response = wp_remote_post(
'https://yourstore.com',
array(
'timeout' => 15,
'sslverify' => true,
'body' => $api_params,
)
);
if ( is_wp_error( $response ) ) {
return false;
}
$license_data = json_decode( wp_remote_retrieve_body( $response ) );
update_option( 'yourprefix_license_status', $license_data->license );
return $license_data;
}
One of the most valuable features of EDD Software Licensing is automatic update delivery. When you release a new version of your plugin or theme, customers see the update notification in their WordPress dashboard just like they would for plugins from wordpress.org. They click “Update” and get the new version instantly.
How the Update Mechanism Works
WordPress periodically checks for plugin and theme updates by calling the wordpress.org API. EDD Software Licensing hooks into this process. Your plugin includes an updater class that redirects update checks from wordpress.org to your EDD store. When WordPress asks “is there a newer version?”, your plugin asks your store instead, and EDD responds with version info, download URL, and changelog.
Integrate the EDD Updater Class
EDD provides a ready-made updater class. Download the EDD_SL_Plugin_Updater class from the Software Licensing documentation page and include it in your plugin. Then initialize it:
function yourprefix_plugin_updater() {
// Bail if the updater class doesn't exist
if ( ! class_exists( 'EDD_SL_Plugin_Updater' ) ) {
require_once plugin_dir_path( __FILE__ ) . 'includes/EDD_SL_Plugin_Updater.php';
}
$license_key = trim( get_option( 'yourprefix_license_key' ) );
$edd_updater = new EDD_SL_Plugin_Updater(
'https://yourstore.com', // Your EDD store URL
__FILE__, // Plugin file path
array(
'version' => '1.0.0', // Current version
'license' => $license_key,
'item_name' => 'Your Product Name',
'author' => 'Your Name',
'beta' => false, // Set true to enable beta updates
)
);
}
add_action( 'admin_init', 'yourprefix_plugin_updater' );
When you release a new version, update the version number in your product’s Download settings on your EDD store, upload the new ZIP file, and update the changelog. Every customer with a valid license will see the update notification within 12 hours (or sooner if they manually check for updates).
Theme Updates
EDD also provides an EDD_SL_Theme_Updater class that works similarly but hooks into the theme update mechanism. The initialization is slightly different because themes use style.css headers instead of plugin headers, but the API calls are identical.
Software licensing is not a set-and-forget system. You need to handle expirations, renewals, upgrades, and edge cases. EDD provides tools for all of this in the WordPress admin and through hooks for customization.
License Expiration and Renewal
When a license expires, the customer loses access to automatic updates but can continue using the version they have installed. EDD sends renewal reminder emails before expiration (configurable under Downloads > Settings > Emails). Customers can renew from their purchase history page or through a direct renewal link.
Renewal behavior is controlled at the product level:
- Renewal discount — offer a percentage off the full price for renewals (common: 25-40% off)
- Grace period — how long after expiration a customer can renew at the discounted rate
- Automatic renewal — if you use EDD Recurring Payments alongside Software Licensing, renewals process automatically via Stripe or PayPal
License Upgrades
Customers often start with a single-site license and later need to upgrade to 5 sites or unlimited. EDD Software Licensing supports upgrade paths where the customer pays only the prorated difference. Configure upgrade paths in the product editor under the Licensing tab by specifying which pricing tiers can upgrade to which other tiers.
Admin License Management
Navigate to Downloads > Licenses in your WordPress admin to see all issued licenses. From this screen you can:
- Search licenses by key, customer email, or product
- View activation details (which sites are using a license)
- Manually activate or deactivate sites
- Extend or revoke licenses
- View the full license history (creation, activations, renewals, status changes)
Software licensing is not limited to WordPress plugins. The system works for any downloadable software where you need access control and update delivery. Here are three common use cases with specific configuration recommendations.
Use Case 1: WordPress Plugin or Theme Business
This is the most common scenario and the one EDD Software Licensing was originally built for. Companies like AffiliateWP, SearchWP, and Restrict Content Pro all run their licensing through EDD.
Recommended configuration:
- Variable pricing with 3 tiers (1 site, 5 sites, unlimited)
- Annual license length with 30% renewal discount
- Automatic updates via
EDD_SL_Plugin_Updater - Beta channel enabled for power users
- Pair with EDD Recurring Payments for automatic annual renewals
Use Case 2: SaaS Tools with a WordPress Component
If your SaaS product includes a WordPress plugin (for example, an analytics dashboard, a form builder, or a marketing tool), EDD Software Licensing can manage the WordPress plugin distribution while your SaaS handles the actual application logic.
Recommended configuration:
- Activation limit matches your SaaS plan’s site limit
- License check integrated with your SaaS API for double verification
- Monthly or annual license length matching your SaaS billing cycle
- Use the
check_licenseAPI to sync license status between your SaaS backend and WordPress
Use Case 3: Digital Templates and Design Assets
Designers selling Figma templates, Canva kits, or code snippets can use EDD licensing to control redistribution. The “license key” in this context is less about software activation and more about proving legitimate purchase.
Recommended configuration:
- Single activation limit (1 per license) for standard licenses
- Extended/team license tier with higher activation limits
- Lifetime license option for one-time purchase products
- Skip the updater class integration since templates do not auto-update through WordPress
EDD Software Licensing fires several WordPress action and filter hooks that let you customize the licensing behavior. Here are the most useful ones for developers:
// Runs when a new license is generated after purchase
add_action( 'edd_sl_store_license', function( $license_id, $download_id, $payment_id, $type ) {
// Send a webhook to your external system
// Log the license creation
// Trigger onboarding email sequence
}, 10, 4 );
// Runs when a license is activated on a new site
add_action( 'edd_sl_activate_license', function( $license_id, $download_id ) {
// Track activation in analytics
// Send notification to your team
}, 10, 2 );
// Filter the license key format before generation
add_filter( 'edd_sl_generate_license_key', function( $key, $license_id, $download_id, $payment_id ) {
// Customize the key format (prefix, length, character set)
return 'YOURPREFIX-' . $key;
}, 10, 4 );
// Runs when a license expires
add_action( 'edd_sl_license_expired', function( $license_id ) {
// Trigger win-back email campaign
// Disable premium features
// Log churn event
}, 10, 1 );
These hooks give you the flexibility to build custom workflows around the licensing system — CRM integrations, external analytics tracking, custom email sequences, and webhook notifications to third-party services.
A disciplined release process is critical when customers rely on automatic updates. Pushing a buggy update to thousands of WordPress installations can cause serious problems. Here is a release workflow that works with EDD Software Licensing.
Release Checklist
- Test thoroughly in a staging environment across multiple WordPress versions and PHP versions
- Update the version number in your plugin/theme header file and in the EDD product settings
- Write a clear changelog that explains what changed, what was fixed, and any breaking changes
- Upload the new ZIP to the EDD product’s download files section
- Update the changelog field in the EDD product’s licensing settings
- Consider a staged rollout — release as a beta first, then promote to stable after 48 hours of monitoring
Beta Releases
EDD Software Licensing supports beta channels. In your product settings, you can upload a separate beta version alongside the stable release. Customers who opt in to beta updates (by setting 'beta' => true in the updater initialization) receive the beta version. Everyone else stays on the stable release.
This is valuable for catching bugs before they reach your entire customer base. Many WordPress plugin companies use beta channels to get feedback from power users before a wider release.
Based on the EDD community forums and documentation, these are the most frequent problems developers encounter when implementing software licensing.
“License Key Is Not Valid” Errors
This usually means one of three things:
- The
item_namein your API request does not exactly match the product title in EDD (including capitalization and spacing) - The store URL in your updater initialization does not match your actual site URL (check for www vs non-www, http vs https)
- The license key was entered with leading or trailing whitespace — always use
trim()on the key before sending it
Updates Not Showing in WordPress
If customers report they are not seeing update notifications:
- Verify the version number in your EDD product settings is higher than the version in the installed plugin header
- Check that the
EDD_SL_Plugin_Updaterclass is loading correctly (no PHP errors in debug log) - WordPress caches update checks in a transient. Delete the
update_pluginstransient to force an immediate check - Ensure the customer’s license is active and not expired
Activation Limit Reached
When customers hit their activation limit, they need to either deactivate a site they are no longer using or upgrade their license tier. Provide clear instructions in your plugin’s settings page for how to deactivate, and make the upgrade path visible with a direct link to the upgrade page on your store.
License verification happens over HTTP between the customer’s WordPress installation and your EDD store. Keep these security practices in mind:
- Always use HTTPS for your EDD store — license keys are transmitted in API requests, and HTTP would expose them to interception
- Set
sslverifytotruein yourwp_remote_postcalls (as shown in the code examples above) to prevent man-in-the-middle attacks - Store the license key as a WordPress option, not in a file or hardcoded — options are stored in the database and are accessible only through WordPress
- Rate-limit API calls from your plugin — use transients to cache the license status and check at most once per day, not on every page load
- Handle API failures gracefully — if your store is temporarily unreachable, do not immediately revoke features. Cache the last known good status and allow a grace period (72 hours is common)
Software Licensing becomes even more powerful when combined with other EDD extensions. Here are the most common pairings:
| Extension | What It Adds to Licensing |
|---|---|
| Recurring Payments | Automatic annual renewals via Stripe/PayPal — no manual renewal required |
| Frontend Submissions | Let third-party developers sell licensed plugins through your marketplace |
| Commissions | Split revenue with developers who sell through your platform |
| Email Marketing (Mailchimp, ConvertKit) | Segment customers by license tier for targeted campaigns |
| Reviews | Let customers rate and review your licensed software products |
The Recurring Payments pairing is particularly important. Without it, customers must manually renew each year, and many will forget or procrastinate. Automatic renewals can increase retention rates by 30-50% compared to manual renewal workflows.
Building a software licensing system with EDD is a straightforward process once you understand the components. The extension handles the complex parts — key generation, activation tracking, update delivery — so you can focus on building great software.
Here is the action plan:
- Set up your EDD store if you have not already (follow our EDD setup guide)
- Get the Professional Pass ($299/year) from easydigitaldownloads.com to access Software Licensing
- Create your product with licensing enabled and tiered pricing
- Add the updater class and license verification code to your plugin or theme
- Test the full cycle — purchase, activation, update delivery, deactivation, renewal
- Configure renewal emails and optionally add Recurring Payments for automatic billing
If you are evaluating whether EDD is the right platform for your digital products, our EDD vs SureCart comparison covers how EDD stacks up against newer alternatives. For payment setup details, the EDD payment gateway guide walks through Stripe and PayPal configuration step by step.
The digital products market continues to grow, and software licensing is the infrastructure that turns a one-time download into a sustainable recurring revenue business. EDD gives you that infrastructure without leaving WordPress.
