Fluent Support Database Schema
Fluent Support use custom database tables with options tables to store all the data. Here are the list of database tables, and it's schema to understand overall database design and related data attributes of each model.
Schema Design

Database Tables
fs_tickets
This table stores the ticket data
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| customer_id | bigint(20) UNSIGNED NULL | |
| agent_id | bigint(20) UNSIGNED NULL | |
| mailbox_id | bigint(20) UNSIGNED NULL | |
| product_id | bigint(20) UNSIGNED NULL | |
| product_source | varchar(192) NULL | |
| privacy | varchar(100) [private] | |
| priority | varchar(100) [normal] | |
| client_priority | varchar(100) [normal] | |
| status | varchar(100) [new] | |
| title | varchar(192) NULL | |
| slug | varchar(192) NULL | |
| hash | varchar(192) NULL | |
| content_hash | varchar(192) NULL | |
| message_id | varchar(192) NULL | |
| source | varchar(192) NULL | |
| content | longtext NULL | |
| secret_content | longtext NULL | |
| last_agent_response | timestamp NULL | |
| last_customer_response | timestamp NULL | |
| waiting_since | timestamp NULL | |
| response_count | int(11) [0] | |
| first_response_time | int(11) NULL | |
| total_close_time | int(11) NULL | |
| resolved_at | timestamp NULL | |
| closed_by | bigint(20) UNSIGNED NULL | |
| created_by | bigint(20) UNSIGNED NULL | |
| serial_number | bigint(20) UNSIGNED NULL, UNIQUE | |
| ticket_number | varchar(192) NULL | Public ticket number, e.g. formatted with the fluent_support/ticket_prefix filter and serial_number |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_tag_pivot
This table stores polymorphic tag relations: which tag is attached to which record. source_type/source_id identify the tagged record (e.g. a ticket), and tag_id points at a row in fs_taggables.
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| tag_id | bigint(20) UNSIGNED | |
| source_id | bigint(20) UNSIGNED | |
| source_type | varchar(192) | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_taggables
This is a shared, polymorphic table for tag-like records — the tag_type column discriminates between the Tag, AgentGroup, and TicketTag models, which all use this table rather than having their own.
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| tag_type | varchar(192) NULL | |
| title | varchar(192) | |
| slug | varchar(192) | |
| description | longtext NULL | |
| settings | text NULL | |
| created_by | bigint(20) UNSIGNED NULL | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_products
This table stores the product data
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| source_uid | bigint(20) UNSIGNED NULL | |
| mailbox_id | bigint(20) UNSIGNED NULL | |
| title | varchar(192) NULL | |
| description | text NULL | |
| settings | longtext NULL | |
| source | varchar(100) [local] | |
| created_by | bigint(20) UNSIGNED NULL | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_persons
This is a shared table for people records — both the Agent and Customer models use this table, distinguished by the person_type column, rather than having separate tables.
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| first_name | varchar(192) NULL | |
| last_name | varchar(192) NULL | |
| varchar(192) NULL | ||
| title | varchar(192) NULL | |
| avatar | varchar(192) NULL | |
| person_type | varchar(192) [customer] | |
| status | varchar(192) [active] | |
| ip_address | varchar(20) NULL | |
| last_ip_address | varchar(20) NULL | |
| address_line_1 | varchar(192) NULL | |
| address_line_2 | varchar(192) NULL | |
| city | varchar(192) NULL | |
| zip | varchar(192) NULL | |
| state | varchar(192) NULL | |
| country | varchar(192) NULL | |
| note | longtext NULL | |
| hash | varchar(192) NULL | |
| user_id | bigint(20) UNSIGNED NULL | |
| description | mediumtext NULL | |
| remote_uid | bigint(20) UNSIGNED NULL | |
| last_response_at | timestamp NULL | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_meta
This table stores the meta data
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| object_type | varchar(192) NULL | |
| object_id | bigint(20) NULL | |
| key | varchar(192) NULL | |
| value | longtext NULL | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_mail_boxes
This table stores the mailbox data
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| name | varchar(192) | |
| slug | varchar(192) | |
| box_type | varchar(50) [web] | |
| varchar(192) | ||
| mapped_email | varchar(192) NULL | |
| email_footer | longtext NULL | |
| settings | longtext NULL | |
| avatar | varchar(192) NULL | |
| created_by | bigint(20) UNSIGNED NULL | |
| is_default | ENUM('yes', 'no') [no] | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_data_metrix
This table stores the data metrix
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| stat_date | DATE | |
| data_type | varchar(100) [agent_stat] | |
| agent_id | bigint(20) UNSIGNED NULL | |
| replies | int(11) UNSIGNED NULL [0] | |
| active_tickets | int(11) UNSIGNED NULL [0] | |
| resolved_tickets | int(11) UNSIGNED NULL [0] | |
| new_tickets | int(11) UNSIGNED NULL [0] | |
| unassigned_tickets | int(11) UNSIGNED NULL [0] | |
| close_to_average | int(11) UNSIGNED NULL [0] | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_conversations
This table stores the conversation data
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| serial | int(11) UNSIGNED [1] | |
| ticket_id | bigint(20) UNSIGNED | |
| person_id | bigint(20) UNSIGNED | |
| conversation_type | varchar(100) [response] | |
| content | longtext NULL | |
| source | varchar(100) [web] | |
| content_hash | varchar(192) NULL | |
| message_id | varchar(192) NULL | |
| is_important | ENUM('yes', 'no') [no] | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_attachments
This table stores the attachment data
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| ticket_id | bigint(20) UNSIGNED NULL | |
| person_id | bigint(20) UNSIGNED NULL | |
| conversation_id | bigint(20) UNSIGNED NULL | |
| file_type | varchar(100) NULL | |
| file_path | text NULL | |
| full_url | text NULL | |
| settings | text NULL | |
| title | varchar(192) NULL | |
| file_hash | varchar(192) NULL | |
| driver | varchar(100) [local] | |
| status | varchar(100) NULL [active] | |
| file_size | varchar(100) NULL | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_notifications
This table stores internal notification records created by the Internal Notifications module (added in 2.2.0).
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| actor_id | bigint(20) UNSIGNED NULL | ID of the person who triggered the event (from fs_persons). NULL for system-generated notifications. |
| ticket_id | bigint(20) UNSIGNED NULL | The related ticket ID |
| conversation_id | bigint(20) UNSIGNED NULL | The related conversation/response ID, if applicable |
| event_type | varchar(192) NOT NULL | Notification event type slug (e.g. ticket_assigned, customer_replied) |
| category | varchar(100) NOT NULL | Notification category: mentions, ticket_activity, or automation_triggers |
| payload | longtext NULL | JSON-encoded contextual data for rendering the notification message |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_notification_users
This table tracks per-recipient read state for each internal notification (added in 2.2.0).
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| notification_id | bigint(20) UNSIGNED NOT NULL | Foreign key to fs_notifications.id |
| user_id | bigint(20) UNSIGNED NOT NULL | Recipient agent person ID (from fs_persons) |
| channel | varchar(100) [web] | Delivery channel. Currently only web is used. |
| is_read | tinyint(1) [0] | Whether the recipient has read this notification |
| read_at | timestamp NULL | When the notification was marked as read |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_activities
This table stores the activities data
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| person_id | bigint(20) NULL | |
| person_type | varchar(192) NULL | |
| event_type | varchar(192) NULL | |
| object_id | bigint(20) NULL | |
| object_type | varchar(192) NULL | |
| description | mediumtext NULL | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_ai_activity_logs
This table stores AI usage logs — one row per AI request made from a ticket (e.g. generating a reply, summarizing a conversation) — used for auditing and token-usage tracking.
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| agent_id | bigint(20) NULL | |
| ticket_id | bigint(20) NULL | |
| model_name | varchar(50) NULL | |
| tokens | mediumtext NULL | |
| prompt | longtext NULL | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_saved_replies
This table stores saved/canned replies agents can reuse when responding to tickets. The SavedReply model lives in Core, but this table is only created when Pro (which ships the Saved Replies feature) is active.
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| created_by | bigint(20) UNSIGNED NULL | |
| mailbox_id | bigint(20) UNSIGNED NULL | |
| product_id | bigint(20) UNSIGNED NULL | |
| title | varchar(192) NULL | |
| content | longtext NULL | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_ticket_audits
This table stores one AI-generated mood/sentiment audit per ticket (mood, score, summary), refreshed on a schedule via the AI Audit reporting module.
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| ticket_id | bigint(20) UNSIGNED, UNIQUE | |
| mood | varchar(20) NULL | One of Happy, Neutral, Frustrated, Very Unhappy |
| score | decimal(3,1) NULL | 0.0 (most negative) to 10.0 (most positive) |
| summary | text NULL | |
| status | varchar(20) [failed] | |
| error | text NULL | |
| audited_at | datetime NULL | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_report_snapshots
This table stores periodic (default every 6 hours) point-in-time snapshots of report data, keyed by report_type, so historical report trends can be shown without re-computing them from raw ticket data.
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| snapshot_time | datetime | |
| report_type | varchar(50) | |
| period | varchar(20) [6h] | |
| data | longtext | JSON-encoded report payload for this snapshot |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_time_tracks
This table stores agent time-tracking entries against tickets (start/stop timers or manual entries), used for billing and reporting.
| Column | Type | Comment |
|---|---|---|
| id | int(10) UNSIGNED Auto Increment | |
| agent_id | bigint(20) UNSIGNED | |
| customer_id | bigint(20) UNSIGNED | |
| ticket_id | bigint(20) UNSIGNED | |
| mailbox_id | bigint(20) UNSIGNED | |
| started_at | timestamp NULL | |
| completed_at | timestamp NULL | |
| message | text NULL | |
| status | varchar(50) [committed] | |
| working_minutes | int(10) UNSIGNED [0] | |
| billable_minutes | int(10) UNSIGNED [0] | |
| is_manual | tinyint(1) [0] | Whether this entry was manually logged rather than timed |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_workflows
This table stores workflow automation definitions — a trigger plus settings — that run one or more fs_workflow_actions when matched.
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| created_by | bigint(20) NULL | |
| priority | int(10) [10] | |
| title | varchar(192) NULL | |
| trigger_key | varchar(192) NULL | |
| trigger_type | varchar(50) [manual] | |
| settings | longtext NULL | |
| status | varchar(50) [draft] | |
| last_ran_at | timestamp NULL | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
fs_workflow_actions
This table stores the individual actions belonging to a workflow (fs_workflows), run in sequence when the parent workflow is triggered.
| Column | Type | Comment |
|---|---|---|
| id | bigint(20) UNSIGNED Auto Increment | |
| title | varchar(192) NULL | |
| action_name | varchar(192) NULL | |
| workflow_id | bigint(20) NULL | References fs_workflows.id |
| settings | longtext NULL | |
| created_at | timestamp NULL | |
| updated_at | timestamp NULL |
