Main Header

Locked features and upgrade paths

Updated on July 30, 2026

When a feature requires a higher tier or an inactive license, SignalPress locks the UI instead of deleting your configuration. Saved credentials, routing rules, queue settings, and permission matrices remain in the database until you change them.

Tiers: Tier features (0, Plus, Pro). Activation: License activation.

What “locked” looks like

PatternWhere
Tier badge (lock icon + Tier 1 / Tier 2)Tab labels, section headings, field labels
Premium calloutYellow banner with Upgrade button
Disabled controlsCheckboxes and inputs disabled but visible
Preview cardsIntegrations browser for unlicensed premium services
403 on saveServer rejects POST when tier or permission check fails

Locked fields often set data-premium-locked="1" in HTML for styling hooks.

Settings are preserved

When a license expires or tier drops:

  • Integration credentials and Enable service toggles stay saved
  • Routing include/exclude patterns and request rules remain
  • Delivery queue configuration persists
  • signalpress_role_permissions matrix is unchanged
  • License key remains stored (masked) for one-click reactivation

Features simply stop executing until entitlement returns. Reactivate or Refresh the license — License activation.

Upgrade URL helpers

In-plugin upgrade links use signalpress_get_upgrade_url( $service ):

PHP

$url = signalpress_get_upgrade_url( 'posthog' );
// Adds ?service=posthog&utm_source=signalpress-plugin to SIGNALPRESS_UPGRADE_URL

Filter: signalpress/upgrade_url.

Pricing page links use signalpress_pricing_url( $context ) (for example the Plugins page Upgrade to Pro row when Pro is not installed).

Common upgrade attribution keys

These service values appear in upgrade URLs from the admin UI:

KeyLocked feature
role_permissionsPermissions tab
reliable_deliveryDelivery Queue tab
debuggingPro debugging section
system_logsSystem Logs menu
plugin_status_endpointStatus endpoint toggle
request_rulesRequest rules routing field
message_templatesEmail message templates
extended_delivery_logsTier 0 log retention upsell
unlimited_delivery_logsTier 1 retention upsell
{integration_id}Integration card (for example posthog, slack, webhooks)

Use the integration’s service ID for per-card attribution — Service Targeting.

Upgrade paths in the admin

LocationBehavior
IntegrationsPreview cards link to pricing with service attribution
Settings → PermissionsTier 2 lock + callout when below Pro
Settings → Delivery QueueFull tab locked below Tier 2
Settings → DebuggingPro section locked; basic sp() remains on free tier
Service Settings → RoutingAdvanced routing locked below Tier 1; request rules below Tier 2
Recent Activity / LogsRetention message + upgrade link below Tier 2
Plugins → SignalPressUpgrade to Pro when Pro package not installed

Operation mode overrides

Remote config can set signalpress_operation_mode() to values such as pro_suspended or disabled, which force signalpress_has_feature() false and block tier-gated delivery even when the license status reads active.

Check monitoring endpoints and hub announcements if features lock unexpectedly with a valid license.

Grace period

Status grace still passes signalpress_has_license_level() — features remain unlocked briefly after expiry while renewal is pending. UI may show warning styling on the license table and plugin status endpoint.

Custom plugins

Gate custom admin tools the same way core does:

PHP

if ( ! signalpress_has_license_level( 2 ) ) {
	return;
}

if ( ! signalpress_user_can( 'manage_routing' ) ) {
	wp_die( esc_html__( 'Permission denied.', 'my-plugin' ) );
}

Do not rely on CSS alone — always enforce server-side on form handlers and AJAX.