Main Header

Extending SignalPress

Updated on July 30, 2026

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

GoalApproachTier
Add a destination inside SignalPress or ProAdd a bundled serviceAny (official packages)
Ship an integration as a separate WordPress pluginCustom integrations2 (Pro)
Transform payloads, routing, or deliveryDeveloper hooks reference1+ for event hooks; 2 for registration
Understand bundled vs CDN dependenciesThird-party libraries

Core contracts

TypePurpose
SignalPress_ProviderMinimum contract — get_id(), capture(), settings fields
SignalPress_ServiceFull integration contract — description, logo, premium flag, URLs
SignalPress_Provider_RegistryRegisters services and controls Integrations browser state
SignalPress_EventNormalized 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:

  1. Integration activation — visible on Integrations; adds a left-menu link when active.
  2. 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, and tags.
  • 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).