Main Header

Custom integrations (Tier 2)

Updated on July 30, 2026

Tier 2 (Pro) sites can register SignalPress destinations from separate WordPress plugins without copying files into signalpress/ or signalpress-pro/.

Bundled official services: Add a bundled service. Overview: Extending SignalPress.

Requirements

  • SignalPress and SignalPress Pro active
  • Tier 2 license (signalpress_has_license_level( 2 ))
  • Service class implementing SignalPress_Service
  • Registration on signalpress/register_services (or signalpress/register_providers)

Below Tier 2:

  • signalpress/register_services and signalpress/register_providers do not run
  • $registry->register() returns false
  • signalpress/providers filter is not applied
  • signalpress/bundled_service_files additions are ignored

Plugin structure

Text

my-signalpress-integration/
  my-signalpress-integration.php   ← main plugin file
  class-my-logging-service.php
  logo.svg

Service class

PHP

 [
				'label' => 'API key',
				'type'  => 'password',
			],
		];
	}

	public function is_configured( array $settings ) {
		return ! empty( $settings['enabled'] ) && ! empty( $settings['api_key'] );
	}

	public function capture( SignalPress_Event $event, array $settings ) {
		// Send with wp_remote_post(); return true or WP_Error.
		return true;
	}
}

Use a unique get_id() — it becomes the Service Targeting key and option namespace under signalpress_settings.

Register on boot

Load the class inside the callback so SignalPress interfaces exist:

PHP

add_action(
	'signalpress/register_services',
	function ( SignalPress_Provider_Registry $registry ) {
		require_once __DIR__ . '/class-my-logging-service.php';
		$registry->register( new My_Logging_Service() );
	}
);

signalpress/register_providers fires in the same boot pass with the same registry — use either hook, not both, unless registering distinct providers.

Success and failure

PHP

$registered = $registry->register( new My_Logging_Service() );
if ( ! $registered ) {
	// Tier 2 not active -- do not rely on this integration.
}

After registration

Successful registration:

  • Adds a card on SignalPress → Integrations (logo, description, premium badge)
  • Creates SignalPress → {Service name} when the integration is activated
  • Exposes Settings, Routing, Logs, and Help tabs like built-in services
  • Participates in Advanced Event Routing and Request rules when Tier 2 routing is available

Administrators (or roles with Manage integrations) activate the integration and configure credentials.

Premium and licensing

Set is_premium() to true when the destination requires a paid SignalPress tier or a hub feature flag.

Optional:

PHP

public function get_required_license_feature() {
	return 'my_logging_service';
}

When set, is_service_licensed() checks the hub features map via signalpress_has_feature(). When empty, premium services fall back to signalpress_is_pro().

Filter the provider list

After registration, signalpress/providers can adjust the in-memory provider map (Tier 2 only):

PHP

add_filter(
	'signalpress/providers',
	function ( $providers ) {
		unset( $providers['my_logging_service'] ); // rare -- prefer not registering.
		return $providers;
	}
);

Prefer register() / omit registration over removing providers at runtime.

Integration metadata

signalpress/integrations filters the Integrations browser array (cards, upgrade URLs, active state). Use it to adjust marketing copy — not to bypass licensing.

Testing

  1. Confirm Tier 2 license is active — License activation.
  2. Activate your WordPress plugin.
  3. Open Integrations — your service card should appear.
  4. Activate the integration and Enable service on Settings.
  5. Run a connection test if implemented.
  6. Call sp_capture() with 'services' => [ 'my_logging_service' ] and verify the Logs tab.

Hard dependency vs optional

Optional (recommended for public plugins):

PHP

if ( function_exists( 'sp_capture' ) ) {
	sp_capture( 'order completed', [ 'order_id' => 123 ], [], [ 'my_logging_service' ] );
}

Hard dependency — require SignalPress active and fail gracefully in admin if Tier 2 is missing.