Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/syntekpro/syntekpro-license-server/archive/refs/heads/main.zipA comprehensive WordPress plugin for managing licenses for your premium WordPress plugins and themes.
📋 Description
Syntekpro License Server provides a complete solution for selling and managing licenses for your WordPress products. It includes:
- REST API for license validation, activation, and deactivation
- Admin Interface for creating and managing licenses
- Domain Tracking to control where licenses can be activated
- Expiration Management with customizable license durations
- Status Control to activate, suspend, or revoke licenses
🚀 Features
- ✅ Generate unique license keys with custom prefix (SP-XXXX-XXXX-XXXX-XXXX)
- ✅ Control activation limits (single-site or multi-site licenses)
- ✅ Set custom expiration periods
- ✅ Track which domains are using each license
- ✅ REST API endpoints for remote validation
- ✅ Beautiful admin interface with one-click copy functionality
- ✅ License status management (active, inactive, suspended, expired)
- ✅ Secure nonce verification and sanitization
- ✅ Easy integration with your plugins
- ✅ Full settings page for API security, rate limits, and admin defaults
📦 Installation
Method 1: Manual Installation
- Download the plugin files
- Upload the
syntekpro-license-serverfolder to/wp-content/plugins/ - Activate the plugin through the 'Plugins' menu in WordPress
- Navigate to 'Syntekpro Licenses' in the admin menu
Method 2: Development Installation
- Clone or copy the plugin to your plugins directory:
cd wp-content/plugins/ cp -r /path/to/Syntekpro-license-server ./syntekpro-license-server - Activate the plugin in WordPress admin
🔧 Usage
Creating a License
- Go to Syntekpro Licenses → Add New
- Fill in the form:
- Customer Email: The license owner's email
- Product ID: Unique identifier for your plugin (e.g.,
my-plugin-pro) - Activation Limit: Number of sites allowed (default: 1)
- Expires In: Number of days until expiration (default: 365)
- Click Create License
- Copy the generated license key and send it to your customer
Managing Licenses
- View All Licenses: Go to Syntekpro Licenses
- Change Status: Use the dropdown to change license status
- Delete License: Click the delete button (with confirmation)
- Copy License Keys: Click the copy button next to any license key
Plugin Settings
Go to Syntekpro Licenses → Settings to configure:
- API Security: Require HMAC signatures and manage your HMAC secret
- Rate Limits: Window size and per-endpoint limits (validate/activate/deactivate)
- Admin Defaults: Licenses per page, default activation limit, default expiration days
- Advanced Action: One-click HMAC secret regeneration (remember to update clients)
- Connection Check: One-click API self-test against
/syntekpro/v1/validate
API Endpoints
The plugin provides three REST API endpoints:
1. Validate License
POST /wp-json/syntekpro/v1/validate
Parameters:
license_key- The license key to validateproduct_id- Your product identifierX-Syntekpro-Timestamp(header, optional*) - Unix timestampX-Syntekpro-Signature(header, optional*) - HMAC SHA256 signature
Response:
{
"valid": true,
"message": "License is valid",
"expires_at": "2026-01-21 12:00:00",
"activations": "1/3"
}
2. Activate License
POST /wp-json/syntekpro/v1/activate
Parameters:
license_key- The license keyproduct_id- Your product identifierdomain- The domain to activate onX-Syntekpro-Timestamp(header, optional*) - Unix timestampX-Syntekpro-Signature(header, optional*) - HMAC SHA256 signature
Response:
{
"activated": true,
"message": "License activated successfully",
"activations": "1/3"
}
3. Deactivate License
POST /wp-json/syntekpro/v1/deactivate
Parameters:
license_key- The license keyproduct_id- Your product identifierdomain- The domain to deactivate fromX-Syntekpro-Timestamp(header, optional*) - Unix timestampX-Syntekpro-Signature(header, optional*) - HMAC SHA256 signature
Response:
{
"deactivated": true,
"message": "License deactivated successfully"
}
* Signature headers become required when Require HMAC Signatures is enabled in plugin settings.
Error Codes
Failed responses now include a machine-readable error_code field, for example:
{
"activated": false,
"message": "Activation limit reached (1 sites maximum)",
"error_code": "activation_limit_reached"
}
Common codes: missing_required_parameters, invalid_license_key, license_product_mismatch, license_not_active, license_expired, activation_limit_reached, rate_limit_exceeded, missing_signature, invalid_signature, invalid_signature_timestamp, expired_signature_timestamp.
🔌 Integrating with Your Plugin
To add licensing to your WordPress plugin, use the client code:
require_once plugin_dir_path(__FILE__) . 'includes/class-license-client-helper.php';
// Initialize the license client helper
$license = new Syntekpro_License_Client_Helper(
'my-plugin-pro', // Product ID (must match server)
'https://license-server.com', // License server base URL
defined('MY_PLUGIN_LICENSE_HMAC_SECRET') ? MY_PLUGIN_LICENSE_HMAC_SECRET : '' // Optional HMAC secret
);
// Example: validate a key
$result = $license->validate_license('SP-XXXX-XXXX-XXXX-XXXX');
if (!empty($result['data']['valid'])) {
// License valid
}
// Check if license is valid
if (!$license->is_license_valid('SP-XXXX-XXXX-XXXX-XXXX')) {
wp_die('Please activate your license!');
}
// Your premium features here...
Client Helper Notes
- Use includes/class-license-client-helper.php as a drop-in class in your premium plugin.
- When the server has an HMAC secret configured, pass the same secret to the helper so it sends signed headers.
- Available helper methods:
validate_license($license_key),activate_license($license_key, $domain = ''),deactivate_license($license_key, $domain = ''),is_license_valid($license_key).
See the client implementation guide for complete integration instructions.
🗄️ Database Schema
The plugin creates a table wp_syntekpro_licenses with the following structure:
| Column | Type | Description |
|---|---|---|
| id | mediumint(9) | Primary key |
| license_key | varchar(255) | Unique license key |
| varchar(100) | Customer email | |
| product_id | varchar(100) | Product identifier |
| status | varchar(20) | License status |
| activations_limit | int(11) | Max activations allowed |
| activations_count | int(11) | Current activations |
| activated_domains | text | JSON array of domains |
| created_at | datetime | Creation timestamp |
| expires_at | datetime | Expiration timestamp |
🔒 Security
- All API requests are sanitized and validated
- Optional HMAC request signing support for API clients
- Built-in per-endpoint rate limiting for API abuse protection
- WordPress nonce verification for admin actions
- Capability checks for admin pages (
manage_options) - Prepared SQL statements to prevent injection
- Status validation for license updates
📝 License Statuses
- active: License is valid and can be used
- inactive: License exists but is not active
- suspended: License has been temporarily disabled
- expired: License expiration date has passed
🛠️ Requirements
- WordPress 5.0 or higher
- PHP 7.4 or higher
- MySQL 5.6 or higher
📞 Support
For support, feature requests, or bug reports:
- Email: support@syntekpro.com
- Website: https://syntekpro.com/support
- GitHub Issues: https://github.com/syntekpro/syntekpro-license-server/issues
👨💻 Author
Syntek Pro
- Website: https://syntekpro.com
- GitHub: https://github.com/syntekpro
- Support: https://syntekpro.com/support
📄 License
This plugin is licensed under the GPL v2 or later.
🙏 Credits
Built with ❤️ for the WordPress community by Syntek Pro.
Version: 1.0.1
Last Updated: January 2026
Repository: https://github.com/syntekpro/syntekpro-license-server
Releases
1 release.
These releases are tags only. The author does not attach a packaged zip, so there are no download counts to report.