The Software Distribution module enables selling WordPress plugins, themes, or any software with automatic update checking, secure downloads, and version management.
Prerequisites
- Enable Licensing module (required)
- Enable Software Distribution module in Settings → Modules
- Configure downloadable products with software distribution enabled
Product Configuration
When editing a downloadable product in WooCommerce, you'll see a new "Software Distribution" section:
| Field | Description |
|---|
| Enable Software Updates | Allow customers to check for updates via API |
| Software Slug | Unique identifier (e.g., my-plugin) used in API calls |
| Current Version | Latest version number (e.g., 1.2.3) |
WordPress Integration (Optional)
Enable "WordPress Plugin/Theme" to add these fields:
- Requires WP - Minimum WordPress version
- Tested WP - Tested up to WordPress version
- Requires PHP - Minimum PHP version
API Endpoints
Check for Updates
GET /wp-json/woonoow/v1/software/check
POST /wp-json/woonoow/v1/software/check
Parameters:
| Parameter | Type | Required | Description |
|---|
license_key | string | Yes | Valid license key |
slug | string | Yes | Software slug |
version | string | Yes | Current installed version |
site_url | string | No | Site URL for tracking |
Response:
{
"success": true,
"update_available": true,
"product": {
"name": "My Plugin",
"slug": "my-plugin"
},
"current_version": "1.0.0",
"latest_version": "1.2.0",
"changelog": {
"narrative": "Here the new features coming",
"points": [
{
"type": "ADD",
"text": "Added feature X"
},
{
"type": "FIX",
"text": "Fixed bug Y"
}
]
},
"release_date": "2026-02-01 12:00:00",
"download_url": "https://your-store.com/wp-json/woonoow/v1/software/download?token=..."
}
For WordPress plugins/themes, an additional wordpress object is included:
{
"wordpress": {
"requires": "6.0",
"tested": "6.7",
"requires_php": "7.4",
"icons": { "1x": "...", "2x": "..." },
"banners": { "low": "...", "high": "..." }
}
}
Download File
GET /wp-json/woonoow/v1/software/download?token=<token>
Download tokens are single-use and expire after 5 minutes.
Get Changelog
GET /wp-json/woonoow/v1/software/changelog?slug=<slug>
GET /wp-json/woonoow/v1/software/changelog?slug=<slug>&version=<version>
Returns version history with changelogs.
Response:
{
"slug": "my-plugin",
"versions": [
{
"version": "1.1.2",
"release_date": "2026-06-03 20:52:35",
"changelog": {
"narrative": "Here the new features coming",
"points": [
{
"type": "ADD",
"text": "Feature 1"
},
{
"type": "FIX",
"text": "Feature 2 Stable"
}
]
},
"download_count": 0
}
]
}
WordPress Client Integration
Include the updater class in your plugin or theme to enable automatic updates:
1. Copy the Updater Class
Copy class-woonoow-updater.php from the WooNooW plugin's templates/updater/ directory to your plugin.
2. Initialize in Your Plugin
<?php
require_once plugin_dir_path(__FILE__) . 'includes/class-woonoow-updater.php';
new WooNooW_Updater([
'api_url' => 'https://your-store.com/',
'slug' => 'my-plugin',
'version' => MY_PLUGIN_VERSION,
'license_key' => get_option('my_plugin_license_key'),
'plugin_file' => __FILE__,
]);
3. For Themes
<?php
require_once get_theme_file_path('includes/class-woonoow-updater.php');
new WooNooW_Updater([
'api_url' => 'https://your-store.com/',
'slug' => 'my-theme',
'version' => wp_get_theme()->get('Version'),
'license_key' => get_option('my_theme_license_key'),
'theme_slug' => 'my-theme',
]);
Non-WordPress Integration
For other software types, make HTTP requests directly to the API:
JavaScript Example
async function checkForUpdates(licenseKey, currentVersion) {
const response = await fetch('https://your-store.com/wp-json/woonoow/v1/software/check', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
license_key: licenseKey,
slug: 'my-software',
version: currentVersion,
}),
});
const data = await response.json();
if (data.update_available) {
console.log(`Update available: v${data.latest_version}`);
}
return data;
}
Python Example
import requests
def check_for_updates(license_key: str, current_version: str) -> dict:
response = requests.post(
'https://your-store.com/wp-json/woonoow/v1/software/check',
json={
'license_key': license_key,
'slug': 'my-software',
'version': current_version,
}
)
data = response.json()
if data.get('update_available'):
print(f"Update available: v{data['latest_version']}")
return data
Managing Versions
Use the Admin SPA at Products → Software Versions to:
- View all software-enabled products
- Release new versions with changelogs
- Track download counts per version
- Set current (latest) version
Error Codes
| Error | Description |
|---|
invalid_license | License key is invalid or expired |
product_not_found | Software slug doesn't match any product |
software_disabled | Software distribution not enabled for product |
invalid_token | Download token expired or already used |
module_disabled | Software Distribution module is disabled |
Security
- All API endpoints require valid license key
- Download tokens are single-use and expire in 5 minutes
- Rate limiting: 10 requests/minute per license (configurable)
- IP address logged with download tokens