# Settings & System Filters System-level filter hooks that do not belong to a single contact, campaign or automation. For the matching actions, see [Settings & System Actions](/hooks/actions/settings-and-system). ## Experimental Settings ### `fluent_crm/experimental_settings` Filter the experimental module settings (the `_fluentcrm_experimental_settings` option merged with its defaults). `Helper::isExperimentalEnabled()` and every module check read through this. ::: warning Applied once per request The settings are cached in a static variable before the filter runs, so the filter is applied on the first call in a request only. Later calls return the unfiltered cached copy. Register your filter early, before FluentCRM first reads these settings. ::: **Parameters** - `$settings` Array - flag => value. Default keys: `campaign_archive`, `campaign_group_by_month`, `campaign_search`, `campaign_max_number`, `campaign_ids`, `campaign_status`, `frontend_portal`, `frontend_portal_slug`, `frontend_portal_render_type`, `frontend_portal_page_id`, `classic_date_time`, `company_module`, `company_auto_logo`, `disable_visual_ai`, `multi_threading_emails`, `system_logs`, `event_tracking`, `abandoned_cart`, `activity_log`, `messaging_module`. Switches use `yes` / `no` **Usage:** ```php add_filter('fluent_crm/experimental_settings', function($settings) { $settings['system_logs'] = 'yes'; return $settings; }); ``` **Source:** `fluent-crm/app/Services/Helper.php` --- ## Sender Loopback Requests After each batch, the email sender continues its chain by firing a non-blocking POST request to the site itself. cURL is tried first because it bypasses WordPress SSL filters that can break local or self-signed loopbacks; on failure it falls back to the WordPress HTTP API. All three filters below receive the request URL and body. ### `fluent_crm/non_blocking_request_timeout` Filter the total timeout, in seconds, of the loopback request. Values below `1` are raised to `1`. **Parameters** - `$timeout` Integer - Default `3` - `$url` String - the loopback URL - `$body` Array - the POST body **Usage:** ```php add_filter('fluent_crm/non_blocking_request_timeout', function($timeout, $url, $body) { return 5; }, 10, 3); ``` **Source:** `fluent-crm/app/Services/Libs/Mailer/Handler.php` --- ### `fluent_crm/non_blocking_request_connect_timeout` Filter the connection timeout, in seconds, of the loopback cURL request. Values below `1` are raised to `1`. The WordPress HTTP fallback has no separate connect timeout and ignores it. **Parameters** - `$connectTimeout` Integer - Default `2` - `$url` String - the loopback URL - `$body` Array - the POST body **Usage:** ```php add_filter('fluent_crm/non_blocking_request_connect_timeout', function($connectTimeout, $url, $body) { return 4; }, 10, 3); ``` **Source:** `fluent-crm/app/Services/Libs/Mailer/Handler.php` --- ### `fluent_crm/non_blocking_request_use_wp_http` Return `true` to skip cURL and send the loopback request with `wp_remote_post()` instead. This is the same transport used automatically when cURL is unavailable or fails. Useful on hosts where direct cURL loopbacks misbehave. **Parameters** - `$useWpHttp` Boolean - Default `false` - `$url` String - the loopback URL - `$body` Array - the POST body **Usage:** ```php add_filter('fluent_crm/non_blocking_request_use_wp_http', '__return_true'); ``` **Source:** `fluent-crm/app/Services/Libs/Mailer/Handler.php` --- ### `fluent_crm/intercept_loopback` Return `true` to swallow the loopback request: nothing is sent and the function returns right away. It exists as a test seam so test suites can observe that the sender intends to continue without making HTTP calls. Do not enable it on a live site, because the sender chain would not continue until the next cron run. **Parameters** - `$intercept` Boolean - Default `false` - `$url` String - the loopback URL - `$body` Array - the POST body **Usage:** ```php add_filter('fluent_crm/intercept_loopback', function($intercept, $url, $body) { $GLOBALS['captured_loopbacks'][] = [$url, $body]; return true; }, 10, 3); ``` **Source:** `fluent-crm/app/Services/Libs/Mailer/Handler.php` --- ## Templates & Block Parsing ### `fluent_crm/remote_template_allowed_hosts` Filter the hosts that email templates may be downloaded from. Only `https` URLs whose host is in this list are fetched. The default list is `fluentcrm.com`, `www.fluentcrm.com`, `wpmanageninja.com`, `www.wpmanageninja.com`, plus the host of the `FC_TEMPLATE_API_DOMAIN` constant when it is defined. The result is lowercased and sanitized, and anything other than an array leaves no allowed hosts. **Parameters** - `$allowedHosts` Array - host names, for example `fluentcrm.com` **Usage:** ```php add_filter('fluent_crm/remote_template_allowed_hosts', function($allowedHosts) { $allowedHosts[] = 'templates.example.com'; return $allowedHosts; }); ``` **Source:** `fluent-crm/app/Services/RemoteTemplateFetcher.php` --- ### `fluent_crm/block_parser_legacy_fallback_enabled` Control the fallback of the email block parser. When the Gutenberg email parser returns an empty result for content that contains `