Main Header

Free and Pro architecture

Updated on July 30, 2026

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

PackageDirectoryBoot priorityProvides
SignalPresssignalpress/plugins_loaded priority 5-7sp_capture(), client, registry, admin UI, free services, entitlement API surface
SignalPress Prosignalpress-pro/plugins_loaded priority 1-30License 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 APIPro 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

OptionOwnerContents
signalpress_licenseProKey, activation credentials, entitlement cache
signalpress_role_permissionsFree adminTier 2 permission matrix
signalpress_settingsFreePer-service credentials and toggles
signalpress_general_settingsFreeProject, environment, delivery master switch
signalpress_integrationsFreeActive integration flags
signalpress_remote_configFreeHub 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_activated
  • signalpress/license_refreshed

See License activation.

Pro modules that hook free UI

Pro does not duplicate admin pages — it attaches to free actions:

Pro moduleFree hook / surface
License UIsignalpress/settings/after_general
Pro debuggingsignalpress/render_debugging_settings
Error monitorsignalpress/debugging/after_settings
System Logs bodysignalpress/render_system_logs
Delivery queueDelivery 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

HookTierPurpose
signalpress/ready0+Client booted
signalpress/providers1+ licensed servicesRegister destinations
signalpress/properties1+Transform capture payloads
signalpress/debug/record2React to Pro sp() captures

Full hook reference: Hooks and Filters. Boot timing: Loading SignalPress Safely.