# Settings & System Actions
System-level action hooks that do not belong to a single contact, campaign or automation. For the
matching filters, see [Settings & System Filters](/hooks/filters/settings-and-system).
## Email Sending Sessions
A sending session is one lock-winning sender run, which can last up to roughly 50 seconds and spans
many claimed batches. Transport plugins use these two hooks to hold a reusable connection open for the
whole window. FluentSMTP, for example, uses them for SMTP keep-alive and HTTP connection reuse.
### `fluent_crm/email_sender_session_started`
Fires after a sender process wins the processing lock and a bulk sending session begins. It does not
fire for a process that fails to get the lock.
**Parameters**
- `$optionKey` String - the sender lock key; identifies the cron, multi-thread or CLI sender
**Usage:**
```php
add_action('fluent_crm/email_sender_session_started', function($optionKey) {
// Open a reusable connection for the duration of the session
});
```
**Source:** `fluent-crm/app/Services/Libs/Mailer/BaseHandler.php`
---
### `fluent_crm/email_sender_session_ended`
Fires when the sender releases its processing lock, so close anything you opened on
`email_sender_session_started`. It can fire without a matching session start, because the lock may be
released when it was never held, and it can fire more than once per run. Make listeners idempotent.
**Parameters**
- `$optionKey` String - the sender lock key
**Usage:**
```php
add_action('fluent_crm/email_sender_session_ended', function($optionKey) {
// Close the connection if it is open; safe to call repeatedly
});
```
**Source:** `fluent-crm/app/Services/Libs/Mailer/BaseHandler.php`
---
## Experimental Settings
### `fluent_crm/experimental_settings_saved`
Fires after the experimental module switches (Settings, Experimental) are saved through the REST API.
Core runs its own migrations for its modules. Modules that live in an add-on cannot be reached from
there, so they listen here to create their tables when their switch has just been turned on.
A partial request is merged into the stored settings first, so `$data` holds the full saved settings,
including flags the request did not carry.
**Parameters**
- `$data` Array - the full experimental settings as saved, for example `['company_module' => 'yes', 'messaging_module' => 'no', ...]`
**Usage:**
```php
add_action('fluent_crm/experimental_settings_saved', function($data) {
if (($data['my_addon_module'] ?? '') === 'yes') {
my_addon_create_tables();
}
});
```
**Source:** `fluent-crm/app/Http/Controllers/SettingsController.php`