SignalPress ships as two WordPress plugins that share one runtime. The free plugin owns the event pipeline and admin shell; SignalPress Pro adds premium services, licensing, and Pro-only subsystems.
Overview: Licensing, tiers, and permissions. Tier matrix: Tier features (0, Plus, Pro).
Plugin responsibilities
| Package | Directory | Boot priority | Provides |
|---|---|---|---|
| SignalPress | signalpress/ | plugins_loaded priority 5-7 | sp_capture(), client, registry, admin UI, free services, entitlement API surface |
| SignalPress Pro | signalpress-pro/ | plugins_loaded priority 1-30 | License manager, premium service classes, queue, Pro debugging, system logs |
Pro requires the free plugin. If core is inactive, Pro admin modules do not boot (signalpress_pro_is_core_active()).
Boot sequence (simplified)
Text
plugins_loaded @1 → SignalPress_License_Manager (filters entitlement) plugins_loaded @5 → SignalPress_Client::boot() plugins_loaded @6 → Remote config, admin analytics plugins_loaded @7 → SignalPress_Basic_Debugger plugins_loaded @30 → Debug manager, error monitor, delivery queue, system logs, Clockwork
Premium service PHP files load through the Pro service loader and register on signalpress/providers.
Entitlement filters (Pro → free)
The free plugin exposes hooks; Pro supplies values when licensed:
| Free API | Pro filter |
|---|---|
signalpress_is_pro() | signalpress/is_pro |
signalpress_license_status() | signalpress/license_status |
signalpress_license_tier() | signalpress/license_tier |
signalpress_license_expires_at() | signalpress/license_expires_at |
signalpress_has_feature( $feature ) | signalpress/has_feature |
signalpress_has_license_level( $min ) | signalpress/has_license_level |
Without Pro (or without activation credentials), tier helpers return Tier 0 / inactive defaults.
Preferred checks in custom code
PHP
// Good -- works with or without Pro installed.
if ( signalpress_has_license_level( 1 ) ) {
add_filter( 'signalpress/properties', 'my_plugin_enrich_properties' );
}
// Avoid -- breaks when Pro is installed but license lapses.
if ( class_exists( 'SignalPress_License_Manager' ) ) {
// ...
}
// Avoid -- conflates "plugin zip present" with "licensed".
if ( signalpress_is_pro_plugin_installed() ) {
// ...
}
Use signalpress_is_pro_plugin_installed() only for install UX (for example showing install instructions). Use signalpress_is_pro() for “has paid entitlement.”
Integration registration
Text
Free registry → Local, Email, RequestBin (always) Pro services → filter signalpress/providers at priority 10+ Catalog → signalpress/integrations for Integrations browser cards
Each provider may implement get_required_license_feature() for hub feature flags. SignalPress_Provider_Registry::is_service_licensed() combines tier, feature map, and activation state before allowing Enable service.
Shared storage options
| Option | Owner | Contents |
|---|---|---|
signalpress_license | Pro | Key, activation credentials, entitlement cache |
signalpress_role_permissions | Free admin | Tier 2 permission matrix |
signalpress_settings | Free | Per-service credentials and toggles |
signalpress_general_settings | Free | Project, environment, delivery master switch |
signalpress_integrations | Free | Active integration flags |
signalpress_remote_config | Free | Hub remote config cache |
Remote config and hub
Licensed sites fetch remote config from the hub using signed activation credentials (not the license key). Config drives operation mode, campaigns, and refresh intervals.
License lifecycle hooks that refresh config:
signalpress/license_activatedsignalpress/license_refreshed
See License activation.
Pro modules that hook free UI
Pro does not duplicate admin pages — it attaches to free actions:
| Pro module | Free hook / surface |
|---|---|
| License UI | signalpress/settings/after_general |
| Pro debugging | signalpress/render_debugging_settings |
| Error monitor | signalpress/debugging/after_settings |
| System Logs body | signalpress/render_system_logs |
| Delivery queue | Delivery Queue tab renderer |
This keeps one admin menu and one Help iframe entry point.
Uninstall and deactivation
- Deactivating Pro stops premium dispatch and licensing filters; free integrations continue.
- Deactivating free SignalPress disables the entire stack; deactivate Pro first on uninstall.
- Deactivate this site (license) releases the hub activation slot without deleting integration settings.
Extension points
| Hook | Tier | Purpose |
|---|---|---|
signalpress/ready | 0+ | Client booted |
signalpress/providers | 1+ licensed services | Register destinations |
signalpress/properties | 1+ | Transform capture payloads |
signalpress/debug/record | 2 | React to Pro sp() captures |
Full hook reference: Hooks and Filters. Boot timing: Loading SignalPress Safely.