Main Header

Developer hooks reference

Updated on July 30, 2026

SignalPress exposes WordPress actions and filters for lifecycle events, payload transformation, delivery control, licensing, and extension registration.

Overview: Extending SignalPress. Safe boot timing: Loading SignalPress Safely.

Tier summary

TierHooks
0 (Free)Lifecycle — signalpress/ready, signalpress/rejected, signalpress/captured, signalpress/max_payload_bytes, signalpress/service_includes_capture_origin, …
1 (Plus)Event pipeline — signalpress/properties, signalpress/context, signalpress/target_services, …
2 (Pro)Registration — signalpress/register_services, signalpress/providers, signalpress/bundled_service_files

Tier gates use signalpress_has_license_level(). Registering a callback on a Tier 1 hook on Tier 0 does not throw — the filter simply never runs during capture.

Capture pipeline order

Text

sp_capture()
  → signalpress/properties        (Tier 1+)
  → signalpress/context           (Tier 1+)
  → build SignalPress_Event
  → signalpress/event             (Tier 1+)
  → validate payload size / JSON
  → signalpress/should_capture    (Tier 1+)
  → foreach active service:
       → signalpress/should_deliver_to_service (Tier 1+)
       → signalpress/service_event             (Tier 1+)
       → routing / request rules
       → signalpress/deliver_service_event     (queue hook, Pro)
       → provider->capture()
       → signalpress/after_delivery            (Tier 1+)
  → signalpress/captured

On validation failure: signalpress/rejected (all tiers).

Tier 0+ lifecycle

signalpress/ready

Action — after core boot, bundled services, and Tier 2 registration pass.

PHP

add_action(
	'signalpress/ready',
	function ( SignalPress_Client $client ) {
		// Safe to call sp_capture() and inspect registry.
	}
);

signalpress/rejected

Action — payload validation failed or should_capture returned false.

PHP

add_action(
	'signalpress/rejected',
	function ( SignalPress_Event $event, WP_Error $reason ) {
		// Inspect rejection reason.
	},
	10,
	2
);

signalpress/captured

Action — after all services processed; receives per-service results.

PHP

add_action(
	'signalpress/captured',
	function ( SignalPress_Event $event, array $results ) {
		// $results[ $service_id ] => true|WP_Error
	},
	10,
	2
);

signalpress/max_payload_bytes

Filter — default 1,000,000 bytes encoded JSON (properties + context). Return integer.

PHP

add_filter( 'signalpress/max_payload_bytes', fn () => 2_000_000 );

signalpress/service_includes_capture_origin

Filter — when Capture origin is enabled, control whether capture origin context is sent to a remote service. Default includes observability integrations and excludes slack, discord, teams, email, and pushover.

PHP

add_filter(
	'signalpress/service_includes_capture_origin',
	function ( bool $include, string $service_id ): bool {
		return $include;
	},
	10,
	2
);

See Capture Origin.

Tier 1+ event transformation

All Tier 1 filters must return the documented type or capture returns WP_Error.

signalpress/properties

Filter — before SignalPress_Event construction.

PHP

add_filter(
	'signalpress/properties',
	function ( array $properties, string $event_name, array $context ): array {
		$properties['app_version'] = '2.0.0';
		return $properties;
	},
	10,
	3
);

signalpress/context

Filter — before SignalPress adds event_id, request_id, correlation_id, and defaults.

PHP

add_filter(
	'signalpress/context',
	function ( array $context, string $event_name, array $properties ): array {
		$context['tenant'] = 'acme';
		return $context;
	},
	10,
	3
);

signalpress/event

Filter — after construction; replace or mutate the event object.

PHP

add_filter(
	'signalpress/event',
	function ( SignalPress_Event $event ): SignalPress_Event {
		return new SignalPress_Event(
			$event->get_name(),
			$event->get_properties(),
			$event->get_context()
		);
	}
);

signalpress/should_capture

Filter — return false to skip all services (returns empty array, fires rejected).

PHP

add_filter(
	'signalpress/should_capture',
	function ( bool $capture, SignalPress_Event $event ): bool {
		return 'heartbeat' === $event->get_name() ? false : $capture;
	},
	10,
	2
);

signalpress/target_services

Filter — adjust explicit service list. null = broadcast to all active services; [] = none.

PHP

add_filter(
	'signalpress/target_services',
	function ( ?array $services, string $event_name, array $properties, array $context ): ?array {
		if ( 'payment_failed' === $event_name ) {
			return [ 'local', 'slack' ];
		}
		return $services;
	},
	10,
	4
);

Runs after Service Targeting normalizes the $services argument to sp_capture().

signalpress/should_deliver_to_service

Filter — per service, before routing.

PHP

add_filter(
	'signalpress/should_deliver_to_service',
	function ( bool $deliver, SignalPress_Event $event, string $service_id, SignalPress_Provider $provider, array $settings ): bool {
		if ( 'email' === $service_id && 'debug' === ( $event->get_properties()['level'] ?? '' ) ) {
			return false;
		}
		return $deliver;
	},
	10,
	5
);

When false, remote services log filtered (Local excluded).

signalpress/service_event

Filter — transform payload for one service before routing.

PHP

add_filter(
	'signalpress/service_event',
	function ( SignalPress_Event $event, string $service_id, SignalPress_Provider $provider ): SignalPress_Event {
		if ( 'webhooks' !== $service_id ) {
			return $event;
		}
		$properties = $event->get_properties();
		$properties['schema_version'] = 2;
		return new SignalPress_Event( $event->get_name(), $properties, $event->get_context() );
	},
	10,
	3
);

signalpress/after_delivery

Action — after each service queue handoff or provider call and log row write.

PHP

add_action(
	'signalpress/after_delivery',
	function ( $result, string $service_id, SignalPress_Event $event, string $status, string $message ): void {
		// $status: dispatched, failed, queued, filtered, etc.
	},
	10,
	5
);

With the durable queue, queued means accepted to the queue — final remote outcome appears later in logs.

signalpress/deliver_service_event

Filter (Pro queue) — return handled array to intercept delivery. Used internally by SignalPress_Delivery_Queue. Extension use is advanced; return null to defer to the provider.

Tier 2 registration and metadata

signalpress/register_services

Action — register external integrations.

PHP

add_action(
	'signalpress/register_services',
	function ( SignalPress_Provider_Registry $registry ) {
		$registry->register( new My_Logging_Service() );
	}
);

Alias: signalpress/register_providers (same timing).

signalpress/providers

Filter — modify registered provider instances (Tier 2).

signalpress/bundled_service_files

Filter — append service.php paths for custom distributions — Add a bundled service.

signalpress/integrations

Filter — Integrations browser metadata (name, logo, licensed, active).

signalpress/integration_default_active

Filter — whether a service starts active when no saved state exists. Default: Local only.

Licensing and entitlement (Pro filters)

Pro supplies values; free plugin defines the API:

FilterPurpose
signalpress/is_proGeneral Pro access
signalpress/has_license_levelTier gate
signalpress/has_featureHub feature map
signalpress/license_statusactive, grace, inactive
signalpress/license_tierNumeric tier
signalpress/license_expires_atExpiry timestamp
signalpress/delivery_log_policyRetention limits

Actions: signalpress/license_activated, signalpress/license_refreshed, signalpress/license_deactivated, signalpress/license_revoked.

See License activation.

Admin and UI actions

HookWhen
signalpress/settings/after_generalAfter general Settings form (license UI attaches here)
signalpress/render_debugging_settingsDebugging tab Pro sections
signalpress/debugging/after_settingsAfter Pro debugging form (error monitor)
signalpress/render_system_logsSystem Logs page body
signalpress/render_delivery_queueDelivery Queue tab

Logging and delivery

HookTypePurpose
signalpress/log_addedActionAfter a delivery log row is stored
signalpress/captureActionInternal capture dispatch (prefer sp_capture())

Remote config and URLs

FilterPurpose
signalpress/upgrade_urlIn-plugin upgrade links
signalpress/pricing_urlPricing page URL
signalpress/docs_embed_urlHub embed Help URL
signalpress/remote_config/payloadHub remote config payload
signalpress/campaignsAdmin campaign placements

Debugging (Pro)

HookPurpose
signalpress/debug/recordAfter Pro PHP sp() capture

Service-specific payload filters

Pattern: signalpress/{service-id}/payload

Examples: signalpress/posthog/payload, signalpress/slack/payload, signalpress/email/payload, signalpress/requestbin/payload, …

Email also exposes signalpress/email/subject, signalpress/email/html, and template token filters signalpress/template_tokens, signalpress/subject_tokens.

Document service-specific hooks in the integration README — Integrations Overview.

Deprecated aliases

DeprecatedUse instead
signalpress/addonssignalpress/integrations
signalpress/addon_default_activesignalpress/integration_default_active

Hooks run before per-service routing fields — Advanced Event Routing, Request rules, Per-service routing behavior.