SignalPress is designed for extension: ship a bundled destination inside the plugin, register a Tier 2 custom integration from another plugin, transform events with hooks, or rely on the bundled libraries SignalPress already ships.
This section is for advanced and custom work. For everyday capture and setup, start with Capturing Events with sp_capture() and Loading SignalPress Safely.
Choose an extension path
| Goal | Approach | Tier |
|---|---|---|
| Add a destination inside SignalPress or Pro | Add a bundled service | Any (official packages) |
| Ship an integration as a separate WordPress plugin | Custom integrations | 2 (Pro) |
| Transform payloads, routing, or delivery | Developer hooks reference | 1+ for event hooks; 2 for registration |
| Understand bundled vs CDN dependencies | Third-party libraries | — |
Core contracts
| Type | Purpose |
|---|---|
SignalPress_Provider | Minimum contract — get_id(), capture(), settings fields |
SignalPress_Service | Full integration contract — description, logo, premium flag, URLs |
SignalPress_Provider_Registry | Registers services and controls Integrations browser state |
SignalPress_Event | Normalized event passed to every capture() call |
Implement SignalPress_Service for new work. SignalPress_Provider remains for backwards compatibility.
Boot and registration order
Text
plugins_loaded @5 → SignalPress_Client::boot() → glob signalpress/services/*/service.php (bundled free services) → _signalpress/register_internal_services (Pro premium services) → signalpress/register_providers + register_services (Tier 2 external plugins) → signalpress/ready
External plugins should hook signalpress/register_services (or signalpress/register_providers) and call $registry->register() — not register_internal().
See Free and Pro architecture for how Pro attaches to the free plugin.
Integration vs delivery
Two admin concepts apply to every service:
- Integration activation — visible on Integrations; adds a left-menu link when active.
- Enable service — per-service Settings toggle; must be on for delivery.
Deactivating an integration hides its admin UI but preserves saved settings.
Settings and Help
- Settings fields support types such as
text,password,url,checkbox,number,select, andtags. - Password fields are never rendered back; empty submit keeps the saved value.
- Bundled services can ship
services/{id}/README.md— rendered on the service Help tab. - Optional methods:
sanitize_settings(),test_connection(),can_test_connection(),enqueue_browser_tracking(),get_required_license_feature().
Entitlement checks in extension code
Use central helpers — not Pro file paths or license storage:
PHP
if ( signalpress_has_license_level( 2 ) ) {
// Custom integration registration runs during boot.
}
if ( signalpress_has_license_level( 1 ) ) {
add_filter( 'signalpress/properties', 'my_transform' );
}
Details: Tier features (0, Plus, Pro).