# 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 `