White-label licenses let an agency ship a single plugin to many client sites where each site sees its own branding in the plugin's admin UI: a custom name, brand colours, logo URL, support contact, feature flags, and any other fields you need.
Each license has its own API key that can be revoked independently, and branding is fetched at runtime so you can update it without redeploying the plugin.
White-label licenses are available on the Agency plan only.
Creating a license
- Open your plugin in the dashboard and go to Settings.
- Find the White-label Licenses card and click Add license.
- Fill in the fields:
| Field | Purpose |
|---|---|
| Label | Internal name — only visible in this dashboard |
| Client name | Shown in the WP admin UI instead of the canonical plugin name |
| Primary color | Brand hex colour, e.g. #1A56DB |
| Foreground color | Text colour for use on the primary background, e.g. #ffffff |
| Metadata | Free-form JSON for any extra fields your plugin needs |
- Click Create license. The raw API key is shown once — copy it and give it to the site owner.
Metadata
The metadata field accepts any valid JSON object. There is no enforced schema — put whatever your plugin reads at runtime:
{
"logo_url": "https://acme.com/logo.svg",
"support_email": "help@acme.com",
"report_from": "Acme SEO <noreply@acme.com>",
"report_footer": "Powered by Acme · acme.com",
"features": {
"multi_country": true,
"vehicle_compatibility": false,
"content_creation": false,
"schema_markup": true,
"geo_monitoring": true
},
"default_country": "NL",
"default_locale": "nl_NL"
}
WordPress plugin integration
Install or update the AutomagicWP updater (v1.1.0+):
composer require automagicwp/updater
Pass the license key as the secret option, then call get_config() wherever you need branding data:
use AutomagicWPUpdaterPluginUpdater;
add_action('init', function () {
$updater = new PluginUpdater([
'file' => __FILE__,
'id' => 'plugin_abc123',
'secret' => get_option('my_plugin_license_key'),
]);
$config = $updater->get_config();
if ($config) {
$client_name = $config->clientName ?? 'My Plugin';
$primary = $config->primaryColor ?? '#2563eb';
$foreground = $config->primaryForegroundColor ?? '#ffffff';
// Metadata fields
$logo = $config->metadata->logo_url ?? '';
$support_email = $config->metadata->support_email ?? '';
// Feature flags
$features = (array) ($config->metadata->features ?? []);
if ($features['multi_country'] ?? false) {
// enable multi-country UI
}
}
});
get_config() caches the response in a WordPress transient for 5 minutes. Pass force: true to bypass the cache — useful after a settings save:
$config = $updater->get_config(force: true);
License key settings field
Add a settings field so the site owner can paste their license key:
add_action('admin_init', function () {
register_setting('my_plugin_settings', 'my_plugin_license_key');
add_settings_field(
'license_key',
'License Key',
function () {
$key = get_option('my_plugin_license_key', '');
echo '<input type="password" name="my_plugin_license_key"
value="' . esc_attr($key) . '" class="regular-text">';
},
'my-plugin',
'my_plugin_license_section'
);
});
Plugin name in WP Admin update notices
When a site checks for updates using a license key, the update notification in WP Admin automatically uses the client name set on the license — no extra code needed.
Revoking a license
Click the trash icon on any license row in the dashboard. The API key is revoked immediately and the site will receive a 401 on its next update check or config fetch.
Need help? Email support@automagicwp.com