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
| Tier | Hooks |
|---|---|
| 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:
| Filter | Purpose |
|---|---|
signalpress/is_pro | General Pro access |
signalpress/has_license_level | Tier gate |
signalpress/has_feature | Hub feature map |
signalpress/license_status | active, grace, inactive |
signalpress/license_tier | Numeric tier |
signalpress/license_expires_at | Expiry timestamp |
signalpress/delivery_log_policy | Retention limits |
Actions: signalpress/license_activated, signalpress/license_refreshed, signalpress/license_deactivated, signalpress/license_revoked.
See License activation.
—
Admin and UI actions
| Hook | When |
|---|---|
signalpress/settings/after_general | After general Settings form (license UI attaches here) |
signalpress/render_debugging_settings | Debugging tab Pro sections |
signalpress/debugging/after_settings | After Pro debugging form (error monitor) |
signalpress/render_system_logs | System Logs page body |
signalpress/render_delivery_queue | Delivery Queue tab |
—
Logging and delivery
| Hook | Type | Purpose |
|---|---|---|
signalpress/log_added | Action | After a delivery log row is stored |
signalpress/capture | Action | Internal capture dispatch (prefer sp_capture()) |
—
Remote config and URLs
| Filter | Purpose |
|---|---|
signalpress/upgrade_url | In-plugin upgrade links |
signalpress/pricing_url | Pricing page URL |
signalpress/docs_embed_url | Hub embed Help URL |
signalpress/remote_config/payload | Hub remote config payload |
signalpress/campaigns | Admin campaign placements |
—
Debugging (Pro)
| Hook | Purpose |
|---|---|
signalpress/debug/record | After 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
| Deprecated | Use instead |
|---|---|
signalpress/addons | signalpress/integrations |
signalpress/addon_default_active | signalpress/integration_default_active |
—
Related routing docs
Hooks run before per-service routing fields — Advanced Event Routing, Request rules, Per-service routing behavior.