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
| Pattern | Where |
|---|---|
Tier badge (lock icon + Tier 1 / Tier 2) | Tab labels, section headings, field labels |
| Premium callout | Yellow banner with Upgrade button |
| Disabled controls | Checkboxes and inputs disabled but visible |
| Preview cards | Integrations browser for unlicensed premium services |
| 403 on save | Server 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_permissionsmatrix 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:
| Key | Locked feature |
|---|---|
role_permissions | Permissions tab |
reliable_delivery | Delivery Queue tab |
debugging | Pro debugging section |
system_logs | System Logs menu |
plugin_status_endpoint | Status endpoint toggle |
request_rules | Request rules routing field |
message_templates | Email message templates |
extended_delivery_logs | Tier 0 log retention upsell |
unlimited_delivery_logs | Tier 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
| Location | Behavior |
|---|---|
| Integrations | Preview cards link to pricing with service attribution |
| Settings → Permissions | Tier 2 lock + callout when below Pro |
| Settings → Delivery Queue | Full tab locked below Tier 2 |
| Settings → Debugging | Pro section locked; basic sp() remains on free tier |
| Service Settings → Routing | Advanced routing locked below Tier 1; request rules below Tier 2 |
| Recent Activity / Logs | Retention message + upgrade link below Tier 2 |
| Plugins → SignalPress | Upgrade 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.