Skip to content

FluentBoards Database Schema ​

FluentBoards Core Advanced

FluentBoards stores its data in custom database tables. This page lists every table with its columns, types, defaults and indexes, taken from the migration files.

  • Free tables are created by the migrators in fluent-boards/database/Migrations/ (run by database/DBMigrator.php).
  • The only Pro table, fbs_time_tracks, is created by fluent-boards-pro/app/Modules/TimeTracking/TimerInit.php when the Time Tracking module is enabled.

All table names get the WordPress table prefix. With the default prefix, fbs_boards becomes wp_fbs_boards. The query builder and the models add the prefix for you, so in PHP you always write fbs_boards.

Conventions

  • Every table has an INT UNSIGNED AUTO_INCREMENT primary key named id.
  • Columns marked "serialized" are stored with maybe_serialize(). The matching model unserializes them for you.
  • created_at / updated_at are TIMESTAMP NULL and are managed by the models.

Tables at a Glance ​

TableModel(s)StoresEdition
fbs_boardsBoard, FolderBoards (type to-do / roadmap) and folders (type folder)Free
fbs_board_termsBoardTerm, Stage, Label, CustomFieldStages, labels and custom field definitionsFree
fbs_tasksTaskTasks and subtasksFree
fbs_task_metasTaskMetaKey/value meta for tasksFree
fbs_attachmentsAttachment, TaskImage, CommentImage, TaskAttachmentFiles and links attached to tasks, comments and boardsFree
fbs_commentsCommentTask comments and repliesFree
fbs_activitiesActivityBoard and task activity logFree
fbs_notificationsNotificationIn-app notificationsFree
fbs_notification_usersNotificationUserNotification recipients and read stateFree
fbs_teamsTeamTeamsFree
fbs_metasMeta, WebhookGeneric meta: options, board meta, webhooks, repeat-task settingsFree
fbs_relationsRelationMany-to-many links (board members, assignees, labels, watchers, ...)Free
fbs_time_tracksTimeTrackTime tracking entriesPro
usersUserWordPress core users table (not created by FluentBoards)WordPress

Entity Relationship Diagrams ​

The schema is split into three diagrams. Solid lines are real ID columns. Dashed lines go through object_id + object_type (polymorphic) or through fbs_relations rows, so the database does not enforce them. fbs_metas is left out because what it points to depends on object_type.

Boards, Stages and Tasks ​

Attachments, Activities and Notifications ​

Relations (fbs_relations) and Teams ​

Each line is one object_type value. See fbs_relations for the full list.

Relationships Summary ​

How the tables connect. "Pivot" rows live in fbs_relations, filtered by object_type.

FromColumn(s)ToKind
fbs_board_termsboard_idfbs_boards.idmany-to-one
fbs_tasksboard_idfbs_boards.idmany-to-one
fbs_tasksstage_idfbs_board_terms.id (type = 'stage')many-to-one
fbs_tasksparent_idfbs_tasks.id (subtasks)many-to-one
fbs_taskscreated_byusers.IDmany-to-one
fbs_taskscrm_contact_idFluentCRM fc_subscribers.idmany-to-one (optional)
fbs_task_metastask_idfbs_tasks.idmany-to-one
fbs_commentstask_id, board_idfbs_tasks.id, fbs_boards.idmany-to-one
fbs_commentsparent_idfbs_comments.id (replies)many-to-one
fbs_attachmentsobject_id + object_typefbs_tasks.id (TASK, task_description), fbs_comments.id (comment_image), fbs_boards.id (BOARD)polymorphic
fbs_activitiesobject_id + object_typefbs_tasks.id (task_activity), fbs_boards.id (board_activity)polymorphic
fbs_activitiescreated_byusers.IDmany-to-one
fbs_notificationsobject_id (object_type = 'board_notification')fbs_boards.idmany-to-one
fbs_notificationstask_id, activity_byfbs_tasks.id, users.IDmany-to-one
fbs_notification_usersnotification_id, user_idfbs_notifications.id, users.IDpivot
fbs_metasobject_id + object_typedepends on object_type (see fbs_metas)polymorphic
fbs_relationsobject_id, foreign_id + object_typedepends on object_type (see fbs_relations)pivot
fbs_teamsparent_idfbs_teams.idmany-to-one
fbs_time_tracksuser_id, board_id, task_idusers.ID, fbs_boards.id, fbs_tasks.idmany-to-one (Pro)

fbs_boards Table ​

Stores boards. The same table also stores folders: rows with type = 'folder', read through the Folder model.

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
parent_idINT UNSIGNEDNULLParent board or folder (for nesting)
titleTEXTNULLBoard title, may be longer than 255 characters
descriptionLONGTEXTNULLBoard description
typeVARCHAR(50)NULLto-do (default set by the model), roadmap, or folder
currencyVARCHAR(50)NULLCurrency code
backgroundTEXTNULLSerialized background settings
settingsTEXTNULLSerialized board settings. Templates have is_template = true
created_byINT UNSIGNEDNOT NULLWP user ID of the creator
archived_atTIMESTAMPNULLSet when the board is archived
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: parent_id, type

fbs_board_terms Table ​

Stores the per-board "terms": stages, labels, and custom field definitions. The type column tells them apart.

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
board_idINT UNSIGNEDNOT NULLOwning board
titleVARCHAR(100)NULLTitle. A label may have only a color and no title
slugVARCHAR(100)NULLSlug
typeVARCHAR(50)NOT NULL, DEFAULT 'stage'stage, label, or custom-field
positionDECIMAL(10,2)NOT NULL, DEFAULT 1Sort position (1 = first). Older installs are upgraded from INT to DECIMAL by the migrator
colorVARCHAR(50)NULLText color
bg_colorVARCHAR(50)NULLBackground color
settingsTEXTNULLSerialized settings. Stages default to default_task_status and is_template
archived_atTIMESTAMPNULLSet when the term is archived
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: title, type, position, slug

fbs_tasks Table ​

Stores tasks. Subtasks are rows in the same table with parent_id set.

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
parent_idINT UNSIGNEDNULLParent task ID when the row is a subtask
board_idINT UNSIGNEDNULLBoard the task belongs to
crm_contact_idBIGINT UNSIGNEDNULLLinked contact, for example a FluentCRM subscriber ID
titleTEXTNULLTask title, may be longer than 255 characters
slugVARCHAR(255)NULLSlug, generated from the title when empty
typeVARCHAR(50)NULLtask or roadmap. Set by the model from the board type
statusVARCHAR(50)NULL, DEFAULT 'open'open or closed
stage_idINT UNSIGNEDNULLStage (fbs_board_terms.id)
sourceVARCHAR(50)NULL, DEFAULT 'web'Where the task came from, for example web, funnel, contact-section
source_idVARCHAR(255)NULLID in the source system. Older installs are upgraded from INT by the migrator
priorityVARCHAR(50)NULL, DEFAULT NULLurgent, high, medium, low, or empty for no priority
descriptionLONGTEXTNULLTask description (HTML)
lead_valueDECIMAL(10,2)DEFAULT 0.00Value for pipeline-style boards
created_byBIGINT UNSIGNEDNULLWP user ID of the creator
positionDECIMAL(10,2)NOT NULL, DEFAULT 1Sort position inside the stage, or inside the parent for subtasks
comments_countINT UNSIGNEDNULL, DEFAULT 0Cached count of top-level comments
issue_numberINT UNSIGNEDNULLBoard-specific issue number
reminder_typeVARCHAR(100)NULL, DEFAULT 'none'Reminder type
settingsTEXTNULLSerialized settings (cover, subtask_count, subtask_completed_count, attachment_count, ...)
remind_atTIMESTAMPNULLReminder time
started_atTIMESTAMPNULLStart date
due_atTIMESTAMPNULLDue date
last_completed_atTIMESTAMPNULLSet when the task is closed, cleared when it is reopened
archived_atTIMESTAMPNULLSet when the task is archived
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: type, board_id, slug, comments_count, issue_number, crm_contact_id, due_at, priority

fbs_task_metas Table ​

Key/value meta for tasks. Keys used by the plugin include is_pinned, subtask_group_id, group_name and upvote.

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
task_idINT UNSIGNEDNOT NULLTask ID
keyVARCHAR(100)NOT NULLMeta key
valueLONGTEXTNULLMeta value (serialized by the model when needed)
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: task_id

fbs_attachments Table ​

Files and links attached to tasks, task descriptions, comments and boards.

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
object_idINT UNSIGNEDNOT NULLTask, comment or board ID
object_typeVARCHAR(100)DEFAULT 'TASK'TASK (task attachment), task_description (image in a task description), comment_image, BOARD
attachment_typeVARCHAR(100)NULLFor example url for a link, or the file type for uploads
file_pathTEXTNULLLocal file path
full_urlTEXTNULLPublic or remote URL
settingsTEXTNULLSerialized settings
titleVARCHAR(192)NULLDisplay title
file_hashVARCHAR(192)NULLRandom hash used in secure download URLs
driverVARCHAR(100)DEFAULT 'local'Storage driver (local, or a Pro cloud storage driver)
statusVARCHAR(100)NULL, DEFAULT 'ACTIVE'ACTIVE, INACTIVE or DELETED
file_sizeVARCHAR(100)NULLFile size
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: object_type, object_id, attachment_type, status, file_hash, driver

fbs_comments Table ​

Comments and replies on tasks.

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
board_idINT UNSIGNEDNOT NULLBoard ID
task_idINT UNSIGNEDNOT NULLTask ID
parent_idBIGINT UNSIGNEDNULLParent comment ID for replies
typeVARCHAR(50)NULL, DEFAULT 'comment'comment, note or reply
privacyVARCHAR(50)NULL, DEFAULT 'public'public or private. The model sets private when empty
statusVARCHAR(50)NULL, DEFAULT 'published'published, draft or spam
author_nameVARCHAR(192)NULL, DEFAULT ''Author name (filled from the WP user on create)
author_emailVARCHAR(192)NULL, DEFAULT ''Author email (filled from the WP user on create)
author_ipVARCHAR(50)NULL, DEFAULT ''Author IP
descriptionTEXTNULLComment body (HTML)
created_byBIGINT UNSIGNEDNULLWP user ID of the author
settingsTEXTNULLSerialized settings
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: type, task_id, board_id, status, privacy

fbs_activities Table ​

Activity log for boards and tasks.

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
object_idINT UNSIGNEDNOT NULLTask or board ID
object_typeVARCHAR(100)NOT NULLtask_activity or board_activity
actionVARCHAR(50)NOT NULLFor example created, updated, added, changed, removed, deleted
columnVARCHAR(50)NULLChanged field
old_valueVARCHAR(50)NULLValue before the change
new_valueVARCHAR(50)NULLValue after the change
descriptionLONGTEXTNULLDescription of the change
created_byBIGINT UNSIGNEDNULLWP user ID that made the change
settingsTEXTNULLSerialized settings
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: object_type, object_id

fbs_notifications Table ​

In-app notifications. Recipients are stored in fbs_notification_users.

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
object_idINT UNSIGNEDNOT NULLBoard ID
object_typeVARCHAR(100)NOT NULLboard_notification
task_idINT UNSIGNEDNULLRelated task
actionVARCHAR(255)NULLHook-like action name, for example task_created, task_comment_mentioned
activity_byBIGINT UNSIGNEDNOT NULLWP user ID that triggered the notification
descriptionLONGTEXTNULLNotification text
settingsTEXTNULLSerialized settings
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: object_id, object_type, activity_by

fbs_notification_users Table ​

Links notifications to the users who receive them and tracks read state.

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
notification_idINT UNSIGNEDNULLNotification ID
user_idBIGINT UNSIGNEDNOT NULLRecipient WP user ID
marked_read_atTIMESTAMPNULLWhen the user read it. NULL means unread
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: notification_id, user_id

fbs_teams Table ​

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
parent_idINT UNSIGNEDNULLParent team
titleVARCHAR(100)NOT NULLTeam name
descriptionTEXTNULLDescription
typeVARCHAR(50)NOT NULLTeam type
visibilityVARCHAR(50)DEFAULT 'VISIBLE'VISIBLE or SECRET
notifications_enabledTINYINT(1)DEFAULT 1Whether notifications are on
settingsTEXTNULLSerialized settings
created_byBIGINT UNSIGNEDNOT NULLWP user ID of the creator
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: type, visibility, created_by, parent_id, notifications_enabled, title

fbs_metas Table ​

Generic key/value storage. object_type says what object_id points to.

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
object_idINT UNSIGNEDNULLRelated object ID (NULL for global options)
object_typeVARCHAR(100)NOT NULLSee the list below
keyVARCHAR(100)NULLMeta key
valueLONGTEXTNULLMeta value (serialized by the model)
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: object_id

Common object_type values:

object_typeobject_idUsed for
option—Plugin options read by fluent_boards_get_option() / fluent_boards_update_option()
boardBoard IDBoard meta (Board::getMeta(), Board::updateMeta())
userWP user IDPer-user settings, for example global notification preferences
webhook—Incoming webhooks (Webhook model)
outgoing_webhook—Outgoing webhooks
repeat_taskTask IDRepeat (recurring) task settings
fluent_board_adminWP user IDFluentBoards admin flag

fbs_relations Table ​

Generic pivot table behind most many-to-many relations. object_type says what the two IDs mean.

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
object_idINT UNSIGNEDNOT NULLLeft side of the relation
object_typeVARCHAR(100)NOT NULLRelation type (see below)
foreign_idINT UNSIGNEDNOT NULLRight side of the relation
settingsTEXTNULLSerialized settings
preferencesTEXTNULLSerialized preferences
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: object_type, object_id, foreign_id

object_type values (constants in FluentBoards\App\Services\Constant):

object_typeConstantobject_idforeign_idNotes
board_userOBJECT_TYPE_BOARD_USERBoard IDUser IDBoard membership. settings holds is_admin / is_viewer_only, preferences holds notification preferences
board_user_emailOBJECT_TYPE_BOARD_USER_EMAIL_NOTIFICATIONBoard IDUser IDEmail notification settings
board_user_notificationOBJECT_TYPE_BOARD_USER_NOTIFICATIONBoard IDUser IDLegacy notification settings
task_assigneeOBJECT_TYPE_TASK_ASSIGNEETask IDUser IDTask assignees
task_user_watchOBJECT_TYPE_USER_TASK_WATCHTask IDUser IDTask watchers
task_labelOBJECT_TYPE_TASK_LABELTask IDLabel IDLabels on a task
task_custom_fieldTASK_CUSTOM_FIELDTask IDCustom field IDCustom field values (value in settings)
task_dependencyOBJECT_TYPE_TASK_DEPENDENCYPredecessor task IDSuccessor task IDPro task dependencies
outgoing_webhook_board—Outgoing webhook ID (fbs_metas.id)Board IDBoards an outgoing webhook listens to. settings holds the triggered events
FluentBoardsPro\App\Models\FolderOBJECT_TYPE_FOLDER_BOARDFolder IDBoard IDBoard placed in a folder. The value is a legacy class name string, kept for compatibility

fbs_time_tracks Table ​

Pro

Time tracking entries. Created by the Pro Time Tracking module the first time the module is enabled (TimerInit::migrateDbTable()), not by a migrator class.

ColumnTypeNull / DefaultComment
idINT UNSIGNEDAUTO_INCREMENTPrimary key
user_idBIGINT UNSIGNEDNOT NULLWP user ID that tracked the time
board_idINT UNSIGNEDNOT NULLBoard ID
task_idINT UNSIGNEDNOT NULLTask ID
started_atTIMESTAMPNULLStart time
completed_atTIMESTAMPNULLEnd time
messageTEXTNULLOptional note
statusVARCHAR(50)NULL, DEFAULT 'commited'Entries are saved as commited (spelled this way in the code). TimeTrack::getWorkingSeconds() treats active as a running timer
working_minutesINT UNSIGNEDNOT NULL, DEFAULT 0Minutes worked
billable_minutesINT UNSIGNEDNOT NULL, DEFAULT 0Billable minutes
is_manualTINYINT(1)NOT NULL, DEFAULT 01 when the entry was added manually
created_atTIMESTAMPNULL
updated_atTIMESTAMPNULL

Indexes: user_id, status, task_id, board_id

users Table ​

The WordPress core users table. FluentBoards reads it through the User model and does not change its schema.

ColumnTypeComment
IDBIGINT UNSIGNEDPrimary key
user_loginVARCHAR(60)Login name
user_passVARCHAR(255)Password hash. Never serialized by the User model
user_nicenameVARCHAR(50)URL-friendly name. Hidden by the User model
user_emailVARCHAR(100)Email. Hidden unless the viewer can list_users or privileged serialization is on
user_urlVARCHAR(100)Website. Hidden by the User model
user_registeredDATETIMERegistration date. Hidden by the User model
user_activation_keyVARCHAR(255)Activation key. Hidden by the User model
user_statusINTStatus. Hidden by the User model
display_nameVARCHAR(250)Display name